[关闭]
@llplmlyd 2021-10-20T19:56:35.000000Z 字数 2069 阅读 1042

TiDB 恢复误删除的数据 适用dml ddl

数据库-TiDB


refer:https://book.tidb.io/session3/chapter5/recover-data-gc.html

利用 GC 快照读恢复数据

查看历史数据保留策略

  1. select VARIABLE_NAME, VARIABLE_VALUE from mysql.tidb where VARIABLE_NAME like 'tikv_gc%';

更新gc时间配置

  1. 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 前须使用 @@ 而非 @,因为 @@ 表示系统变量,@ 表示用户变量。

  1. > select * from table;
  2. xxx
  3. xxx
  4. > select now();
  5. +---------------------+
  6. | now() |
  7. +---------------------+
  8. | 2020-06-17 20:51:02 |
  9. +---------------------+
  10. > insert into table values (xxxx )
  11. > select * from table;
  12. xxx
  13. xxx
  14. xxxx
  15. ## 查看历史数据
  16. > set @@tidb_snapshot='2020-06-17 20:51:02';
  17. > select * from table;
  18. xxx
  19. xxx
  20. # 回到现在目前的数据
  21. > set @@tidb_snapshot='';

恢复被更新/删除的数据

在确认误操作时间仍在gc时间范围内时,我们可以通过以下几种方式获取对应的误操作前的数据记录。
注:过去无法改变,所以我们无法在过去的快照中进行更新。误操作时间点越精确越好。建议在各个tidb节点打开对应的tidb_general_log 参数进行sql流水记录。

  1. tidb_general_log
  2. 作用域:INSTANCE
  3. 默认值:OFF
  4. 这个变量用来设置是否在日志里记录所有的 SQL 语句。该功能默认关闭。如果系统运维人员在定位问题过程中需要追踪所有 SQL 记录,可考虑开启该功能。
  5. 通过查询 "GENERAL_LOG" 字符串可以定位到该功能在日志中的所有记录。日志会记录以下内容:
  6. conn:当前会话对应的 ID
  7. user:当前会话用户
  8. schemaVersion:当前 schema 版本
  9. txnStartTS:当前事务的开始时间戳
  10. forUpdateTS:事务模型为悲观事务时,SQL 语句的当前时间戳。悲观事务内发生写冲突时,会重试当前执行语句,该时间戳会被更新。重试次数由 max-retry-count 配置。事务模型为乐观事务时,该条目与 txnStartTS 等价。
  11. isReadConsistency:当前事务隔离级别是否是读已提交 (RC)
  12. current_db:当前数据库名
  13. txn_mode:事务模型。可选值:OPTIMISTIC(乐观事务模型),或 PESSIMISTIC(悲观事务模型)
  14. sql:当前查询对应的 SQL 语句

方法一

官方 mydumper/dumpling 工具指定快照时间
mydumper : --tidb-snapshot '2021-07-14 12:05:16'导出
dumpling : --consistency snapshot --snapshot '2021-07-14 12:05:16'

  1. 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
  2. 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

方法二

创建一个与待恢复的数据表同结构的临时表

  1. > create table t_20161008 like t;

回到过去的时间,将对应的数据select抽取出来

  1. > set @@tidb_snapshot="2016-10-08 16:45:26";
  2. > select * from t where c=2 ## 可以导出到文件/sql中

按照业务逻辑将需要的数据插入到临时表

  1. > insert into t_20161008 values(xxx) /load data local infile xxxx

按照业务逻辑将数据从临时表反更新或插入到原表

按照业务逻辑校验数据

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注