暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

变色龙同步工具进行MySQL_to_CMDB迁移文档

IT那活儿 2023-03-20
1072
点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!

激活python虚拟环境

# dir_venv为目录名,一般放在${HOME}下:

source <dir_venv>/bin/activate

# 例如:

source ${HOME}/venv/bin/activa.te


迁移前源库准备(MySQL)

# 创建同步用户并授权:

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;

如要进行在线迁移(实时同步),MySQL数据库需配置如下参数
  • log_bin = on

  • binlog_format = row

  • binlog_row_image = full

  • enforce_gtid_consistency = on

  • gtid_mode = on



迁移前目标库准备(CMDB)

# 创建数据库及用户:

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。可参考《chameleon使用指南》6.1。需关注是否需要使用 mysql_restart_config 参数,详见《chameleon使用指南》3.4.26。

初始化迁移过程

初始化复制流

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
# 删除同步前创建的辅助schema及表的日志。

附 录

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]$


END


本文作者:伍 维(上海新炬中北团队)

本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论