如果自己搞不定可以找诗檀软件专业ORACLE数据库修复团队成员帮您恢复!
诗檀软件专业数据库修复团队
服务热线 : 13764045638 QQ号:47079569 邮箱:service@parnassusdata.com
Oracle数据库 – 企业版 –版本9.0.1.0和本文档中适用于任何平台的更高的信息。
目的
这篇短文介绍了Oracle 的几个功能,可在新数据库上用来在快要发生故障时帮助检测,其中一些功能是公开记录的,有些则不是,都应该小心使用。Oracle支持服务建议使用这些功能来创建新数据库,但是,在现有数据库上引入任何功能时,要注意它们可能会显示存在的问题。
详情
块校验
不同的Oracle 版本中有一个特殊的规定,就是对Oracle数据库块添加校验,当块接下来由Oracle读取时,这有助于检测介质损坏。
它有什么作用?
块校验迫使Oracle计算校验和,并在它写入到磁盘之前,置于每个数据库块的头部。
当块随后被读出时,校验和被重新计算,存储的值与计算的值一起被检查。
任何差异都被当做一个介质错误,ORA-1578错误也以信号告知,校验和本身在块被写入之前添加到块。
优点
校验使Oracle能检测因底层磁盘、存储系统或I / O系统引起的早期损坏。
缺点
导致了一小笔性能开销。
开启此功能通常仅仅会导致增加1%到2%的开销,所以,Oracle公司建议将DB_BLOCK_CHECKSUM设置为true,但是,在一个实时的数据库上引入该选项之前,如果可行的话,应该进行检查,这种开销是不太可能很大,但它的影响主要取决于应用程序和数据访问,所以是很难预测的。
启用块校验和
将下列相关的参数添加到你的INIT.ORA 文件中
Oracle 版本 用来启用校验和的参数
10gR2+ DB_BLOCK_CHECKSUM = OFF | TYPICAL | FULL
默认是TYPICAL和以前版本中的 TRUE 一样
在FULL 模式下,Oracle 在来自update/delete 语句的变更申请前,还确认了校验,变更申请后,重新计算了校验。此外,在将其写入当前日志之前,Oracle对每一个日志块进行校验。
9.0.1 – 10g DB_BLOCK_CHECKSUM = TRUE
默认是TRUE –>> 处理所有的表空间以及为重做日志的块写入校验。
如果设置为 FALSE –>>仅处理SYSTEM表空间
动态:更改系统
8.1.5 – 8.1.7 DB_BLOCK_CHECKSUM = TRUE
如果设置为TRUE –>>处理所有的表空间以及为重做日志的块写入校验。
默认是FALSE –>>仅处理SYSTEM表空间
请注意,使用8.1.5或更高版本, DB_BLOCK_CHECKSUM也会将校验信息写入到已被写入到联机重做日志中的重做日志块。
在8i之前的版本中,有单独的参数LOG_BLOCK_CHECKSUM来控制这个,这个LOG_BLOCK_CHECKSUM 参数现在对于8i 及以上版本来说是过时的。
还要注意的是校验和仅添加到一个数据块,如果块已被Oracle修改,所以,当此参数首先设置,大部分的数据块将不会受到校检。
我们通常希望将校验添加到现有的块,以确保尽可能早的检测出问题,Oracle8 及以后的版本中,有望通过使用RMAN 复制下列描述的数据文件得以实现。
在所有版本,也可以通过大量更新主表来实现,以保证每个数据块由Oracle修改从而具有校验添加到它。
使用RMAN添加校验到文件
这是一个用来证明如何使用RMAN 添加校验到数据文件的例子,你可以使用此方法,即便你不会为你的备份使用RMAN。
# 在目标数据库上确保DB_BLOCK_CHECKSUM 设置为TRUE
# 干净关闭后安装目标数据库,随后:
rman nocatalog
RMAN>连接目标
RMAN-06005: 连接到目标数据库: V806
RMAN> 执行{
分配信道DEV1类型的磁盘;
复制数据文件 ‘/prod/original.dbf’ 到 ‘/prod/backup.dbf’;
}
# 复制的文件(/prod/backup.dbf here) 现在包括
# 每个块上的校验.
#然后,您可以在复制文件指出数据库
#或复制备份到原始位置
#比如:
RMAN> sql “修改数据库重命名文件”/prod/original.dbf” 到 ”/prod/backup.dbf””;
逻辑块检查
此功能迫使Oracle在数据块被修改时对其完整性进行健康检查。
它有什么作用?
每当Oracle修改数据块时,块上就会进行一次完整的健康检查,以确保其完全一致,发现的任何错误会导致内部错误发出信号(比如: ORA-600 [6599]),可能会引起一系列内部错误,这取决于损坏被检测之前被立即执行的块更改的类型。
如果通过8.1.5在Oracle7 中检测到问题,Oracle执行块的高速缓存恢复,如果高速缓存恢复时,错误重复发生,该块就会被标记为软件损坏,该块中的数据在正常的应用访问中丢失,该块所属的对象在此块被请求时会引起ORA-1578 错误。
(一个“软件损坏”块通过在块的头部设置某些字节产生,以表明该块被认为是损坏的块)
因为,如果块级别恢复失败Oracle 8.1.6的新错误(ORA-607) 会发出信号, Oracle 8.1.6 及以后的版本,块不会立刻损坏。
优点
逻辑块检查使得潜在的损坏在发生之前尽早地被检测到,在造成一个更严重的错误之前避免了更大范围的损坏。
缺点
块检查通常会引起1%到 10% 的开销,这取决于工作量。
工作量中的更新和插入越多,块检查的花费也就越大。
如果性能开销在接受的范围内,应该把DB_BLOCK_CHECKING设置为true
警告
没有在正常操作时间以外首先进行数据库逻辑一致性检查时,不可启用该功能。
这可以通过使用提供Oracle7.3及以上的DBVERIFY工具来实现,或者在旧版本可以恢复数据库的副本,并执行完全出口,并在所有主要股指执行索引范围扫描检查,以证明他们都完好无损。
对原始数据块有信心也是重要的。
如果一个损坏应该被检测到,也应该考虑可能造成的停机时间。
启用逻辑块检查
添加下列相关的参数到你的init.ora 文件。
这些事件适用于所有的Oracle版本。
Oracle 版本 设置参数启用块检查
10gR2+ DB_BLOCK_CHECKING = OFF | LOW | MEDIUM | FULL
默认是 OFF
LOW – 内存中的块内容变化后,执行基本的块的头部检查 (例如, UPDATE或 INSERT 语句后, 进行磁盘上的读取或者RAC实例间的块传输)
MEDIUM – 执行所有的 LOW 检查, 同时对所有非索引组织表块进行语义块检查
FULL – 执行所有的LOW和 MEDIUM 检查, 同时对索引块进行语义检查
(也就是, 损坏发生时,从属对象的块实际上可以丢弃和重建)
9.0.1 – 10g DB_BLOCK_CHECKING = TRUE
如果设置为True –>> 对所有的表空间启用块检查 默认是 FALSE –>> 仅对 SYSTEM表空间设置块检查.
动态: 更改系统
8.1.6 – 8.1.7 DB_BLOCK_CHECKING = TRUE
如果设置为True -> 在所有的表空间启用块检查 默认是FALSE -> 仅对 SYSTEM表空间设置块检查
写入丢失检查
写入丢失检查由11.1 及以上的初始化参数‘DB_LOST_WRITE_PROTECT’ 启用。
它有什么作用?
如果I / O子系统确认块写操作完成,其实它并没有写入到磁盘时,发生写入丢失。如果DB_LOST_WRITE_PROTECT被设置,高速缓存中读取被记录,从而导致产生重做的选择。这对写入丢失检查是必要的。
优点?
这将有助于待机环境下被运用之前捕捉写入丢失,它还可以帮助期间待机或主数据库介质恢复应用重做时检测写入丢失。
缺点?
大部分情况下开销很小,但是再生产环境中启用之前,应该在测试系统上评估其影响。
启用写入丢失保护
使用更改系统……(ALTER SYSTEM …) ,可以自动设置参数。
如果它在主数据库上被设置为TYPICAL,它将从读写表空间重新读取。
如果它在主数据库上被设置为FULL,它还将从只写表空间重新读取。
数据库超安全(11g 及以上)
这个参数(在11.1介绍过)提供了一种方式,可以结合之前提到过的块检查方法。
它的作用是什么?
该参数可以设置打开参数的缺省值DB_BLOCK_CHECKING,DB_BLOCK_CHECKSUM和表或表和索引的缺省值DB_LOST_WRITE_PROTECT,这将包括存储在SYSTEM表空间的SYS数据。
明确设置任何单个参数将会覆盖由DB_ULTRA_SAFE 定义的缺省设置。
优点?
一个进行块检查的简单方法
缺点?
上面所讨论的开销同样适用,但是,如果有必要减少开支时,参数可以单独关闭。
设置数据库超安全
参考 Note: 567096.1 ‘Init.ora Parameter “DB_ULTRA_SAFE” Reference Note’
DBVERIFY工具
DBVERIFY (也称 DBV) 对上述描述的块检查执行类似的检查,但是,它是一个独立的工具,可以在Oracle 数据文件中运行。大部分的 Unix平台允许DBV 在开放的数据库文件中运行,但使用稳健级锁定的 NT, VMS 和其他平台则不允许。
DBVERIFY 检查数据及索引块,并从Oracle 7.3及以上起作为标准配置提供,8.1.6 添加块类型也被检查。
欲了解更多DBVERIFY的信息,请查看Note:35512.1
ANALYZE TABLE tablename VALIDATE STRUCTURE CASCADE
这个SQL命令允许Oracle在指定表以及任何相关索引上进行健康检查。
它的作用是什么 ?
‘ANALYZE … VALIDATE ..’ 命令执行和上述逻辑块检查相同的块检查, 但是NOT表示块损坏,它还检查表和索引条目匹配。
发现的任何问题报告到用户会话跟踪文件USER_DUMP_DEST.
你可以指定要进行网上结构验证当DML正在验证对象时。
与正在进行的影响对象的DML验证可能有轻微的性能影响,但是,这被可以在线执行ANALYZE 的灵活性抵消。
ANALYZE TABLE <name> VALIDATE STRUCTURE CASCADE ONLINE;
当你在线验证对象结构时, Oracle 数据库不会收集任何信息,离线验证时也是如此。
对于表, Oracle数据库验证各数据块和行的完整性。
对索引组织表, 该数据库还为表上的主要关键索引产生压缩统计(最佳的前缀压缩计数)。
对于集群,Oracle数据库会自动验证集群表的结构。
对于分区表,Oracle数据库也验证属于正确的分区的每个行。
如果行整理不正确,那么它的rowid插入INVALID_ROWS表。
脚本UTLVALID.SQL用于创建无效行表。
分析表<名> 验证结构到无效行;
对于索引, Oracle 数据库验证索引中每个数据块的完整性,检查块损坏。
该子句不确认表中的每一行都有一个索引条目,每个索引条目都对应一个行。
你可以通过用CASCADE 子句验证表结构的方式执行这些操作。
优点
这使得重要的表在合适的期间内定期进行损坏检查。
缺点
当离线运行锁定对象时,该命令需要耗用系统资源和时间来运行。
使用ANALYZE
这是一个标准的SQL命令,需要时这样可以针对任何表发出, 建议提前准备一个脚本已检查所有的主要应用程序表是否使用了该功能。
DBMS_REPAIR
DBMS_REPAIR 是在Oracle 8.1.5中引入的一个包。
DBMS_REPAIR.CHECK_OBJECT 程序可用于执行 ANALYZE TABLE … VALIDATE STRUCTURE所执行的同类型的检查。
DBMS_REPAIR 包仅用于同处理层和数据层的损坏(软件损坏快)一同工作。发生物理损坏的块被标记(例如:断裂块),因为该块被写入高速缓存缓冲区,DBMS_REPAIR忽略了所有标记为损坏的块。
必须将DB_BLOCK_CHECKING 和 DB_BLOCK_CHECKSUM 都设置为 FALSE。
DBMS_REPAIR 程序有以下缺点:
a.带有LOB数据类型的表、嵌套表和可变数组表受到支持,但超出行的列被忽略。
b.SKIP_CORRUPT_BLOCKS和REBUILD_FREELISTS 程序中的群集受到支持, CHECK_OBJECT 程序不支持群集。
c.不支持索引组织表和LOB索引。
d.DUMP_ORPHAN_KEYS程序不对位图索引或基于函数的索引操作。
e.DUMP_ORPHAN_KEYS程序处理不超过3,950字节长的密钥。
f.使用FIX_CORRUPT_BLOCKS 和 SKIP_CORRUPT_BLOCKS 程序DBMS_REPAIR 通过忽略表和索引扫描时的损坏使对象可用。
RMAN
RMAN 可用于检查逻辑损坏和物理损坏
在一次RMAN备份或RMAN“备份验证”时,每一个当前使用的或以前使用的块被读入内存,然后写入到内存的另一部分.
在此内存到内存写入期间,进行了块损坏检查。
所以,RMAN的备份命令、验证和逻辑检查语句使得数据库管理员能够快速检查出物理和逻辑损坏。
参考文献
NOTE:35512.1 – DBVERIFY – Database file Verification Utility (7.3.2 – 11.2)
NOTE:567096.1 – Init.ora Parameter “DB_ULTRA_SAFE” Reference Note
NOTE:68013.1 – DBMS_REPAIR example
Comment