Подтвердить что ты не робот

Импорт MySQL дампа в базу данных PostgreSQL

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

/* content of the script.lisp */
LOAD DATABASE
FROM mysql://[email protected]/dbname
INTO postgresql://[email protected]/dbname;


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

И после этого у вашей базы данных postgresql будет вся информация, которая была у вас в вашем MySQL SB.

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

Ответ 4

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

Этапы:

  • Загрузить Pentaho ETL из http://kettle.pentaho.org/ (версия сообщества)

  • Разархивируйте и запустите Pentaho (spoon.sh/spoon.bat в зависимости от unix/windows)

  • Создайте новое задание

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

  • Создайте соединение с базой данных для источника PostgreSQL (как указано выше)

  • Запустите мастер Copy Tables (Инструменты → Мастер → Столы копирования)

  • Запуск задания

Ответ 5

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

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

- 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',

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

Короче говоря:

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

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

MacVim + Substitute:

:%s!tinyint(\w\+)!smallint!g
:%s!mediumint(\w\+)!integer!g

Ответ 7

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

sudo apt-get install pgloader

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

pgloader mysql://user:[email protected]/database postgresql://user:[email protected]/database

Ответ 8

У меня есть этот bash script для переноса данных, он не создает таблицы, потому что они созданы в сценариях миграции, поэтому мне нужно только преобразовать данные. Я использую список таблиц, чтобы не импортировать данные из таблиц 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'.

Ответ 9

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

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

Ответ 10

Вот простая программа для создания и загрузки всех таблиц в базе данных mysql (honey) в postgresql. Преобразование типов из mysql является грубым, но легко уточняется. Вам нужно будет обновить индексы вручную:

import MySQLdb
from magic import Connect #Private mysql connect information
import psycopg2

dbx=Connect()
DB=psycopg2.connect("dbname='honey'")
DC=DB.cursor()

mysql='''show tables from honey'''
dbx.execute(mysql); ts=dbx.fetchall(); tables=[]
for table in ts: tables.append(table[0])
for table in tables:
    mysql='''describe honey.%s'''%(table)
    dbx.execute(mysql); rows=dbx.fetchall()
    psql='drop table %s'%(table)
    DC.execute(psql); DB.commit()

    psql='create table %s ('%(table)
    for row in rows:
        name=row[0]; type=row[1]
        if 'int' in type: type='int8'
        if 'blob' in type: type='bytea'
        if 'datetime' in type: type='timestamptz'
        psql+='%s %s,'%(name,type)
    psql=psql.strip(',')+')'
    print psql
    try: DC.execute(psql); DB.commit()
    except: pass

    msql='''select * from honey.%s'''%(table)
    dbx.execute(msql); rows=dbx.fetchall()
    n=len(rows); print n; t=n
    if n==0: continue #skip if no data

    cols=len(rows[0])
    for row in rows:
        ps=', '.join(['%s']*cols)
        psql='''insert into %s values(%s)'''%(table, ps)
        DC.execute(psql,(row))
        n=n-1
        if n%1000==1: DB.commit(); print n,t,t-n
    DB.commit()

Ответ 11

С 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 на theserverwithmysql с помощью 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 пользователя otherusername.

мигрировать

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

pgloader mysql://theusername:[email protected]/databasename postgresql://[email protected]/databasename

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

Total import time          ✓     877567   158.1 MB       1m11.230s

Ответ 12

Как и в большинстве миграций баз данных, на самом деле нет разрезанного и высушенного раствора.

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

  • Типы данных не будут совпадать. Некоторые будут, некоторые не будут. Например, биты SQL Server (boolean) не имеют эквивалента в Oracle.
  • Последовательности первичных ключей будут генерироваться по-разному в каждой базе данных.
  • Внешние ключи будут указывать на ваши новые последовательности.
  • Индексы будут отличаться и, вероятно, нуждаются в настройке.
  • Любые хранимые процедуры должны быть перезаписаны.
  • Schemas. Mysql не использует их (по крайней мере, не так, как я использовал), Postgresql делает. Не ставьте все в общедоступную схему. Это плохая практика, но большинство приложений (Django приходит на ум), которые поддерживают Mysql и Postgresql, попытаются заставить вас использовать общедоступную схему.
  • Перенос данных. Вам нужно будет вставить все из старой базы данных в новую. Это означает, что вы отключите первичные и внешние ключи, вставив данные, а затем включив их. Кроме того, все ваши новые последовательности должны быть reset до самого высокого идентификатора в каждой таблице. Если нет, следующая запись, которая вставлена, завершится с нарушением первичного ключа.
  • Переписывание кода для работы с новой базой данных. Он должен работать, но, вероятно, не будет.
  • Не забывайте о триггерах. Я использую триггеры создания и обновления на большинстве моих таблиц. Каждый db сайтов их немного отличается.

Имейте это в виду. Лучший способ - это, вероятно, написать утилиту преобразования. Счастливого обращения!

Ответ 13

Mac/Win

Загрузите пробную версию Navicat в течение 14 дней (я не понимаю $ 1300) - полный корпоративный пакет:

соедините обе базы данных mysql и postgres

меню - инструменты - передача данных

подключите обе базы данных на этом первом экране. Пока на этом экране есть общие/параметры - под проверкой параметров с правой стороны - продолжить при ошибке * обратите внимание, что вы, вероятно, хотите отменить проверку индекса и клавиш слева.. вы можете легко переназначить их в postgres.

по крайней мере, получить ваши данные из MySQL в Postgres!

надеюсь это поможет!

Ответ 14

Мне пришлось сделать это в последнее время для большого количества больших файлов .sql размером примерно 7 ГБ. Даже VIM беспокоило их редактирование. Лучше всего импортировать .sql в MySql, а затем экспортировать его как csv, который затем можно импортировать в Postgres.

Но экспорт MySQL как csv ужасно медленный, поскольку он запускает запрос select * from yourtable. Если у вас есть большая база данных/таблица, я бы предложил использовать другой метод. Один из способов - написать script, который читает вставки sql по строкам и использует строковое манипулирование, чтобы переформатировать его в инструкции Postgres-compliant, а затем выполнить эти инструкции в Postgres

Ответ 15

Я мог бы копировать таблицы из MySQL в Postgres, используя DBCopy Plugin для SQuirreL SQL Client. Это было не с дампа, а между живыми базами данных.

Ответ 16

Используйте свой файл xxx.sql для настройки базы данных MySQL и используйте FromMysqlToPostrgreSQL. Очень проста в использовании, короткая конфигурация и работает как шарм. Он импортирует вашу базу данных с установленными первичными ключами, внешними ключами и индексами в таблицах. Вы даже можете импортировать данные самостоятельно, если вы установите соответствующий флаг в файле конфигурации.

Инструмент миграции FromMySqlToPostgreSql Анатолия Хайтовича обеспечивает точную миграцию табличных данных, индексов, ПК, FK... Широко использует протокол PostgreSQL COPY.

Смотрите также: Страница Wiki Wiki