ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

05 · 控制文件与在线日志丢失恢复:当文件真的没了

05 · 控制文件与在线日志丢失恢复:当文件真的没了 03-数据库启动失败排查 讲了怎么分诊本篇讲怎么手术。控制文件和控制着归档链的在线 redo 是 Oracle 最要命的两类文件——处理动作分支多、风险高动手前先想清楚自己在归档模式还是非归档模式、有没有 RMAN 备份这两个前提决定你能走哪条路。一、控制文件丢失/损坏1.1 为什么控制文件如此重要控制文件是数据库的户口本数据文件清单、redo 清单、RMAN 备份目录、SCN 时间线全在里面。丢失意味着数据库连自己有哪些家当都不知道。它也是少数 Oracle 官方要求多路复用的文件control_files参数指向 3 份副本建议分布在不同磁盘任一副本损坏其余副本仍可救场。1.2 场景 A多路复用副本损坏最常见也最轻松-- ① 关库SQLSHUTDOWNIMMEDIATE;-- ② 用好副本覆盖坏副本OS 层操作$ cp/u02/ctl/control02.ctl/u01/ctl/control01.ctl-- ③ 起库SQLSTARTUP;alert.log 里出现单个控制文件副本 IO 错误时就是这么处理。做完必须排查坏副本所在磁盘——多路复用的意义就是不同故障域如果三份都放同一块盘等于没复用。1.3 场景 B全部损坏有 RMAN 备份标准路径前提CONFIGURE CONTROLFILE AUTOBACKUP ON;没开现在就去开。RMAN STARTUP NOMOUNT; -- 控制文件丢了只能到这 RMAN SET DBID 你的DBID; -- 从之前的告警/文档里找RAC 常见自动识别失败时必需 RMAN RESTORE CONTROLFILE FROM AUTOBACKUP; RMAN ALTER DATABASE MOUNT; RMAN RECOVER DATABASE; -- 用归档redo 恢复数据文件 RMAN ALTER DATABASE OPEN RESETLOGS; -- 重建的控件文件使 redo 序列归零RESETLOGS 的代价在线日志序列号从 1 重新计数之前的所有备份瞬间作废——所以 OPEN RESETLOGS 之后要立刻做一个全新的全备。1.4 场景 C无备份但有 trace最后手段前提曾经执行过ALTER DATABASE BACKUP CONTROLFILE TO TRACE或从 alert.log 中整理出 CREATE CONTROLFILE 语句-- 平时预防措施就做一份SQLALTERDATABASEBACKUPCONTROLFILETOTRACEAS/tmp/ctrl_rebuild.sql;拿到重建脚本后按其中 NORESETLOGS/RESETLOGS 两个分支选择执行数据文件都在、只是控制文件丢了 → 尽量走 NORESETLOGS 分支保住归档链。1.5 控制文件丢失决策树控制文件损坏 ├─ 还有副本可用 │ └─ 是 → 好副本覆盖 → 开库 → 排查磁盘 → 完事 └─ 全没了 ├─ 有 RMAN autobackup→ RESTORE CONTROLFILE → RECOVER → OPEN RESETLOGS → 立刻全备 ├─ 有 trace 重建脚本→ CREATE CONTROLFILE优先 NORESETLOGS └─ 都没有→ 数据文件还在 → 手写 CREATE CONTROLFILE高风险二、在线重做日志Online Redo Log丢失2.1 先看状态状态决定动作SELECTgroup#, status, archived, member FROM v$logfile;SELECTgroup#, status, sequence# FROM v$log;组状态含义丢失后果处理UNUSED从未写过无数据丢失直接CLEAR LOGFILEINACTIVE检查点已推进过它无数据丢失但对应归档可能缺失CLEAR LOGFILE归档模式下可能要先处理归档ACTIVE崩溃恢复还可能需要它危险CLEAR UNARCHIVED LOGFILE会打断归档链CURRENTLGWR 正在写极危险可能丢数据需 RMAN 不完全恢复全部丢失—数据丢失风险高RESETLOGS 重建2.2 各状态处理命令-- INACTIVE / UNUSED安全清理重建SQLALTERDATABASECLEAR LOGFILEGROUP3;-- ACTIVE 且归档模式下归档也没了跳过归档强制重建SQLALTERDATABASECLEAR UNARCHIVED LOGFILEGROUP3;CLEAR UNARCHIVED的连锁后果该组对应的归档日志永久缺失这条归档链断了——此后用它之前的备份做恢复最多只能恢复到断点之前。清完必须立刻全备重新建立恢复基线。Data Guard 环境下还要检查备库是否因此出现 gap。2.3 CURRENT 组丢失接受不完全恢复CURRENT 日志里有尚未检查点化的数据物理丢失即丢数据。标准动作是 RMAN 不完全恢复RMAN RESTORE DATABASE; RMAN RECOVER DATABASE UNTIL CANCEL; -- 归档应用完手动 CANCEL RMAN ALTER DATABASE OPEN RESETLOGS;纪律做完 RESETLOGS第一时间全备 通知业务核对数据一致性。2.4 预防日志组的三三制每个日志组至少 2 个 member分布在不同磁盘和 control file 同理至少3 个组为切换留余量redo 大小以30 分钟左右切换一次为宜切换过快 → checkpoint 压力 log file switch等待见 08-log-file-sync提交慢专题。三、两条贯穿全文的保命配置-- RMAN 里执行控制文件spfile 自动备份RMANCONFIGURE CONTROLFILE AUTOBACKUPON;-- 日常留档控制文件重建脚本每月或重大变更后SQLALTERDATABASEBACKUPCONTROLFILETOTRACEAS/backup/ctrl_rebuild.sql;这两条配置的价值在 03-数据库启动失败排查 的参数文件场景和本篇的场景 B/C 中反复兑现——恢复的难度取决于事故发生前你做了什么。四、演练建议在测试库下面是一套安全的故障演练方法与 RAC 实操演练同款流程单机同样适用演练前先备份ocrconfig -manualbackup集群或 RMAN 全备单机制造故障dd if/dev/zero of测试盘 bs1M count50模拟文件损坏按 1.5 / 2.1 的决策树走恢复流程验收开库后核对数据 检查 alert.log 无新 ORA-。只在隔离的测试环境做。五、小结控制文件有副本→覆盖有 autobackup→RESTORERESETLOGS有 trace→CREATE CONTROLFILE在线日志丢失先查v$log状态UNUSED/INACTIVE 可 CLEARACTIVE 要 UNARCHIVED断归档链清完立刻全备CURRENT 走不完全恢复两条保命配置CONTROLFILE AUTOBACKUP ON 定期 TO TRACERESETLOGS 之后旧备份作废必须立即全备。下一个大主题是性能06-AWR-ASH-ADDM性能诊断三板斧 —— 5 分钟读懂一份 AWR。
返回列表