2013-04-24 6 views
9

हैलो, मैं कुछ टेबल को पोस्टग्रेज़ डेटाबेस से MySQL में कनवर्ट करना चाहता हूं। आदर्श रूप में मैं एक ऐसी स्क्रिप्ट बनाना चाहूंगा जो पीजी के लिए माईएसक्यूएल में टेबल को कन्वर्ट करेगी, लेकिन मुझे खुशी है कि अगर हम यह समझने में सक्षम हैं कि इसे एक पठनीय तरीके से कैसे संभव बनाया जाए।पोस्टग्रेज़ से MySQL तक डेटाबेस माइग्रेट कैसे करें?

सबसे पहले, मैं एक ऐसी ही पोस्ट यहाँ पढ़ लिया है: Migrate database from Postgres to MySQL

मैं कोशिश की है दोनों समाधान वहाँ प्रस्तावित है, लेकिन वे चाल बनाने नहीं समझे।

यह कहना महत्वपूर्ण है कि मैं संरचना और डेटा माइग्रेट करना चाहता हूं।

-- 
-- 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) सबसे पहले दृष्टिकोण, pG2Mysql का उपयोग करना::

लेकिन सबसे पहली बात, यहां postgres-डेटाबेस के एसक्यूएल डंप है http://www.lightbox.ca/pg2mysql.php सरल और तेजी से (सिद्धांत में): दुर्भाग्य से यह कई त्रुटियाँ हैं जब पार्स करने:

# 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"); 
:

यहाँ दस्तावेज़ लिया गया है

जब मैं किसी डाटाबेस प्रबंधक का उपयोग कर डेटाबेस के लिए इस फ़ाइल को आयात मैं कुछ भी नहीं लेकिन त्रुटियों प्राप्त:

The first error किसी कारण पार्सर के निशान वर्ण उन प्रतीकों के बीच: ''। यदि हम ध्यान से देखते हैं, तो कभी-कभी कॉलम के नाम '' और अन्य समय के बीच होते हैं, क्यों?

मैं चार आसपास के लोगों प्रतीकों हटा सकते हैं और एक ही आयात फिर से करने के लिए आगे बढ़ना है, लेकिन फिर एक और त्रुटि का सामना कर रहा:

The second error

प्रकार OID? वो क्या है? पढ़ना मुझे लगता है कि प्राथमिक कुंजी के लिए उपयोग किया जाने वाला एक प्रकार है ... इस बिंदु पर मैंने फैसला किया:

fuck this shit! मेरे पास पर्याप्त था!

2) दूसरा दृष्टिकोण, मैं Mysql Workbench साथ की कोशिश करेंगे:

मैं Ubuntu में इस सुविधा को स्थापित किया है और मैं इसे एक कोशिश दे दी है। डेटाबेस माइग्रेट करने का एक विकल्प है, बढ़िया!

1.- मैं स्रोत लागू करने और कनेक्शन का परीक्षण: गंतव्य The source connection test

2.- तब और कनेक्शन का परीक्षण: (! हे इस sh-- ..thing काम हो सकता है :)) The destination connection test

3.- अगले स्क्रीन, सब कुछ ठीक है: Things are working

4।- अब मुझे स्कीमा चुनने के लिए कहा गया है, मैं डिफ़ॉल्ट विकल्प का चयन करता हूं: Select the schema

5.- और मुझे निम्नलिखित त्रुटि मिलती है, "रिवर्स इंजीनियर चयनित स्कीमाटा" में विफल रहा है।

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.- अगर मैं स्कीमा (सूत्री 4.) कार्यक्रम अचानक बंद कर देता है किसी अन्य तरह के प्रयास करें: Exit(-1)

बस इतना ही, मैं MySQL कार्यक्षेत्र, साथ में कई तरह से यह कोशिश की है जो बहुत अच्छा लग रहा था, लेकिन दुर्भाग्य से कुछ भी काम नहीं किया।

कोई विचार? याद रखें कि पोस्टग्रेस एसक्यूएल पोस्ट की शुरुआत में है, इसलिए कोई भी माइग्रेशन का प्रयास कर सकता है। प्राप्त किसी भी मदद के लिए मैं बेहद आभारी रहूंगा।

जेसुस रेडोंडो।

+4

अच्छा, यह एक अच्छी कहानी है, लेकिन समाधान पहले से ही अच्छी तरह से स्थापित हैं: एक स्कीमा डंप करें और फिर प्रति-तालिका डंप को सीएसवी पर करें। हाथ स्कीमा को परिवर्तित करें और इसे MySQL में लोड करें, फिर प्रत्येक तालिका में डेटा आयात करें। यदि आपको वह दृष्टिकोण पसंद नहीं है तो आप डेटा माइग्रेशन करने के लिए पेंटाहो केटल या टैलेंड स्टूडियो जैसे ईटीएल उपकरण का उपयोग कर सकते हैं। स्कीमा रूपांतरण उपकरण भी मौजूद हैं, लेकिन आमतौर पर लागत $। एक बात ** पूरी तरह से काम नहीं करने की गारंटी ** ** डीबी को डंप करना और इसे MySQL में लोड करने का प्रयास करना है। –

+1

हां, मैं बस हाथ से स्कीमा रूपांतरण से बचना चाहता था। जैसा कि रिचर ह्यूस्टन ने टिप्पणी की थी कि मैं वास्तव में पोस्टग्रेएसक्यूएल और माईएसक्यूएल को सही तरीके से करने के लिए पर्याप्त गहराई से समझ नहीं पा रहा हूं। लेकिन ईमानदारी से मुझे लगता है कि मेरे पास अन्य मौका नहीं है लेकिन इसे आजमाएं। – Jesus

+0

यह बंद नहीं होने के कारण उत्तर नहीं दे सकता है, लेकिन आपको पहले एसक्यूएल सीखना चाहिए। यदि आप नहीं चाहते हैं, तो अन्य स्वचालित टूल में से किसी एक को आज़माएं: https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL#MySQL या कोशिश करें [पेंटाहो केटल] (http://community.pentaho.com/projects/ डेटा एकीकरण/)। – Chloe

उत्तर

2

यह आपके लिए मुश्किल हो रहा है मुझे डर है।

  1. आप PostgreSQL को समझने के लिए नहीं लग रहे
  2. आप MySQL को समझने के लिए नहीं लग रहे
  3. अगर वह अपने पूरे स्कीमा है आप अपने डेटाबेस स्कीमा

को समझने के लिए नहीं लग रहे , बस इसे अपनी पसंद के टेक्स्ट एडिटर में कॉपी करें और इसे मैन्युअल रूप से अपडेट करें।

क्या मैं कह सकता हूं कि "ओआईडी" कॉलम का उपयोग नहीं किया जा रहा है, लेकिन प्राथमिक कुंजी (शायद एक बड़ी वस्तु या "ब्लॉब"?) से इसका कोई लेना-देना नहीं है।

उद्धरण केवल तभी उपयोग किया जाता है जहां आपने मिश्रित केस का उपयोग किया है LikeThis की पहचान करता है। डिफ़ॉल्ट रूप से एसक्यूएल केस असंवेदनशील है।

माइस्क्ल में वास्तविक "बुलियन" प्रकार नहीं है, तो आप शायद bit या tinyint का उपयोग करना चाहेंगे।

स्कीमा में अगली() कॉल कॉल अद्वितीय आईडी उत्पन्न करना है। यह एक PostgreSQL चीज है और MySQL में समर्थित नहीं है - आप शायद एक auto_increment संशोधक चाहते हैं।

उन युक्तियों और pg2mysql आउटपुट के बीच जो आपको प्रारंभ करना चाहिए।

+0

धन्यवाद, मैं स्कीमा को पार्स करने और इसे स्क्रिप्ट करने योग्य बनाने के लिए CSV प्रारूप में डेटा को एक से दूसरे डेटाबेस में पास करने का प्रयास करूंगा। मैं आपको नहीं बताता कि ओड का उपयोग क्यों किया जाता है।मैंने डेटाबेस स्कीमा डिज़ाइन नहीं किया है, लेकिन मुझे डर है कि डिजाइनर न तो नहीं जानता था :) उद्धरण और बूलियन युक्तियों के लिए धन्यवाद! – Jesus

+1

@ जेसस "ओआईडी" पुराने में एक आंतरिक कॉलम है ('ओड्स के साथ) PostgreSQL टेबल। यह अभी भी सिस्टम कैटलॉग में उपयोग किया जाता है लेकिन सामान्य रूप से अधिक नहीं। यह बहुत ही असंभव है कि आप इसे किसी भी चीज़ के लिए उपयोग करते हैं और डेटा माइग्रेशन करते समय इसे आम तौर पर छोड़ा जा सकता है। "ओआईडी" "ऑब्जेक्ट आइडेंटिफायर" है। सभी विवरणों के लिए PostgreSQL दस्तावेज़ देखें। –

संबंधित मुद्दे