ticdc 同步tidb到mysql

张映 发表于 2021-01-14

分类目录: tidb

标签:, , ,

前面说到了通过dm server把mysql的数据同步到tidb,现在又为什么要把tidb的数据同步到mysql?

其实还是对tidb不太放心,就算把tidb当做正式数据库使用,也希望用mysql来兜底,观察一段时间后,如果不出问题就可以把同步停掉了,脱离mysql。

1,tiup安装cdc插件

$ tiup install cdc

2,创建同步文件

$ cat tidb2m201.toml

# 指定配置文件中涉及的库名、表名是否为大小写敏感
# 该配置会同时影响 filter 和 sink 相关配置,默认为 true
case-sensitive = true

# 是否输出 old value,从 v4.0.5 开始支持
enable-old-value = false

[filter]
# 过滤器规则
# 过滤规则语法:https://docs.pingcap.com/zh/tidb/stable/table-filter#表库过滤语法
rules = ['test.*']

[mounter]
# mounter 线程数,用于解码 TiKV 输出的数据
worker-num = 16

[sink]
# 对于 MQ 类的 Sink,可以通过 dispatchers 配置 event 分发器
# 支持 default、ts、rowid、table 四种分发器,分发规则如下:
# - default:有多个唯一索引(包括主键)时按照 table 模式分发;只有一个唯一索引(或主键)按照 rowid 模式分发;如果开启了 old value 特性,按照 table 分发
# - ts:以行变更的 commitTs 做 Hash 计算并进行 event 分发
# - rowid:以所选的 HandleKey 列名和列值做 Hash 计算并进行 event 分发
# - table:以表的 schema 名和 table 名做 Hash 计算并进行 event 分发
# matcher 的匹配语法和过滤器规则语法相同
# dispatchers = [
# {matcher = ['test1.*', 'test2.*'], dispatcher = "ts"},
# {matcher = ['test3.*', 'test4.*'], dispatcher = "rowid"},
# ]
# 对于 MQ 类的 Sink,可以指定消息的协议格式
# 目前支持 default、canal、avro 和 maxwell 四种协议。default 为 TiCDC Open Protocol
protocol = "default"

[cyclic-replication]
# 是否开启环形同步
enable = false
# 当前 TiCDC 的复制 ID
replica-id = 1
# 需要过滤掉的同步 ID
filter-replica-ids = [2,3]
# 是否同步 DDL
sync-ddl = true

3,创建同步任务

$ tiup ctl cdc changefeed create --pd=http://10.0.10.19:2379 --sink-uri="mysql://用户名:密码@10.0.10.18:13306/?max-txn-row=500&time-zone="  --config tidb2m201.toml --changefeed-id="test-to-201-mysql"

创建任务时报了二个错误如下:

Error: startTs less than gcSafePoint: [tikv:9006]GC life time is shorter than transaction duration, transaction starts at 422148328409530369, GC safe point is 18446744073709551615

解决办法:

//登录到tidb
mysql> update mysql.tidb set variable_value='30m' where variable_name='tikv_gc_life_time';

tikv_gc_life_time默认是10m0s,并且调小max-txn-row

Error: fail to query session variable allow_auto_random_explicit_insert: [CDC:ErrMySQLQueryError]Error 1298: Unknown or incorrect time zone: 'Asia/Shanghai'

解决办法:

mysql> SHOW VARIABLES like '%time_zone%';    //mysql
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | CST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

mysql> SHOW VARIABLES like '%time_zone%';    //tidb
+------------------+---------------+
| Variable_name    | Value         |
+------------------+---------------+
| system_time_zone | Asia/Shanghai |
| time_zone        | SYSTEM        |
+------------------+---------------+
2 rows in set (0.00 sec)

由上面可以看出,tidb和mysql的time_zone是不一样的,--sink-uri="mysql://用户名:密码@10.0.10.18:13306/?max-txn-row=500&time-zone=",加入time-zone=,这样就可以了

4,其他操作

//暂停
$ tiup ctl cdc changefeed pause --pd=http://10.0.10.19:2379 -c test-to-201-mysql 

//重新同步
$ tiup ctl cdc changefeed resume --pd=http://10.0.10.19:2379 -c test-to-201-mysql 

//删除
$ tiup ctl cdc changefeed remove --pd=http://10.0.10.19:2379 -c test-to-201-mysql 

//强制删除
$ tiup ctl cdc changefeed remove --pd=http://10.0.10.19:2379 -c test-to-201-mysql --force

//查看正在执行的任务列表
$ tiup ctl cdc processor list --pd=http://10.0.10.19:2379 

//查看所有的任务列表
$ tiup ctl cdc changefeed list  --pd=http://10.0.10.19:2379

//查看某个任务详细信息
$ tiup ctl cdc changefeed query --pd=http://10.0.10.19:2379 -c test-to-201-mysql

5,更新配置

//暂停
$ tiup ctl cdc changefeed pause --pd=http://10.0.10.19:2379 -c test-to-201-mysql 

//查看状态
$ tiup ctl cdc changefeed query --pd=http://10.0.10.19:2379 -c test-to-201-mysql 

 "status": {
 "resolved-ts": 422213399143251969,
 "checkpoint-ts": 422213399143251969,
 "admin-job-type": 1
 },
 "count": 0,
 "task-status": [] //最后这个状态为空时,就说明已停止。

//修改配置文件
$ vim tidb2m201.toml 

//更新
$ tiup ctl cdc changefeed update -c test-to-201-mysql --pd=http://10.0.10.19:2379 --sink-uri="mysql://用户名:密码@10.0.10.18:13306/?max-txn-row=50&time-zone=" --config tidb2m201.toml 

//恢复
$ tiup ctl cdc changefeed resume --pd=http://10.0.10.19:2379 -c test-to-201-mysql

 



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/tidb/2479.html