前言:
作为一个dba,需要掌握数据库备份、恢复的各种手段。
本文主要介绍Tidb的全量+实时增量备份,并通过备份文件实现恢复数据库到指定时间点。
如果有误删数据无法恢复或者发生灾难性崩溃可参考本方案实施恢复。
系统架构
架构图如下:
TiDB Binlog 是一个用于收集 TiDB 的 binlog,并提供准实时备份和同步功能的商业工具。
TiDB Binlog 支持以下功能场景:
- 数据同步:同步 TiDB 集群数据到其他数据库。
- 实时备份和恢复:备份 TiDB 集群数据,同时可以用于 TiDB 集群故障时恢复。
从 TiDB v7.5.0 开始,TiDB Binlog 组件的数据同步功能不再提供技术支持,建议使用 TiCDC 作为数据同步的替代方案。
V7.5.0之前版本本方案仍可继续使用。
全量+增量备份方案
全量备份
TIDB提供了丰富的备份方案可满足用户的各种需求:
如果你对数据备份有以下要求,可考虑使用 BR 对 TiDB 进行数据备份:
- 备份的数据量较大(大于 1 TB),而且要求备份速度较快
- 直接备份数据的 SST 文件(键值对)
- 对延迟不敏感的增量备份
详细的备份方法参考官方文档,这里就不展开说明了
https://docs.pingcap.com/zh/tidb/stable/br-use-overview
br也有增量备份功能,但是无法实现实时备份。
如果你对数据备份有以下要求,可考虑使用Dumpling 对 TiDB 进行数据备份:
- 导出 SQL 或 CSV 格式的数据
- 对单条 SQL 语句的内存进行限制
- 导出 TiDB 的历史数据快照
详细的备份方法参考官方文档,这里就不展开说明了
https://docs.pingcap.com/zh/tidb/stable/dumpling-overview
我所使用的数据库大小超过了1T,使用了br做全量备份,为了节省资源每个礼拜备份一次到nfs共享盘并上传oss。
增量备份
通过Tidb的drainer组件输出binlog日志存储到服务器本地。
drainer参数
db-type
下游类型,目前支持的选项有:
mysql
tidb
kafka
file
本地binlog文件建议定时打包上传到S3、oss等存储。
恢复数据库到指定时间
准备一套相同配置相同版本数据库集群
通过br恢复数据到新数据库
br restore full --pd "xxxxxx:2379" --storage "local:///tidbback/230528" --log-file restorefull.log
从oss上下载对应时间段的binlog文件到本地服务器
./ossutil64 cp oss://tsp-tidb-binlog/binlog/2023-05-28-00.zip /tidbback/binlog/
./ossutil64 cp oss://tsp-tidb-binlog/binlog/2023-05-29-00.zip /tidbback/binlog/
./ossutil64 cp oss://tsp-tidb-binlog/binlog/2023-05-30-00.zip /tidbback/binlog/
./ossutil64 cp oss://tsp-tidb-binlog/binlog/2023-05-31-00.zip /tidbback/binlog/
./ossutil64 cp oss://tsp-tidb-binlog/binlog/2023-06-01-00.zip /tidbback/binlog/
./ossutil64 cp oss://tsp-tidb-binlog/binlog/2023-06-02-00.zip /tidbback/binlog/
解压binlog文件
unzip 2023-05-28-00.zip
unzip 2023-05-29-00.zip
unzip 2023-05-30-00.zip
unzip 2023-05-31-00.zip
unzip 2023-06-01-00.zip
unzip 2023-06-02-00.zip
使用reparo工具把指定binlog写入新数据库
通过br备份日志获取全量备份的tso。
Reparo 是 TiDB Binlog 的一个配套工具,用于增量的恢复。使用 TiDB Binlog 中的 Drainer 将 binlog 按照 protobuf 格式输出到文件,通过这种方式来备份增量数据。当需要恢复增量数据时,使用 Reparo 解析文件中的 binlog,并将其应用到 TiDB/MySQL 中。
编写配置文件reparo.toml
# Drainer 输出的 protobuf 格式 binlog 文件的存储路径。
data-dir = "/tidbback/binlog"
# 日志输出信息等级设置:debug, info, warn, error, fatal (默认值:info)。
log-level = "info"
# 使用 start-datetime 和 stop-datetime 来选择恢复指定时间范围内的 binlog,格式为 “2006-01-02 15:04:05”。
# start-datetime = ""
# stop-datetime = ""
# start-tso、stop-tso 分别对应 start-datetime 和 stop-datetime,也是用于恢复指定时间范围内的 binlog,用 tso 的值来设置。如果已经设置了 start-datetime 和 stop-datetime,就不需要再设置 start-tso 和 stop-tso。
# 在从全量或者上次增量位置继续同步时,start-tso 应当指定为全量 tso + 1 或者上次增量的 stop-tso + 1
start-tso = 441766852117397526
stop-tso = 441856504627200001
# 下游服务类型。 取值为 print, mysql(默认值:print)。当值为 print 时,只做解析打印到标准输出,不执行 SQL;如果为 mysql,则需要在 [dest-db] 中配置 host、port、user、password 等信息。
dest-type = "mysql"
# 输出到下游数据库一个事务的 SQL 语句数量(默认 20)。
txn-batch = 20
# 同步下游的并发数,该值设置越高同步的吞吐性能越好(默认 16)。
worker-count = 64
# 安全模式配置。取值为 true 或 false(默认值:false)。当值为 true 时,Reparo 会将 update 语句拆分为 delete + replace 语句。
safe-mode = false
# replicate-do-db 和 replicate-do-table 用于指定恢复的库和表,replicate-do-db 的优先级高于 replicate-do-table。支持使用正则表达式来配置,需要以 '~' 开始声明使用正则表达式。
# 注:replicate-do-db 和 replicate-do-table 使用方式与 Drainer 的使用方式一致。
# replicate-do-db = ["~^b.*","s1"]
# [[replicate-do-table]]
# db-name ="test"
# tbl-name = "log"
# [[replicate-do-table]]
# db-name ="test"
# tbl-name = "~^a.*"
# 如果 dest-type 设置为 mysql, 需要配置 dest-db。
[dest-db]
host = "127.0.0.1"
port = 4000
user = "root"
password = "xxxxxxxx"
数据库参数设置
set GLOBAL allow_auto_random_explicit_insert = true;
执行命令 恢复数据
./bin/reparo -config reparo.toml
至此数据库恢复任务完成。
binlog+reparo如果灵活使用,还可以把历史sql执行记录都输出。
- dest-type 指定目标类型,取值为
mysql
、print
。 当值为mysql
时,可以恢复到 MySQL/TiDB 等使用或兼容 MySQL 协议的数据库,需要在配置下面的 [dest-db] 填写数据库信息;当取值为 print 的时候,只是打印 binlog 信息,通常用于 debug,以及查看 binlog 的内容,此时不需要填写[dest-db]
。
后记
本方案主要依赖于tidb的binlog组件实现实时的增量备份和指定时间点恢复功能,随着tidb版本迭代,V7.5以后官方将不再对binlog功能提供技术支持,希望官方或者社区小伙伴能开发出功能更强、性价比更高的技术方案。