前面说到了通过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