控制文件
- 一个小的二进制文件
- 定义物理数据库的当前状态
- 维护数据库的完整性
- 要求:1.在数据库启动期间处于MOUNT状态 ; 2.操作数据库。
- 链接到单个数据库
- 丢失可能需要恢复
- 初始大小由CREATE DATABASE决定
控制文件的大小
控件设置的值是控制文件大小的主要决定因素MAXDATAFILES, MAXLOGFILES, MAXLOGMEMBERS, MAXLOGHISTORY,和创建关联数据库的CRÉATEDATABASE语句中的MAXINSTANCES参数。增加这些参数的值会增加关联数据库的控制文件的大小。
控制文件内容
控制文件包含以下条目:
- 数据库名称和标识符
- 数据库创建的时间戳
- 表空间名称
- 数据文件和在线重做日志文件的名称和位置
- 当前在线重做日志文件序号
- 检查点的信息
- 撤销段的开始和结束
- 重做日志存档信息
- 备份信息
多路复用控制文件
每个Oracle数据库应该至少有两个控制文件,分别存储在不同的物理磁盘上。如果控制文件由于磁盘故障而损坏,则必须关闭关联的实例。一旦修复了磁盘驱动器,就可以使用从另一个磁盘上完整拷贝的控制文件来恢复损坏的控制文件,并且可以重新启动实例。在这种情况下,不需要进行介质恢复。
多路控制文件的行为是这样的:
- 数据库写入数据库初始化参数文件中为初始化参数CONTROL_FILES列出的所有文件名。
- 在数据库操作期间,数据库只读取CONTROL_FILES参数中列出的第一个文件。
- 如果任何控制文件在数据库操作期间变得不可用,则实例变得不可操作并应中止。
注意:Oracle强烈建议您的数据库具有至少有两个控制文件,并且它们位于不同的物理磁盘上。
当使用SPFILE时
1. 修改SPFILE:
ALTER SYSTEM SET control_files =
'$HOME/ORADATA/u01/ctrl01.ctl',
'$HOME/ORADATA/u02/ctr102.ctl'SCOPE=SPFILE;
2. 关闭数据库:
shutdown immediate
3.创建额外的控制文件:
cp $HOME/ORADATA/u01/ctrl01.ctl
$HOME/ORADATA/u02/ctrl02.ctl
4. 启动数据库:
startup
当使用PFILE时
1. 关闭数据库:
shutdown immediate
2. 创建额外的控制文件:
cp $HOME/ORADATA/u01/ctrl01.ctl
$HOME/ORADATA/u02/ctrl02.ctl
3.在PFILE中添加控制文件名:
CONTROL_FILES = $HOME/ORADATA/u01/ctrl01.ctl,
$HOME/ORADATA/u02/ctrl02.ctl)
4. 启动数据库:
startup
使用OMF
如果没有指定CONTROL_FILES参数,则创建OMF。
位置被定义为DB_CREATE_ONLINE_LOG_DEST_n。
名称是唯一生成并显示在alertSID.log。
获取控制文件信息
有关控制文件状态和位置的信息可以通过查询以下视图来检索。
- V$CONTROLFILE:列出与实例关联的所有控制文件的名称和状态
- V$PARAMETER:列出所有参数的状态和位置
- V$CONTROLFILE_RECORD_SECTION:提供有关控制文件记录节的信息
- SHOW PARAMETER CONTROL_FILES:列出控制文件的名称、状态和位置
维护在线重做日志文件(Online Redo log file)
在线重做日志文件具有以下特点:
- 记录对数据所做的所有更改
- 提供恢复机制
- 一定被组织为组
- 至少需要两组
重做文件结构
在线重做日志文件组
- 在线重做日志文件的一组相同副本称为在线重做日志文件组。
- LGWR后台进程并发地向一个组中的所有在线重做日志文件中写入相同的信息。
- Oracle服务器至少需要两个在线重做日志文件组才能保证一个数据库的正常运行。
在线重做日志文件成员
- 组中的每个在线重做日志文件称为一个成员。
- 组中的每个成员具有相同的日志序列号,大小相同。
- LSN(日志序列号)是Oracle服务器每次写日志组时分配的,用来唯一标识每个在线重做日志文件。
多路重做日志文件
为了防止涉及重做日志本身的故障,Oracle数据库允许多路重做日志,这意味着可以在不同的位置自动维护两个或多个相同的重做日志副本。为了获得最大的好处,这些位置应该位于单独的磁盘上。然而,即使重做日志的所有副本都在同一个磁盘上,冗余也可以帮助防止I/O错误、文件损坏等。当重做日志文件多路复用时,LGWR并发地将相同的重做日志信息写入多个相同的重做日志文件,从而消除了重做日志单点故障。
多路复用是通过创建多组重做日志文件实现的。一个组由一个重做日志文件和它的多路副本组成。每个相同的副本被称为组的一个成员。每个重做日志组都用一个数字来定义,比如组1、组2,等等。
注意:Oracle建议您使用多重重做日志文件。如果需要恢复,日志文件数据的丢失可能是灾难性的。请注意,当您复用重做日志时,数据库必须增加它执行的I/O量。根据您的配置,这可能会影响数据库的整体性能。
重做文件如何工作
在线重做日志文件以循环的方式使用。
当一个在线重做日志文件已满时,LGWR会移动到下一个日志组。
- 称为日志切换
- 检查点操作也会发生
- 写入控制文件的信息
从一个日志文件组切换到另一个日志文件组的行为称为日志切换。检查点是将脏的(修改的)块从缓冲区缓存写到磁盘。
LGWR什么时候写重做?
- 事务提交的时候。
- 每三秒一次
- 当重做日志缓冲区满三分之一时。
- 当重做日志缓冲区中有超过1兆字节的更改记录时。
- 在DBWn将数据库缓存中修改过的块写入到database files
LS & LSN
日志交换机和日志序列号
日志开关是数据库停止写入一个重做日志文件并开始写入另一个日志文件的点。通常,日志切换发生在当前重做日志文件被完全填满,必须继续写入下一个重做日志文件的时候。但是,您可以将日志切换配置为定期发生,而不管当前重做日志文件是否被完全填满。你也可以手动强制日志切换。
Oracle数据库在每次日志切换发生并且LGWR开始写入时,为每个重做日志文件分配一个新的日志序列号。当数据库归档重做日志文件时,归档的日志保留其日志序列号。重做日志文件被循环回用时,会被赋予下一个可用的日志序列号。
每个在线或存档的重做日志文件都由其日志序列号唯一标识。在崩溃、实例或介质恢复期间,数据库通过使用必要的归档和重做日志文件的日志序列号,以升序正确地应用重做日志文件。
强制日志开关和CK
强制日志开关:
ALTER SYSTEM SWITCH LOGFILE;
可以通过以下方式强制设置检查点:
设置FAST_START_MTTR_TARGET参数
FAST_START_MTTR_TARGET = 600
修改系统检查点命令
ALTER SYSTEM CHECKPOINT;
添加重做文件组
ALTER DATABASE ADD LOGFILE GROUP 3
('$HOME/ORADATA/u01/log3a.rdo',
'$HOME/ORADATA/u02/log3b.rdo')
SIZE 1M;
添加Redo文件成员
ALTER DATABASE ADD LOGFILE MEMBER
'$HOME/ORADATA/u04/log1c.rdo' TO GROUP 1,
'$HOME/ORADATA/u04/1og2c.rdo' TO GROUP 2,
'$HOME/ORADATA/u04/1og3c.rdo' TO GROUP 3;
删除Redo文件成员
- 允许删除重做日志文件,使多路重做日志暂时变得不对称。例如,如果你使用双工重做日志文件组,你可以删除一个组中的一个成员,即使所有其他组每个组都有两个成员。但是,您应该立即纠正这种情况,以便所有组至少有两个成员,从而消除重做日志可能出现的单点故障。
- 一个实例总是需要至少两组有效的重做日志文件,而不管组中的成员有多少。(一个组由一个或多个成员组成。)如果要删除的成员是组中最后一个有效的成员,则在其他成员生效之前不能删除该成员。要查看重做日志文件状态,请使用V$LOGFILE视图。如果数据库无法访问重做日志文件,则重做日志文件变为INVALID。如果数据库怀疑它不完整或不正确,则变为STALE。当一个陈旧的日志文件的组下一次被设置为活动组时,该日志文件将再次变为有效的。
- 只有当重做日志成员不属于活动组或当前组时,才能删除该成员。如果你想删除一个活动组的成员,首先强制进行日志切换。
- 在删除成员之前,请确保重做日志成员所属的组已存档(如果存档已启用)。要查看是否发生了这种情况,使用V$LOG view。
当重做日志成员从数据库中删除时,操作系统文件不会从磁盘中删除。相反,更新关联数据库的控制文件以从数据库结构中删除该成员。在删除重做日志文件后,确保删除成功完成,然后使用适当的操作系统命令删除被删除的重做日志文件。
删除重做文件组
- 一个实例至少需要两组在线重做日志文件。
- 不能删除活动组或当前组。
- 删除在线重做日志文件组时,不会删除操作系统文件。
ALTER DATABASE DROP LOGFILE GROUP 3;
搬迁和重命名
您可以使用操作系统命令重新定位重做日志,然后使用ALTER DATABASE语句使数据库知道它们的新名称(位置)。这个过程是必要的,例如,如果当前用于某些重做日志文件的磁盘将被删除,或者数据文件和多个重做日志文件存储在同一个磁盘上,并且应该分开以减少争用。
要重命名重做日志成员,您必须具有ALTER DATABASE系统权限。此外,您可能还需要操作系统权限来将文件复制到所需的位置和特权,以打开和备份数据库。
在重新定位重做日志或对数据库进行任何其他结构更改之前,请完全备份数据库,以防在执行操作时遇到问题。作为预防措施,在重命名或重定位一组重做日志后日志文件,立即备份数据库控制文件。
搬迁和重命名
通过以下两种方式之一重新定位或重命名在线重做日志文件:
ALTER DATABASE重命名文件命令
- 关闭数据库。
- 将在线重做日志文件复制到新位置。
- 将数据库置于MOUNT模式。
- 执行命令。
- 打开数据库进行正常操作。
ALTER DATABASE RENAME FILE
'$HOME/ORADATA/u01/log2a.rdo'
TO '$HOME/ORADATA/u02/log1.rdo';
添加新成员,删除旧成员。
清除重做文件
清除数据库日志文件命令用于重新初始化在线重做日志文件。
ALTER DATABASE CLEAR LOGFILE GROUP 2;
使用UNARCHIVED关键字,避免归档损坏的在线重做日志文件。
ALTER DATABASE CLEAR UNARCHIVED
LOGFILE GROUP 2;
重做文件配置
小贴士:在不同的磁盘上在设置多路重做日志时,将组的成员放在不同的物理磁盘上。如果单个磁盘发生故障,则组中只有一个成员对LGWR不可用,而LGWR仍然可以访问其他成员,因此实例可以继续运行。
如果归档重做日志,请将重做日志成员分散到磁盘上,以消除LGWR和ARCn后台进程之间的争用。例如,如果你有两组多工重做日志成员(双工重做日志),将每个成员放在不同的磁盘上,并将存档目标设置为第五个磁盘。这样做可以避免LGWR(写入成员)和ARCn(读取成员)之间的争用。
数据文件也应该和重做日志文件放在不同的磁盘上,以减少写数据块和重做记录的争用。
用OMF管理重做文件
定义DB_CREATE_ONLINE_LOG_DEST_n参数:
DB_CREATE_ONLINE_LOG_DEST_1
DB_CREATE_ONLINE_LOG_DEST_2
可以在没有文件规格的情况下添加组:
Alter database add logfile;
删除组:
Alter database drop logfile group 3;
组&成员信息
可以通过查询以下视图获取组及其成员的信息:
- V$LOG
- V$LOGFILE
什么是重做线程?
当在多个数据库实例的上下文中说话时,每个数据库实例的重做日志也被称为重做线程。在典型配置中,只有一个数据库实例访问一个Oracle数据库,因此只存在一个线程。然而,在Oracle真实应用集群环境中,两个或多个实例并发访问一个数据库,每个实例都有自己的重做线程。每个实例单独的重做线程避免了对一组重做日志文件的争用,从而消除了潜在的性能瓶颈。
归档的重做日志文件
- 由ARCn自动完成
- 通过SQL语句手动完成归档成功时:
- 在控制文件中做一个条目记录:存档日志名称、日志序号、高低系统变更号(SCN)
- 填满的在线重做日志文件不能被重用,直到:检查点已经发生—文件已被ARCn归档
- 能复用吗
- 由DBA维护
填满的在线重做日志文件可以归档。
以ARCHIVELOG模式运行数据库并存档在线重做日志文件有两个优点:
- 恢复:数据库备份以及联机和归档的重做日志文件可以保证恢复所有已提交的事务。
- 备份:这可以在数据库打开时执行。
默认情况下,数据库创建在无归档日志模式。