一、归档的目的
二、如何开启数据库归档模式
三、设置归档进程和归档目录
四、维护归档目录
五、禁用归档模式
一、归档的目的
启用归档模式的目的:数据变更前需要由LGWR进程将内存中的log buffer(重做数据)写入redo log(重做日志)日志组,但由于日志组是循环复用结构。日志组切换需要覆盖时如果未开启归档模式会被覆盖,造成日志缺失,无法完成数据库的完全恢复。既开启归档模式后,可以完成数据库的介质恢复(recovery)。
二、如何开启数据库归档模式
查看是否开启归档模式
SQL> archive log list;
Database log mode(归档模式) No Archive Mode(非归档模式)
Automatic archival (自动归档) Disabled(禁用)
首先数据库开启mount状态
SQL> alter database archivelog; (开启归档模式)
SQL> archive log list;
Database log mode Archive Mode(归档模式)
Automatic archival Enabled(启用)
将数据库开启open模式
三、设置归档进程和归档目录
LGWR进程将log buffer写入redo log日志文件,由于是顺序写而且很频繁,所以写入速度很快。但是归档日志的写入需要读取redo log然后安装归档日志的格式在内存中进行调整,再写入归档日志中。此时就产生了一个瓶颈,即读磁盘=>内存修改=>写磁盘,相比redo log的读内存=>写磁盘要慢一些。此时如果归档进程还没有写完,但已经需要切换到当前日志组,就会发生数据库hang住的情况。并且如果设置归档目录的磁盘出现问题,无法写入就会造成数据库挂起无法进行工作的严重事件。匹配归档进程和合理的冗余就能降低故障的几率。
设置归档进程
首先查看当前开启的最大数量归档进程,该参数的默认值为2
SQL> show parameter log_archive_max_processes;
修改归档进程数量为,由于此参数是动态参数可以动态修改
SQL> alter system set log_archive_max_processes=4
设置完归档进程数量,需要设置归档目录。进程数量和归档目录的数量尽量需要匹配,目录数量大于进程数量就会发生一些进程写完一份日志还需要折回继续写其他目录的日志。造成写日志的等待。
设置归档目录
查看归档目录相关参数
SQL> show parameter log_archive_max_processes;
oracle在11g中共设置了31个归档目录可供使用,默认状态全部空白。同时可以看到有31个归档进程,默认状态全部为enable(启用)。其中 log_archive_dest_n 参数指定归档目录的绝对路径,log_archive_dest_state_n 参数指定归档目录的状态,可用于归档目录维护时的设置。
log_archive_dest_n 可以设置相关参数
参数 |
含义 |
设置的例子 |
LOCATION |
本地文件系统或ASM磁盘组 |
log_archive_dest_n='location=/disk1/arc'或log_archive_dest_n='location=+DGP' |
LOCATION |
使用快速恢复区 Fast Recovery Area |
log_archive_dest_n='location=use_db_recovery_file_dest' |
SERVICE |
配置远程归档位置时,SERVICE选项。需要指定远程数据库的网络服务名(在tnsnames.ora文件中配置) |
log_archive_dest_n='service=std1' |
参数 |
含义 |
mandatory |
强制归档日志必须写完,当前日志组才能覆盖。 |
optional |
归档日志还未写完,当前日志组同样可以覆盖。默认设置为optional。如只设置一个归档目录,由于归档参数log_archive_min_succeed_dest默认为1(最小成功完成归档数量),此时等同于设置为mandatory。 |
reopen |
指定如果归档不成功尝试重新归档的时间间隔,默认值为300秒,必须跟在MANDATORY后 |
设置log_archive_dest_1目录路径,为强制归档目录并且设置重新归档时间为100秒
SQL> alter system set log_archive_dest_1='location=/u01/app/archive_test/archive_test_dest_1/ mandatory reopen=100';
设置log_archive_dest_2目录路径,并且为可选择归档目录
alter system set log_archive_dest_2='location=/u01/app/archive_test/archive_test_dest_2/ optional';
设置log_archive_dest_3目录路径,Oracle默认为可选择归档目录
alter system set log_archive_dest_3='location=/u01/app/archive_test/archive_test_dest_3/';
验证归档目录设置
SQL> select destination,binding,target,status from v$archive_dest where destination is not null;
DESTINATION BINDING TARGET STATUS
-------------------------------------------------- --------- ------- ---------
/u01/app/archive_test/archive_test_dest_1/ MANDATORY PRIMARY VALID
/u01/app/archive_test/archive_test_dest_2/ OPTIONAL PRIMARY VALID
/u01/app/archive_test/archive_test_dest_3/ OPTIONAL PRIMARY VALID
查询归档信息
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/archive_test/archive_test_dest_3/ -----------归档终点,此目录必须写入成功,否则数据库会被挂起。
Oldest online log sequence 35 ---------------最早的联机日志序列号
Next log sequence to archive 37 ---------------下一个存档日志序列号
Current log sequence 37 ---------------当前日志序列
注:Windows操作系统,如果修改log_archive_dest_1归档目录为/u01/app/archive_test1/,单为创建此目录。此时oracle会默认寻找此目录的上一层目录,完成归档。但如果整个磁盘损坏,则无法完成归档。
查询最小成功归档数量,默认为1
SQL> show parameter log_archive_min_succeed_dest;
设置最小成功归档终点数量,必须小于等于归档目录的数量。否则会报错
SQL> alter system set log_archive_min_succeed_dest=2;
此次设置了3个归档目录,dest_1为mandatory,另外两个目录设置为optional。
查看log_archive_max_processes与log_archive_min_succeed_dest关系
参考值 |
关系 |
1 |
该参数被忽略,使用目录设置参数为mandatory的归档终点,此目录成功,redo日志组可以被重用。 |
2 |
除设置为mandatory的归档终点,还要至少一个optional归档终点归档成功,redo日志组才可以被重用。 |
3 |
所有目录都需要归档成功,redo日志才可以被重用。 |
>=4 |
报错,大于归档目录数量 |
查询参数log_archive_format(归档日志格式)参数
show parameter log_archive_format;
参数值 |
含义 |
%t |
重做日志线程号 |
%T |
重做日志线程号(带有前导0) |
%r |
resetlogs(重做日志ID号) |
%R |
resetlogs(带前导0) |
%s |
日志序列号 |
%S |
日志序列号(带前导0) |
%a |
活动ID号 |
%d |
数据库ID号 |
修改归档日志格式
SQL> alter system set log_archive_format = "archive_%t_%s_%r.log" scope=spfile;(指定归档日志文件的格式)
日志格式与版本、操作系统有关,一般不需要变更
四、维护归档目录
归档目录的状态
状态 |
含义 |
enable |
磁盘目录或服务名已经指定,并且有效 |
defer |
该目录被临时禁用,维护归档目录是,经常将目录设置为此状态 |
alternative |
该目录为备用目录,当对应的主目录发生故障时,会自动启动备用目录。 |
查看归档目录状态
select dest_name,status,binding,process,error from v$archive_dest where status not like 'INA%';
模拟mandatory参数主目录损坏,无法归档。造成数据库挂起
1、移动mandatory归档目录至其他地方
2、切换日志,强制日志写归档,直至数据库hang住
alter system switch logfile;
3、重新打开一个新连接,查看数据库归档状态,发现ORA-16032:无法转换参数的目标字符串(意思为目录不存在)
select dest_name,binding,process,error from v$archive_dest where status not like 'INA%';
4、修改问题归档目录状态为defer
alter system set log_archive_dest_state_1=defer;
5、将目录放回原位
6、修改问题归档目录状态为enable,再次连接日志切换正常
添加归档日志目录4为归档日志目录1的备用归档目录,降低由于主目录损坏造成数据库挂起的几率
1、首先设置归档日志目录4路径
SQL> alter system set log_archive_dest_4='location=/u01/app/archive_test/archive_test_dest_4';
2、配置归档日志目录,使目录4作为目录1的备份
SQL> alter system set log_archive_dest_1='location=/u01/app/archive_test/archive_test_dest_1/ mandatory alternate=log_archive_dest_4';
3、将目录4的状态修改为alternate
SQL> alter system set log_archive_dest_state_4=alternate;
4、验证修改结果
SQL> show parameter log_archive_dest_1;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1 string location=/u01/app/archive_test
/archive_test_dest_1/ mandator
y alternate=log_archive_dest_4
查询所有的归档终点名称和状态
select dest_name,status,destination from v$archive_dest where status not like 'INA%';
DEST_NAME STATUS DESTINATION
LOG_ARCHIVE_DEST_1 VALID /u01/app/archive_test/archive_test_dest_1/
LOG_ARCHIVE_DEST_2 VALID /u01/app/archive_test/archive_test_dest_2/
LOG_ARCHIVE_DEST_3 VALID /u01/app/archive_test/archive_test_dest_3/
LOG_ARCHIVE_DEST_4 ALTERNATE /u01/app/archive_test/archive_test_dest_4
主目录未发生故障时,备用目录内不会有任何归档日志。当主目录发生故障,会自动切换至备用目录存储日志
五、禁用归档模式
SQL
> alter system set log_archive_start=false scope=spfile; #禁用自归档
SQL
> shutdown immediate; #关闭数据库
SQL
> startup mount; #重启数据库到mount模式
SQL> alter database noarchivelog; #修改为非归档模式
SQL> alter database open; #打数据文件
SQL> archive log list; #再次查看前归档模式