dbsync 项目目标是围绕 PostgreSQL Greenplum ,实现易用的数据的互迁功能
github地址:https://github.com/aliyun/rds_dbsync
支持的功能如下:
1、MySQL -> PostgreSQL/Greenplum(binlog_minner binlog_loader)
功能:基于 MySQL binlog 解析的增量数据同步
状态:可用
2、MySQL -> PostgreSQL/Greenplum mysql2pgsql
功能:以表为单位的多线程全量数据迁移
状态:可用
3、PostgreSQL -> PostgreSQL pgsql2pgsql
功能:pg->pg 全量+增量数据同步
状态:可用
4、PostgreSQL -> PostgreSQL/Greenplum pgsql2gp
功能:基于 PostgreSQL 逻辑日志的增量数据同步
状态:不可用
官方文档说明:https://github.com/aliyun/rds_dbsync/blob/master/doc/mysql2gp.md
1.在客户端主机(也可以部署在其他主机)上启动一个临时 PG 数据库,用于临时存放从 MySQL 拉去到的 binlog 数据
2.binlog_miner 从源 MySQL 的一个 binlog 文件开始,拉取和解析 binlog 并存放到临时 PG 中
3.binlog_loader 从临时 PG 中读取增量数据,并做适当的处理,最终批量写入到目标 PostgreSQL 或 Greenplum 中去
1、mysql数据源
1、数据库,create database syncdb1;
2、用户权限,需要拥有select权限和binlog拉取权限,此处使用root权限
3、同步的表(切换到syncdb1数据库),create table tb1(a int primary key, b char(10));
2、pgsql临时数据库
1、用户,create user test with password 'test';
2、数据库,create database test with owner 'test';
3、pgsql目的数据库
1、用户,create user syncdb with password 'syncdb';
2、数据库,create database syncdb with owner 'syncdb';
3、同步的表(使用syncdb用户切换到syncdb数据库),create table tb1(a int primary key, b char(10));
1、下载和解压缩
下载地址:https://github.com/aliyun/rds_dbsync/releases
解压缩:unzip mysql2pgsql.bin.el7.20171213.zip && mv mysql2pgsql.bin.el7.20171213 mysql2pgsql
2、修改配置文件,vim bin/my.cfg
1、mysql数据源
[src.mysql]
host = "118.190.209.102"
port = "5700
user = "root"
password = "123456"
db = "syncdb1"
encodingdir = "share"
encoding = "utf8"
binlogfile = "mysql-bin.000001"
binlogfile_offset = "154"
serverid = 129
2、pgsql临时数据库
[local.pgsql]
connect_string = "host=127.0.0.1 dbname=test port=5432 user=test password=test"
3、pgsql目的数据库
[desc.pgsql]
connect_string = "host=118.190.209.102 dbname=syncdb port=5432 user=syncdb password=syncdb"
target_schema = "public"
ignore_copy_error_count_each_table = "0"
4、需要同步的表设置
[binlogloader]
loader_table_list = "loader_table_list.txt"
load_batch = 2
load_batch_gap = 10 # load任务的间隔
3、修改配置文件,vim bin/loader_table_list.txt
tb1
1、 启动 binlog 拉取进程
cd bin
./binlog_miner
2、 启动 binlog 写入进程
cd bin
./binlog_loader
1、mysql数据源插入数据
insert into tb1 select 1,'a';
2、pgsql临时表数据
1、binlog_data表
test=# select * from binlog_data;
id | event | tbname | new_row | old_key | flag
----+-------+--------+---------+---------+------
1 | 1 | tb1 | 1|'a' | 1 | 1
2、binlog_load_table_status表
test=# select * from binlog_load_table_status;
id | tbname | last_load_time | apply_id | task_id
----+--------+----------------------------+----------+---------
1 | tb1 | 2018-08-01 15:02:52.307866 | 1 | 1
3、binlog_miner_status
test=# select * from binlog_miner_status;
id | binlogfile | position | binlog_data_id | last_update
----+------------------+----------+----------------+---------------------------
1 | mysql-bin.000001 | 419 | 1 | 2018-08-01 15:02:51.52023
4、binlog_washer_status
test=# select * from binlog_washer_status;
id | b | e | count | finish_time
----+---+---+-------+----------------------------
1 | 0 | 1 | 1 | 2018-08-01 15:02:51.753591
3、pgsql目的数据库
syncdb=> select * from tb1;
a | b
---+------------
1 | a
1、数据源同步的表,发生ddl变更操作后,启动dml操作
报错
COPY failed: ERROR: extra data after last expected column
CONTEXT: COPY tb1, line 1: "3|'c'|3"
[loader] task 3 run faild
[binlog_loader_main] thread exit, proc exit
解决
1、调整目的数据库的表结构,和源端保持一致
2、重新启动binlog_loader进程
2、多个库中表的同步
这个工具默认是同步下面对应的库表,所以每个进程只能同步一个库
数据库:my.cfg-->[src.mysql]-->db对应的数据库
表:loader_table_list.txt对应的表
可以并发启动多个进程,每个进程分别同步一个库,最终的目标库可以保持一致,实现mysql多个库中的表同步到pgsql的一个库的一个表
3、同步表比较多和数据量比较大时,会造成性能的瓶颈
转载于:https://blog.51cto.com/11257187/2153182