Импортировать дамп MySQL в базу данных PostgreSQL - PullRequest
50 голосов
/ 24 марта 2011

Как я могу импортировать дамп "xxxx.sql" из MySQL в базу данных PostgreSQL?

Ответы [ 16 ]

37 голосов
/ 25 февраля 2015

Этот вопрос немного стар, но несколько дней назад я имел дело с этой ситуацией и обнаружил pgloader.io .

Это, безусловно, самый простой способ сделать это, вынеобходимо установить его, а затем запустить простой сценарий lisp ( script.lisp ) со следующими 3 строками:

/* content of the script.lisp */
LOAD DATABASE
FROM mysql://dbuser@localhost/dbname
INTO postgresql://dbuser@localhost/dbname;


/*run this in the terminal*/
pgloader script.lisp

И после этого ваша БД postgresql будет иметь всю информациючто у вас было в вашем MySQL SB.

В дополнение к этому, убедитесь, что вы скомпилировали pgloader, поскольку на момент написания этого поста в установщике была ошибка.(версия 3.2.0)

22 голосов
/ 24 марта 2011

Не ожидайте, что это будет работать без редактирования.Возможно, много редактирования.

mysqldump имеет аргумент совместимости , --compatible=name, где «name» может быть «oracle» или «postgresql», но это не гарантирует совместимость.Я думаю, что настройки сервера, такие как ANSI_QUOTES, тоже имеют некоторый эффект.

Здесь вы получите более полезную помощь, если включите полную команду, использованную для создания дампа, вместе с любыми сообщениями об ошибках, которые вы получили вместо того, чтобы просто«У меня ничего не получалось».

12 голосов
/ 15 июня 2016

Mac OS X

brew update && brew install pgloader

pgloader mysql://user@host/db_name postgresql://user@host/db_name
10 голосов
/ 03 сентября 2015

Для тех пользователей Google, которые находятся в 2015 году + .
Я потратил на это весь день и хотел бы подвести итоги.

Iперепробовал все решения, описанные в этой статье Александру Котиораса (которая полна отчаяния).Из всех упомянутых решений у меня сработало только одно.

- lanyrd / mysql-postgresql-converter @ github.com (Python)

Но это одно победило 'т делатьКогда вы будете импортировать ваш новый преобразованный файл дампа:

# \i ~/Downloads/mysql-postgresql-converter-master/dump.psql 

PostgreSQL расскажет вам о запутанных типах из MySQL:

psql:/Users/jibiel/Downloads/mysql-postgresql-converter-master/dump.psql:381: ERROR:  type "mediumint" does not exist
LINE 2:     "group_id" mediumint(8)  NOT NULL DEFAULT '0',

Так что вам придетсяисправьте эти типы вручную согласно этой таблице.

Вкратце это:

tinyint(2) -> smallint  
mediumint(7) -> integer
# etc.

Вы можете использовать regex и любой классный редактор, чтобы сделать это.

MacVim + Substitute:

:%s!tinyint(\w\+)!smallint!g
:%s!mediumint(\w\+)!integer!g
10 голосов
/ 24 марта 2011

Самый быстрый (и наиболее полный) способ, который я нашел, - это использование чайника.Это также будет генерировать необходимые таблицы, конвертировать индексы и все остальное.Аргумент совместимости mysqldump работает , а не .

Шаги:

  1. Скачать Pentaho ETL с http://kettle.pentaho.org/ (версия для сообщества)

  2. Распаковать и запустить Pentaho (spoon.sh/spoon.bat в зависимости от unix / windows)

  3. Создать новую работу

  4. Создание подключения к базе данных для источника MySQL (Инструменты -> Мастер -> Создать подключение к базе данных)

  5. Создание подключения к базе данных для источника PostgreSQL (каквыше)

  6. Запустите мастер Copy Tables (Инструменты -> Мастер -> Копировать таблицы)

  7. Запустите задание

7 голосов
/ 24 марта 2011
6 голосов
/ 23 июня 2017

Вы можете использовать pgloader.

sudo apt-get install pgloader

Использование:

pgloader mysql://user:pass@host/database postgresql://user:pass@host/database
5 голосов
/ 11 июля 2015

У меня есть скрипт bash для переноса данных, он не создает таблицы, потому что они создаются в скриптах переноса, поэтому мне нужно только преобразовать данные.Я использую список таблиц, чтобы не импортировать данные из таблиц migrations и sessions.Вот оно, только что протестировано:

#!/bin/sh

MUSER="root"
MPASS="mysqlpassword"
MDB="origdb"
MTABLES="car dog cat"
PUSER="postgres"
PDB="destdb"

mysqldump -h 127.0.0.1 -P 6033 -u $MUSER -p$MPASS --default-character-set=utf8 --compatible=postgresql --skip-disable-keys --skip-set-charset --no-create-info --complete-insert --skip-comments --skip-lock-tables $MDB $MTABLES > outputfile.sql

sed -i 's/UNLOCK TABLES;//g' outputfile.sql
sed -i 's/WRITE;/RESTART IDENTITY CASCADE;/g' outputfile.sql
sed -i 's/LOCK TABLES/TRUNCATE/g' outputfile.sql
sed -i "s/'0000\-00\-00 00\:00\:00'/NULL/g" outputfile.sql
sed -i "1i SET standard_conforming_strings = 'off';\n" outputfile.sql
sed -i "1i SET backslash_quote = 'on';\n" outputfile.sql
sed -i "1i update pg_cast set castcontext='a' where casttarget = 'boolean'::regtype;\n" outputfile.sql
echo "\nupdate pg_cast set castcontext='e' where casttarget = 'boolean'::regtype;\n" >> outputfile.sql

psql -h localhost -d $PDB -U $PUSER -f outputfile.sql

Вы получите множество предупреждений, которые можно смело игнорировать, например:

psql:outputfile.sql:82: WARNING:  nonstandard use of escape in a string literal
LINE 1: ...,(1714,38,2,0,18,131,0.00,0.00,0.00,0.00,NULL,'{\"prospe...
                                                         ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
4 голосов
/ 24 марта 2011

Невозможно импортировать дамп Oracle (двоичный) в PostgreSQL.

Если дамп MySQL находится в простом формате SQL, вам необходимо отредактировать файл, чтобы сделать синтаксис правильным для PostgreSQL (напримерубрать нестандартные кавычки, убрать определение движка для операторов CREATE TABLE, настроить типы данных и многое другое)

2 голосов
/ 27 января 2019

С pgloader

Получить последнюю версию pgloader;тот, который предоставляется Debian Jessie (по состоянию на 2019-01-27), равен 3.1.0, и не будет работать , поскольку pgloader приведет к ошибке при

Can not find file mysql://...
Can not find file postgres://...

Доступе к источнику MySQL

Сначала убедитесь, что вы можете установить соединение с mysqld на сервере под управлением MySQL, используя

telnet theserverwithmysql 3306

Если это не удается с

Имя или службанеизвестно

Войдите в систему theserverwithmysql и отредактируйте файл конфигурации mysqld.Если вы не знаете, где находится файл конфигурации, используйте find / -name mysqld.cnf.

. В моем случае мне пришлось изменить эту строку с mysqld.cnf

# By default we only accept connections from localhost
bind-address    = 127.0.0.1

на

bind-address    = *

Помните, что разрешение доступа к базе данных MySQL со всех адресов может представлять угрозу безопасности, означая, что вы, вероятно, захотите изменить это значение обратно после переноса базы данных.

Сделайте изменения в mysqld.cnf эффективнымиперезапустив mysqld.

Подготовка цели Postgres

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

createdb databasename

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

для базы данных с именем

при вызове pgloader.Я получил эту ошибку, хотя пользователь имел право создавать базы данных в соответствии с psql > \du.

Вы можете убедиться в этом в psql:

GRANT ALL PRIVILEGES ON DATABASE databasename TO otherusername;

Опять же, это может бытьИзбыток привилегий и, следовательно, риск для безопасности, если вы оставите все эти привилегии у пользователя otherusername.

Миграция

Наконец, команда

pgloader mysql://theusername:thepassword@theserverwithmysql/databasename postgresql://otherusername@localhost/databasename

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

Total import time          ✓     877567   158.1 MB       1m11.230s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...