做DBA这行,最怕半夜手机响。数据库宕了、数据文件损坏、日志文件丢失,每一件都够让人头疼一宿。干了十几年Oracle运维,我踩过的坑不比你们少。今天不聊那些虚头巴脑的理论,就说说我工位上常备的几款修复工具,都是实战里真刀真枪用过的。

先说最基础的DBMSREPAIR。这工具听着不起眼,但对付数据块损坏特别好使。有一次客户的生产库报ORA-01578,文件7的块1203坏了,整张表都查不了。我当时就用DBMSREPAIR.CHECKOBJECT扫了一遍,把坏块标记出来,再用FIXCORRUPTBLOCKS修复,用DUMPORPHANKEYS把孤立行捞出来。整个过程像做外科手术,坏块隔离了,表能查了,业务没中断。这工具适合处理局部块损坏,但要注意它只是把坏块标成“跳过”,数据本身是找不回来的,该做备份还得做。
真正遇上大面积的介质损坏,就得靠RMAN出手了。RMAN不是新工具,但很多人用不明白。我见过不少同行,RMAN备份是配了,可从来没验证过恢复。这就跟买了保险不看病历一样,真出事才发现备份是坏的。RMAN的VALIDATE命令、RESTORE...PREVIEW这些功能,我每次备份完都会跑一遍。还有BLOCKRECOVER,能针对单个坏块做恢复,不用整库恢复,速度极快。去年有一回,一套核心系统的数据文件头块坏了,我用了不到十分钟就搞定,业务基本没感知。
再说说LogMiner,这工具是分析重做日志的利器。有一次客户说数据被误删了,但不知道具体谁干的、什么时候干的。我用了LogMiner分析归档日志,把那个时间段的SQL全捞出来,很快就定位到是一条DELETE语句没带WHERE条件。有了这个信息,后面不管是做闪回还是手工补数据,都有了依据。LogMiner的用法也不复杂,先ADD LOGFILE,再STARTMINING,查询V$LOGMNRCONTENTS视图。关键是你要会读那些SQL语句,能从一堆操作里分辨出哪些是正常业务,哪些是人为失误。
闪回技术这块,Flashback Query和Flashback Table我几乎天天用。这俩工具适合处理逻辑错误,比如数据被误更新了、表被误删了。Flashback Query能让你看到过去某个时间点的数据快照,直接查出来补回去就行。Flashback Table更干脆,一条语句把整张表恢复到指定时间点。但这里有个坑,你得提前开好UNDORETENTION,并且确保UNDO表空间够大。我有一次就是因为UNDO太小,想闪回的时间点已经过了保留期,只能干瞪眼。
遇到数据文件丢失、表空间掉线的情况,我一般先用ALTER DATABASE DATAFILE OFFLINE把文件隔离,然后从备份里恢复。但恢复完了经常遇到SCN不一致的问题,这时候就需要用RECOVER DATABASE命令做介质恢复。这个过程看着简单,其实细节很多。你得分清是恢复整个数据库还是某个表空间,是恢复到当前时间点还是恢复到某个SCN。搞错了,可能把好的数据也弄坏了。所以我的习惯是,动手之前先把当前的控制文件和数据文件头信息记录下来,做到心里有数。
还有一个工具经常被忽略,就是DUL(Data Unloader)。这工具是Oracle内部用来直接读取数据文件的,不通过数据库实例。当数据库彻底起不来,连MOUNT都进不去的时候,DUL能直接从数据文件里把表数据导出来。我印象最深的一次,客户的数据库因为断电导致控制文件全部损坏,而且没有备份控制文件的脚本。当时所有常规手段都失灵了,就是用DUL把关键业务表的数据抽了出来,虽然不是完整恢复,但保住了最核心的数据。这工具不太容易拿到,但作为兜底方案,建议有条件的朋友备一个。
另外,Oracle自带的ADRCI工具也值得一说。它主要负责查看和管理数据库的告警日志、事件日志。有时候故障原因不明,我就先用ADRCI把最近一段时间的错误信息全导出来,看看有没有ORA-600、ORA-7445这类内部错误。这些错误信息往往能提示是某个组件出了问题,比如redo log buffer不够、某个后台进程异常退出。ADRCI还能生成incident文件,这些文件在向Oracle官方提SR(Service Request)时是必备的素材。
工具再多,也别忘了最根本的一条:备份策略要合理。很多故障本来可以轻松恢复,就是因为备份策略有漏洞,才搞得兴师动众。我见过不少人把RMAN备份写到本地磁盘,结果磁盘也坏了;也有人的备份周期太长,恢复点目标(RPO)根本满足不了业务要求。所以我的建议是,备份要分级、要多样,本地盘保留一份,异地的存储再放一份,有条件的话再配个云备份。平时多花点心思在备份上,真出故障的时候,工具才能发挥出最大的作用。
说句实在话,工具只是辅助,真正靠的是对Oracle内部机制的深入理解。你只有知道数据块是怎么组织的、SCN是怎么推进的、回滚段是怎么工作的,才能用好这些工具。我建议大家有空多翻翻Oracle的官方文档,尤其是Concepts和Backup and Recovery User's Guide这两本,把原理搞通了,工具用起来才能得心应手。故障来了别慌,先定位问题,再选合适的工具,一步步来,多数问题都能解决。毕竟这行干久了,什么稀奇古怪的故障没见过呢。


