Oracle_管理控制文件和日志文件
控制文件:
控制文件在数据库创建时被自动创建,并在数据库发生物理变化时更新。控制文件被不断更新,并且在任何时候都要保证控制文件是可用的。只有Oracle进程才能安全地更新控制文件的内容,所以,任何时候不要试图手动编辑控制文件
Oracle系统提供了备份文件和多路复用机制来保护控制文件。
控制文件中包含的内容(数据库的结构信息+当前的数据库参数设置):
数据库名称和SID标识
数据文件和日志文件列表(文件名称和对应路径信息)
数据库创建的时间戳
表空间信息
当前重做日志文件序列号
归档日志信息
检查点信息
回滚段(UNDO SEGMENT)的起始和结束
备份数据文件信息
控制文件的多路复用
在系统不同的位置上同时存放多个控制文件的副本。在这种情况下,如果多路复用控制文件中的某个磁盘发生物理损坏导致其所包含的控制文件损坏,数据库将被关闭((在数据库实例启动的情况下),此时就可以利用另一个磁盘中保存的控制文件来恢复被损坏的控制文件,然后再重新启动数据库,达到保护控制文件的目的。
在初始化参数CONTROL_FILES列出了当前数据库中的所有控制文件。Oracle将根据CONTROL_FILES参数中的信息同时修改所有的控制文件,如果任何一个控制文件损坏,那么实例就不能再继续运行。
实现控制文件的多路复用主要包括更改CONTROL_FILES参数和复制控制文件两个步骤,
step1.更改CONTROL_FILES参数
alter system set control_files=
'F:\app\Administrator\oradata\orcl\control01.ctl',
'F:\app\Administrator\flash_recovery_area\orcl\control02.ctl',
'd:\oracopy\control03.ctl'
scope=spfile
/
step2.复制控制文件
先退出SQL*Plus 在管理\服务中,将OracleServiceORCL和OracleDBConsoleORCL服务停止
手动将control01.ctl复制到目标位置,并重命名
再次启动服务
可以看到新备份的控制文件
创建控制文件:
在创建新控制文件时,首先需要了解数据库中的数据文件和日志文件。
日志:select member from v$logfile;
数据:select name from v$datafile;
控制:select name from v$controlfile;
关闭数据库:shudown immediate
备份文件
在创建新控制文件之前,需要备份所有的数据文件和重做日志文件
启动数据库实例
startup nomount(不加载数据库,因为会打开控制文件,无法达到新创建控制文件的效果)
创建新的控制文件
create controlfile reuser database "orcl"
logfile
group 1 'F:\APP\ADMINISTRATOR\ORCL\REDO01.LOG'
group 2 'F:\APP\ADMINISTRATOR\ORCL\REDO02.LOG'
group 3 'F:\APP\ADMINISTRATOR\ORCL\REDO03.LOG'
datafile
'F:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSTEM01.DBF'
'F:\APP\ADMINISTRATOR\ORADATA\ORCL\SYSAUX01.DBF'
'F:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS01.DBF'
'F:\APP\ADMINISTRATOR\ORADATA\ORCL\USERS01.DBF'
'F:\APP\ADMINISTRATOR\ORADATA\ORCL\EXAMPLE01.DBF'
maxlogfiles 50
maxlogmembers 3
maxinstances 6
maxdatafiles 200
noresetlogs --仍然使用原有的重做日志文件 若原有重做日志文件和控制文件一起丢失,可以指定resetlogs
noarchivelog;
编辑参数
alter system set control_files=
'F:\app\Administrator\oradata\orcl\control01.ctl',
'F:\app\Administrator\flash_recovery_area\orcl\control02.ctl'
scope=spfile;
使其指向新建的控制文件
这里我也不知道是如何指定的,和之前的相比,就只是少了一个之前备份的
打开数据库 alter database open;
若,创建控制文件时使用了“resetlogs",则需要以恢复方式打开数据库,
alter database open resetlogs
备份和恢复控制文件
备份:(两种)
其一:备份为二进制
alter database backup controlfile
to 'd:\oraback\control_file1.bkp';
其二:备份为脚本 也就是备份为一个可读的文本文件
alter database backup controlfile to trace;
这种文件也称之为,跟踪文件,实际上是一个SQL脚本。可以利用它来”重新创建“新的控制文件。跟踪文件的存放位置由SPFILE文件中的USER_DUMP_DEST参数来决定
alert_orcl.log
恢复控制文件
当控制文件本身损坏:
关闭数据库,shutdown immediate
复制这个损坏文件对应的一个多路复用文件,覆盖掉原来目录下的损坏文件
重新启动数据库 startup
当磁盘介质永久性损坏:
关闭数据库实例 shutdown ,将当前控制文件的一个多路复用文件复制到一个新的可用位置
编辑初始化参数CONTROL_FILES,用新的控制文件的位置替换原来损坏的位置,或者说删除原来损坏的位置,添加一个新的控制文件的位置
重新启动数据库(startup)
删除控制文件
如果控制文件的位置不再合适,可以从数据库中删除控制文件:
关闭数据库 停止相关的服务consoleorcl orcl
编辑初始化参数CONTROL_FILES,清除打算要删除的控制文件的名称(也可以手动清除磁盘上的物理文件)
重新启动数据库
注意:不能将控制文件全部删除,要至少保留两个,否则数据库将无法启动
查询控制文件的信息
控制文件是一个二进制文件,被分隔成许多部分,分别记录各种类型的信息。每一类信息称为一个记录文档段。控制文件的大小在创建时就被确定,其中各个记录文档段的大小也是固定的。
与控制文件信息相关的常用数据字典视图
字典视图 | 说明 |
v$controlfile | 包含所有控制文件的名称和状态信息 |
v$controlfile_record_section | 包含控制文件中各个记录文档段的信息 |
v$parameter | 包含了系统的所有初始化参数,从中可以查询参数control_files的值 |
如:记录文档段的信息
type,record_size,records_total,records_used,...等字段信息
重做日志文件(Redo Log File):日志文件
日志文件的内容及数据恢复:重做日志文件由重做记录组成(重做条目),它由一组变更向量组成。每个变更向量都记录了数据库中某个数据块所做的修改。
利用重做记录,不仅能够恢复对数据文件所做的修改操作,还能恢复对回滚段所做的修改操作。在进行数据库恢复时,Oracle会读取每个变更向量,然后将其中记录的修改信息重新应用到相应的数据块上。
重做记录将以循环方式在SGA区的重做日志高速缓冲区中进行缓存,并且由LGWR写入到重做日志文件中。当一个事务被提交时LGWR进程将与该事务相关的所有重做记录全部写入重做日志文件组中,同时生成一个”系统变更码“SCN
状态:
current active inactive
增加日志组及成员
(要有alter database权限)
1.添加新的重做日志文件组
在SYSTEM模式下,向数据库中添加一个新的重做日志文件组:
alter database add logfile
(
'D:\oralogfile\redo04_a.log',
'E:\oralogfile\redo04_b.log')
size 20m;
一般重做日志文件的大小最好在10M-50M(defalut)之间;当向上面的例子中,并没有指定组编号,Oralce会自动为新建的重做日志组设置编号(递增)。如需手动指定(group +编号)
日志编号,必须连续,不能跳跃
若要添加一个单一(非复用)的日志文件组,可以直接创建,若要覆盖重名的日志文件,可以(reuse)关键字,但是不能同时使用size (其大小由已经存在的日志文件的大小决定)
2.创建日志成员文件
如果某个日志组中的所有日志成员都被损坏了,那么当后台LGWR切换到该日志组时,Oracle会停止工作,并对数据库执行不完全恢复,为此数据库管理员需要向该日志组添加一个或多个日志成员
如:为第4个重做日志文件组添加一个新的日志成员:
alter database add logfile member
'e:\oralogfile\redo04_c.log' to group 4;
小技巧:to 可以是一个日志成员名称(全部路径),这样就会将该日志文件添加到to右侧日志文件所在的组
删除重做日志
1.删除日志成员
在SYSTEM模式下,删除”e:\oralogfile\redo04_c.log'重做日志文件:
alter database drop logfile member
'e:\oralogfile\redo04_c.log';
若出现当前日志,则可以切换,
alter system switch logfile(切换当前日志组)
注意:这样的删除,只是在数据字典和控制文件中将重做日志文件成员删除,而对应的物理文件还需要手动删除。
2.删除日志文件组
删除之前需要注意:
(1)无论日志组中有剁手个成员,一个数据库至少需要两个日志组,删除时不能超过这个限制
(2)只能删除处于INACITVE状态的日志组。如果要删除处于CURRENT状态的重做日志组,必须执行一个手动切换日志,将它切换到INACTIVE状态
(3)如果数据库处于归档模式,在删除重做日志组之前必须确定它已经被归档
如:删除数据库编号为5的日志组
alter database drop logfile group 5;
注意:与删除指定的日志文件一样,删除日志文件组也只是在数据字典和控制文件中将日志文件组的信息删除,而对应的物理文件并没有删除,若要删除,可以采用手动删除方式
3.清空重做日志文件
将日志文件中的内容清空。即使数据库只有两个重做日志文件组,甚至要清空的重做日志组处于CURRENT状态,也都可以成功地执行清空操作
如:清空数据库编号为4的日志组中所有的日志文件中的内容
alter database clear logfile group 4;
注意:如果清空的重做日志文件组尚未归档,则必须使用“alter database clear unarchived logfile”
更改重做日志的位置和名称
step1:关闭数据库 shutdown
step2:手动复制源文件到目标位置,甚至可以对复制后的文件进行重命名
step3:再次启动数据库实例,加载数据库,但不打开数据库
startup mount
step 4:alter database rename file重新设置重做日志文件的路径以及名称
alter database rename file
'd:\oralogfile\redo1_new.log'
to
'e:\oralogfile\redo1_newa.log'
step 5 打开数据库 alter database open;
查看重做日志信息
查询日志文件信息常用的数据字典视图
字典视图 | 说明 |
v$log | 显示控制文件中的日志文件信息 |
v$logfile | 日志组和日志成员信息 |
v$log_history | 日志历史信息 |
管理归档日志文件
Oracle利用重做日志文件来记录用户对数据库所做的修改,但是重做日志文件是以循环方式使用的,在重新写入重做日志文件时,原来保存的重做记录会被覆盖。为了完整地记录数据库的全部修改过程,Oracle使用“归档日志文件”来提前一步保存这些即将被覆盖掉的重做日志记录
日志模式分类
分为归档日志模式、非归档日志模式
1.归档日志模式(ARCHIVELOG)
在重做日志文件被覆盖之前,Oracle能够将已经写满的重做日志文件通过复制保存到指定的位置,保存下来的所有重做日志文件被称为“归档重做日志”,这个过程就是“归档过程”。也只有在归档模式时,才会对重做日志文件执行归档操作。另外,归档日志文件不仅包含了被覆盖的日志文件,还包含重做日志文件使用的顺序号。
当数据库处于归档模式下,具有如下优势:
A.如果发生磁盘介质损坏,则可以使用数据库备份与归档重做日志恢复已经提交的事务,保证不会发生任何数据丢失。
B.如果为当前数据库建立一个备份数据库,通过持续地为备份数据库应用归档重做日志,可以保证源数据库与备份数据库的一致性。
C.利用归档日志文件,可以实现使用数据库在打开状态下创建的的备份文件来进行数据库恢复。
归档模式下,归档操作一般可以由ACRN自动完成
2.非归档模式
非归档模式只能用于保护实例故障,而不能保护介质故障,当数据处于NOARCHIVELOG模式时,如果进行日志切换,生成新的内容将直接覆盖掉原来的日志文件记录
所具有的优点:
A.当检查点完成之后,后台进程LGWR可以覆盖原来的重做日志文件
B.如果数据库备份后的重做日志内容已经被覆盖掉,那么当出现数据库文件损坏时,只能恢复到最近一次的某个完整备份点,而且这个备份点的时间手动无法控制,甚至可能会有数据丢失。
注意:Oracle数据库具体应用归档模式还是非归档模式,这个由数据库对应的应用系统来决定。
管理归档操作
1.日志模式切换
改变日志模式,必须有sysdba身份执行相应的操作
查看当前日志模式: select log_mode from v$database;
一般默认是在非归档日志模式,此时若要改变日志模式
关闭并重新启动数据库
shutdown immediate
startup mount(改变日志模式时,关闭数据库不能使用shutdown abort)
改变日志模式
alter database archivelog;
打开数据库
alter database open
至此,日志模式切换完毕(archive log list 可以查看现在的数据库是否处于归档模式)
配置归档进程
如果Oracle系统的后台进程LGWR经常处于等待的状态,就可以考虑启动多个ARCN进程,通过修改参数“LOG_ARCHIVIE_MAX_PROCESS”
如:设置启动3个ARCN后台系统进程:
alter system set log_archive_max_processes=3;
注意:当数据库处于归档模式下,Oracle会自动启动两个归档日志进程。
设置归档文件位置
归档目标在初始化参数LOG_ARCHIVE_DEST_n,其中n为1-10,即可以为数据库指定1-10个归档目标。在进行归档时,Oracle会将重做日志文件组以相同的方式归档到每一个归档目标中。在设置归档目标时,可以指定本地机器作为归档目标(LOCATION)也可以选择远程服务器(SERVER)
1.本地归档目标(LOCATION)
如在本地机器上,建立1个归档目标
alter system set log_archive_dest_1 ='location=d:\oralogfile\archive1';
还可以同时添加3个选项
optional:默认选项,使用该选项,无论“归档操作”是否执行成功,都可以覆盖重做日志文件
mandatory:用于强制进行“归档操作”。也就是说,只有归档成功后,重做日志文件才能被覆盖
reopen:这是一个属性选项。用于设定重新归档的时间间隔,默认是300秒。但必须跟在mandatory之后才可以使用
如建立:
alter system set log_archive_dest_2='location=d:\oralogfile\archive2 mandatory reopen=400';
也可以设置LOG_ARCHIVE_MIN_SUCCEED_DEST控制本地成功归档的“最小个数”,如果生成的归档日志文件少于“最小个数”,那么重做日志将不能被覆盖
如:在本地机器上,设置最下归档数为3个
alter system set log_archive_min_succeed_dest=3;
同时,可以使用log_archive_dest_state(enable,defer)来确定是否开启相应的归档位
如:禁用log_archive_dest_state_4的归档位置
alter system set log_archive_dest_state_4=defer;
小技巧:一般当归档日志所在的磁盘损坏或填满时,DBA应该暂时禁用该归档位置
注意,使用log_archive_dest_state_n的序号n一定要大于log_archive_min_succeed_dest的参数值
2.远程归档目标(SERVER)
如:建立一个远程归档目标,其目标位置名称为“MRKJ”的服务器:
alter system set log_archive_dest_1='service=MRKJ';
查看归档日志信息
1.使用数据字典和动态视图
字典视图 | 说明 |
v$database | 用于查询数据库是否处于归档模式 |
v$archived_log | 控制文件中所有已经归档的日志信息 |
v$archive_dest | 归档目标信息 |
v$archive_process | 已启动的ARCN进程状态 |
v$backup_redolog | 所有已经备份的归档日志信息 |
2.使用archive log list命令 可以显示当前数据库的归档信息