@llplmlyd
2021-10-20T19:56:35.000000Z
字数 2069
阅读 1042
数据库-TiDB
refer:https://book.tidb.io/session3/chapter5/recover-data-gc.html
select VARIABLE_NAME, VARIABLE_VALUE from mysql.tidb where VARIABLE_NAME like 'tikv_gc%';
update mysql.tidb set VARIABLE_VALUE="24h" where VARIABLE_NAME="tikv_gc_life_time";
例如查看 2020-06-17 20:51:02 这个时间点前的数据:
设置一个特殊的环境变量 tidb_snapshot
,这个是一个 会话级别的 session scope 变量,仅作用于当前链接 的变量,其意义为读取这个时间之前的最新的一个版本。在当前链接设置过去快照时间,不会影响到其他业务链接的使用。
注意: 这里的时间设置的是 update 语句之前的那个时间。在 tidb_snapshot 前须使用 @@ 而非 @,因为 @@ 表示系统变量,@ 表示用户变量。
> select * from table;
xxx
xxx
> select now();
+---------------------+
| now() |
+---------------------+
| 2020-06-17 20:51:02 |
+---------------------+
> insert into table values (xxxx )
> select * from table;
xxx
xxx
xxxx
## 查看历史数据
> set @@tidb_snapshot='2020-06-17 20:51:02';
> select * from table;
xxx
xxx
# 回到现在目前的数据
> set @@tidb_snapshot='';
在确认误操作时间仍在gc时间范围内时,我们可以通过以下几种方式获取对应的误操作前的数据记录。
注:过去无法改变,所以我们无法在过去的快照中进行更新。误操作时间点越精确越好。建议在各个tidb节点打开对应的tidb_general_log
参数进行sql流水记录。
tidb_general_log
作用域:INSTANCE
默认值:OFF
这个变量用来设置是否在日志里记录所有的 SQL 语句。该功能默认关闭。如果系统运维人员在定位问题过程中需要追踪所有 SQL 记录,可考虑开启该功能。
通过查询 "GENERAL_LOG" 字符串可以定位到该功能在日志中的所有记录。日志会记录以下内容:
conn:当前会话对应的 ID
user:当前会话用户
schemaVersion:当前 schema 版本
txnStartTS:当前事务的开始时间戳
forUpdateTS:事务模型为悲观事务时,SQL 语句的当前时间戳。悲观事务内发生写冲突时,会重试当前执行语句,该时间戳会被更新。重试次数由 max-retry-count 配置。事务模型为乐观事务时,该条目与 txnStartTS 等价。
isReadConsistency:当前事务隔离级别是否是读已提交 (RC)
current_db:当前数据库名
txn_mode:事务模型。可选值:OPTIMISTIC(乐观事务模型),或 PESSIMISTIC(悲观事务模型)
sql:当前查询对应的 SQL 语句
官方 mydumper/dumpling 工具指定快照时间
mydumper : --tidb-snapshot '2021-07-14 12:05:16'导出
dumpling : --consistency snapshot --snapshot '2021-07-14 12:05:16'
mydumper -h ip -P port -u username -p xxxx --tidb-snapshot '2021-07-14 12:05:16' -t 16 -F 64 --skip-tz-utc -B dbname -T table1,table2 -o directory
dumpling -h ip -P port -u username -p xxxx --consistency snapshot --snapshot '2021-07-14 12:05:16' --threads 32 --filetype sql -o directoy -F '64MiB' -T db.table1,db.table2
创建一个与待恢复的数据表同结构的临时表
> create table t_20161008 like t;
回到过去的时间,将对应的数据select抽取出来
> set @@tidb_snapshot="2016-10-08 16:45:26";
> select * from t where c=2 ## 可以导出到文件/sql中
按照业务逻辑将需要的数据插入到临时表
> insert into t_20161008 values(xxx) /load data local infile xxxx
按照业务逻辑将数据从临时表反更新或插入到原表
按照业务逻辑校验数据