1、Data Block Structure
- Cache Layer:缓存层包含了关于块格式、类型(数据、索引、头部等)以及序列化数据的信息。
- Transaction Layer:事务层存储了对块感兴趣的事务信息。
- Data Layer:数据层包含了实际的数据。
Oracle服务器数据块的这三层是通过C结构体表示的,这些结构体映射到SGA中的kcbh(内核缓存块头部)。特别地,缓存头部提供了对损坏数据的检查,用于确保读取的块是正确的,并且块没有被破坏或以其他方式受损。一个被破坏的块是指部分写入磁盘的块,留下了块的旧版本。
2、ROWIDs and Block Dumps
- ROWIDs的作用:ROWIDs是指向特定块中某一行的指针。它们可以用来提取文件和块编号,以便转储特定的块。
- ROWID访问方法的使用时机:
- 当数据被索引时,索引块包含每一行的ROWID,以便于更快的访问。
- 当常规访问方法(如select和export)失败时,也可以使用ROWID来从块中提取数据。
- ROWID格式的介绍:为了在只有一组ROWIDs而没有实际的文件编号和块编号时能够转储块,引入了ROWID格式。
- ROWIDs和块转储的关系:通过ROWIDs可以在数据损坏的情况下,使用ROWID访问方法来转储块,这是因为在数据损坏时,常规的数据访问方法可能无法使用。
3、Oracle ROWID Format
"Oracle ROWID Format"部分详细解释了Oracle中扩展ROWID数据类型的结构,它用于存储数据库中每一行的地址。扩展ROWID由以下部分组成:
- 数据对象编号(Data object number):用于唯一标识数据库中的一个对象,如表或索引。
- 相对文件编号(Relative file number):指示包含该行的数据文件。
- 块编号(Block number):指示数据文件中的特定块,该块包含了这一行。
- 槽号(Slot (row) number):在块中唯一标识行的位置。
Oracle8i和Oracle9i使用扩展ROWID数据类型,它有效地识别分区表和索引以及非分区表和索引中的行。扩展ROWID支持表空间相对的数据块地址,并使用基于64的编码(A-z, 0-9, +, /)来编码每行选定的物理地址。
例如,一个SQL查询可能返回如下的ROWID和姓氏:
SQL> select rowid, last_name from hr.employees where last_name = Cabrio; ROWID LAST_NAME --------------- -------- AAABL5AAFAAAABgAAm Cabrio
复制
这里,AAABL5AAFAAAABgAAm
是行的扩展ROWID,它按上述格式编码了行的物理地址信息。
(OOOOOO)(FFF)(BBBBBB)(SSS)
O:Data object number
F:Relative file number
B:Block number
S:Slot (row) number
4、DBMS_ROWID Package
- ROWID_BLOCK_NUMBER函数:此函数返回输入ROWID对应的数据库块号。例如,通过下面的SQL语句可以将某个表TABLE1中键值为42的行的块号插入到另一个表TABLE2中:
SQL> insert into TABLE2 2 (select dbms_rowid.rowid_block_number(ROWID) 3 from TABLE1 where key_value = 42);
复制
- ROWID_OBJECT函数:此函数返回扩展ROWID对应的数据对象编号。例如,以下SQL语句用于从hr.employees表中选出employee_id为190的行,并返回该行的数据对象编号:
SQL> select dbms_rowid.rowid_object(ROWID) 2 from hr.employees 3 where employee_id = 190;
复制
返回的数据对象编号示例为4857。
DBMS_ROWID包非常有用,当你需要获取有关ROWIDs的信息时,不需要编写代码来解释基于64的字符外部ROWID格式。
5、Oracle Block Dumps
主要包含两种方法:
- 使用操作系统工具进行的原始转储(Raw dumps):这种方法利用操作系统级别的工具(如UNIX平台上的dd命令)直接从磁盘读取数据块的内容,不经过数据库管理系统的处理。
- 通过RDBMS执行的格式化转储(Formatted dumps):这种方法利用数据库管理系统提供的功能(如ALTER SYSTEM DUMP DATAFILE命令)生成数据块的详细信息,通常包括数据块的结构和内容的解释性描述。格式化转储生成的信息通常用于诊断目的,因为它提供了数据块内部结构的详细视图。
格式化转储生成的跟踪文件包含数据块的详细信息,这对于理解数据块的结构、诊断问题以及数据库恢复等操作非常有用。这些信息通常保存在用户转储目的地目录中,可以通过查看数据库的初始化参数文件来找到这个目录的位置。
6、Operating System Dump of Oracle Blocks
如何使用UNIX操作系统的dd
工具来进行Oracle数据块的转储。这种方法允许你在操作系统级别直接访问和转储数据库文件中的特定数据块,而不通过Oracle数据库系统。这对于深入分析和诊断数据库问题非常有用,尤其是在数据库无法访问或特定数据块损坏的情况下。
具体步骤和参数解释如下:
- bs:块大小(例如,Oracle块大小;2 KB, 4 KB等)。
- if:输入文件,即数据库文件的路径。
- skip:在开始转储之前要跳过的块数。
- count:要转储的块数。
- od:UNIX的八进制转储工具,用于将转储的数据以十六进制格式显示。
- -x:
od
命令的选项,用于以十六进制格式显示数据。 - -v:
od
命令的选项,显示所有输入数据(详细模式)。
示例命令:
dd bs=db_block_size if=dbfile.dbf skip=(block-1) count=3 | od -xv > file.out
复制
这个示例演示了如何使用dd
命令和od
工具将数据库文件dbfile.dbf
中从指定块开始的3个块的内容转储到file.out
文件中,以便进行进一步分析。
此外,文档还指出在执行转储之前,如果数据库正在运行,应该强制执行检查点以确保脏缓冲区被刷新到磁盘。这是为了确保转储的数据块是最新的。
7、Oracle Data Block Layout
Oracle数据块是Oracle数据库存储数据的基本单位,其布局对于理解数据如何在数据库中存储和管理至关重要。以下是该部分的主要内容:
- 数据块头部(Header):包括类型(Typ)、格式(Fmt)、校验值(ChkVal)、填充(Filler)、相对数据库地址(RDBA)、系统变更号基础(SCNBase)、系统变更号包装(SCNWrap)、序列号(Seq)、标志(Flg)等信息。这些信息对于数据块的识别和一致性检查非常重要。
- 数据块主体(Body):包含实际的用户数据或元数据。数据的组织结构取决于块的类型,例如,数据块、索引块或撤销块等。
- 尾部(Tail):包括用于验证数据块头部和尾部版本一致性的信息,通常是SCNBase的低位2字节、块类型和SCN序列号的组合。
文档还提到了一些关键的标志(Flg)定义,如KCBHFNEW(新块 - 数据区域已清零)、KCBHFDLC(延迟日志更改)、KCBHFCKV(校验值保存 - 块异或结果为零)和KCBHFTMP(临时块)等,这些标志对于理解块的状态和处理方式很有帮助。
此外,还强调了如果在同一系统变更号(SCN)下对块进行了254次更改,则在下一次更改块时必须强制分配新的SCN。
8、Decoding Oracle Blocks
0004000 0602 0000 0140 000d 0004 10e7 0000 0102 Type Formaat t Filler RDBA SCN Base Seq SCN Wrap Flag
复制
在这个示例中,数据块的头部信息被解码如下:
- Type:
06
表示数据块的类型。 - Format:
02
表示数据块的格式。 - Filler:
0000
为填充字段。 - RDBA:
0140 000d
表示相对数据库地址。 - SCN Base:
0004
表示系统更改号的基础值。 - Seq:
01
表示序列号。 - SCN Wrap:
0000
表示系统更改号的包装值。 - Flag:
02
最后的字段表示数据块的标志。
接下来的部分提供了数据块尾部的信息:
0007760 0c11 0101 0102 c209 ff02 c115 10e7 0601 Tail-->10e7 0601
复制
- Tail:尾部信息用于验证数据块的一致性。
此外,还提供了数据层中一行数据的解码示例:
tab 0, row 0, @0xf4b tl: 77 fb: --H-FL-- lb: 0x1 cc: 11 col 0: [3] c2 02 32 col 1: [5] 45 6c 65 6e 69 col 2: [7] 5a 6c 6f 74 6b 65 79 ...
复制
- tl:
77
表示行的总长度。 - fb:
--H-FL--
表示行的标志。 - lb:
0x1
表示锁定字节。 - cc:
11
表示列计数。 - col 0 - col 2:展示了前三列的数据,每一列的数据长度和具体的数据值。
这个示例展示了如何从一个Oracle数据块转储中解析出数据块头部、尾部以及数据层中的具体数据。这对于深入理解数据块的结构、进行数据恢复或故障诊断非常有帮助。
9、Oracle Formatted Block Dumps
- 如何生成格式化转储:通过执行
ALTER SYSTEM
命令来请求Oracle数据库为特定的数据文件和块生成格式化转储。例如,使用命令ALTER SYSTEM DUMP DATAFILE <文件号> BLOCK <块号>;
可以生成指定数据块的格式化转储信息。 - 转储文件的位置:格式化转储的输出通常保存在数据库的用户转储目录中。这个目录的位置可以通过查看数据库的初始化参数
user_dump_dest
来找到。 - 转储内容的细节:格式化转储提供了数据块的详细信息,包括但不限于:
- 数据块的头部信息:显示了数据块的类型、大小、所属对象的ID等信息。
- 事务信息:包括数据块中涉及的事务的详细信息。
- 行目录和行数据:显示了数据块中每行数据的位置和内容。
- 尾部信息:验证数据块头部和尾部版本的一致性所需的信息。
- 转储信息的用途:格式化转储信息对于数据库管理员进行故障诊断、性能分析和数据恢复等操作非常有价值。它提供了数据块的内部视图,帮助管理员识别问题所在,并采取相应的措施。
例如,转储输出中可能包含类似以下的信息:
*** 2001-08-27 13:22:50.252 *** SESSION ID:(7.7196) 2001-08-27 13:22:50.241 Start dump data blocks tsn:5 file#: 5 minblk 96 maxblk 96 buffer tsn: 5 rdba: 0x01400060 (5/96) scn:0x0000.0000ee3f seq: 0x01 flg:0x06 tail:0xee3f0601 frmt: 0x02 chkval: 0x9abe type: 0x06=trans data Block header dump: 0x01400060 Object id on Block? Y
复制
这段示例展示了格式化转储文件的一部分,其中包括了数据块的SCN、类型、所属文件和块号等信息。
11、What Is Block Corruption?
- 数据块损坏的定义:当Oracle数据库尝试读取或写入一个数据块到磁盘时,如果该数据块的内容不符合预期的结构或值,就被认为是损坏的。这种损坏可能是由硬件故障、系统崩溃、软件缺陷或其他外部因素引起的。
- 一致性检查:为了发现数据块损坏,Oracle在读取或写入数据块时执行一系列一致性检查。这些检查包括:
- 数据块版本:确认数据块的版本与数据库期望的版本一致。
- DBA值比较:比较缓存中的数据库地址(DBA)与数据块缓冲区中的DBA值,确保它们匹配。
- 块校验和:如果启用了块校验和(block-checksum),则会计算并验证数据块的校验和,以检测数据块内容是否被未授权修改。
通过这些检查,Oracle试图确保数据的完整性和一致性,防止损坏的数据块导致的数据丢失或错误。
数据块损坏是数据库管理中一个严重的问题,需要通过适当的恢复策略和工具来解决。Oracle提供了多种工具和技术来检测、报告和修复数据块损坏,以最小化对数据库操作的影响。
12、Which Checks Are Performed?
- SCNBase和Seq的检查:Oracle会检查数据块头部的系统更改号(SCNBase)和序列号(Seq),并与数据块尾部的相应值进行比较。这种检查确保了数据块的头部和尾部信息是一致的,表明数据块在写入磁盘时没有被部分覆写或损坏。
- 数据块类型的检查:Oracle还会验证数据块的类型是否符合预期。每种类型的数据块(如数据块、索引块、撤销块等)都有特定的结构和用途,错误的块类型可能表明数据块损坏。
- 错误示例:文档提供了一些典型的ORA-600错误示例,这些错误由数据块损坏引起。例如:
- ORA-600 [4519]:表示缓存层的块类型不正确。
- ORA-600 [4136]:提示检查回滚段块。
- ORA-600 [4154]:也是提示检查回滚段块的错误。
这些检查是Oracle数据库自动执行的,旨在尽早发现潜在的数据块损坏问题,从而允许数据库管理员采取适当的恢复措施,以保护数据库的完整性和可用性。
通过这些内置的一致性检查,Oracle能够在数据块损坏发生时提供警告,并帮助数据库管理员定位问题,采取必要的恢复措施。
13、Block Corruption Types
- 媒介损坏(Media corrupt):当数据块的内容在磁盘上被损坏,以至于当Oracle尝试读取这些块时,块中的信息没有任何意义,这种情况被称为媒介损坏。媒介损坏通常是由硬件故障(如磁盘损坏)引起的。一个典型的迹象是系统更改号(SCN)被置为0。
- 软件损坏(Soft corrupt):当数据块由于Oracle软件内部错误或其他非硬件原因导致的数据不一致而被标记为损坏时,这种情况被称为软件损坏。软件损坏可能发生在数据块的内容在逻辑上无法被数据库正确解释的情况下。一个典型的迹象是系统更改号(SCN)不为0,但序列号(Seq)被设置为UB1MAXVAL,表示只有在更高的SCN上进行更改,才能应用于该块,这种更改需要重构整个块。
这两种类型的损坏都需要数据库管理员的注意,因为它们可能需要不同的处理方法。媒介损坏通常需要物理介质的替换和数据的恢复操作,而软件损坏可能需要Oracle支持的介入来诊断和解决问题。
理解数据块损坏的类型有助于数据库管理员采取适当的措施来恢复数据,保证数据库的完整性和可用性。
14、Symptoms: ORA-1578
ORA-01578错误表示"ORACLE data block corrupted (file # %s, block # %s)",这意味着Oracle在尝试访问特定的数据文件和数据块时发现了数据块损坏。
- 错误描述:ORA-01578错误通常指示数据库中某个数据块已经损坏,无法被Oracle正常读取。错误消息会提供损坏的数据文件编号和块编号,帮助定位问题。
- 损坏的原因:数据块损坏可能由多种原因引起,包括硬件故障(如磁盘错误)、系统崩溃、网络问题或软件缺陷等。
- 诊断步骤:
- 检查alert.log文件:首先检查数据库的alert.log文件,查找有关损坏块的详细信息和其他相关错误。
- 使用DBVERIFY工具:DBVERIFY是一个命令行工具,可以用来检查数据文件中的物理和逻辑一致性,帮助确认数据块损坏的情况。
- 尝试手动转储块:使用
ALTER SYSTEM DUMP DATAFILE ... BLOCK ...;
命令手动转储受影响的数据块,以便进一步分析。
- 恢复策略:
- 如果损坏是由硬件故障引起的,首先应该解决硬件问题,如更换坏的磁盘或修复网络连接。
- 损坏的数据块可以通过从备份恢复或使用Oracle的RMAN工具进行块级恢复来修复。
- 在某些情况下,如果数据块损坏影响的是非关键数据,也可以考虑手动编辑或删除受影响的数据块,尽管这种方法风险较高,通常不推荐。
- 预防措施:为了减少数据块损坏的风险,建议定期检查硬件健康状况,实施恰当的备份和恢复策略,并保持数据库软件更新到最新版本。
ORA-01578错误是数据库管理员必须认真对待的问题,因为它可能影响到数据的完整性和可用性。正确诊断和及时恢复是解决这一问题的关键。
15、Symptoms: ORA-600
- ORA-600 错误的格式:ORA-600 错误通常以“ORA-600 [错误代码], [参数1], [参数2], …”的形式出现。错误代码和参数为Oracle支持团队提供了关于错误发生时内部状态的重要信息。
- ORA-600 错误的示例:
- 一个典型的ORA-600错误示例是“ORA-600 [kcbzpb_1], [d], [kind], [chk], [ ], [ ]”。在这个示例中,“kcbzpb_1”是内部错误代码,后面的参数提供了额外的上下文信息,比如数据块编号和损坏类型。
- 诊断和处理:
- 文档强调了检查数据库的
alert.log
文件以获取错误的上下文信息的重要性。alert.log
文件记录了数据库运行时发生的重要事件,包括ORA-600错误。 - 建议使用Oracle的自动诊断仓库(Automatic Diagnostic Repository, ADR)来收集和分析诊断数据。
- 对于ORA-600错误,通常需要联系Oracle支持服务来获取进一步的帮助。Oracle支持团队可以使用错误代码和参数来诊断问题的根本原因,并提供修复建议。
- 文档强调了检查数据库的
- 重要性:
- ORA-600错误表示数据库遇到了不应该发生的内部异常情况。这可能是由于软件缺陷、硬件问题或其他系统级问题导致的。
- 处理ORA-600错误通常需要深入的技术知识和对Oracle数据库内部工作机制的理解。在许多情况下,解决这些问题需要Oracle官方支持的介入。
文档通过提供ORA-600错误的背景信息、诊断步骤和处理建议,帮助数据库管理员理解这类错误的严重性,并采取适当的行动来解决问题。
ORA-600 [kcbzpb_1],[d],[kind],[chk] is signaled when a block is corrupted in memory. The only way it should be bad is if a stray store into memory destroyed the header or tail. kcbzpb_1: a named internal error, referencing a source code module name d : blocknumber kind : kind of corruption detected chk : checksum flag Please see WebIV Note 28814.1 for more information.
复制
16、Handling Corruptions
- 检查警告文件和系统日志:
- 强调了检查数据库的
alert.log
文件和系统日志的重要性。这些日志文件中可能包含有关损坏发生的时间、位置和可能原因的重要信息。
- 强调了检查数据库的
- 使用诊断工具:
- 推荐使用Oracle提供的诊断工具,例如DBVERIFY和RMAN(恢复管理器),来确定损坏的类型和范围。这些工具可以帮助识别损坏的数据块,并提供有关如何修复它们的信息。
- 执行转储以识别问题:
- 建议对损坏的数据块执行转储操作,以便进一步分析。这可以通过执行
ALTER SYSTEM
命令来完成,该命令允许管理员将特定数据块的内容转储到磁盘文件中。
- 建议对损坏的数据块执行转储操作,以便进一步分析。这可以通过执行
- 确定错误是否持续存在:
- 强调了重复运行检查命令或尝试重新执行导致错误的操作的重要性,以确定问题是否是暂时的或持续存在的。
- 从损坏的对象中恢复数据:
- 如果必要,可能需要从损坏的对象(如表或索引)中恢复数据。这可能涉及到从备份中恢复、使用Oracle Flashback技术,或者手动提取和重建数据。
- 解决硬件问题:
- 如果数据块损坏是由硬件故障引起的(如磁盘错误),则必须先解决这些硬件问题,然后才能进行数据恢复。
- 数据恢复或还原:
- 根据损坏的严重程度和类型,可能需要执行数据文件的完整恢复或使用RMAN执行块级数据恢复。
17、DBVERIFY Utility
DBVERIFY是Oracle提供的一个命令行工具,用于对数据库文件进行物理一致性检查。它可以在数据库在线或离线时运行,帮助数据库管理员检测数据文件中的潜在损坏。
- 功能:
- DBVERIFY主要用于检查数据文件的物理一致性。它可以验证单个数据文件、一组数据文件或整个数据库中的数据块是否存在物理损坏。
- 使用场景:
- DBVERIFY可以在数据库运行时使用,因为它以只读模式打开数据文件,不会干扰数据库的正常操作。这使得它成为日常数据库维护和故障排查的有用工具。
- 操作:
- 使用DBVERIFY时,管理员需要指定要检查的数据文件和数据块大小。例如,命令
dbv file=query_data_01_sid.dbf blocksize=4096
会检查指定的数据文件,假设数据块大小为4096字节。
- 使用DBVERIFY时,管理员需要指定要检查的数据文件和数据块大小。例如,命令
- 输出:
- DBVERIFY的输出会显示检查过程中发现的问题,例如损坏的数据块。它还提供了被检查的数据块的总数、处理过的数据块的数量以及发现损坏的数据块的数量。
- 注意事项:
- 尽管DBVERIFY对于发现物理损坏非常有用,但它不能修复损坏的数据块。发现损坏后,管理员可能需要采取其他措施来恢复数据,例如使用Oracle的RMAN工具或从备份中还原数据。
- 使用限制:
- DBVERIFY仅适用于数据文件,不能用于检查控制文件或在线日志文件的一致性。
此部分内容强调了DBVERIFY在日常数据库管理中的价值,特别是在维护数据一致性和完整性方面。通过定期使用DBVERIFY工具,数据库管理员可以及时发现并处理潜在的数据文件问题,从而避免数据损坏导致的更严重后果。
- DBVERIFY仅适用于数据文件,不能用于检查控制文件或在线日志文件的一致性。
17、The ANALYZE Command
这个命令不仅可以帮助检测数据块损坏,还能验证数据库对象(如表、索引和簇)的结构完整性。
- 功能:
- ANALYZE命令主要用于收集关于数据库对象的统计信息,但也可以用于检查对象的结构完整性。通过使用不同的选项,ANALYZE命令可以执行多种任务,包括验证表、索引、簇的结构,以及检测链式行和迁移行。
- 逻辑块检查:
- 当用于验证结构时,ANALYZE命令可以帮助发现数据块损坏的迹象。尽管它不会标记块为软损坏,但会报告找到的问题。
- 使用示例:
- 为了验证表的结构并级联到相关的索引,可以使用如下命令:
ANALYZE TABLE table_name VALIDATE STRUCTURE CASCADE;
。这将检查表的所有数据块和相关索引的数据块。 - 类似地,可以单独验证索引的结构:
ANALYZE INDEX index_name VALIDATE STRUCTURE;
。
- 为了验证表的结构并级联到相关的索引,可以使用如下命令:
- 注意事项:
- 需要注意的是,ANALYZE命令用于逻辑检查,可能无法检测所有类型的损坏。例如,它可能无法检测到所有物理损坏情况。
- 自动段空间管理(ASSM):
- 对于使用自动段空间管理的段,ANALYZE命令会验证位图信息,但不会检查高水位线以下未格式化的块。
- 使用场景:
- ANALYZE命令在数据库维护和故障诊断中非常有用,尤其是在确定数据块损坏的范围和性质时。它可以作为诊断和预防措施的一部分,帮助维护数据库的健康状态。
这部分内容强调了ANALYZE命令在Oracle数据库管理中的重要性,特别是在确保数据完整性和执行预防性维护方面。通过定期使用ANALYZE命令,数据库管理员可以及时发现并解决潜在的数据完整性问题。
- ANALYZE命令在数据库维护和故障诊断中非常有用,尤其是在确定数据块损坏的范围和性质时。它可以作为诊断和预防措施的一部分,帮助维护数据库的健康状态。
18、Diagnostic Events
这些事件可以帮助数据库管理员在遇到数据损坏时采取特定的行动,比如跳过损坏的块或者在发现损坏时生成更多的诊断信息。
- 跳过损坏的块:
- 事件10231:用于在全表扫描期间跳过损坏的块。设置此事件可以帮助避免查询因尝试访问损坏的块而失败。
- 事件10233:用于在索引范围扫描期间跳过损坏的数据或索引块。这有助于在使用索引访问数据时避免因损坏的块引起的错误。
- 在跟踪文件中转储损坏的块:
- 事件10232:当数据库遇到损坏的块时,此事件会将损坏的块的详细信息转储到跟踪文件中。这为诊断问题提供了更多的信息。
- 强制逻辑块检查:
- 事件10210、10211和10212:这些事件分别用于强制在修改表数据块、索引块和簇块时进行逻辑检查。如果检查失败,这些块会被标记为软损坏。这些事件可以帮助及早发现潜在的数据损坏问题,但可能会影响性能。
- 注意事项:
- 这些诊断事件是资源密集型的,应谨慎使用,并在问题解决后关闭。
- 事件10231和10233仅跳过软损坏的块,不适用于媒介损坏的块。
这些诊断事件是Oracle数据库提供的高级功能,允许管理员在遇到数据损坏时采取预防和诊断措施。正确使用这些事件可以帮助维护数据库的稳定性和数据的完整性,但也需要注意它们的使用可能会对数据库性能产生影响。
19、Flash Freeze
Oracle 9i引入的一个特性,它允许在由用户定义的事件触发时快速冻结实例。这为自动冻结系统提供了一种机制,当Oracle错误发生时,可以进一步进行诊断。然而,需要注意的是,当前在RAC(Real Application Clusters)环境中不支持多实例冻结。
-
功能:Flash Freeze允许在特定的Oracle错误发生时自动冻结数据库实例。这有助于捕获错误发生时的系统状态,从而为问题诊断提供宝贵的信息。
-
用途:随着Oracle数据库对高可用性要求的不断增加,提供高效的调试和诊断工具变得尤为重要。Flash Freeze通过在第一次出现故障时捕获所有相关数据,有助于减少未来的失败次数,从而提高系统的可用性。
-
配置示例:
- 触发Flash Freeze的事件可以通过在
init.ora
文件中设置相应的事件来配置。例如,可以设置在某个特定的内部错误(如ksuwaitsysevent_1
)发生时触发Flash Freeze,或者当PMON进程遇到内部错误1301时触发。
- 触发Flash Freeze的事件可以通过在
-
限制:当前,Flash Freeze不支持在RAC环境中对多个实例同时进行冻结。这意味着在RAC环境下,Flash Freeze只能在遇到错误的那个实例上工作。
-
配置语法示例:
- 在
init.ora
文件中设置事件以触发Flash Freeze,例如:event="600 flashfreeze after 1 times on error ksuwaitsysevent_1";
event="600 flashfreeze on error 1301, proc=PMON";
- 这些设置指示Oracle在遇到特定错误时自动执行Flash Freeze操作。
Flash Freeze是Oracle为数据库管理员提供的一个强大工具,可以在系统遇到特定错误时自动采取行动,从而为问题的诊断和解决提供即时的数据支持。然而,使用这一特性时需要注意其在RAC环境中的限制。
- 在
20、Initialization Parameter
这些参数在数据库的配置文件(如init.ora
或spfile.ora
)中设置,用于控制数据库实例的行为和特性。
- db_block_checking:
- 引入于Oracle 8i,
db_block_checking
参数可以通过ALTER SESSION
或ALTER SYSTEM DEFERRED
命令设置。 - 当设置为
TRUE
时,Oracle会在每次数据块被修改时进行逻辑检查,以确保数据块的完整性。这有助于及早发现潜在的数据损坏。 - 默认值是
FALSE
,意味着默认情况下不启用这项检查。启用此参数可能会对性能产生一定影响,因为它增加了额外的检查开销。
- 引入于Oracle 8i,
- _CHECK_BLOCK_AFTER_CHECKSUM:
- 当设置为
TRUE
时,如果_DB_ALWAYS_CHECK_SYSTEM_TS
为TRUE
并且数据块位于SYSTEM表空间中,或者DB_BLOCK_CHECKING
为TRUE
,则在数据库写入器(DBW)准备将数据块写入磁盘时,会调用块检查例程。 - 此参数确保在计算校验和之后对数据块进行逻辑检查,即使校验和未启用。如果检查失败,调用者(通常是DBW)会报错,数据块不会被写入磁盘。默认值为
TRUE
。
- 当设置为
- db_block_checksum:
- 此参数与数据块的校验和计算相关。当设置为
TRUE
时,Oracle会为每个写入磁盘的数据块计算并存储一个校验和值。读取数据块时,会重新计算校验和并与存储的值进行比较,以检测数据块在磁盘上是否被损坏。
这些初始化参数提供了对Oracle数据库在处理数据完整性和损坏恢复方面的细粒度控制。通过合理配置这些参数,数据库管理员可以在维护数据完整性的同时平衡性能的需求。
- 此参数与数据块的校验和计算相关。当设置为
21、The Export Utility
这是一个用于将数据库中的数据和对象导出到操作系统文件中的工具。导出文件可以用于备份、迁移或恢复数据。
- 功能:
- 导出工具可以执行全库导出、用户级导出或表级导出。它将数据、表结构、存储过程、触发器等导出到一个二进制文件中,该文件可以用导入工具(imp)导入到同一个或另一个Oracle数据库中。
- 一致性检查:
- 导出操作执行全表扫描,以检索表中的数据。这意味着导出工具可以用来检查数据库的逻辑一致性,但它不会检测磁盘上高水位线以上未使用的数据块的损坏。
- 限制:
- 导出工具不会检测索引、空闲或临时扩展中的损坏。此外,它不会读取数据字典的所有部分,因此可能存在系统表空间中未被检测到的损坏。
- 使用示例:
- 一个常见的使用示例是执行全库导出作为备份策略的一部分,或在升级数据库版本前创建数据的快照。管理员可以使用如下命令进行全库导出:
exp system/manager full=y file=full_export.dmp
。
- 一个常见的使用示例是执行全库导出作为备份策略的一部分,或在升级数据库版本前创建数据的快照。管理员可以使用如下命令进行全库导出:
- 注意事项:
- 虽然导出工具对于数据备份和迁移非常有用,但它不应被视为唯一的备份策略。对于大型数据库,导出操作可能非常耗时,并且导出文件可能非常大。
- 优化:
- 在执行导出时,可以通过指定不同的参数来优化性能,例如调整缓冲区大小或并行执行导出。
这部分内容强调了导出工具在数据库维护、备份和迁移中的重要作用,同时也指出了它的一些限制和考虑事项。通过合理使用导出工具,数据库管理员可以有效地管理和迁移数据,但也需要注意其在数据一致性检查方面的局限性。
- 在执行导出时,可以通过指定不同的参数来优化性能,例如调整缓冲区大小或并行执行导出。
22、Media Recovery
介质故障通常指的是数据文件、控制文件或日志文件在物理存储介质上的损坏,这可能是由于硬件故障、操作错误或其他外部因素导致的。以下是该部分的主要内容:
- 启用归档日志模式:
- 介绍了在数据库运行于归档日志模式下时进行媒体恢复的步骤。归档日志模式允许Oracle数据库保存已满的在线重做日志文件的副本,这对于恢复操作至关重要。
- 解决硬件问题:
- 在进行数据恢复之前,首先需要解决任何潜在的硬件问题,如更换损坏的磁盘。确保硬件故障已经被修复是开始恢复过程的前提。
- 确定受影响的数据文件:
- 识别出哪个数据文件包含损坏的块。这可以通过检查Oracle的警告日志(alert.log)或使用其他诊断工具完成。
- 恢复备份:
- 根据损坏的严重程度和范围,可能需要从备份中恢复一个或多个数据文件。这涉及到将备份文件复制到原始位置,并使用Oracle恢复命令来恢复数据。
- 应用归档日志:
- 在数据文件被恢复到备份时刻的状态后,需要应用归档日志文件来将数据库前滚到最近的一致状态。这一步骤确保了数据的完整性和一致性。
- 检查恢复后的数据文件:
- 恢复完成后,建议对恢复的数据文件进行检查,以确保没有进一步的损坏,并且所有数据都已成功恢复。
- 考虑使用块级恢复:
- Oracle 9i引入的块级媒体恢复(Block Media Recovery)允许恢复单个损坏的块,而不是整个数据文件。这可以通过使用恢复管理器(RMAN)来完成,减少了恢复时间并提高了数据可用性。
"Media Recovery"部分强调了在处理介质故障时进行数据恢复的重要性和复杂性。通过遵循正确的步骤和最佳实践,数据库管理员可以有效地恢复损坏的数据,最小化数据丢失和停机时间。
- Oracle 9i引入的块级媒体恢复(Block Media Recovery)允许恢复单个损坏的块,而不是整个数据文件。这可以通过使用恢复管理器(RMAN)来完成,减少了恢复时间并提高了数据可用性。
23、Block Media Recovery (BMR)
"Block Media Recovery (BMR)"部分介绍了Oracle 9i引入的一项新的恢复选项,这项功能允许数据库管理员在不需要将整个数据文件离线的情况下,仅恢复受损的数据块。这种方法大大减少了恢复时间,并允许在进行媒介恢复时数据文件保持在线状态,从而提高了数据库的可用性。以下是该部分的主要内容:
- BMR的引入:
- BMR作为Oracle 9i的新功能,提供了一种更加精细化的恢复手段,允许对单个损坏的数据块进行恢复,而不是整个数据文件。
- 恢复过程:
- BMR通过恢复管理器(RMAN)执行。当数据库管理员发现一个或多个数据块损坏时,可以使用RMAN的
BLOCKRECOVER
命令来恢复这些块。 - 示例命令:
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 1713;
这个命令将恢复数据文件5中的块1713。
- BMR通过恢复管理器(RMAN)执行。当数据库管理员发现一个或多个数据块损坏时,可以使用RMAN的
- 完整恢复:
- BMR始终执行完整恢复,意味着Oracle会尝试使用所有可用的归档日志和重做日志信息来恢复数据块到最新的一致状态。
- 优势:
- BMR的主要优势在于减少了恢复时间和提高了数据可用性。由于只有受影响的块被恢复,其他部分的数据库可以继续在线并对用户可用,这对于生产环境中的数据库尤其重要。
- 使用场景:
- BMR特别适用于那些只有少数块损坏的情况,这些损坏可能是由于磁盘故障、系统崩溃或其他原因导致的。通过仅恢复受损的块,可以快速恢复数据库的正常运行,而不必进行更耗时的完整数据文件恢复。
"Block Media Recovery (BMR)"部分强调了这项功能在Oracle数据库管理和维护中的重要性,特别是在处理数据块损坏的情况下,如何有效地恢复数据,同时保持数据库的高可用性。
- BMR特别适用于那些只有少数块损坏的情况,这些损坏可能是由于磁盘故障、系统崩溃或其他原因导致的。通过仅恢复受损的块,可以快速恢复数据库的正常运行,而不必进行更耗时的完整数据文件恢复。
24、Which Object Is Corrupted?
如何确定在Oracle数据库中哪个对象(如表、索引等)受到了损坏。这是在处理数据块损坏时的一个重要步骤,因为它帮助数据库管理员确定损坏的范围,并制定相应的恢复策略。
- 确定损坏对象的类型:
- 如果损坏发生在索引上,可以通过简单地删除并重建索引来解决问题。这是因为索引数据可以从表数据中重新生成。
- 如果损坏发生在回滚段上,将在后续章节中讨论具体的恢复方法。
- 如果表受到损坏,损坏的数据块中的数据可能会丢失。解决方案可能包括从导出的备份中恢复数据、使用事件10231在导出操作中跳过损坏的块,或者使用SQL或PL/SQL将数据从损坏的表中提取到一个新表中。
- 使用SQL查询确定损坏对象:
-
提供了一个SQL查询示例,用于确定包含损坏块的对象。这需要使用
dba_extents
视图来查找与损坏块相关的段(对象)。查询示例如下:SELECT segment_name, segment_type, relative_fno FROM dba_extents WHERE file_id = :file_number AND :block_number BETWEEN block_id AND block_id + blocks - 1;
复制 -
在这个查询中,
:file_number
和:block_number
需要替换为实际的文件号和块号,这些信息通常可以从错误消息或警告日志中获取。
-
- 使用SQL和PL/SQL提取数据:
- 如果表中的数据需要被救回,可以使用带有ROWID范围的SQL查询来尝试绕过损坏的块,将剩余的数据移动到新表中。
- 对于包含
LONG
数据类型的列,可能需要编写PL/SQL程序来处理。
这部分内容强调了在数据库中发现损坏时,如何快速确定受影响的对象,并根据对象的类型采取适当的恢复措施。通过这种方法,数据库管理员可以最小化数据损失,同时尽可能地恢复数据库的正常运行。
25、Using SQL or PL/SQL
如何使用SQL或PL/SQL来处理和恢复Oracle数据库中损坏的数据块中的数据。当数据库中的某个对象(如表)受到损坏时,尤其是当损坏影响到了数据的物理存储时,数据库管理员可能需要采取手动步骤来尽量恢复或迁移尚未损坏的数据。
- 使用索引和ROWID:
- 如果损坏的表具有唯一索引,可以利用这个索引和ROWID来访问和恢复数据。通过指定ROWID的范围,可以尝试绕过损坏的数据块,从而访问和恢复未受损坏的数据。
- ROWID范围扫描:
- 可以使用带有ROWID提示的SQL查询,根据ROWID范围来选择绕过损坏块的数据。这种方法需要对ROWID的构成有深入的理解,以便正确地指定范围。
- 处理包含LONG列的表:
- 如果损坏的表中包含LONG数据类型的列,可能需要使用PL/SQL来恢复数据。由于SQL的限制,直接查询或修改包含LONG类型的列可能会受到限制,因此编写PL/SQL程序可以提供更多的灵活性来处理这些数据。
- 示例代码:
- 文档可能提供了如何创建新表、如何使用DBMS_ROWID包来生成特定的ROWID,以及如何使用INSERT语句结合ROWID范围来迁移数据的示例代码。这些示例说明了如何在不触及损坏块的情况下,将尽可能多的数据迁移到一个新的表中。
- 获取对象编号:
- 为了使用DBMS_ROWID包中的功能,需要知道受损表的对象编号。这可以通过查询DBA_OBJECTS视图来获取。对于分区表,可能需要查询特定的数据字典视图来获取正确的对象编号。
这部分内容强调了在面对数据块损坏的情况下,如何利用SQL和PL/SQL的高级功能来最大限度地恢复数据。通过这些技术,数据库管理员可以在一定程度上减轻数据损坏带来的影响,并尽量保留未损坏的数据。
- 为了使用DBMS_ROWID包中的功能,需要知道受损表的对象编号。这可以通过查询DBA_OBJECTS视图来获取。对于分区表,可能需要查询特定的数据字典视图来获取正确的对象编号。
26、The dbms_repair Package
这是一组用于处理和修复数据块损坏问题的PL/SQL程序。dbms_repair
的目的是帮助数据库管理员诊断数据块损坏,收集关于损坏的信息,以及在某些情况下允许跳过损坏的块以保持数据库的可用性
- 功能和用途:
dbms_repair
包提供了一系列工具和程序,用于检测损坏的数据块,收集损坏信息,以及管理损坏块的处理。它特别适用于处理那些无法通过常规恢复方法修复的损坏。
- 主要程序:
- admin_tables:创建和管理
dbms_repair
使用的管理表和视图,这些表和视图用于存储关于损坏块的信息。 - check_object:检查指定的数据库对象(如表或索引),并在发现损坏时收集信息。
- fix_corrupt_blocks:尝试修复已识别为损坏的块。
- dump_orphan_keys:对于索引损坏,报告那些指向损坏数据块中行的索引项。
- skip_corrupt_blocks:设置数据库在访问时跳过损坏的块,允许对未损坏数据的访问,提高数据库的可用性。
- admin_tables:创建和管理
- 使用示例:
- 文档可能提供了如何使用
dbms_repair
程序来检查对象、收集损坏信息以及如何处理损坏块的示例。例如,使用check_object
程序来检查一个表的损坏情况,并使用admin_tables
来创建必要的管理表。
- 文档可能提供了如何使用
- 注意事项:
- 使用
dbms_repair
时应谨慎,因为错误的使用可能导致数据进一步损坏或丢失。在使用之前,应确保已经尝试了所有其他恢复选项,并且有适当的备份。
- 使用
- 限制:
dbms_repair
并不能保证能修复所有类型的损坏。在某些情况下,损坏的数据可能无法恢复,需要采取其他措施(如从备份恢复)。
"The dbms_repair Package"部分强调了dbms_repair
在Oracle数据库管理中处理数据块损坏问题时的重要性和实用性。通过提供一系列工具来诊断和修复损坏,dbms_repair
增强了数据库的健壮性和可用性。
27、Patching with ORAPATCH
"Patching with ORAPATCH"部分讨论了Oracle数据库中使用ORAPATCH工具进行补丁操作的方法。ORAPATCH是一个低级别的工具,允许用户直接编辑和修改数据库文件中的数据块。这个工具主要由Oracle支持工程师在特殊情况下使用,以解决特定的数据损坏问题或应用必要的修正。以下是该部分的主要内容:
- 工具功能:
- ORAPATCH被描述为一个纯粹的磁盘或文件编辑器。它允许用户以十六进制形式查看和修改所有由RDBMS支持的文件和数据块类型。
- 使用方法:
- 用户可以通过输入“ORAPATCH help”命令来查看所有可用的命令和选项。这提供了一个交互式界面,用户可以在其中执行查看和修改操作。
- 操作数据块:
- 该工具支持对数据块进行查看和修改,这使得在需要直接干预数据库文件以解决损坏或应用特定更改时非常有用。
- 注意事项:
- 使用ORAPATCH时需要非常小心,因为不正确的修改可能会导致数据进一步损坏或产生不可预测的后果。因此,这种工具的使用通常限于Oracle支持团队或在严格监督下进行。
- 示例:
- 文档可能提供了使用ORAPATCH打开数据库文件、设置编辑器的基数(如十六进制)、显示特定块、查找和修改字符串以及退出编辑器的示例操作。
- 限制和风险:
- ORAPATCH作为一个强大的工具,它的使用伴随着一定的风险。它应该作为最后的手段,仅在其他恢复选项(如从备份恢复或使用其他Oracle工具)都无法解决问题时考虑使用。
"Patching with ORAPATCH"部分强调了在处理Oracle数据库中的特定问题时,如何谨慎地使用ORAPATCH工具。由于直接编辑数据库文件涉及高风险,因此强调了在使用此工具时应遵循的最佳实践和预防措施。
- ORAPATCH作为一个强大的工具,它的使用伴随着一定的风险。它应该作为最后的手段,仅在其他恢复选项(如从备份恢复或使用其他Oracle工具)都无法解决问题时考虑使用。
30、Patching with BBED
BBED是一个强大的内部工具,用于浏览和编辑Oracle数据库文件中的数据块。这个工具主要用于诊断和修复数据块损坏的情况,或在特定紧急情况下直接修改数据块。
- 工具概述:
- BBED被描述为一个块浏览器和编辑器,它允许用户在数据库开启时直接编辑磁盘上的数据结构。BBED支持物理(字节级)和符号(结构和字段级)接口,用于显示和编辑数据。
- 安全警告:
- 使用BBED时需要极度小心,因为不正确的操作可能导致数据损坏或丢失。BBED通常被视为Oracle内部使用的工具,并且其使用通常限于经验丰富的数据库管理员或Oracle支持工程师。
- 使用方法:
- 用户可以通过命令行启动BBED,并使用特定的参数(如数据文件、块大小、编辑模式等)进行配置。BBED提供了一个交互式环境,用户可以在其中执行各种操作,如设置文件、映射数据块、显示和修改数据块内容。
- 示例操作:
- 文档可能提供了如何使用BBED进行常见操作的示例,包括如何打开数据文件、设置编辑模式、映射并显示数据块内容、查找和修改数据、保存更改以及退出BBED的步骤。
- 注意事项:
- 强调了在使用BB包括BBED时应该采取的预防措施,包括确保有数据备份、仅在其他恢复选项失败时使用BBED、以及在操作前详细规划和测试。
"Patching with BBED"部分强调了BBED作为一个直接编辑Oracle数据块内容的工具的重要性和风险。这个工具的使用需要特别小心,以避免对数据库造成不可逆的损害。由于其潜在的风险,BBED的使用通常仅限于紧急情况或在Oracle支持指导下进行。
- 强调了在使用BB包括BBED时应该采取的预防措施,包括确保有数据备份、仅在其他恢复选项失败时使用BBED、以及在操作前详细规划和测试。
31、Patching with BBED or ORAPATCH
这些工具允许用户直接编辑和修改数据库文件中的数据块,特别是在处理数据损坏或需要应用特定修补时。
- 工具用途:
- BBED和ORAPATCH都是强大的低级工具,设计用于在Oracle数据库中直接编辑数据块。它们通常用于诊断、分析和修复数据块损坏问题,或在特殊情况下直接修改数据块。
- 风险和警告:
- 使用这些工具进行数据块修补涉及高风险,因为不当操作可能导致数据进一步损坏或完全丢失。因此,这些工具主要由Oracle支持工程师或经验丰富的数据库管理员在必要时使用,并且通常在Oracle支持的指导下进行。
- 操作注意事项:
- 在使用BBED或ORAPATCH之前,应确保已经尝试了所有其他数据恢复选项,并且有适当的数据备份。这些工具的使用应作为最后手段,并且在操作前应充分理解所做更改的影响。
- 示例和使用限制:
- 文档可能提供了使用BBED和ORAPATCH的基本示例,包括如何打开和编辑数据块,如何查找和修改特定的数据值等。同时,也强调了这些工具仅限于Oracle内部使用,并不公开提供给客户。
- 修补流程和策略:
- 在进行数据块修补时,建议采取谨慎的策略,包括在测试环境中先行验证更改的影响,确保操作的准确性,并在操作后验证数据块的完整性和一致性。
"Patching with BBED or ORAPATCH"部分强调了在Oracle数据库管理和维护中,直接编辑数据块内容的重要性和风险。虽然这些工具在处理特定的数据损坏问题时非常有用,但它们的使用需要谨慎和专业的指导,以避免不必要的数据损失。
- 在进行数据块修补时,建议采取谨慎的策略,包括在测试环境中先行验证更改的影响,确保操作的准确性,并在操作后验证数据块的完整性和一致性。
32、Multiple Block Size
这项功能允许数据库在同一个实例中使用不同的数据块大小,为数据库设计和性能调优提供了更多的灵活性。
- 支持多块大小的原因:
- Oracle引入多块大小的支持,主要是为了提高数据迁移的灵活性,优化I/O性能,以及提高在不同数据库之间传输表空间的兼容性。这对于需要处理不同类型负载的数据库尤其有用,例如,大块大小可能更适合大型顺序读取,而小块大小可能更适合随机访问模式。
- 配置多块大小:
- 数据库可以有一个标准块大小(由DB_BLOCK_SIZE初始化参数指定),以及最多四个非标准块大小。非标准块大小是通过DB_nK_CACHE_SIZE参数设置的,其中n可以是2、4、8、16或32,代表不同的块大小(以KB为单位)。
- 使用场景:
- 多块大小的使用允许数据库管理员根据具体的应用需求和数据访问模式,为特定的表空间选择最合适的块大小。例如,可以为包含大型LOB对象的表空间选择更大的块大小,而为频繁更新的小记录选择更小的块大小。
- 注意事项:
- 虽然多块大小提供了额外的灵活性,但它也增加了数据库设计和管理的复杂性。选择非标准块大小时,需要仔细考虑其对性能的潜在影响,并确保为每种块大小配置足够的缓冲区缓存。
- 限制:
- 所有分区对象的分区必须位于具有相同块大小的表空间中。此外,所有临时表空间必须使用标准块大小。
"Multiple Block Size"部分强调了Oracle数据库支持多块大小的能力,这为数据库的性能优化和跨数据库迁移提供了更多的选项和灵活性。然而,正确利用这一功能需要深入理解不同块大小对性能的潜在影响,以及对数据库配置和管理的影响。
- 所有分区对象的分区必须位于具有相同块大小的表空间中。此外,所有临时表空间必须使用标准块大小。
33、Multiple Block Size Guidelines
Oracle数据库支持多块大小功能,允许数据库在同一个实例中使用不同的数据块大小。这可以提高性能和数据迁移的灵活性,但也需要谨慎使用以避免潜在问题。
- 分区对象的一致性:
- 所有分区对象的分区必须位于具有相同块大小的表空间中。这意味着,如果一个分区表或索引的一个分区使用了特定的块大小,那么该对象的所有其他分区也必须使用相同大小的块。
- 临时表空间的限制:
- 所有临时表空间必须使用标准块大小。这是因为临时表空间通常用于排序和其他数据库操作,这些操作最优化地设计为使用数据库的标准块大小。
- 操作系统工具的使用:
- 当使用操作系统工具(如UNIX的
dd
命令)来直接操作或分析Oracle数据文件时,必须使用正确的块大小。错误的块大小可能导致误解数据或损坏文件。
- 当使用操作系统工具(如UNIX的
- 块结构的一致性:
- 无论块大小如何,所有Oracle数据块的内部结构都是一致的,由
kcb.h
文件定义。这意味着,不同块大小的数据块在逻辑上遵循相同的结构和布局规则。
- 无论块大小如何,所有Oracle数据块的内部结构都是一致的,由
- 工具使用的注意事项:
- 使用像ORAPATCH这样的工具进行数据块修补时,必须指定正确的块大小,否则可能会引入额外的数据损坏。正确的块大小对于确保数据块修补操作的安全性和有效性至关重要。
"Multiple Block Size Guidelines"部分强调了在设计和管理使用多块大小的Oracle数据库时需要考虑的关键方面。合理地应用这些指导原则有助于最大化多块大小功能的优势,同时避免可能的配置和性能问题。
- 使用像ORAPATCH这样的工具进行数据块修补时,必须指定正确的块大小,否则可能会引入额外的数据损坏。正确的块大小对于确保数据块修补操作的安全性和有效性至关重要。