2013年2月28日 Oracle 数据库完全破损/损坏对策 M mac Author 32 min Read Time 18 Views Block Corruption 造成的影响 对商业运行造成的直接影响 数据损坏导致业务停止 数据恢复时间变长 修复工作发生错误,造成二次灾害 寻找原因的时间变长 数据损坏的主要原因 复杂并且有可能被分割的Layer的风险 系统中数据保护的机制 § 单个系统中,考虑到了一些无法防御的的风险的机制。 – 例:因为人为错误删除数据时,在RAID结构中无法防御。 § 复制数据中保护一致性与确实性的机制。 – 例:部分备份导致的数据完整性的欠缺。 § 考虑到迅速切换以及确实的修复的机制。 – 例:由于灾害恢复训练不足,实际上无法切换,无法返回的备份。 为了确实地能提高工作的可持续性需要什么? Oracle Maximum Availability Architecture § Maximum Availability Architecture (MAA) 是基于oracle验证完成的高可用性的数码与成功事例的最佳实践。 § MAA的目的 – 为了修复、查出、规避所有的停止的情况提供最优实践。 – 在样本中构成最优的高可用性的架构。 § 不受硬件以及OS影响(不需要特定的高价的产品以及技术) § 马上就可以提供高可用性的解决策略(Oracle事先完成验证) 高可用性的数码的最佳实践。 Oracle MAA 的整体映像 Low-Cost, Integrated, Fully Active, High ROI Oracle MAA の Data Protection Oracle Database 11g Release 2 Oracle Database 的 Data Protection功能 Type of Block Corruption § Data Block Corruption(Doc ID 840978.1) – Physical Block Corruption – Logical Block Corruption § Other Corruptions – Control file Corruption § Use control file mirror & Copy – Redo Corruption § ASM Mirroring / Use multiplexed log file – Dictionary Corruption(Doc ID 136697.1) Doc ID 1088018.1 Master Note for Handling Oracle Database Corruption KROWN#152523 [Master Notes] Corruption(破损) Data Block Corruption § 物理性的块内数据破损状态的块 – 破损例 • Block Header不正确 • Block Header与Footer信息不一致 • 数据缺失 • Block配置地点不正确 • 0隐藏的Block Physical Block Corruptions Data Block Corruption § Block中结构发生理论破损的状态的块 – 物理性(Block Header以及Footer的信息、Checksum的计算结果)正确 – 破损例 • 行碎片的开始与结束位置不在块内。 • 行碎片直接发生重叠 • 锁定行碎片的ITL编号不正确 • ITL展示的锁定中的行碎片的数量与实际不一致 • Block中空白区域的尺寸不正确 • Lost Write Logical Block Corruptions Oracle Database中最适合的破损检测 § Oracle Database的Block并不是单独的bit的罗列, 明确地事先定义过的结构 à 正是有理解了Block的结构的Oracle Database,可以检测 Physical Corruption以及Logical Corruption。 à 并且,通过同时使用Oracle Database的各Technology,可以提高检测水平 – OS、文件系统以及存储中,仅仅是和命令一样对块进行I/O,但无法判断块的结构作为一个数据块来说是否正确。Exadata Cell Storage Serverと、H.A.R.D Initiative 是可以检测的 Data Block Format Oracle DatabaseのData Protection § 控制检测范围、水平、破损类型的初始化参数 – DB_BLOCK_CHECKSUM – DB_BLOCK_CHECKING – DB_LOST_WRITE_PROTECT § 定期检测功能 – Oracle Recovery Manager(CHECK LOGICAL句 / VALIDATE 命令) – SQL> ANALYZE TABLE文(VALIDATE STRUCTURE CASCADE 选项) 提高检测水平的功能 DB_BLOCK_CHECKSUM § 利用Data Block中的Checksum的Physical Corruption检测的机制 – 向Disk写入Block之前 § 将DBWR以及执行Direct Load的服务器进程、Checksum(从Block中所有数据为基础来计算出的数值)储存到Block Header之中。 – 从Disk中读出Block后 § 读出Block的进程将重新计算的Checksum与储存到Block Header中的Checksum进行比较验证。 à 如果Checksum不一致时,因为块内数据可能会产生变更,可能判断为Physical Block Corruption以及发生了 概要 DB_BLOCK_CHECKSUM 设定值中的每个操作 DB_BLOCK_CHECKSUM § 请注意设定值的不同造成的操作的不同 – DB_BLOCK_CHECKSUM=TYPICAL • 由于服务器进程的Block更新之后,Checksum为0 • DBWR在向Disk写入时,计算Checksum再嵌入 à 每次更新时,因为不会计算Checksum而高效化 – DB_BLOCK_CHECKSUM=FULL • 由于服务器进程的Block更新之后,计算Checksum再嵌入 • DBWR在向Disk写入时, 验证Checksum à可以验证内存上的Block Corruption 对于Buffer Cache上被更新的Data Block Checksum嵌入时机 DB_BLOCK_CHECKSUM § 每次发行时,请注意其中不同的操作 – Release 11.1以降では、Redo BlockのChecksumの 将生成处理由生成了Redo的Foreground Process担当à减轻 LGWR的负荷 § 但是,Release 11.1~11.2.0.1中,设定为FULL时, LGWR在向磁盘写入Redo Block之前,会执行Foreground Process所生成的Checksum的完整性检查。 对Redo Block进行Checksum的生成与验证(KROWN#155653) DB_BLOCK_CHECKSUM 检测出破损的操作 DB_BLOCK_CHECKSUM § Primary Database’s Alert.log 用Automatic Block Media Recovery(ABR)来自动修复时所参考的日志 DB_BLOCK_CHECKING § 在Buffer Cache上变更Block之后, 通过检测理论性的完整性,可以检测Logical Corruption – 即使是Checksum正确,可以检测理论性的不正确的状态。 – 变更后被标记的理由是由于DML数据更新以外,包含变更。 § 例:伴随着DBWR的写出,变更Block Header的信息 – 不经过Buffer Cache的Direct Load Operation不在本次检测对象中 – 根据参数的设定值,可以控制检测的对象以及水平 概要 DB_BLOCK_CHECKING § 上位设定值包含下位设定值的检测 – 比如,「LOW」=「OFF」的检查 + 所有的Block的Block Header Check – 基本上,Buffer Cache上的Block内容在变更后会执行检测,但 Block Header Check是RAC的实例之间的Block在传送后也会被执行 设定值的操作 DB_BLOCK_CHECKING – 包含没有commit的redo,发生错误之前的Block的状态 à 同一会话中继续进行事务的可能 检测出破损后的操作(Disk上的Block是正常的情况) DB_BLOCK_CHECKING § Oracle Client § Alert.log 检测出时的参考日志(Disk上的Block正常的情况) DB_BLOCK_CHECKING – 即使自动修复失败,请注意成功时,只会返回同样的错误。 § 之后,重新访问block时,会发生ORA-1578 或者ORA-600 à 需要手动操作 Block Media Recovery(ABR不会发动) 检测出破损后的操作(Disk上的Block也破损的情况) DB_BLOCK_CHECKING § Oracle Client § Alert.log 检测时的参考日志(Disk上的Blockも发生破损的情况) Soft Corrupt § 检测出破损的(Oracle的破损与认识)Block中被加上的标记 – 访问这些被标记的块时,会发生ORA-1578。 不是与Physical Corruption / Logical Corruption同列的单词 DB_LOST_WRITE_PROTECT § 不管从存储装置中block的写入完成是否发出通知,实际上磁盘中没有被写入的事项。 – 因为Data Block的构造是正常的, 即使访问发生了Lost Write 的Block也没有发生错误 à 可能会有提供不正确的数据给顾客或者用户的风险 à 不正确的数据污染可能会扩散 § Lost Write所影响的例子 – 不管是否有没有储备,都作为有储备来接收订单 – 不管是否接受订单都会变成没有接收订单 Lost Write是什么? DB_LOST_WRITE_PROTECT § Data Guard(Physical Standby Database)中检测出Lost Write的机制Primary Database中从磁盘中读出Block时,生成验证用的redo § Data File Number § Data Block Address(DBA) § System Change Number(SCN) • Data Guard的机制中,对Physical Standby Database传送Redo • 比较验证Standby Database方的对象Block与Redo内的SCN à 如果SCN不一致时,可能发生Lost Write 概要 DB_LOST_WRITE_PROTECT § 需要Primary Database以及Standby Database两方面的设定 – Primary 或者 Standby Database的两方面的设定都是NONE时无效 § Primary因为没有生成验证用的redo无法用Standby来验证 § 即使用Primary来生成Redo,用Standby也不能验证 各个设定值的操作 DB_LOST_WRITE_PROTECT § 检测Lost Write的时机是? – 从Primary Database中发生Lost Write的Block,从磁盘向Buffer读入时生成的Redo,Standby Database的MRP验证时 – à 不是发生Lost Write时(对Disk的写入不足的瞬间) 将发生Lost Write的Block从Disk读入的时机 – 特定Block中,即使发生Lost Write,只要不使用那个Block § 搜索结果以及更新事务都正常 § 不正确的数据不会传染到其他的块中 Lost Write的发生以及检测时机不一致 DB_LOST_WRITE_PROTECT § 验证用redo的生成仅限于向Buffer Cache读入Block时 – 不经过Buffer Cache的Direct Path Read中,不生成验证用的Redo § 非Data Guard环境中,用TYPICAL以上的设定来生成验证用Redo – Media recovery(前滚)时可以验证Lost Write § 还可以验证Standby Database中发生的Lost Write – 与Primary中生成验证用redo + Standby中验证这样的功能相同 – 仅限这种情况,但也可以用ASM Mirror以及ABR来自动修复(后面将讲到) 動作の補足 DB_LOST_WRITE_PROTECT Lost Write检测的流程(Primary中发生Lost Write的情况) DB_LOST_WRITE_PROTECT § Primary中发生的Lost Write在Standby中被检测出来 – 记录Standby DatabaseのAlert.log中发生的ORA-752 – 为了保护Standby Database的数据,自动停止MRP进程 § 终止以后的Redo适用,防止不正确数据导致的数据污染 – PRxx进程的Trace File(xxx_xxx_prxx_xxx.trc)中记录了Block的详细内容 § 访问Primary中的对象block时所生成的Redo记录的Dump § Standby中所保存的对象Block的Dump – 从这些信息中,确认以后会发生Lost Write 检测出Lost Write后的操作(Primary中发生Lost Write的情况) DB_LOST_WRITE_PROTECT Wed Oct 23 19:18:08 2013 Hex dump of (file 7, block 131) in trace file /u01/app/oracle/diag/rdbms/orcls/orcls1/trace/orcls1_pr02_1401.trc Reading datafile '+DATA/orcls/datafile/lw.281.829593935' for corruption at rdba: 0x01c00083 (file 7, block 131) Read datafile mirror 'DATA_0004' (file 7, block 131) found same corrupt data (logically corrupt) Read datafile mirror 'DATA_0006' (file 7, block 131) found same corrupt data (logically corrupt) STANDBY REDO APPLICATION HAS DETECTED THAT THE PRIMARY DATABASE LOST A DISK WRITE OF BLOCK 131, FILE 7 NO REDO AT OR AFTER SCN 3987667 CAN BE USED FOR RECOVERY. Recovery of Online Redo Log: Thread 1 Group 7 Seq 103 Reading mem 0 Slave exiting with ORA-752 exception Errors in file /u01/app/oracle/diag/rdbms/orcls/orcls1/trace/orcls1_pr02_1401.trc: ORA-00752: 由于恢复导致检测出数据块的写入欠缺。 ORA-10567: Redo is inconsistent with data block (file# 7, block# 131, file offset is 1073152 bytes) ORA-10564: tablespace LW ORA-01110: 数据文件7: '+DATA/orcls/datafile/lw.281.829593935' ORA-10561: block type 'TRANSACTION MANAGED DATA BLOCK', data object# 87637 Wed Oct 23 19:18:12 2013 Recovery Slave PR02 previously exited with exception 752 Wed Oct 23 19:18:12 2013 MRP0: Background Media Recovery terminated with error 448 Errors in file /u01/app/oracle/diag/rdbms/orcls/orcls1/trace/orcls1_pr00_1395.trc: ORA-00448: バックグラウンド・プロセスが正常終了しました。 MRP0: Background Media Recovery process shutdown (orcls1) Lost Write检出时的Standby Database的Alert.log输出的一部分摘选 (Primary中发生Lost Write的情况) DB_LOST_WRITE_PROTECT Hex dump of (file 7, block 131) Dump of memory from 0x00000000F03B0000 to 0x00000000F03B2000 0F03B0000 0000A206 01C00083 003CC55A 04010000 [........Z.<.....] ... STANDBY REDO APPLICATION HAS DETECTED THAT THE PRIMARY DATABASE LOST A DISK WRITE OF BLOCK 131, FILE 7 The block read on the primary had SCN 3977658 (0x0000.003cb1ba) seq 1 (0x01) while expected to have SCN 3982682 (0x0000.003cc55a) seq 1 (0x01) The block was read at SCN 3987667 (0x0000.003cd8d3), BRR: CHANGE #1 TYP:2 CLS:6 AFN:7 DBA:0x01c00083 OBJ:87637 SCN:0x0000.003cb1ba SEQ:1 OP:23.2 ENC:0 RBL:1 ... REDO RECORD - Thread:1 RBA: 0x000067.00000128.0010 LEN: 0x0034 VLD: 0x10 SCN: 0x0000.003cd8d3 SUBSCN: 1 10/23/2013 19:18:16 (LWN RBA: 0x000067.00000126.0010 LEN: 0003 NST: 0001 SCN: 0x0000.003cd8cf) CHANGE #1 TYP:2 CLS:6 AFN:7 DBA:0x01c00083 OBJ:87637 SCN:0x0000.003cb1ba SEQ:1 OP:23.2 ENC:0 RBL:1 Block Read - afn: 7 rdba: 0x01c00083 BFT:(1024,29360259) non-BFT:(7,131) scn: 0x0000.003cb1ba seq: 0x01 flags: 0x00000006 ( dlog ckval ) 续) PRxx的Trace File输出例(Primary中发生了Lost Write的情况) DB_LOST_WRITE_PROTECT Lost Write检测流程(Standby中发生Lost Write的案例) DB_LOST_WRITE_PROTECT § 在Standby Database检测出了 Lost Write。 § 与Primary中发生的Lost Write不同,自动进行修复 – Primary Database中因为保存了最新的正常Block 用Data Guard的Automatic Block Media Recovery自动修复 – 如果自动修复的话就不会发生ORA-752(Alert.log中没有输出) § MRP进程正常继续运行 检测出Lost Write的操作(Standby中发生了Lost Write的情况) DB_LOST_WRITE_PROTECT 检测出Lost Write后的操作总结 DB_ULTRA_SAFE Parameter § 通过变更DB_ULTRA_SAFE参数值,可以一起变更3个参数值 – 本参数的默认值是FALSE – 明确地个别设定各个参数时,优先个别设定值 提高检测水平的3个参数的一致设定 OLTP系的Workload中性能比较 § Exadata X2-2 Quarter Rack( 2node RAC结构) § Oracle Database 11g Release 11.2.0.4 § Oracle Grid Infrastructure 11g Release 11.2.0.4 § Exadata Storage Server Software 11g Release 11.2.3.2.1 – Write Through Mode 验证环境 OLTP系的Workload中性能比较 § 在下面的用户脚步中反复执行泛用的SQL Workload与Transaction的定义 OLTP系的Workload中性能比较 § 验证变更了Transaction的比例的三个Workload – 伴随着Test#的增加,将更新处理的比例 Transaction比例的模式 OLTP系的Workload中性能比较 § 在前页的各个Workload中,验证下面四个设定模式 Parameter的设定模式 OLTP系的Workload中性能比较 検証結果) 全模式测试的吞吐量(Transaction Per Sec) OLTP系的Workload中性能比较 验证结果) 全模式测试的Response Time OLTP系的Workload中性能比较 验证结果) 全模式测试的CPU使用率 Oracle DatabaseのData Protection § Oracle Recovery Manager(RMAN) – VALIDATE评论Data File、Backup File(Image Copy / Backup Piece)的破损检查 – CHECK LOGICAL句 § 追加Physical Corruption的检测,检测Logical Corruption § 可以与BACKUP / VALIDATE / RECOVER 评论同时检测 § ANALYZE TABLE <TableName> VALIDATE STRUCTURE CASCADE ; – 可能检测出表与索引Block之间的不完整 提供定期破损检测的功能 RMAN> Validate Check Logical RMAN> validate check logical datafile 18 ; Starting validate at 28-AUG-13 using target database control file instead of recovery catalog ... channel ORA_DISK_1: starting validation of datafile channel ORA_DISK_1: specifying datafile(s) for validation input datafile file number=00018 name=+DATA/orcl/datafile/tt.316.824637849 channel ORA_DISK_1: validation complete, elapsed time: 00:00:01 List of Datafiles ================= File Status Marked Corrupt Empty Blocks Blocks Examined High SCN ---- ------ -------------- ------------ --------------- ---------- 18 OK 1 277 320 224873829 File Name: +DATA/orcl/datafile/tt.316.824637849 Block Type Blocks Failing Blocks Processed ---------- -------------- ---------------- Data 0 4 Index 0 1 Other 0 38 Finished validate at 28-AUG-13 参考输出日志 SQL> ANALYZE TABLE VALIDATE STRUCTURE CASCADE ; – 如果发生了Physical Block Corruption,那么就会发生ORA-1578 – 如上所示,发生ORA-1499的话,表以及索引之间发生不完整的状态。 § 需要区分到底是在那个块中发生了故障。 – 例:FULL提示,或者使用NO_INDEX提示执行全表搜索 KROWN#68739 参考输出日志 Oracle Database 的 Data Protection Block Corruption 造成的影响 对商业造成的直接伤害 ü数据损伤造成的业务停止 ü修复时间变长 ü修复工作的人为错误、二次灾害 ü探究原因的时间变长 à 需要快速找出故障以及执行正确的修复 Oracle MAA的数据保护功能一览 Oracle Database 11g Release 2 Oracle MAA 主要的修复功能 Oracle ASM / Mirroring § 需要Normal(二重化) 以及High Redundancy(三重化)的结构 § 检测到破损时,参考Mirror数据自动进行修复 – 对于Oracle Client(ORA错误不会返回) – Primary中关于发生的Lost Write,不在此次对象中 § Standby中发生Lost Write时,使用Mirror防止误检测 § Redo Block破损时,参考Mirror数据 – Normal/High Redundancy的ASM Diskgroup上配置Redo Log file § Doc ID 1274318.1 通过Oracle Client对块进行自动修复 Automatic Block Media Recovery 由于Active Data Guard进行穿透性的块修复 Automatic Block Media Recovery § Standby中检测出块破损是,就会用逆向ABR进行自动修复 – 对象块破损 § Standby中的Physical Block Corruption – 用DB_BLOCK_CHECKSUM的功能检测出的项目 – 对Soft Corrupt以及标记完成的块进行访问时,不会有任何操作 (ABR至多在标记之前进行尝试修复。) § Standby中发生了Lost Write的Block – Primary中发上来Lost Write的Block不在此次对象中 (更新不正确的块时,生成的不正确的redo是无法修复的) 操作的追加信息 Automatic Block Media Recovery § Primary Database’s Alert.log 检测块破损以及用ABR进行自动修复时的参考日志 Oracle Recovery Manager § 储存修复对象块的Data File只有在ONLINE状态下才可以执行 § Lost Write导致的块破损不在此次对象中 – 修复指定块的命令 § 一般而言,在V$DATABASE_BLOCK_CORRUPTION视图中,指定被表示的block(检测出破损的块)(执行时也需要检测破损) – 将在V$DATABASE_BLOCK_CORRUPTION视图中表示的视图一起修复的命令。 用RECOVER命令来对块进行修复 Oracle Recovery Manager § 对块单位的恢复来说,需要可以Restore的正常块 – 正常块的搜索地址的优先顺序如下所示 • Active Data Guard的Physical Standby Database • Flashback Log (Recovery执行中的Database内) • RMAN Image Backup (Recovery执行中的Database内) – 前述都是正常的块被Restore,用自动恢复来实现最新化 – 如果块单位中无法修复时,需要用数据文件单位的恢复 怎样的块才会是可以成为块单位中恢复基准的正常块呢? Oracle Enterprise Manager Cloud Control 12c § 根据Database环境状况,可以简单实现最适合的恢复 – 考虑块单位中的恢复是否可能的命令 – 用Oracle Enterprise Manager可以简单地执行恢复能 § 执行例 – 在下面的Database环境中,我们将介绍用Physical Block Corruption以及 EM(Data Recovery Advisor)来修复的顺序 § 没有Active Data Guard环境 § 有Flashback Log(但是是过了保存期限的状态) § 没有RMAN Image Copy Backup Data Recovery Advisor中自动生成修复命令 Oracle Enterprise Manager Cloud Control 12c 早期掌握Incident Manager的故障 Oracle Enterprise Manager Cloud Control 12c Data Recovery Advisor的执行 Oracle Enterprise Manager Cloud Control 12c § 考虑Database环境的状况(3页之前), 判断为块单位中的恢复是不可能的 Data Recovery Advisor的执行结果 Oracle Enterprise Manager Cloud Control 12c Recovery Job的发行(执行Advisor的结果脚步) Flashback Technology § Flashback Database命令 – 人为错误(删除数据以及不合适的更新处理等)可以迅速恢复 – 因为Primary中发生Lost Write了,在Data Guard中执行Fail-Over之后, 将旧Primary作为新Standby环境来迅速修复的情况 § Flashback Log – 执行上述的Flashback Database命令时 – 前章中介绍过的,执行RMAN主导的块单位中的Media Recovery时 Flashback Database (Flashback Log)的活用例 Oracle Data Guard § Oracle Data GuardのPhysical Standby是完全复制Database – 将在Primary Database中生成的Redo同样地应用于Standby中 § Primary中的块更新处理,也适用于redo的块。 à 一定会Fail-Over的Database环境 § 特别是在Primary Database中发生Lost Write时有效 – 使用正常数据迅速重新展开业务 – 可以不影响正常业务来调查Lost Write发生原因 § 原因不明时,请考虑持续使用Primary的H/W的风险 对Physical Standby Database的Fail-Over Oracle Data Guard § 从Lost Write检测开始到Fail-Over为止,被执行的事务会失去 – Primary是Standby中检测出Lost Write也继续运行 à 由于业务事务,发生新变更的状况 à 虽然也有正确的变更,但也混合了一些使用了Lost Write的Block的变更 – Standby为了防止数据污染,检出以后的redo适用停止了。 – à 重要的是如何迅速停止Primary仅限Fail-Over à Release 11.2.0.4以后, 追加Data Guard Broker的Primary Lost Write Action Property 检测出Lost Write事可以自动对Primary进行ABORT 检测出Lost Write后Fail-Over时需要考虑的事情(1) Oracle Data Guard § Fail-Over之后,Data Guard结构崩溃的状态 – 因为旧Primary与新Primary(原Standby)是在不同的道路上前进 à 需要对新Standby Database重新制成旧Primary Database § 重新制成的方法 检测出Lost Write后Fail-Over时需要考虑的事情(2) Oracle’s Data Protection Conclusion Data Protection Oracle Database 11g Release 2 Data Protection 3个初始化参数的检测操作以及修复方法的概要 Conclusion Data Protection Oracle Database 可以提供保护数据的高可用性的解决方法。 l DB_ULTRA_SAFE Parameter l Oracle Data Guard l Oracle Recovery Manager Oracle Enterprise Manager