MySQL數據全量導入PG的方法

下面會用到一個perl腳原本作數據格式的轉換: https://github.com/ahammond/mysql2pgsql
html


1 導出mysql的數據mysql

# 導出結構
mysqldump bx_cmdb_37 --master-data=2  --skip-opt --default-character-set=utf8 --no-data --compact --skip-dump-date --set-gtid-purged=OFF > /tmp/struct.sql

# 導出數據
mysqldump bx_cmdb_37 --master-data=2  --skip-opt --default-character-set=utf8 --no-create-info  --compact --skip-dump-date --set-gtid-purged=OFF > /tmp/data.sql


2 使用perl腳本,將上一步驟中的2個sql轉爲pg格式的,命令相似以下git

下載 到 /root/目錄下
chmod +x /root/mysql2pgsql.perl

cd /tmp/

/root/mysql2pgsql.perl struct.sql struct_pg.sql
/root/mysql2pgsql.perl data.sql data_pg.sql

sed -i.bak 's# int # bigint #g' struct_pg.sql
sed -i.bak 's# smallint # int #g' struct_pg.sql
sed -i.bak 's# datetime(6) # timestamp #g' struct_pg.sql

作上面的幾個sed替換操做的緣由是: 這裏我遇到幾個問題(我下面的操做處理的不夠優雅):
1 部分int unsigned的數據,perl腳本給轉成了int signed,致使範圍縮小了,後續插入數據可能溢出,所以我這裏將所有建表語句中的int 替換爲bigint
2 注意 datetime的列,在PG裏面咱們須要人工改爲 timestamp 類型的,否則會報錯
3 smallint 都改爲 int類型,防止到PG中插入溢出




3 將文件導入到PG庫中(注意可能有些不兼容的報錯)github

chown postgres.postgres /tmp/bbb.sql
psql --port 5434 -d testdb -f /tmp/bbb.sql   便可導入到PG的testdb庫中




4 後續的增量數據同步,能夠使用 go-mysql-postgresql來進行(下一篇blog介紹用法)sql

咱們 導出data.sql 的時候, 已經帶上 master-data了,很容易就知道最後複製的binlog位置。



## 參考  http://zhansq.cn/article/18-08-09/43.htmlbash

相關文章
相關標籤/搜索