[FAQ] 如何恢复truncate 表的数据

[问题澄清]

手误 truncate 表,之后如何恢复数据

[解决方案]

  1. 4.0版本使用 flashback table 命令恢复数据

    (1) 查看当前 gc 配置参数值

    select * from mysql.tidb where variable_name in (‘tikv_gc_safe_point’,‘tikv_gc_life_time’);

    (2) 修改 gc 时间防止数据被清理

    update mysql.tidb set VARIABLE_VALUE=“24h” where VARIABLE_NAME=“tikv_gc_life_time”;

    (3) 执行命令 flashback 恢复数据

    FLASHBACK TABLE t TO t1;

    (4)可以执行 insert 命令将数据恢复到 表t,或者 rename 表 t1(如果以后使用了视图等没有测试过是否适合rename)

    insert into t select * from t1;

    或者

    drop table t;
    rename table t1 to t;

    (5)将 gc 时间修改为之前的参数值

参考文档
https://pingcap.com/docs-cn/stable/sql-statements/sql-statement-flashback-table/

  1. 如果是 4.0 以前版本,不支持 flashback,需要设定tidb_snapshot来恢复数据

举例:

(1)找到 truncate 表 的时间,找不大,可以大概估算时间 :

(2) 设置tidb_snapshot 参数,选择可以恢复的时间

set @@tidb_snapshot=‘2020-05-27 21:47:00’;

image

(3) 使用 mydumper 导出snapshot 时间的表数据(注意,如果是drop表,一定要加–skip-tz-utc参数

./mydumper -h 172.16.5.xxx -u root -P 43500 --skip-tz-utc -B ryltest -T t --tidb-snapshot=‘2020-05-27 21:47:00’

(4) 重新导入数据

参考文档

https://pingcap.com/docs-cn/v3.0/mydumper-overview/

1 个赞