MySQL 不落地迁移、导入 PostgreSQL - 推荐 rds_dbsync

简介: 标签PostgreSQL , MySQL , rds_dbsync , mysql , mysqldump , copy , mysql_fdw背景将MySQL数据不落地的方式导入PostgreSQL。

标签

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


背景

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

1 rds_dbsync (推荐使用)

《MySQL准实时同步到PostgreSQL, Greenplum的方案之一 - rds_dbsync》

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

用法

以CentOS 7.x x64为例。

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

1、pgsql

《PostgreSQL on Linux 最佳部署手册 - 珍藏级》

《PostgreSQL 10 on ECS 实施 流复制备库镜像+自动快照备份+自动备份验证+自动清理备份与归档 - 珍藏级》

《PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户) - 珍藏级》

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

https://dev.mysql.com/downloads/repo/yum/

https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/

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 <table list file> -j <thread number> -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  

https://github.com/aliyun/rds_dbsync/blob/master/doc/mysql2pgsql_ch.md

https://github.com/aliyun/rds_dbsync/releases

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打通隧道进行互相访问。

《使用 ssh -R 建立反向/远程TCP端口转发代理》

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

《PostgreSQL 10 + PostGIS + Sharding(pg_pathman) + MySQL(fdw外部表) on ECS 部署指南(适合新用户) - 珍藏级》

https://github.com/EnterpriseDB/mysql_fdw

http://blog.163.com/digoal@126/blog/static/1638770402011111233524987/

http://blog.163.com/digoal@126/blog/static/163877040201493145214445/

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

https://github.com/aliyun/rds_dbsync

https://github.com/EnterpriseDB/mysql_fdw

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
3月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS费用价格:MySQL、SQL Server、PostgreSQL和MariaDB引擎收费标准
阿里云RDS数据库支持MySQL、SQL Server、PostgreSQL、MariaDB,多种引擎优惠上线!MySQL倚天版88元/年,SQL Server 2核4G仅299元/年,PostgreSQL 227元/年起。高可用、可弹性伸缩,安全稳定。详情见官网活动页。
802 152
|
4月前
|
存储 SQL 关系型数据库
RDS DuckDB技术解析一:当 MySQL遇见列式存储引擎
RDS MySQL DuckDB分析实例以​列式存储与向量化计算​为核心,实现​复杂分析查询性能百倍跃升​,为企业在海量数据规模场景下提供​实时分析能力​,加速企业数据驱动型决策效能。​​
|
4月前
|
存储 运维 关系型数据库
从MySQL到云数据库,数据库迁移真的有必要吗?
本文探讨了企业在业务增长背景下,是否应从 MySQL 迁移至云数据库的决策问题。分析了 MySQL 的优势与瓶颈,对比了云数据库在存储计算分离、自动化运维、多负载支持等方面的优势,并提出判断迁移必要性的五个关键问题及实施路径,帮助企业理性决策并落地迁移方案。
|
3月前
|
SQL 关系型数据库 MySQL
如何将Excel表的数据导入RDS MySQL数据库?
本文介绍如何通过数据管理服务DMS将Excel文件(转为CSV格式)导入RDS MySQL数据库,涵盖建表、编码设置、导入模式选择及审批执行流程,并提供操作示例与注意事项。
|
3月前
|
关系型数据库 MySQL 数据库
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎
阿里云数据库RDS支持MySQL、SQL Server、PostgreSQL和MariaDB引擎,提供高性价比、稳定安全的云数据库服务,适用于多种行业与业务场景。
|
5月前
|
关系型数据库 MySQL Java
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
字节面试: MySQL 百万级 导入发生的 “死锁” 难题如何解决?“2序4拆”,彻底攻克
|
3月前
|
关系型数据库 MySQL 数据库
云时代MySQL:RDS与自建数据库的抉择
在云计算时代,选择合适的数据库部署方案至关重要。本文深入对比了AWS RDS与自建MySQL的优劣,帮助您在控制权、运维成本和业务敏捷性之间找到最佳平衡点。内容涵盖核心概念、功能特性、成本模型、安全性、性能优化、高可用方案及迁移策略,为您提供全面的决策参考。
|
6月前
|
关系型数据库 MySQL 数据库
MySQL数据库上云迁移
本文介绍了将数据库迁移到RDS for Mysql的两种主要方法:停服迁移和不停服迁移。停服迁移适合可短暂中断服务的场景,通过mysqldump或DTS完成;不停服迁移适用于需保持业务连续性的场景,推荐使用DTS实现结构、全量及增量数据迁移。文中详细列出了每种方法的具体操作步骤,帮助企业根据需求选择合适的迁移方案。
244 1
MySQL数据库上云迁移
|
4月前
|
关系型数据库 MySQL 程序员
从自建MySQL到阿里云RDS:程序员的数据库减负革命
如果你正在为自建MySQL数据库的高成本运维发愁,为凌晨三点的主从同步故障告警而崩溃,为开发团队频繁索要新测试库的要求感到窒息——是时候开启一场数据库的自我救赎了。 程序员更需构建"技术敏锐度+工程落地能力+跨域协作"的三维竞争力,通过创建技术组合形成差异化优势。企业应建立持续学习机制,提供AI沙盒环境促进技术转化。

相关产品

  • 云数据库 RDS
  • 云数据库 RDS PostgreSQL 版
  • 云数据库 RDS MySQL 版
  • 推荐镜像

    更多