# [Known-Issues]-TiDB-Binlog-告警-TiDB_binlog_error_total-导致-Drainer-不同步数据

## Kew Words

binlog 数据不同步, tidb_binlog_error_total, write binlog failed, write binlog fail but error ignored

## Description

TiDB Binlog 收到告警 TiDB_binlog_error_total，TiDB 日志有 write binlog failed 和 write binlog fail but error ignored 报错，如下

```golang
[ERROR] [binloginfo.go:253] ["write binlog failed"] [binlog_type=Prewrite] [binlog_start_ts=433922313593028655] [binlog_commit_ts=0] [error="write binlog failed, the last error rpc error: code = DeadlineExceeded desc = context deadline exceeded"]
[ERROR] [binloginfo.go:259] ["write binlog fail but error ignored"]
```

## Root Cause

TiDB 默认设置 ignore-error: true，由于一些原因比如 Pump 磁盘满、TiDB 和 Pump 之间网络抖动、pump 所在机器网络打满、[TiDB 大事务 gRPC 消息超过限值](https://docs.pingcap.com/zh/tidb/stable/handle-tidb-binlog-errors##%E5%BD%93%E4%B8%8A%E6%B8%B8%E4%BA%8B%E5%8A%A1%E8%BE%83%E5%A4%A7%E6%97%B6pump-%E6%8A%A5%E9%94%99-rpc-error-code--resourceexhausted-desc--trying-to-send-message-larger-than-max-2191430008-vs-2147483647) 等导致写 Binlog 错误时，TiDB 会忽略并停止写入 Binlog ，并且在监控项 tidb_server_critical_error_total 上计数加 1，因此触发 TiDB_binlog_error_total 告警。

## Diagnostic Steps

1. 检查 TiDB 日志是否有 write binlog failed 关键字报错

2. 确认 TiDB 是否配置了 ignore-error: true

3. TiDB Binlog 监控 TiDB Server Skip Binlog Count 可以看到有很多忽略的 Binlog

## Resolution

重新部署 Binlog，参考 [主从同步开启 ignore-error 触发 critical error 后如何重新部署](https://docs.pingcap.com/zh/tidb/stable/tidb-binlog-faq##%E4%B8%BB%E4%BB%8E%E5%90%8C%E6%AD%A5%E5%BC%80%E5%90%AF-ignore-error-%E8%A7%A6%E5%8F%91-critical-error-%E5%90%8E%E5%A6%82%E4%BD%95%E9%87%8D%E6%96%B0%E9%83%A8%E7%BD%B2)

## Workaround

1. 修复导致写失败的问题，例如上面提到的 Pump 磁盘满、TiDB 和 Pump 之间网络异常、大事务引起的 gRPC 消息超过限制等

2. 恢复 TiDB Server 的 Binlog 写入状态

    1. 通过 `curl http://{TiDBIP}:10080/info/all` 确认 binlog_status 为 Skipping，重启状态为 Skipping 的 TiDB Server
    2. 对于 v3.0.8 及以上版本，可以在线恢复：通过 `curl http://{TiDBIP}:10080/binlog/recover?op=status` 确认 Binlog 状态 Skipped: true，然后使用 `curl http://{TiDBIP}:10080/binlog/recover?op=nowait&op=reset` 恢复 Binlog 写入，等待一段时间，确认状态变为 Skipped: false

3. 使用 [sync-diff-inspector](https://docs.pingcap.com/zh/tidb/stable/sync-diff-inspector-overview) 检查并修复下游不一致的数据。

## Affected Versions

All