[问题澄清]
手误 truncate 表,之后如何恢复数据
[解决方案]
-
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/
- 如果是 4.0 以前版本,不支持 flashback,需要设定tidb_snapshot来恢复数据
举例:
(1)找到 truncate 表 的时间,找不大,可以大概估算时间 :
(2) 设置tidb_snapshot 参数,选择可以恢复的时间
set @@tidb_snapshot=‘2020-05-27 21:47:00’;
(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) 重新导入数据
参考文档