Как перенести базу данных из Postgres в MySQL?

9

Здравствуйте, я хочу преобразовать некоторые таблицы из базы данных Postgres в MySQL. В идеале я хотел бы создать script, который преобразует таблицы для PG в MySQL, но я рад, если мы сможем выяснить, как сделать это возможным с помощью сценариев.

Прежде всего, я прочитал аналогичную запись здесь: Перенос базы данных из Postgres в MySQL

Я пробовал предлагаемые там оба решения, но они не сделали трюк.

Важно сказать, что Я хочу перенести структуру и данные.

Но сначала сначала. Вот дамп SQL в базе данных postgres:

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

Когда я импортирую этот файл в базу данных с помощью любого менеджера баз данных, я получаю ничего, кроме ошибок:

Изображение 15189 По какой-то причине парсер отмечает символы между этими символами: ''. Если мы внимательно посмотрим, иногда имена столбцов находятся между '' и другими моментами, WHY?

Я удаляю эти символы вокруг char и снова делаю тот же импорт, но снова появляется другая ошибка:

Изображение 15190

Введите oid? что это? Чтение Я вижу, что это тип, используемый для первичных ключей... В этот момент я решил:

Изображение 15191 Мне было достаточно!

2) Второй подход, я попробую с Mysql Workbench:

Я установил эту функцию в Ubuntu, и я попробовал. Существует возможность переноса баз данных, отлично!

1.- Я ввожу источник и проверяю соединение: Изображение 15192

2.- Затем пункт назначения и проверьте соединение: (эй, эта штука... может работать!:)) Изображение 15193

3.- Следующий экран, все в порядке: Изображение 15194

4.- Теперь меня попросят выбрать схему, я выбираю вариант по умолчанию: Изображение 15195

5.- И я получаю следующую ошибку, проваливаясь в названной точке, "Обратный инженер выбранных схем".

Starting...
Connect to source DBMS...
- Connecting...
Connecting to postgresql@DRIVER=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.- Если я попытаюсь использовать другие типы схем (POINT 4.-), программа внезапно закрывается: Изображение 15196

Что все, я пробовал это несколькими способами с Mysql Workbench, что казалось большим, но, к сожалению, ничего не работало.

Любые идеи? Помните, что postgres SQL находится в начале сообщения, поэтому каждый может попробовать выполнить миграцию. Я буду очень благодарен за любую полученную помощь.

Хесус Редондо.

  • 5
    Что ж, это хорошая история, но решения уже хорошо известны: создайте дамп схемы, а затем дампы для каждой таблицы в CSV. Вручную преобразуйте схему и загрузите ее в MySQL, затем импортируйте данные в каждую таблицу. Если вам не нравится такой подход, вы можете использовать инструменты ETL, такие как Pentaho Kettle или Talend Studio, чтобы выполнить миграцию данных. Инструменты преобразования схемы также существуют, но обычно стоят $. Единственное, что гарантированно не работает, - это просто сбросить БД и попытаться загрузить ее в MySQL.
  • 1
    Да, я просто хотел избежать преобразования схемы вручную. Как прокомментировал Ричар Хакстон, я действительно недостаточно глубоко понимаю PostgreSQL и MySQL, чтобы делать это правильно. Но, честно говоря, я думаю, что у меня нет другого шанса, кроме как попробовать его.
Показать ещё 1 комментарий
Теги:
migration

1 ответ

2

Это будет сложно для вас, я боюсь.

  • Вы, кажется, не понимаете PostgreSQL
  • Вы, кажется, не понимаете MySQL
  • Кажется, вы не понимаете схему своей базы данных.

Если это ваша целая схема, просто скопируйте ее в свой текстовый редактор и вручную обновите.

Какой столбец "oid" используется для того, что я не мог сказать, но это не связано с первичным ключом (возможно, с большим объектом или "блобом"?).

Цитата используется только там, где вы использовали смешанный случай, идентифицирующий LikeThis. По умолчанию SQL нечувствителен к регистру.

Mysql не имеет реального "булева" типа, вы, вероятно, захотите использовать bit или tinyint.

Вызов nextval() в схеме должен генерировать уникальные идентификаторы. Это вещь PostgreSQL и не поддерживается в MySQL - вам, вероятно, понадобится модификатор auto_increment.

Между этими советами и выходом pg2mysql, который должен вас запустить.

  • 0
    Спасибо, я постараюсь проанализировать схему и передать данные из одной базы данных в другую в формате CSV, чтобы сделать ее пригодной для сценариев. Я не могу сказать вам, почему там используется масло. Я не проектировал схему базы данных, но, боюсь, дизайнер не знал ни того, ни другого :) Спасибо за цитаты и логические советы!
  • 1
    @Jesus "oid" - это внутренний столбец в старых ( WITH OIDS ) таблицах PostgreSQL. Он по-прежнему используется в системных каталогах, но не так, как обычно. Маловероятно, что вы используете его для чего-либо, и его обычно можно опустить при переносе данных. «oid» - это «идентификатор объекта». Смотрите документацию PostgreSQL для всех деталей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню