将MySQL转储导入PostgreSQL数据库

Pal*_*nan 52 mysql postgresql

如何从MySQL导入"xxxx.sql"转储到PostgreSQL数据库?

小智 41

这个问题有点旧,但几天前我正在处理这种情况并找到了pgloader.io.

这是迄今为止最简单的方法,您需要安装它,然后使用以下3行运行一个简单的lisp脚本(script.lisp):

/* 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
Run Code Online (Sandbox Code Playgroud)

之后,你的postgresql DB将拥有你在MySQL SB中拥有的所有信息.

另外,请确保编译pgloader,因为在本文发布时,安装程​​序有一个错误.(版本3.2.0)

  • 我很高兴惊讶.工作顺利.在mac:brew install pgloader; 命令:pgloader mysql:// root @ localhost/mydb postgresql:/// otherdb (7认同)

Mik*_*ll' 23

不要指望在没有编辑的情况下工作.也许很多编辑.

mysqldump有一个兼容性参数,--compatible=name其中"name"可以是"oracle"或"postgresql",但这并不能保证兼容性.我认为像ANSI_QUOTES这样的服务器设置也有一些效果.

如果您包含用于创建转储的完整命令,以及您获得的任何错误消息,而不是仅仅说"对我没用",那么您将获得更多有用的帮助.

  • 这并没有回答标题中提出的问题。这展示了如何创建 postgresql 转储,而不是如何将 mysql 转储导入 postgres。 (3认同)
  • 它确实如此 - 它解释了如何制作 mysql 转储,更容易在 postgresql 中导入。有关更多信息,请参阅:https://en.wikibooks.org/wiki/Converting_MySQL_to_PostgreSQL (3认同)
  • [SQL dump 的常用方法](http://en.wikibooks.org/wiki/Converting_MySQL_to_PostgreSQL#Common_way_with_SQL_dump) (2认同)

kyo*_*kyo 14

Mac OS X.

brew update && brew install pgloader

pgloader mysql://user@host/db_name postgresql://user@host/db_name
Run Code Online (Sandbox Code Playgroud)

  • 这对我有用 `pgloader --no-ssl-cert-verification mysql://user:password@host/db_name "postgresql://user@host/db_name?sslmode=allow&password=<yourpassword>"` (2认同)

Wol*_*lph 10

我找到的最快(也是最完整)的方法是使用Kettle.这也将生成所需的表,转换索引和其他所有内容.在mysqldump兼容性说法并不能正常工作.

步骤:

  1. http://kettle.pentaho.org/下载Pentaho ETL (社区版)

  2. 解压缩并运行Pentaho(spoon.sh/spoon.bat取决于unix/windows)

  3. 创建一份新工作

  4. 为MySQL源创建数据库连接(工具 - >向导 - >创建数据库连接)

  5. 为PostgreSQL源创建数据库连接(如上所述)

  6. 运行Copy Tables向导(工具 - >向导 - >复制表)

  7. 运行这份工作

  • 你是光剑军人..该死的自动纠正! (2认同)

jib*_*iel 10

适用于2015年以上的Google员工.
我整天浪费在这上面,并想总结一下.

我试着在描述的所有解决方案,文章由亚历Cotioras(这是充满了绝望).在提到的所有解决方案中,只有一个为我工作.

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

但仅此一点是不行的.当您要导入新转换的转储文件时:

# \i ~/Downloads/mysql-postgresql-converter-master/dump.psql 
Run Code Online (Sandbox Code Playgroud)

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',
Run Code Online (Sandbox Code Playgroud)

因此,您必须根据表手动修复这些类型.

简而言之就是:

tinyint(2) -> smallint  
mediumint(7) -> integer
# etc.
Run Code Online (Sandbox Code Playgroud)

你可以使用regex任何很酷的编辑器来完成它.

MacVim+ Substitute:

:%s!tinyint(\w\+)!smallint!g
:%s!mediumint(\w\+)!integer!g
Run Code Online (Sandbox Code Playgroud)


小智 9

Mac/Win

下载 Navicat 试用版 14 天(我不明白 1300 美元)- 完整的企业包:

连接数据库 mysql 和 postgres

菜单-工具-数据传输

在第一个屏幕上连接两个数据库。虽然仍然在此屏幕上,但有一个常规/选项 - 在右侧的选项检查下检查 - 错误时继续 * 请注意,您可能想取消检查左侧的索引和键..您可以在 postgres 中轻松地重新分配它们。

至少将数据从 MySQL 导入 Postgres!

希望这可以帮助!


Fre*_*tte 6

你可以使用pgloader.

sudo apt-get install pgloader
Run Code Online (Sandbox Code Playgroud)

使用:

pgloader mysql://user:pass@host/database postgresql://user:pass@host/database
Run Code Online (Sandbox Code Playgroud)

  • 您是正确的,截至2018年12月,此问题已解决。 (2认同)

Mat*_*aun 6

pgloader

获取最新版本的pgloader; Debian Jessie 提供的版本(截至 2019 年 1 月 27 日)是 3.1.0 并且不会工作,因为pgloader会出错

Can not find file mysql://...
Can not find file postgres://...
Run Code Online (Sandbox Code Playgroud)

访问 MySQL 源码

首先,确保您可以mysqld使用以下命令在运行 MySQL 的服务器上建立连接

telnet theserverwithmysql 3306
Run Code Online (Sandbox Code Playgroud)

如果那失败了

名称或服务未知

登录theserverwithmysql并编辑mysqld. 如果您不知道配置文件在哪里,请使用find / -name mysqld.cnf.

在我的情况下,我不得不改变这一行 mysqld.cnf

telnet theserverwithmysql 3306
Run Code Online (Sandbox Code Playgroud)

bind-address    = *
Run Code Online (Sandbox Code Playgroud)

请注意,允许从所有地址访问您的 MySQL 数据库可能会带来安全风险,这意味着您可能希望在数据库迁移后将该值更改回来。

mysqld.cnf通过重新启动使更改生效mysqld

准备 Postgres 目标

假设您已登录运行 Postgres 的系统,请使用以下命令创建数据库

createdb databasename
Run Code Online (Sandbox Code Playgroud)

Postgres 数据库的用户必须有足够的权限来创建模式,否则你会遇到

数据库 databasename 的权限被拒绝

打电话时pgloader。尽管用户有权根据psql > \du.

您可以确保psql

GRANT ALL PRIVILEGES ON DATABASE databasename TO otherusername;
Run Code Online (Sandbox Code Playgroud)

同样,如果您将所有这些特权留给 user ,这可能是特权过度杀伤,因此存在安全风险otherusername

迁移

最后,命令

pgloader mysql://theusername:thepassword@theserverwithmysql/databasename postgresql://otherusername@localhost/databasename
Run Code Online (Sandbox Code Playgroud)

在运行 Postgres 的机器上执行应该产生以这样的行结尾的输出:

Total import time          ?     877567   158.1 MB       1m11.230s
Run Code Online (Sandbox Code Playgroud)


Nic*_*y77 5

我有这个bash脚本来迁移数据,它不创建表,因为它们是在迁移脚本中创建的,所以我只需要转换数据.我使用表的列表不从migrationssessions表导入数据.这是它,刚刚测试过:

#!/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
Run Code Online (Sandbox Code Playgroud)

您将收到许多警告,您可以放心地忽略这样:

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'.
Run Code Online (Sandbox Code Playgroud)