2013-04-24 4 views
9

Ciao, voglio convertire alcune tabelle da un database Postgres a MySQL. Idealmente mi piacerebbe creare uno script che converta le tabelle per PG in MySQL, ma sono contento se siamo in grado di capire come renderlo possibile in un modo non scrivibile.Come migrare il database da Postgres a MySQL?

Prima di tutto, ho letto un post simile qui: Migrate database from Postgres to MySQL

Ho provato entrambe le soluzioni proposte lì, ma did't fare il trucco.

È importante dire che Voglio migrare La struttura e i dati.

Ma andiamo con ordine, Ecco il dump SQL del Postgres-database:

-- 
-- PostgreSQL database dump 
-- 

SET statement_timeout = 0; SET client_encoding = 'UTF8'; SET standard_conforming_strings = off; SET check_function_bodies = false; SET client_min_messages = warning; SET escape_string_warning = off; 

SET search_path = public, pg_catalog; 

SET default_tablespace = ''; 

SET default_with_oids = false; 

-- 
-- Name: grupos; Type: TABLE; Schema: public; Owner: postgres; Tablespace: 
-- 

CREATE TABLE grupos (
    "dirGrupo" text, 
    valor real, 
    "flagIntelli" boolean DEFAULT false, 
    "flagQDS" boolean DEFAULT false, 
    finalidad text, 
    "idGrupo" integer DEFAULT nextval('"idGrupo"'::regclass) NOT NULL, 
    "claseDomo" text, 
    instalado boolean DEFAULT true NOT NULL, 
    "codCasa" "char", 
    "codUnidad" integer, 
    protocolo text NOT NULL, 
    escritura boolean, 
    dispositivo text, 
    "tipoDatos" oid, 
    "coordX" integer DEFAULT (-1), 
    "coordY" integer DEFAULT (-1), 
    mapa text, 
    "reglasAsociadas" text); 


ALTER TABLE public.grupos OWNER TO postgres; 

-- 
-- Data for Name: grupos; Type: TABLE DATA; Schema: public; Owner: postgres 
-- 

INSERT INTO grupos VALUES (NULL, 0, false, false, 'sensor', 10, 'LightSensor', true, 'E', 1, 'x10', false, 'SensorLum1', 7, -1, -1, NULL, NULL); INSERT INTO grupos VALUES (NULL, 0, false, false, 'luz', 11, 'SimpleLamp', true, 'K', 1, 'x10', true, 'Luz4', 1, -1, -1, NULL, NULL); INSERT INTO grupos VALUES (NULL, 0, false, false, 'Radiador de la sala', 298, 'Heater', true, 'B', 1, 'x10', true, 'RadiadorX10', 1, 163, 168, 'Sala Quercus', '108;111;115;117;119;123;127;131;134;136;138;140;144;148;150;152;155;157;159;162;166;169;172;176;179;182;185;188;190;193;196;199;201;205;209;214;218;222;226;230;234;238;250;254;260;264;277;278;279;280;284;293;297;301;305;309;313;315;315;315;315;315;315;315;315;315;315;315;315;315;315;315;315;'); INSERT INTO grupos VALUES ('0/0/5', 1, false, false, 'Interruptor', 213, 'Button', true, NULL, NULL, 'knx', true, 'Interruptor', 1, 301, 326, 'Plano Casa', NULL); INSERT INTO grupos VALUES ('0/0/4', 0, false, false, 'Enchufe4', 316, 'Switch', true, NULL, NULL, 'knx', true, 'Enchufe4', 1, 303, 133, 'Plano Casa', '268;272;276;'); INSERT INTO grupos VALUES ('0/0/2', 0, false, false, 'Enchufe2', 210, 'Switch', true, NULL, NULL, 'knx', true, 'Enchufe2', 1, 141, 322, 'Plano Casa', NULL); INSERT INTO grupos VALUES ('0/0/1', 0, false, false, 'LuzFlexo', 217, 'SimpleLamp', true, NULL, NULL, 'knx', true, 'LuzFlexo', 1, 80, 45, 'Plano Casa', '267;271;275;'); INSERT INTO grupos VALUES ('0/0/3', 1, false, false, 'Router', 221, 'Router', true, NULL, NULL, 'knx', true, 'Router1', 1, 467, 439, 'Plano Casa', NULL); INSERT INTO grupos VALUES ('0/0/6', 21.68, false, false, 'SensorTemperatura', 237, 'TemperatureSensor', true, NULL, NULL, 'knx', false, 'SensorTemperatura', 2, 146, 436, 'Plano Casa', NULL); INSERT INTO grupos VALUES (NULL, 0, false, false, 'SensorX10', 219, 'MotionSensor', true, 'A', 1, 'x10', false, 'SensorX10', 6, 362, 11, 'Plano Casa', '335;336;'); INSERT INTO grupos VALUES ('1/1/5', 1, false, false, '', 12, 'MotionSensor', true, NULL, NULL, 'knx', false, 'SensorPresencia', 6, -1, -1, NULL, NULL); INSERT INTO grupos VALUES ('1/1/2', 50, false, true, 'Luz Intervalo', 248, 'DimmableLight', true, NULL, NULL, 'knx', true, 'LuzHInt', 3, 97, 276, 'Plano Casa', '265;269;273;338;'); INSERT INTO grupos VALUES ('1/1/1', 0, false, false, 'LuzHBin', 215, 'SimpleLamp', true, NULL, NULL, 'knx', true, 'LuzHBin', 1, 357, 189, 'Plano Casa', '266;270;274;'); INSERT INTO grupos VALUES (NULL, 1, false, true, 'Encender la luz del flexo', 291, 'SimpleLamp', true, 'C', 1, 'x10', true, 'BombillaX10', 1, 272, 130, 'Sala Quercus', '107;109;110;112;113;114;116;118;120;121;122;124;125;126;128;129;130;132;133;135;137;139;141;142;143;145;146;147;149;151;153;154;156;158;160;161;163;164;165;167;168;170;171;173;174;175;177;178;180;181;183;184;186;187;189;191;192;194;195;197;198;200;202;203;204;206;207;208;210;211;212;213;215;216;217;219;220;221;223;224;225;227;228;229;231;232;233;235;236;237;239;240;249;251;252;253;255;256;257;258;259;261;262;263;281;282;283;290;291;292;294;295;296;298;299;300;302;303;304;306;307;308;310;311;312;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;335;336;'); 


-- 
-- Name: grupos_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres; Tablespace: 
-- 

ALTER TABLE ONLY grupos 
    ADD CONSTRAINT grupos_pkey PRIMARY KEY ("idGrupo"); 


-- 
-- Name: grupos_tipoDatos_fkey; Type: FK CONSTRAINT; Schema: public; Owner: postgres 
-- 

ALTER TABLE ONLY grupos 
    ADD CONSTRAINT "grupos_tipoDatos_fkey" FOREIGN KEY ("tipoDatos") REFERENCES "TiposDatos"(id); 


-- 
-- PostgreSQL database dump complete 
-- 

1) Primo approccio, Usare pG2Mysql: http://www.lightbox.ca/pg2mysql.php semplice e veloce (in teoria): Purtroppo ha diversi errori durante l'analisi:

Ecco il documento recuperato:

# Converted with pg2mysql-1.9 
# Converted on Mon, 22 Apr 2013 14:12:28 -0400 
# Lightbox Technologies Inc. http://www.lightbox.ca 

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; SET time_zone="+00:00"; 

CREATE TABLE grupos (
    `dirGrupo` text, 
    valor real, 
    `flagIntelli` bool DEFAULT 0, 
    `flagQDS` bool DEFAULT 0, 
    finalidad text, 
    `idGrupo` int(11) auto_increment NOT NULL, 
    `claseDomo` text, 
    instalado bool DEFAULT 1 NOT NULL, 
    `codCasa` `char`, 
    `codUnidad` int(11), 
    protocolo text NOT NULL, 
    escritura bool, 
    dispositivo text, 
    `tipoDatos` oid, 
    `coordX` int(11) DEFAULT -1 , 
    `coordY` int(11) DEFAULT -1 , 
    mapa text, 
    `reglasAsociadas` text , PRIMARY KEY(`idGrupo`)) TYPE=MyISAM; 

INSERT INTO grupos VALUES (NULL, 0, false, false, 'sensor', 10, 'LightSensor', true, 'E', 1, 'x10', false, 'SensorLum1', 7, -1, -1, NULL, NULL); INSERT INTO grupos VALUES (NULL, 0, false, false, 'luz', 11, 'SimpleLamp', true, 'K', 1, 'x10', true, 'Luz4', 1, -1, -1, NULL, NULL); INSERT INTO grupos VALUES (NULL, 0, false, false, 'Radiador de la sala', 298, 'Heater', true, 'B', 1, 'x10', true, 'RadiadorX10', 1, 163, 168, 'Sala Quercus', '108;111;115;117;119;123;127;131;134;136;138;140;144;148;150;152;155;157;159;162;166;169;172;176;179;182;185;188;190;193;196;199;201;205;209;214;218;222;226;230;234;238;250;254;260;264;277;278;279;280;284;293;297;301;305;309;313;315;315;315;315;315;315;315;315;315;315;315;315;315;315;315;315;'); INSERT INTO grupos VALUES ('0/0/5', 1, false, false, 'Interruptor', 213, 'Button', true, NULL, NULL, 'knx', true, 'Interruptor', 1, 301, 326, 'Plano Casa', NULL); INSERT INTO grupos VALUES ('0/0/4', 0, false, false, 'Enchufe4', 316, 'Switch', true, NULL, NULL, 'knx', true, 'Enchufe4', 1, 303, 133, 'Plano Casa', '268;272;276;'); INSERT INTO grupos VALUES ('0/0/2', 0, false, false, 'Enchufe2', 210, 'Switch', true, NULL, NULL, 'knx', true, 'Enchufe2', 1, 141, 322, 'Plano Casa', NULL); INSERT INTO grupos VALUES ('0/0/1', 0, false, false, 'LuzFlexo', 217, 'SimpleLamp', true, NULL, NULL, 'knx', true, 'LuzFlexo', 1, 80, 45, 'Plano Casa', '267;271;275;'); INSERT INTO grupos VALUES ('0/0/3', 1, false, false, 'Router', 221, 'Router', true, NULL, NULL, 'knx', true, 'Router1', 1, 467, 439, 'Plano Casa', NULL); INSERT INTO grupos VALUES ('0/0/6', 21.68, false, false, 'SensorTemperatura', 237, 'TemperatureSensor', true, NULL, NULL, 'knx', false, 'SensorTemperatura', 2, 146, 436, 'Plano Casa', NULL); INSERT INTO grupos VALUES (NULL, 0, false, false, 'SensorX10', 219, 'MotionSensor', true, 'A', 1, 'x10', false, 'SensorX10', 6, 362, 11, 'Plano Casa', '335;336;'); INSERT INTO grupos VALUES ('1/1/5', 1, false, false, '', 12, 'MotionSensor', true, NULL, NULL, 'knx', false, 'SensorPresencia', 6, -1, -1, NULL, NULL); INSERT INTO grupos VALUES ('1/1/2', 50, false, true, 'Luz Intervalo', 248, 'DimmableLight', true, NULL, NULL, 'knx', true, 'LuzHInt', 3, 97, 276, 'Plano Casa', '265;269;273;338;'); INSERT INTO grupos VALUES ('1/1/1', 0, false, false, 'LuzHBin', 215, 'SimpleLamp', true, NULL, NULL, 'knx', true, 'LuzHBin', 1, 357, 189, 'Plano Casa', '266;270;274;'); INSERT INTO grupos VALUES (NULL, 1, false, true, 'Encender la luz del flexo', 291, 'SimpleLamp', true, 'C', 1, 'x10', true, 'BombillaX10', 1, 272, 130, 'Sala Quercus', '107;109;110;112;113;114;116;118;120;121;122;124;125;126;128;129;130;132;133;135;137;139;141;142;143;145;146;147;149;151;153;154;156;158;160;161;163;164;165;167;168;170;171;173;174;175;177;178;180;181;183;184;186;187;189;191;192;194;195;197;198;200;202;203;204;206;207;208;210;211;212;213;215;216;217;219;220;221;223;224;225;227;228;229;231;232;233;235;236;237;239;240;249;251;252;253;255;256;257;258;259;261;262;263;281;282;283;290;291;292;294;295;296;298;299;300;302;303;304;306;307;308;310;311;312;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;314;316;317;335;336;'); ALTER TABLE grupos 
    ADD CONSTRAINT grupos_pkey PRIMARY KEY ("idGrupo"); 

Quando ho importare questo file al database utilizzando qualsiasi gestore di database ricevo nulla, ma gli errori:

The first error Per qualche ragione i segni parser caratteri tra questi simboli: ''. Se guardiamo attentamente, a volte i nomi delle colonne sono tra "" e altre volte no, PERCHÉ?

a cancellare quei simboli intorno char e procedere a fare di nuovo la stessa importazione, ma ancora una volta un altro errore rischia fino:

The second error

Tipo OID? Cos'è quello? Leggendo vedo che è un tipo usato per le chiavi primarie ... A questo punto ho deciso:

fuck this shit! Ne ho avuto abbastanza!

2) In secondo approccio, cercherò con Mysql Workbench:

ho installato questa funzione in Ubuntu e ho dato una prova. C'è un'opzione per migrare i database, ottimo!

1.- introduco la fonte e verificare la connessione: The source connection test

2.- Poi la destinazione e verificare la connessione: (! Hey questo sh-- ..thing potrebbe funzionare :)) The destination connection test

3.- La schermata successiva, tutto è OK: Things are working

4.- Ora mi viene chiesto di selezionare lo schema, seleziono l'opzione predefinita: Select the schema

5.- E ricevo il seguente errore, in mancanza del punto denominato, "Schemi di reverse engineer selezionati".

Starting... 
Connect to source DBMS... 
- Connecting... 
Connecting to [email protected]=Postgresql;SERVER=158.49.245.68;PORT=5432... 
Opening ODBC connection to DRIVER=Postgresql;SERVER=158.49.245.68;PORT=5432;DATABASE=QDSDatabase;UID=postgres... 
Connected 
Connect to source DBMS done 
Reverse engineer selected schemata.... 
Reverse engineering public from QDSDatabase 
- Reverse engineering catalog information 
Traceback (most recent call last): 
    File "/usr/lib/mysql-workbench/modules/db_postgresql_re_grt.py", line 335, in reverseEngineer 
    return PostgresqlReverseEngineering.reverseEngineer(connection, catalog_name, schemata_list, context) 
    File "/usr/lib/mysql-workbench/modules/db_generic_re_grt.py", line 207, in reverseEngineer 
    catalog = cls.reverseEngineerCatalog(connection, catalog_name) 
    File "/usr/lib/mysql-workbench/modules/db_generic_re_grt.py", line 367, in reverseEngineerCatalog 
    cls.reverseEngineerSequences(connection, schema) 
    File "/usr/lib/mysql-workbench/modules/db_postgresql_re_grt.py", line 76, in reverseEngineerSequences 
    min_value, max_value, start_value, increment_by, last_value, is_cycled, ncache = cls.execute_query(connection, seq_details_query % (schema.name, seq_name)).fetchone() 
    File "/usr/lib/mysql-workbench/modules/db_generic_re_grt.py", line 56, in execute_query 
    return cls.get_connection(connection_object).cursor().execute(query, *args, **kwargs) 
pyodbc.ProgrammingError: ('42P01', '[42P01] ERROR: no existe la relaci\xc3\xb3n \xc2\xabpublic.idtipodatos\xc2\xbb;\nError while executing the query (7) (SQLExecDirectW)') 

Traceback (most recent call last): 
    File "/usr/share/mysql-workbench/libraries/workbench/wizard_progress_page_widget.py", line 192, in thread_work 
    self.func() 
    File "/usr/lib/mysql-workbench/modules/migration_schema_selection.py", line 160, in task_reveng 
    self.main.plan.migrationSource.reverseEngineer() 
    File "/usr/lib/mysql-workbench/modules/migration.py", line 332, in reverseEngineer 
    self.state.sourceCatalog = self._rev_eng_module.reverseEngineer(self.connection, self.selectedCatalogName, self.selectedSchemataNames, self.state.applicationData) 
SystemError: ProgrammingError("('42P01', '[42P01] ERROR: no existe la relaci\xc3\xb3n \xc2\xabpublic.idtipodatos\xc2\xbb;\nError while executing the query (7) (SQLExecDirectW)')"): error calling Python module function DbPostgresqlRE.reverseEngineer 
ERROR: Reverse engineer selected schemata: ProgrammingError("('42P01', '[42P01] ERROR: no existe la relaci\xc3\xb3n \xc2\xabpublic.idtipodatos\xc2\xbb;\nError while executing the query (7) (SQLExecDirectW)')"): error calling Python module function DbPostgresqlRE.reverseEngineer 
Failed 

6.- Se provo con altri tipi di schemi (POINT 4.-) il programma si chiude improvvisamente: Exit(-1)

Questo è tutto, ho provato in diversi modi con MySQL Workbench, che sembrava fantastico, ma purtroppo non ha funzionato.

Qualche idea? Ricorda che l'SQL postgres è all'inizio del post, quindi chiunque può provare la migrazione. Sarò immensamente grato per ogni aiuto ricevuto.

Jesús Redondo.

+4

Bene, questa è una bella storia, ma le soluzioni sono già ben consolidate: fai un dump dello schema e poi dump per tabella in CSV. Converti lo schema in mano e caricalo in MySQL, quindi importa i dati in ogni tabella. Se non ti piace questo approccio, puoi utilizzare strumenti ETL come Pentaho Kettle o Talend Studio per eseguire la migrazione dei dati. Esistono anche strumenti di conversione dello schema, ma in genere costano $. L'unica cosa ** assolutamente garantita di non funzionare ** è semplicemente scaricare il DB e provare a caricarlo in MySQL. –

+1

Sì, volevo solo evitare la conversione dello schema a mano. Come ha commentato Richar Huxton, davvero non capisco PostgreSQL e MySQL abbastanza profondi da farlo correttamente. Ma sinceramente penso di non avere altra possibilità che provarlo. – Jesus

+0

Impossibile rispondere in quanto è chiuso, ma è necessario prima imparare SQL. Se non vuoi, prova uno degli altri strumenti automatici: https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL o prova [Pentaho Kettle] (http://community.pentaho.com/projects/ integrazione dei dati/). – Chloe

risposta

2

Questo sarà difficile per te, ho paura.

  1. Non mi sembra di capire PostgreSQL
  2. Non mi sembra di capire MySQL
  3. Non mi sembra di capire lo schema del database

Se questo è il vostro intero schema , copialo nel tuo editor di testo di scelta e aggiornalo manualmente.

Cosa non si può dire della colonna "oid", ma non ha nulla a che fare con una chiave primaria (forse un oggetto grande o un "blob"?).

Il preventivo è utilizzato solo nel caso in cui è stato utilizzato il maiuscolo identifica LikeThis. Di default SQL non fa distinzione tra maiuscole e minuscole.

Mysql non ha un tipo "booleano" reale, probabilmente si vorrà utilizzare bit o tinyint.

La chiamata nextval() nello schema è di generare ID univoci. Questa è una cosa di PostgreSQL e non è supportata in MySQL - probabilmente vorrai un modificatore auto_increment.

Tra questi suggerimenti e l'output di pg2mysql che dovrebbe iniziare.

+0

Grazie, cercherò di analizzare lo schema e passare i dati da uno a un altro database in formato CSV per renderlo scrivibile. Non so perché l'oid è usato lì.Non ho progettato lo schema del database, ma temo che il designer non ne sia a conoscenza :) Grazie per le citazioni e suggerimenti booleani! – Jesus

+1

@Jesus "oid" è una colonna interna nelle vecchie tabelle ('WITH OIDS') PostgreSQL. È ancora usato nei cataloghi di sistema ma non molto altro normalmente. È molto improbabile che lo si utilizzi per qualsiasi cosa e in genere può essere omesso quando si eseguono migrazioni di dati. "oid" è "identificatore di oggetto". Vedi i documenti di PostgreSQL per tutti i dettagli. –