干这行十几年,最怕听到的一句话就是“数据没了”。尤其DB2这种老牌企业级数据库,动辄几百G甚至上T的数据量,一旦误删或者逻辑错误,整个人都是懵的。但咱得说,DB2的恢复机制其实相当成熟,关键在于你有没有把“时点恢复”这套功夫练熟。今天不聊那些虚头巴脑的理论,直接上实操,讲讲怎么把数据库精准回滚到你想要的某个时间点。

先说个最常见的场景。凌晨三点,某个开发手一抖,执行了不带WHERE条件的UPDATE,整张表的数据全被改成了同一个值。这时候你接到电话,对方声音都在抖。别慌,先看看你的备份策略。DB2里最常用的就是在线备份加归档日志,只要日志链没断,理论上你可以恢复到任意一个时间点。但这里有个坑,很多人以为备份了就万事大吉,结果发现归档日志目录满了,旧的日志被自动清理,恢复的时候直接卡在中间某个位置,那才叫欲哭无泪。
所以第一步,拿到事故报告后,先确认三件事:最近一次全量备份的时间点、归档日志的连续性、以及数据库当前的状态。如果数据库还在运行,千万别急着关,先执行看一眼当前时间戳,然后立刻冻结写入,用把应用停掉。这一步很多人忽略,觉得先恢复再说,结果恢复过程中又有新数据写入,日志链一乱,前面所有操作全白费。
接下来是恢复的核心逻辑。DB2的时点恢复,本质上就是“全量备份 + 前滚日志到指定时间”。假设你昨晚2点做了全量备份,事故发生在今天上午10点15分,你想恢复到10点整的状态。那么命令很简单:,这里注意,后面跟的是备份时间戳,别搞混了。恢复完成后,数据库处于pending状态,这时候需要前滚:。关键就在这个后面的时间,必须精确到秒,差一秒钟都不行。
但实操中往往没那么顺。比如你手头只有昨天的全量备份,今天的归档日志也没丢,那也能恢复。命令支持,但那是恢复到最新状态,不是时点。所以你得先查一下日志的范围,确认10点这个时间点在日志覆盖区间内。如果日志丢了,那就只能恢复到丢失日志之前最近的那个点,这个没办法,物理限制在那儿。
还有个容易踩的坑是表空间级别的时点恢复。有时候你只想恢复某一张被误删的表,没必要整个库回滚,那样影响面太大。DB2支持表空间时间点恢复(TSPITR),但前提是备份里包含了该表空间,而且表空间得是独立的。操作方法略复杂,先,然后。这里有个潜规则,表空间恢复后,相关表的数据会回到那个时间点,但日志里后续的操作就丢了,所以恢复前最好把该表空间的当前数据导出来留个底。
再聊聊恢复后的验证。很多新手恢复完一看到数据库能连上,就急着通知业务方“好了”,结果第二天人家说数据还是不对。恢复完第一件事,,或者更简单点,,对比一下事故前的统计信息。要是数据量对不上,赶紧查日志,看看是不是时间戳写错了。另外别忘了,恢复完要把数据库设为正常状态,之后,再执行,不然应用连不上。
说句实在话,时点恢复这活儿,七分靠备份策略,三分靠临场反应。你备份策略再完美,遇到日志断链照样抓瞎;反过来,备份做得很糙,但只要日志在,恢复成功率也低不到哪去。所以平时没事儿多演练几次,把恢复步骤写成脚本,标好注释,真出事的时候照着跑就行。别嫌麻烦,凌晨三点被叫起来的时候,你会感谢那个提前写好脚本的自己。DB2的时点恢复,说到底就是“备份+日志+时间戳”这三样东西的组合游戏,玩熟了,数据就稳了。


