# dir_venv为目录名,一般放在${HOME}下:
source <dir_venv>/bin/activate
# 例如:
source ${HOME}/venv/bin/activa.te
# 创建同步用户并授权:
CREATE USER mysql_test;
SET PASSWORD FOR mysql_test=PASSWORD('password123');
GRANT ALL ON *.* TO 'mysql_test';
GRANT RELOAD ON *.* to 'mysql_test';
GRANT REPLICATION CLIENT ON *.* to 'mysql_test';
GRANT REPLICATION SLAVE ON *.* to 'mysql_test';
FLUSH PRIVILEGES;
log_bin = on
binlog_format = row
binlog_row_image = full
enforce_gtid_consistency = on
gtid_mode = on
# 创建数据库及用户:
CREATE USER opengauss_test WITH PASSWORD 'password123';
CREATE DATABASE opengauss_database WITH OWNER opengauss_test dbcompatibility='B' ;
cd ${HOME}/.pg_chameleon/configuration/
cp config-example.yml default.yml
# 编辑 default.yml,按实际需求填写配置文件。
初始化复制流
1. 在cmdb中创建用于存储复制过程的辅助schema和表
创建的schema为:sch_chameleon
详细日志示例见附录2。
chameleon create_replica_schema --config default --debug
2. 将default.yml中配置的同步源添加到数据库同步配置中
详细日志示例见附录3。
chameleon add_source --config default --source mysql --debug
根据default.yml配置文件中的信息,将MySQL源库的全量数据同步到CMDB中。
chameleon init_replica --config default --source mysql --debug
详细日志示例见附录4。
同步完成后,数据在opengauss_database database的 sch_mysql_database schema下。查询方式如下:
# 切换数据库
\c opengauss_database;
# 切换schema
set current_schema to sch_mysql_database;
select count(*) from t1;
1. 开启增量同步
开启增量同步前,需注意第二点中关于MySQL的配置是否符合要求。
根据实际情况决定是否需要“--debug”参数,如果使用“--debug”参数,会持续生成大量日志,需关注目录使用率。
nohup chameleon start_replica --config default --source mysql --debug > replica1_20230101.log 2>&1 &
2. 源库新建测试表(MySQL)
create table tta1 (id int, name char(20));
insert into tta1 values (1, 'aaa');
insert into tta1 values (2, 'bbb');
insert into tta1 values (3, 'ccc');
commit;
3. 目标库查询测试表(CMDB)
# 切换数据库
\c opengauss_database;
# 切换schema
set current_schema to sch_mysql_database;
select * from tta1;
4. 关闭增量同步
chameleon stop_replica --config default --source mysql --debug
chameleon detach_replica --config default --source mysql --debug
# 外键的创建和验证、重置序列(serial)将在detach_replica阶段进行。
chameleon drop_replica_schema --config default --debug
1. 配置文件示例
(venv) [omn@tidb1 .pg_chameleon]$ more configuration/config-example.yml
---
# global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''
# type_override allows the user to override the default type conversion
# into a different one.
type_override:
"tinyint(1)":
override_to: boolean
override_tables:
- "*"
# postgres destination connection
pg_conn:
host: "1.1.1.1"
port: "5432"
user: "opengauss_test"
password: "password123"
database: "opengauss_database"
charset: "utf8"
sources:
mysql:
db_conn:
host: "1.1.1.2"
port: "3306"
user: "mysql_test"
password: "password123"
charset: 'utf8'
connect_timeout: 10
mysql_restart_config: yes
readers: 4
writers: 4
schema_mappings:
mysql_database: sch_mysql_database
limit_tables:
# - delphis_mediterranea.foo
skip_tables:
# - delphis_mediterranea.bar
grant_select_to:
- usr_readonly
lock_timeout: "120s"
my_server_id: 100
replica_batch_size: 10000
replay_max_rows: 10000
batch_retention: '1 day'
copy_max_memory: "300M"
copy_mode: 'file'
out_dir: tmp
sleep_loop: 1
on_error_replay: continue
on_error_read: continue
auto_maintenance: "disabled"
gtid_enable: false
type: mysql
keep_existing_schema: No
migrate_default_value: Yes
skip_events:
insert:
# - delphis_mediterranea.foo # skips inserts on delphis_mediterranea.foo
delete:
# - delphis_mediterranea # skips deletes on schema delphis_mediterranea
update:
# keep_existing_schema: No
2. 初始化复制流日志
(venv) [omn@tidb1 logs]$ chameleon create_replica_schema --config default --debug
2023-02-07 17:44:22 MainProcess INFO global_lib.py (312): Trying to create replica schema
2023-02-07 17:44:22 MainProcess DEBUG pg_lib.py (703): Trying to connect to the destination database.
2023-02-07 17:44:22 MainProcess WARNING pg_lib.py (714): The replica schema is already present.
2023-02-07 17:44:22 MainProcess INFO chameleon.py (63): create_replica_schema finished.
(venv) [omn@tidb1 logs]$
3. 增加源日志
(venv) [omn@tidb1 logs]$ chameleon add_source --config default --source mysql --debug
2023-02-07 17:44:46 MainProcess INFO global_lib.py (329): Trying to add a new source
2023-02-07 17:44:46 MainProcess DEBUG pg_lib.py (2920): Checking if the source mysql already exists
2023-02-07 17:44:46 MainProcess WARNING pg_lib.py (2957): The source mysql already exists
2023-02-07 17:44:46 MainProcess INFO chameleon.py (63): add_source finished.
4. 全量数据初始化日志


注:全量初始化日志过长文中无法全部贴出,上附日志截图仅为一小部分,如需获取全部日志记录,请评论区留言。
5. 增量同步部分日志
2023-02-10 16:34:42 MainProcess DEBUG global_lib.py (912): Replica process for source mysql is running
2023-02-10 16:34:42 MainProcess DEBUG pg_lib.py (1275): Cleaning replayed batches for source mysql older than 1 day
2023-02-10 16:34:43 MainProcess DEBUG global_lib.py (912): Replica process for source mysql is running
2023-02-10 16:34:44 MainProcess DEBUG pg_lib.py (1275): Cleaning replayed batches for source mysql older than 1 day
2023-02-10 16:34:44 read_replica DEBUG pg_lib.py (4258): Checking consistent status for source: mysql
2023-02-10 16:34:44 read_replica DEBUG pg_lib.py (4288): The source: mysql is not consistent
2023-02-10 16:34:44 convert_packet_to_trx DEBUG mysql_lib.py (1515): collecting table type map
2023-02-10 16:34:45 MainProcess DEBUG global_lib.py (912): Replica process for source mysql is running
2023-02-10 16:34:45 MainProcess DEBUG pg_lib.py (1275): Cleaning replayed batches for source mysql older than 1 day
2023-02-10 16:34:45 read_replica DEBUG pg_lib.py (674): There is already a database connection active.
2023-02-10 16:34:45 read_replica DEBUG pg_lib.py (674): There is already a database connection active.
2023-02-10 16:34:45 read_replica DEBUG pg_lib.py (4047): Collecting schema mappings for source mysql
2023-02-10 16:34:45 read_replica DEBUG mysql_lib.py (251): mysql version 5007037
2023-02-10 16:34:45 read_replica DEBUG mysql_lib.py (1795): Batch data [(10, 'mysql-bin.000010', 1732, 't_log_replica_mysql_1', '7474cff9-9af3-11e8-8f1d-286ed488c97b:1-11')]
2023-02-10 16:34:46 MainProcess DEBUG global_lib.py (912): Replica process for source mysql is running
2023-02-10 16:34:46 MainProcess DEBUG pg_lib.py (1275): Cleaning replayed batches for source mysql older than 1 day
6. 关闭增量同步的日志
# 关闭增量同步的日志:
(venv) [omn@tidb1 .pg_chameleon]$ chameleon stop_replica --config default --source mysql --debug
The replica process is stopped
2023-02-10 16:35:01 MainProcess INFO chameleon.py (63): stop_replica finished.
[1]+ Killed nohup chameleon start_replica --config default --source mysql --debug > tb1.log 2>&1
(venv) [omn@tidb1 .pg_chameleon]$
7. detach replica 日志
# detach 日志:
(venv) [omn@tidb1 .pg_chameleon]$ chameleon detach_replica --config default --source mysql --debug
Detaching the replica will remove any reference for the source mysql.
Are you sure? YES/No
YES
2023-02-10 16:49:57 MainProcess INFO chameleon.py (63): detach_replica finished.
(venv) [omn@tidb1 .pg_chameleon]$
8. 删除同步前创建的辅助schema及表的日志
(venv) [omn@tidb1 .pg_chameleon]$ chameleon drop_replica_schema --config default --debug
2023-02-10 16:50:19 MainProcess INFO global_lib.py (319): Dropping the replica schema
2023-02-10 16:50:19 MainProcess DEBUG pg_lib.py (2786): Trying to connect to the destination database.
2023-02-10 16:50:19 MainProcess INFO chameleon.py (63): drop_replica_schema finished.
(venv) [omn@tidb1 .pg_chameleon]$

本文作者:伍 维(上海新炬中北团队)
本文来源:“IT那活儿”公众号





