小智 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)
Mik*_*ll' 23
不要指望在没有编辑的情况下工作.也许很多编辑.
mysqldump有一个兼容性参数,--compatible=name其中"name"可以是"oracle"或"postgresql",但这并不能保证兼容性.我认为像ANSI_QUOTES这样的服务器设置也有一些效果.
如果您包含用于创建转储的完整命令,以及您获得的任何错误消息,而不是仅仅说"对我没用",那么您将获得更多有用的帮助.
kyo*_*kyo 14
brew update && brew install pgloader
pgloader mysql://user@host/db_name postgresql://user@host/db_name
Run Code Online (Sandbox Code Playgroud)
Wol*_*lph 10
我找到的最快(也是最完整)的方法是使用Kettle.这也将生成所需的表,转换索引和其他所有内容.在mysqldump兼容性说法并不能正常工作.
步骤:
从http://kettle.pentaho.org/下载Pentaho ETL (社区版)
解压缩并运行Pentaho(spoon.sh/spoon.bat取决于unix/windows)
创建一份新工作
为MySQL源创建数据库连接(工具 - >向导 - >创建数据库连接)
为PostgreSQL源创建数据库连接(如上所述)
运行Copy Tables向导(工具 - >向导 - >复制表)
运行这份工作
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!
希望这可以帮助!
你可以使用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)
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)
首先,确保您可以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 的系统,请使用以下命令创建数据库
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)
我有这个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
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)
| 归档时间: |
|
| 查看次数: |
70355 次 |
| 最近记录: |