ticdc 同步tidb到mysql

前面说到了通过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 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
海底苍鹰(tank)博客
我还没有学会写个人说明!
上一篇

漫威影业CEO:目前还没有下一任金刚狼选角的计划

下一篇

台积电发布2020年第四季度财报:营收超126亿美元 同比增长 22%

你也可能喜欢

评论已经被关闭。

插入图片