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

标签

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/275369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.net 六大对象之Request、Response

ASP.NET的六大对象&#xff0c;本质上只是 Context 里面的属性&#xff0c;严格上不是对象。 1.Request-->读取客户端在Web请求期间发送的值 2.Response-->封装了页面执行期后返回到Http客户端的输出 3.Server-->提供对服务器上的属性和方法的访问 4.Application-->…

对微型计算机工作影响最小的因数是,(已)保护试题9

继电保护试题9一、填空题(每空1分&#xff0c;共10分)1、交流电的三要素是最大值(幅值)、角频率、初相位。2、三极管实现放大作用的外部条件是发射结正向偏置&#xff0c;集电结反向偏置。3、为了确保方向过电流保护在反向两相短路时不受非故障相电流的影响&#xff0c;保护装置…

1年工作经验8月份大厂面试全记录

大家好&#xff0c;我是若川。最近组织了源码共读活动《1个月&#xff0c;200人&#xff0c;一起读了4周源码》&#xff0c;已经有超50人提交了笔记&#xff0c;群里已经有超1200人&#xff0c;感兴趣的可以点此链接扫码加我微信 ruochuan12本文来自读者AaronKwong 投稿。他参与…

axure ui设计_了解针对UI / UX设计人员的Axure RP 9

axure ui设计Axure is a powerful prototyping software with a lot of history. It has been around for many years and is available for Windows and Mac. Axure gained a lot of functionality over time, and today you can look at Axure as all in one tool. You can b…

如何不让FCKEditor自动添加P标签

使用FCKeditor编辑器的时候&#xff0c;点开里面就会自动添加上<P></P>的标签&#xff0c;按回车也会自动添加上相同的标签修改/include/FCKeditor/fckconfig.js找到FCKConfig.EnterMode p; //p | div | brFCKConfig.ShiftEnterMode br; //p | div | br替换成FCKCo…

Greenplum 优化CASE - 对齐JOIN字段类型,使用数组代替字符串,降低字符串处理开销,列存降低扫描开销...

标签 PostgreSQL , 数组 , 字符串 , 字符串处理 , JOIN , where , 类型一致性 背景 Greenplum通常被用作OLAP&#xff0c;在一些用户使用过程中&#xff0c;可能因为数据结构设计&#xff0c;SQL问题等原因导致性能不佳&#xff0c;虽然通过增加节点可以解决问题&#xff0c;但…

杭州 3~5年 前端面经,高频面试题总结

大家好&#xff0c;我是若川。假期归来&#xff0c;国庆期间没有更文&#xff0c;不用想每天发什么文章&#xff0c;不用担心阅读量&#xff0c;其实感觉挺好。最近组织了源码共读活动《1个月&#xff0c;200人&#xff0c;一起读了4周源码》&#xff0c;已经有超100人提交了笔…

职称以考代评学院考计算机吗,软考与职称的关系,软考是以考代评,不用另外再去评审...

Hokfung(cnitpm.com) 15:16:45软考与职称关系&#xff1a;通过了软考,我们所获得的只是一种资格,是否聘任相应的职称,完全取决于各单位的实际情况&#xff0c;国家有关部门并没有直接的规定。事实上,通过评审方法(也就是常说的"评职称”) 得到的也只是一个资格,单位既可以…

figma下载_我关于Figma文件封面的故事

figma下载It was 8:40 AM in the morning. I woke up from the bed as my subconscious memory reminded me of the team meeting at 9 AM to discuss what I am working on.早上8:40。 我从床上醒来&#xff0c;因为我的潜意识使我想起了上午9点的团队会议&#xff0c;讨论我的…

图解选择排序与插入排序

上一篇详述了冒泡排序及其优化&#xff0c;有兴趣的可以看看&#xff1a; 如何优化冒泡排序&#xff1f; 一、选择排序&#xff08;SelectionSort&#xff09; 算法思想&#xff1a;首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始…

2011年上半年网页游戏开测数据报告发布

网页游戏上半年统计数据显示&#xff0c;2011年上半年&#xff0c;网页游戏开测信息总数为304款&#xff0c;排除重复开测信息&#xff0c;在2011年1月1日至6月30日这段期间&#xff0c;共收录开测&#xff08;含首次开测或更名的&#xff09;的数据为129条。 新公布的产品&…

计算机python程序设计导论,程序设计导论:Python计算与应用开发实践(原书第2版)...

程序设计导论&#xff1a;Python计算与应用开发实践(原书第2版)语音编辑锁定讨论上传视频《程序设计导论&#xff1a;Python计算与应用开发实践(原书第2版)》是2018年机械工业出版社出版的图书&#xff0c;作者是[美] 卢博米尔佩尔科维奇(Ljubomir Perkovic)。书 名程序设计…

vue-cli 将被 create-vue 替代?初始化基于 vite 的 vue3 项目为何如此简单?

大家好&#xff0c;我是若川。最近组织了源码共读活动《1个月&#xff0c;200人&#xff0c;一起读了4周源码》&#xff0c;已经有超50人提交了笔记&#xff0c;群里已经有超1500人&#xff0c;感兴趣的可以点此链接扫码加我微信 ruochuan12create-vue公开了&#xff0c;可以使…

lynda ux_如何进入UX领域

lynda uxI often get asked “What is the right path I should take to get into UX?” and more often than not, I do not have a direct answer. I usually ask a lot of questions about their background, before assessing their current skills with the things they …

php字符串学习笔记

在这里记录下今天的所得首先对字符串处理进行分类今天主要记录有以下字符串的格式化字符串的连接与分割字符串的比较使用字符串函数匹配和替换子字符串使用正则表达式1.字符串的格式化<?php //整理字符串的第一步是清理字符串中的多余的空格 // trim() ltrim() rtrim() // …

This is a Blog Test

Blog Test Hello, everyone! I am going to write blog to record the knowledge about the computer technology involved when I study. Please feel free to comment on any mistakes. Thank you! print("Hello")转载于:https://blog.51cto.com/12370958/2379111

可以测试体育跑步的软件,某高校现跑步打卡神器 能检测出是在走还是跑

[摘要]近日&#xff0c;一批高大上的“阳光跑步神器”在东莞一所高校火了&#xff01;之所以称之“神器”&#xff0c;是由于这批机器能检测到你在走路还是在跑步&#xff0c;如果走路数据将中断。消息一出&#xff0c;学生们有赞成&#xff0c;也有大呼“吃不消”。东莞某高校…

一道很熟悉的前端面试题,你怎么答?

大家好&#xff0c;我是若川。最近这几年&#xff0c;云计算的普及和 HTML5 技术的快速发展&#xff0c;越来越多的应用转向了浏览器 / 服务器&#xff08;B/S&#xff09;架构&#xff0c;这种改变让浏览器的重要性与日俱增&#xff0c;视频、音频、游戏几大核心场景也都在逐渐…

:寻找指定和的整数对_寻找时间:如何增加设计的时间

:寻找指定和的整数对Good design derives from good thinking. And good thinking is highly correlated to how much time you spend. In every place I’ve been though, every designer seems to be thirsty for more time to design. Why does this happen, to a point whe…

JavaScript命名空间namespace的实现方法

网上有很多了&#xff0c;这里给出一个&#xff0c;其实思路就是A{}; A.b{};其实b是A的一个属性。只是做了一些封装&#xff0c;最后的效果是可以直接定义多个namespace&#xff1a; 1: My.namespace("Company", "Company.Feed", "Company.Feed.Mess…