TiDB误操作updata数据后,如何最简单快速找回数据并修复数据?

【 TiDB 使用环境】TIDB serverless

下午的时候误操作,直接把产品核心的用户表给批量错误更新了,下面是记录数据还原和修复的过程和经验总结,希望帮到大家。

1:发现错误更新数据后,第一时间需要修改GC时间避免数据被垃圾回收掉,从而需要更复杂的还原办法,或导致历史数据记录丢失,所以抢救数据时间最重要。

SHOW VARIABLES LIKE ‘%tidb_gc_life_time%’; 默认10分钟。
SET GLOBAL tidb_gc_life_time=‘48h’; 先将数据垃圾回收时间修改为48小时,争取抢救时间。
SET GLOBAL tidb_gc_life_time=‘30m’; 数据恢复后修改为30分钟,后期会有更多的抢救时间。

2:确定数据错误操作的具体时间,如果发现时可以及时记录执行的时间,这个非常重要,否则通过历史日志查询确定更新的时间戳会非常麻烦。

SELECT NOW(); 这里的时间是以数据库的时间,然后下列语句TIMESTAMP '2025-01-25 08:30:00’的日期比我们updata操作的时间更早即可。

3:查询修改更新前的历史版本数据,核对数据是否正确,行数是否正确。

SELECT * FROM plug_user AS of TIMESTAMP ‘2025-01-25 08:30:00’;

4:准备空表,将历史数据另存写入。如果数据较少,客户端查询结果的数据,以INSERT INTO的格式复制数据,然后粘贴到新的SQL对话框中,修改旧表名到新准备的空表中,然后逐行写入错误更新的历史版本数据,逐行写入比较慢。

INSERT INTO … + SELECT * FROM plug_user AS of TIMESTAMP ‘2025-01-25 08:30:00’; 经过测试,这样的组合无法写入数据。

INSERT INTO amztrends_plug_prod.plug_user_nnn (id, email, phone, nick_name, store_name, password, status, create_time, update_time, user_type, expires_time, vip_type, invite_code, bind_invite_code, mark) VALUES (3154637, NULL, ‘13600000000’, ‘amz_00000’, NULL, ‘JjU9KE4Y28xW’, 0, ‘2022-02-19 00:17:48’, ‘2022-02-19 00:17:48’, ‘normal’, NULL, NULL, ‘4NA2L2SI’, NULL, NULL); 目前我是通过这样的方法写入的,其他方法大家可以自行测试和研究。

5:已更改表的数据再次更新,修复数据,选择需要更新的列,其中id作为主键是必须写在前面的。这样在复制为UPDATE语句的时候,会自动的识别并生成以id为主键的更新语句。

SELECT id,user_type,expires_time,vip_type,mark FROM plug_user AS of TIMESTAMP ‘2025-01-25 08:30:00’;

UPDATE amztrends_plug_prod.plug_user SET user_type = ‘normal’, expires_time = NULL, vip_type = NULL, mark = NULL WHERE id = 3154637;

1 个赞

可以先dumpling做个基于mvcc的备份

试了下,TIDB serverless环境下限制还真挺多的。
和tidb本地部署的情况确实不太一样。

最典型的,我尝试找出gc safepoint都不行。 :joy:
感谢楼主提供的实践。这个是值得收藏的。

日志挖掘