为TiDB添加一个MySQL从库,drainer运行正常,但是MySQL里没有增量数据写入

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【TiDB 版本】
V4.0.0
【问题描述】

您好,我想为TiDB添加一个mysql的从库。在全量备份导入后,使用pump+drainer的方式,导入增量。
drainer启动时指定了metadata里的Pos。

drainer状态正常,但是mysql里没有新数据写入。

drainer的配置如下:

# Drainer Configuration.

# Drainer 提供服务的地址("192.168.0.13:8249")
addr = "172.17.10.60:8249"

# Drainer 对外提供服务的地址
advertise-addr = "172.17.10.60:8249"

# 向 PD 查询在线 Pump 的时间间隔 (默认 10,单位 秒)
detect-interval = 10

# Drainer 数据存储位置路径 (默认 "data.drainer")
data-dir = "/data/drainer/data.drainer"

# PD 集群节点的地址 (英文逗号分割,中间不加空格)
pd-urls = "http://172.17.10.11:2379,http://172.17.10.26:2379,http://172.17.10.74:2379"

# log 文件路径
log-file = "/data/logs/drainer.log"

# Drainer 从 Pump 获取 binlog 时对数据进行压缩,值可以为 "gzip",如果不配置则不进行压缩
compressor = "gzip"

# [security]
# 如无特殊安全设置需要,该部分一般都注解掉
# 包含与集群连接的受信任 SSL CA 列表的文件路径
# ssl-ca = "/path/to/ca.pem"
# 包含与集群连接的 PEM 形式的 X509 certificate 的路径
# ssl-cert = "/path/to/pump.pem"
# 包含与集群链接的 PEM 形式的 X509 key 的路径
# ssl-key = "/path/to/pump-key.pem"

# Syncer Configuration
[syncer]
# 如果设置了该项,会使用该 sql-mode 解析 DDL 语句,此时如果下游是 MySQL 或 TiDB 则
# 下游的 sql-mode 也会被设置为该值
# sql-mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

# 输出到下游数据库一个事务的 SQL 语句数量 (默认 20)
txn-batch = 20

# 同步下游的并发数,该值设置越高同步的吞吐性能越好 (默认 16)
worker-count = 16

# 是否禁用拆分单个 binlog 的 SQL 的功能,如果设置为 true,则按照每个 binlog
# 顺序依次还原成单个事务进行同步(下游服务类型为 MySQL, 该项设置为 False)
#disable-dispatch = false

# safe mode 会使写下游 MySQL/TiDB 可被重复写入
# 会用 replace 替换 insert 语句,用 delete + replace 替换 update 语句
safe-mode = false

# Drainer 下游服务类型(默认为 mysql)
# 参数有效值为 "mysql","tidb","file","kafka"
db-type = "mysql"

# 事务的 commit ts 若在该列表中,则该事务将被过滤,不会同步至下游
ignore-txn-commit-ts = []

# db 过滤列表 (默认 "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,mysql,test"),
# 不支持对 ignore schemas 的 table 进行 rename DDL 操作
ignore-schemas = "INFORMATION_SCHEMA,PERFORMANCE_SCHEMA,METRICS_SCHEMA,mysql,*test"

# replicate-do-db 配置的优先级高于 replicate-do-table。如果配置了相同的库名,支持使用正则表达式进行配置。
# 以 '~' 开始声明使用正则表达式

# replicate-do-db = ["~^b.*","s1"]

# [syncer.relay]
# 保存 relay log 的目录,空值表示不开启。
# 只有下游是 TiDB 或 MySQL 时该配置才生效。
#log-dir = "/data/logs/sync"
# 每个文件的大小上限
# max-file-size = 10485760

# [[syncer.replicate-do-table]]
# db-name ="test"
# tbl-name = "log"

# [[syncer.replicate-do-table]]
# db-name ="test"
# tbl-name = "~^a.*"

# 忽略同步某些表
# [[syncer.ignore-table]]
# db-name = "test"
# tbl-name = "log"

# db-type 设置为 mysql 时,下游数据库服务器参数
[syncer.to]
host = "172.17.10.169"
user = "tidb_slave"
password = ""
# 使用 `./binlogctl -cmd encrypt -text string` 加密的密码
# encrypted_password 非空时 password 会被忽略
#encrypted_password = ""
port = 3360

[syncer.to.checkpoint]
# 当 checkpoint type 是 mysql 或 tidb 时可以开启该选项,以改变保存 checkpoint 的数据库
# schema = "tidb_binlog"
# 目前只支持 mysql 或者 tidb 类型。可以去掉注释来控制 checkpoint 保存的位置。
# db-type 默认的 checkpoint 保存方式是:
# mysql/tidb -> 对应的下游 mysql/tidb
# file/kafka -> file in `data-dir`
# type = "mysql"
# host = "127.0.0.1"
# user = "root"
# password = ""
# 使用 `./binlogctl -cmd encrypt -text string` 加密的密码
# encrypted_password 非空时 password 会被忽略
# encrypted_password = ""
# port = 3360

求大佬们指。

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

参考这个 FAQ 排查下呢?

非常感谢您的回复,这个状态是表示已经开启了binlog了对么:

mysql> show global variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | 1     |
+---------------+-------+
1 row in set (0.00 sec)

可以通过 curl http://127.0.0.1:10080/info/all 确认下 binlog 的状态是否是开启的。

按照您的指导,查询到binlog的状态为:
"binlog_status": "Skipping",

另外,binlog.ignore-error的状态为 true
刚搜了下文档,最佳实践是设置默认 false 对吧。

这个要根据你们具体业务设定了。设置为 false 对 上游 TiDB 影响更大。

ignore-error 参数。

忽略写 binlog 发生的错误时处理开关,推荐不修改该值。
默认值:false
如果设置为 true,发生错误时,TiDB 会停止写入 binlog,并且在监控项 tidb_server_critical_error_total 上计数加 1;如果设置为 false,写入 binlog 失败,会停止整个 TiDB 的服务。

收到,感谢您的回复。

我想保持现在的参数配置不变的话,需要怎样继续往下排查呢?

FAQ 中提到了解决方案,请参考 FAQ

ignore-error 参数需要你们去权衡

  • 如果设置为 true,binlog 状态为 skipping 时,无法跳过后续都不会再写 binlog。只能通过重新同步来解决。对下游数据库影响较大。
  • 如果设置为 false,写入 binlog 失败,整个 TiDB 都无法提供服务。对上游 TiDB 影响更大。

需要你们自己权衡。目前这边的问题,建议根据 FAQ 中提到的重做。