博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 不落地迁移、导入 PostgreSQL - 推荐 rds_dbsync
阅读量:5852 次
发布时间:2019-06-19

本文共 4689 字,大约阅读时间需要 15 分钟。

标签

PostgreSQL , MySQL , rds_dbsync , mysql , mysqldump , copy , mysql_fdw


背景

将MySQL数据不落地的方式导入PostgreSQL。

1 rds_dbsync (推荐使用)

这个效率最高,支持不落地,支持流式导入,支持单表并发(通过配置文件,写WHERE条件,拆成多个并发导同一张表)。

用法

以CentOS 7.x x64为例。

mysql2pgsql已打包所有依赖包,可以不安装pgsql和mysql。不过你如果想连接数据库做一些管理工作、或者排错等,还是有必要安装一下。

1、pgsql

su - digoal  vi .bash_profile    export PS1="$USER@`/bin/hostname -s`-> "  export PGPORT=1921  export PGDATA=/data01/pg/pg_root$PGPORT  export LANG=en_US.utf8  export PGHOME=/home/digoal/pgsql11  export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH  export PATH=$PGHOME/bin:$PATH:.  export DATE=`date +"%Y%m%d%H%M"`  export MANPATH=$PGHOME/share/man:$MANPATH  export PGHOST=$PGDATA  export PGUSER=postgres  export PGDATABASE=postgres  alias rm='rm -i'  alias ll='ls -lh'  unalias vi

2、mysql

su - root  vi /etc/yum.repos.d/mysql.repo    [mysql57-community]  name=MySQL 5.7 Community Server  baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/  enabled=1  gpgcheck=0  gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
yum install -y mysql-community-server.x86_64 mysql-community-devel.x86_64

3、rds_dbsync

详细配置文档参考

./mysql2pgsql --help  ignore copy error count 0 each table  Unsupported option: -Usage: -l 
-d -n -f -s -b -h -l specifies a file with table listed; -j specifies number of threads to do the job; -d means get DDL only without fetching data; -n means no partion info in DDLs; -f means taking first column as distribution key; -s specifies the target schema; -b specifies the buffer size in KB used to sending copy data to target db, the default is 0
-j

wget https://github.com/aliyun/rds_dbsync/files/1555186/mysql2pgsql.bin.el7.20171213.zip    unzip mysql2pgsql.bin.el7.20171213.zip

4、rds_dbsync 将mysql迁移到pgsql

确保执行mysql2pgsql的机器,可以同时连接到mysql, pgsql.

如果无法直接互联,可以使用SSH打通隧道进行互相访问。

1、配置my.cfg文件,源(mysql)、目标(pgsql)

cd mysql2pgsql.bin.el7.20171213    cd bin      vi my.cfg    [src.mysql]  host = "数据库IP"  port = "数据库PORT"  user = "数据库user"  password = "数据库user密码"  db = "数据库名"  encodingdir = "share"  encoding = "utf8"    [desc.pgsql]  connect_string = "host=127.0.0.1 port=1921 dbname=postgres user=postgres password=pgsql"  target_schema = "public"

如果postgresql在本地,可以使用unix socket连接,导入性能比tcp要快一点。例如

connect_string = "host=/tmp dbname=postgres port=1921 user=postgres password=pgsql"

unix socket dir配置可从配置文件读取

postgres=# show unix_socket_directories ;   unix_socket_directories   -------------------------   /tmp,.  (1 row)

2、生成mysql 转换为pgsql 的建表 DDL

./mysql2pgsql -d > ddl.sql

3、执行输出的DDL文件

在pgsql对应的数据库中,执行第二步生成的DDL语句,创建目标表。

psql -f ./ddl.sql -1

如果有问题,需要手工修复一下。

迁移例子

1、全量迁移

cd mysql2pgsql.bin.el7.20171213/bin    nohup ./mysql2pgsql >./load.log 2>&1 &

2、选择性迁移

如果不想迁移所有表的数据,或者某些表只想迁移部分数据,可以写配置文件。

2.1、甚至可以多个源写入单个表,例如多个MYSQL节点数据,汇入单个PG节点。

2.2、如果源表与PG的目标表名字不一样,可以在配置文件中映射表名。(冒号分隔:第一列为mysql里面的表名,第二列为MYSQL里面的表名,或者QUERY)

vi lo.txt    tbl1  tbl2 : select * from tbl_from_mysql where id<10000;  tbl2 : select * from tbl_from_mysql where id >= 100000 and id< 10000000;  tbl3 : tbl_from_mysql_1  tbl3 : tbl_from_mysql_2

然后执行

cd mysql2pgsql.bin.el7.20171213/bin    nohup ./mysql2pgsql -l ./lo.txt >./load.log 2>&1 &

3、并行迁移

默认为5个迁移线程操作(每个线程COPY一张表),通过-j参数指定。

cd mysql2pgsql.bin.el7.20171213/bin    nohup ./mysql2pgsql -l ./lo.txt -j 8 >./load.log 2>&1 &

4、单表如何支持并行迁移

单表,通过where条件分段,可以实现单表的并行迁移(但是几个SQL分开执行,他们的SNAPSHOT不一样,不满足全局一致性)

vi lo.txt    tbl2 : select * from tbl_from_mysql where id < 1000000;  tbl2 : select * from tbl_from_mysql where id >= 1000000 and id < 2000000;  tbl2 : select * from tbl_from_mysql where id >= 2000000 and id < 3000000;  tbl2 : select * from tbl_from_mysql where id >= 3000000;
cd mysql2pgsql.bin.el7.20171213/bin    nohup ./mysql2pgsql -l ./lo.txt -j 4 >./load.log 2>&1 &

2 mysql_fdw

3 mysql

通过管道导入

export PGHOST=  export PGPORT=  export PGDATABASE=  export PGUSER=  export PGPASSWORD=    nohup mysql -C -h主机 -P端口 -u用户 -p密码 库 -B -e "select * from 表" | psql -c "copy 表 from stdin with  (format csv, HEADER true, null 'NULL', DELIMITER E'\t')" > /dev/null 2>&1 &

如果表很大,可能OOM,因为需要将数据完全HOLD到mysql客户端后,才开始输出。暂不清楚mysql客户端有没有流式输出的功能。

4 mysqldump

通过管道导入

export PGHOST=  export PGPORT=  export PGDATABASE=  export PGUSER=  export PGPASSWORD=    mysqldump 库名 -t -h主机 -P端口 -u用户 -p密码 --no-create-db --skip-quote-names --skip-add-locks --skip-lock-tables --skip-tz-utc -y --default-character-set=UTF8 -C --compact --compatible=postgresql --tables 表 | psql -f - >/dev/null 2>&1 &

如果在mysql服务器上运行,可以dump CSV格式。

MySQL没有像PostgreSQL这样的COPY to stdout或COPY from stdin这样的COPY协议,只有服务端COPY。

mysqldump有一些格式问题(即使使用--compatible=postgresql),可能导致数据导入到PG时出错。

参考

man mysql

man mysqldump

转载地址:http://ejpjx.baihongyu.com/

你可能感兴趣的文章
jQuery插件开发详细教程
查看>>
jquery通过ajax提交form
查看>>
C# Dictionary通过value获取对应的key值[转发]
查看>>
SSL工作原理
查看>>
《世界如此险恶,你要内心强大》读书笔记(一)
查看>>
基于bootstrup3全屏宽度的响应式jQuery幻灯片特效
查看>>
Hierachy Viewer 使用 monitor命令
查看>>
Jquery利用ajax调用asp.net webservice的各种数据类型(总结篇)
查看>>
买了一个 站立式办公 桌子。
查看>>
SharePoint 2013 搭建负载均衡(NLB)
查看>>
分享到微信、微博、QQ空间、QQ微博
查看>>
makefile高级用法--使用函数
查看>>
SimpleDateFormat使用特定的解释
查看>>
常见英文地址表达方法
查看>>
[CareerCup] 1.8 String Rotation 字符串的旋转
查看>>
高效开发Android App的10个建议
查看>>
[Oracle] - 性能优化工具(3) - ADDM
查看>>
GoldenGate组态(四)它veridata组态
查看>>
实习20天
查看>>
[转载][资料].计算机视觉、机器学习相关领域论文和源代码大集合
查看>>