MySQL数据库迁移到PostgreSQL
2767 点击·0 回帖
![]() | ![]() | |
![]() | 查了不少资料,也尝试了一些,最后采用的办法如下: 1. 导出mysql表定义(无数据) mysqldump --no-data [dbname] >dbdef.sql 2. 使用mysql2postgres把脚本转换为pgsql 3. 上面生成的脚本还不一定很完美,可以尝试导入pgsql,调试错误并手动修改之。我遇到的问题就只有一个,mysql列定义中的zerofill需要手工去掉。一些unsinged定义会生成constraint,如果不需要可以去掉。另外,trigger都有问题,只能后面手工重建 4. 导出mysql数据: mysqldump -v -nt --complete-insert=TRUE --compact --no-create-info --skip-quote-names [dbname] >dbdata.sql 老一些版本的pgsql如果不支持批量插入的话还需要加上--extended-insert=FALSE,这个性能损失巨大。 5. 转义符 mysql默认字符串里的'\'是转义符,而pgsql默认不是,修改postgresql.conf: backslash_quote = on escape_string_warning = off standard_conforming_strings = off 数据导入完成后可以改回默认值。 5. pgsql里导入表定义和数据 psql -d [dbname] <dbdef.sql psql -d [dbname] <dbdata.sql 6. 重建trigger 7. 自增主键(字段)的处理 由于导入数据时此字段都是有值的,所以pgsql里面seq并不会增加,可以用如下语句设置自增列的当前值: SELECT setval('sample_id_seq',max(id)) from sample; 最后,如果数据量大,导入时考虑性能可以先把主键、索引、约束都去掉,导入完成后再加上。另外,psql客户端从管道导入数据似乎不够快,可以用tcp方式psql -h localhost ,还有一些为大数据量导入优化的参数,大概列一下: autovacuum = off wal_level = minimal archive_mode = off full_page_writes = off fsync = off checkpoint_segments = 50 checkpoint_timeout = 1h maintenance_work_mem视内存情况尽量大点 | |
![]() | ![]() |