一、介紹
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 邏輯日誌的增量數據同步
狀態:不可用
二、功能1(基於 MySQL binlog 解析的增量數據同步)
1、原理介紹
官方文檔說明: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 中去
2、配置相關數據源和目標數據源
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));
3、搭建步驟
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
4、啓動同步進程
1、 啓動 binlog 拉取進程
cd bin
./binlog_miner
2、 啓動 binlog 寫入進程
cd bin
./binlog_loader
5、過程中pgsql臨時表的介紹
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
6、存在問題和解決思路
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、同步表比較多和數據量比較大時,會造成性能的瓶頸