归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换时,后台进程ARCH会将重做日志的内容保存到归档日志中,当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。在Oracle10g中,只要启动数据库的归档模式,Oracle就会启用自动归档,从而避免了10g以前由于用户疏忽所带来的一系列问题。
日志操作模式:ARCHIVELOG(归档),NOARCHIVELOG(非归档)
对于非归档模式的数据库改为归档模式(主要以Oracle 10g为参考)使用以下步骤:
首先查看数据库现有模式可使用以下语句,显示数据库处于非归档模式下
SQL>select name,log_mode from v$database;
NAME LOG_MODE
--------- ------------
ZHQHDB NOARCHIVELOG
也可以用下面的语句
[oracle@wangdm~ 10:28 #9]$ sqlplus / as sysdba
SQL>archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination ?/dbs/arch
Oldest online log sequence 534
Current log sequence 536
SQL>alter system setlog_archive_dest_1='location=/u01/arch';
该语句含义是设置归档日志文件的存放路径,实际上Oracle 10g以后可以生成多份一样的日志,保存多个位置以防不测
例如再添加一个归档日志文件存放位置可使用以下语句
SQL>altersystem set log_archive_dest_2='location=/u02/arch ';
“location=/u01/arch”此目录是要从根目录开始的一个完整的目录
详细介绍归档日志文件的存放的两种方法:
方法一、使用log_archive_dest和log_archive_duplex_dest配置归档位置 如果不使用备用数据库,只需要将归档日志存放到本地目录.配置本地归档位置可以使用初始化参数LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST,其中,第一个参数用于设置第一个归档位置,第二个参数用于设置第二个归档位置. ALTER SYSTEM SET log_archive_dest='/u01/arch'; ALTER SYSTEM SET log_archive_duplex_dest='/u01/arch'; 方法二、使用LOG_ARCHIVE_DEST_n配置多个归档位置. 初始化参数LOG_ARCHIVE_DEST_n用于指定多个归档位置,该参数最多可以指定10个归档位置.通过使用初始化参数LOG_ARCHIVE_DEST_n,不仅可以配置本地归档位置,还可以配置远程归档位置. 如果既要在主节点上生成归档日志,又要将归档日志传递到备用节点,那么必须使用参数LOG_ARCHIVE_DEST_n. 两种方法的比较: 1) 方法二可以配置本地和远程归档目录,而方法一只能配置本地归档目录. 2) 方法二可以配置多达10个归档目录,方法一最多只能配置两个归档目录. 3) 如果用方法一那么log_archive_dest是强制(MANDATORY)归档目录,而log_archive_duplex_dest为可选(OPTIONAL)归档目录,且第一种方法中不能使用REOPEN关键字 4) 方法一与方法二是互拆的,设置了方法一参数就不能再设置方法二的参数反之亦然
当使用初始化参数LOG_ARCHIVE_DEST_n配置本地归档位置时,需要指定LOCALTION选项.当配置远程归档位置时,需要指定SERVICE选项. 示例如下: ALTER SYSTEM SET log_archive_dest_1='location=/u01/arch'; ALTER SYSTEM SET log_archive_dest_2='location=/u02/arch'; ALTER SYSTEM SET log_archive_dest_3='service=standby'; 配置远程归档位置时,SERVICE选项需要指定远程数据库的网络服务名(在tnsnames.ora文件中配置)
使用LOG_ARCHIVE_DEST_n的关键字 使用初始化参数LOG_ARCHIVE_DEST_n配置归档位置时,可以在归档位置上指定OPTIONAL或MANDATORY选项;指定MANDATORY选项时,可以设置REOPEN属性. OPTIONAL:该选项是默认选项.使用该选项时,无论归档是否成功,都可以覆盖重做日志. MANDATORY:强制归档.使用该选项时,只有在归档成功之后,重做日志才能被覆盖,在设置时至少应该有一个本地(location)强制(mandatory)归档目录 REOPEN:该属性指定如果归档不成功尝试重新归档的时间间隔,默认值为300秒,必须跟在MANDATORY后. 例如: Alter system set log_archive_dest_1=’location=/u01/arch mandatory’; Alter system set log_archive_dest_2=’location=/u02/arch mandatory reopen=500’; Alter system set log_archive_dest_3=’location=/u03/arch optional’;
控制本地归档成功的最小个数 使用初始化参数LOG_ARCHIVE_MIN_SUCCEED_DEST控制本地归档的最小成功个数 alter system set log_archive_min_succeed_dest=2; 如上设置为2就说明至少要有2个归档目录归档成功后redo日志才能被重写;如果log_archive_dest_n中的mandatory关键字个数大于这个参数那么此参数值失效,只有小于这个数的时候这个参数才有效
使用初始化参数LOG_ARCHIVE_DEST_STATE_n控制归档位置的可用性 设置该参数为ENABLE(默认值),表示会激活相应的归档位置;设置该参数为DEFER/DISABLE,表示禁用相应归档位置.当归档日志所在磁盘损坏或填满时,DBA需要暂时禁用该归档目录. Alter system set log_archive_dest_state_3=defer/disable;(禁用) Alter system set log_archive_dest_state_3=enable;(启用)
配置归档文件格式 当数据库处于ARCHIVELOG模式时,如果进行日志切换,后台进程将自动生成归档日志目录,归档日志的默认位置为%oracle_home%rdbms,在oracle database 10g中,归档日志的默认文件格式为ARCH%S_%R.%T。 归档日志文件可以指定以下匹配符: %s: 日志序列号: %S: 日志序列号(带有前导0) %t: 重做线程编号. %T: 重做线程编号(带有前导0) %a: 活动ID号 %d: 数据库ID号 %r: RESETLOGS的ID值 %R: RESETLOGS的ID值(带有前导0) 从10g开始,配置归档日志文件格式时,必须带有%s,%t和%r匹配符,设置了归档文件格式后必须重启数据库,修改完成后手动干预进行日志切换查看归档日志文件格式是否正确。 |
关闭数据库
SQL>shutdown immediate
启动数据mount状态:
SQL>startup mount
修改数据库为归档模式:
SQL>alter database archivelog;
打开数据库,查询:
SQL>alter database open
初始化参数LOG_ARCHIVE_MAX_PROCESSES用于指定例程初始启动的最大归档进程个数,当将数据库转变为ARCHIVELOG模式时,默认情况下oracle会自动启动两个归档进程.通过改变初始化参数LOG_ARCHIVE_MAX_PROCESS的值,可以动态地增加或降低归档进程的个数,每个实例归档进程数量最多只能为30个取值范围为[0-9 a-t]:
ALTER SYSTEM SETLOG_ARCHIVE_MAX_PROCESSES=3 scope=both;
如果设置的归档进程个数超过30如下图会有错误提示
其实对于oracle 10g以前的版本还有log_archive_start参数与LOG_ARCHIVE_MAX_PROCESSES结合使用,但是对于10g及后期的版本这个参数完全做废了,如下图数据库已启用归档同时在日志发生切换时日志也会自动归档只是log_archive_start参数值还是false,所以到10G后这个参数就不用理它了
1.使用ARCHIVE LOG LIST命令可以显示日志操作模式,归档位置,自动归档机器要归档的日志序列号等信息.
2.显示归档日志信息.
Select name,sequence#, first_change# FROM v$archived_log;
Name用于表示归档日志文件名,sequence#用于表示归档日志对应的日志序列号,firs_change#用于标识归档日志的起始SCN值.
3.执行介质恢复时,需要使用归档日志文件,此时必须准确定位归档日志的存放位置.通过查询动态性能视图v$archive_dest可以取得归档日志所在目录.
SELECT * FROMv$archive_dest;
4.显示日志历史信息
SELECT * FROMv$loghist;
THREAD#用于标识重做线程号,SEQUNCE#用于标识日志序列号,FIRST_CHANGE#用于标识日志序列号对应的起始SCN值,FIRST_TIME用于标识起始SCN的发生时间.SWICTH_CHANGE#用于标识日志切换的SCN值.
5.显示归档进程信息.
进行日志切换时,ARCH进程会自动将重做日志内容复制到归档目录中,为了加快归档速度,应该启用多个ARCH进程.通过查询动态性能视图V$ARCHIVE_PROCESSES可以显示所有归档进程的信息!
SELECT * FROMv$archive_processes;
Porcess用于标识ARCH进程的编号,status用于标识ARCH进程的状态(ACTIVE:活动,STOPPED:未启动),log_sequence用于标识正在进行归档的日志序列号,state用于标识ARCH进程的工作状态
从oracle database 10g开始,当将日志操作模式转变未ARCHIVELOG模式时,oracle会自动启动ARCH进程.如果要使用手工归档.那么在改变日志操作模式时必须使用命令ALTER DATABASEARCHIVELOG MANUAL;
需要注意,使用手工归档方式,数据库管理员必须手工执行归档命令.如果没有执行手工归档命令,日志组的原有内容将不能被覆盖.ALTER DATABASE ARCHIVELOG MANUAL 命令是为了与先前的版本兼容而保留的,将来的oracle版本会淘汰该命令,使用手工归档方式时,数据库管理员可以执行以下命令归档重做日志:
alter systemarchive log all; --手动归档所有switch的日志
alter systemarchive log sequence 545; --545为日志序列号
alter systemarchive log current; --归档当前联机日志文件
arter databasearchivelog; --用此命令再次将数据库改为自动归档,手动归档一般情况下在10g及后期版本其实已经没什么了
1 特别指出的是在Oracle 9i中还要修改参数log_archive_start = true才
能生效,oracle 10g中已经废除了该参数,所以不需要设置该参数。oracle 9i 设置log_archive_start = true的命令是:alter system setlog_archive_start=TRUE scope=spfile;并且不用重启数据库,就可以生效;
2 alter system switch logfile 是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档前的重做日志,若自动归档没有打开就不归档当前重做日志)
3 10G如果没有设置归档路径,在设置了闪回目录的情况下默认会把归档日志放到闪回恢复目录中,如果闪回恢复目录也没设置那么会将归档日志放在$ORACLE_HOME/dbs/arch目录中。
showparameter db_recovery_file_dest
在归档日志模式下,有可能会遇到归档日志大小超过最大值而出现讨厌的ORA-00257错误,前面说了如何把归档日志空间变大。而在普通的开发环境下,其实是根本用不着归档日志的,设个时候我们就把数据库的归档日志给禁用了,也就是说把数据库变为非归档日志模式,应该怎么做呢。
1. 如果是10G及后期的版本直接跳到步骤2,而10G之前的版本此步必须操作,用
SYS用户进行登录,首先设置归档进程关闭。
alter system set log_archive_start=falsescope=spfile;
2.关闭数据库。
shutdown immediate
3.再后面把数据库启动到mount的模式
startup mount
4.如果是10G及后期的版本直接跳至步骤5,而10G之前的版本必须关闭数据库的flash
模式,如果不关闭此功能在后面关闭归档日志的时候就会出现讨厌的ORA-38774错
误;这个主要针对早期的版本,而对于10G及后期的版本此参数也是不需要改的,而
且闪回功能最好是要开启否则数据库的整个闪回特性都失效,也是得不偿失的。
alter database flashback off
5.接着把数据库改为非归档模式
alter database noarchivelog;
6.都修改好了以后,然后打开数据库
alter database open;
7.接着看一下log日志的状态,这一步不能省略修改后切记发现日志的状态为stale非
正常状态的要留意一下,联机日志全部手工切换一遍确保没有问题
select * from v$log;
select * from v$logfile;
8.查看闪回恢复区域空间使用状况,这个只在没有指定归档目录而指定了闪回恢复区域的
情况下才用得着
select * from v$flash_recovery_area_usage;
这些都没有问题以后至此停用数据库归档就算顺利完成了
ORA-00258:
停用归档日志后打开数据库时报如下错误
Sql>alter database open;
alter database open
*
ERROR at line 1:
ORA-00258: manual archiving in NOARCHIVELOG mode must identify log
出现这个问题的原因主要就是将数据库从归档改为非归档模式导致数据打开时报如上错误,可能是日志归档没有完成而这时已将数据改为非归档模式了,在打开数据库的时候没有归档完成的日志又要重新进行归档,可这时发现据库已处于非归档模式下了。解决这个问题的方法是先进入归档模式将所有联机日志进行手工归档然后再将数据库改为非归档模式如下:
(1)查看数据库的归档目录位置
sql> show parameter log_archive_dest_1
(2)查看当前数据库日志情况
sql> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARCSTATUS FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- --------------------- -------------------
1 1 1528 209715200 1 NO CURRENT 476386158 2010-04-20 13:20:13
2 1 1526 209715200 1 YESINACTIVE 476094078 2010-04-14 16:00:07
3 1 1527 209715200 1 NO INACTIVE 476248931 2010-04-17 22:00:54
(3)尝试归档第一组日志
sql>alter system archive log group 1;
alter system archive log group 1
ERROR at line 1:
ORA-00259: log 1 of open instance ora10g (thread 1) is the current log, cannotarchive
错误提示很显然,当前日志组不允许归档。
(4)尝试归档第二组日志
sql >alter system archive log group 2;
alter system archive log group 2
ERROR at line 1:
ORA-16013: log 2 sequence# 1526 does not need archiving
因为归档状态是“YES”,因此该组日志无需归档。
(5)尝试归档第三组之日
sql >alter system archive log group 3;
System altered.
归档成功。
(6)确认归档文件
sql > !ls-l /u01/arch/
total 194652
-rw-r----- 1 oracle oinstall 199121920 Apr 21 06:38 1_1527_688786498.arch
(7)有关手工归档操作补充内容
以上我们使用的是数据库参数指定的路径存放手工归档生成的文件,我们还可以额外指定归档写入的路径方法如下
sql > alter system archive log group 3 to'/home/oracle';
System altered.
sql > !ls -l /home/oracle/1_1527_688786498.arch
-rw-r----- 1 oracle oinstall 199121920 Apr21 06:45 /home/oracle/1_1527_688786498.arch
注意:其实还有一种方法就是将数据改回归档模式然后打开数据过一段时间后再将数据库改为非归档模式,数据库就可以正常开启了。
视图 |
作用 |
V$DATABASE |
LOG_MODE字段归档模式 |
V$INSTANCE |
ARCHIVER字段是否正在归档 |
V$ARCHIVED_LOG |
从控制文件中获取的所有历史归档日志文件信息 |
V$ARCHIVE_DEST |
归档目标位置的信息 |
V$ARCHIVE_PROCESSES |
归档进程的信息 |
V$BACKUP_REDOLOG |
所有已备份的归档日志文件的信息 |
V$LOG |
所有重做日志文件的信息,其中包含那些需要归档的重做日志文件 |
V$LOG_HISTORY |
重做日志文件的历史信息 |