数据库归档模式介绍简介:归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换时,后台进程ARCH会将重做日志的内容保存到归档日志中,当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。
在Oracle10g中,只要启动数据库的归档模式,Oracle就会启用自动归档,从而避免了10g以前由于用户疏忽所带来的一系列问题。
日志操作模式:ARCHIVELOG(归档),NOARCHIVELOG(非归档)启动Oracle10g数据库的归档模式详细步骤对于非归档模式的数据库改为归档模式(主要以Oracle 10g为参考)使用以下步骤:步骤1(查看数据库的归档状态)首先查看数据库现有模式可使用以下语句,显示数据库处于非归档模式下SQL> select name,log_mode from v$database;NAME LOG_MODE--------- ------------ZHQHDB NOARCHIVELOG也可以用下面的语句[oracle@wangdm ~ 10:28 #9]$ sqlplus / as sysdbaSQL> archive log listDatabase log mode No Archive ModeAutomatic archival DisabledArchive destination ?/dbs/archOldest online log sequence 534Current log sequence 536步骤2(设置归档日志文件路径)SQL>alter system set log_archive_dest_1='location=/u01/arch';该语句含义是设置归档日志文件的存放路径,实际上Oracle 10g以后可以生成多份一样的日志,保存多个位置以防不测例如再添加一个归档日志文件存放位置可使用以下语句SQL>alter system set log_archive_dest_2='location=/u02/arch ';“location=/u01/arch”此目录是要从根目录开始的一个完整的目录详细介绍归档日志文件的存放的两种方法:步骤3(修改数据库为归档模式)关闭数据库SQL> shutdown immediate启动数据mount状态:SQL> startup mount修改数据库为归档模式:SQL> alter database archivelog;打开数据库,查询:SQL> alter database open步骤4(配置归档进程个数)可选初始化参数LOG_ARCHIVE_MAX_PROCESSES用于指定例程初始启动的最大归档进程个数,当将数据库转变为ARCHIVELOG模式时,默认情况下oracle会自动启动两个归档进程.通过改变初始化参数LOG_ARCHIVE_MAX_PROCESS的值,可以动态地增加或降低归档进程的个数,每个实例归档进程数量最多只能为30个取值范围为[0-9 a-t]: ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3 scope=both; 如果设置的归档进程个数超过30如下图会有错误提示其实对于oracle 10g以前的版本还有log_archive_start参数与LOG_ARCHIVE_MAX_PROCESSES结合使用,但是对于10g及后期的版本这个参数完全做废了,如下图数据库已启用归档同时在日志发生切换时日志也会自动归档只是log_archive_start参数值还是false,所以到10G后这个参数就不用理它了步骤5(显示归档日志信息)1.使用ARCHIVE LOG LIST命令可以显示日志操作模式,归档位置,自动归档机器要归档的日志序列号等信息.2.显示归档日志信息.Select name, sequence#, first_change# FROM v$archived_log;Name用于表示归档日志文件名,sequence#用于表示归档日志对应的日志序列号,firs_change#用于标识归档日志的起始SCN值.3.执行介质恢复时,需要使用归档日志文件,此时必须准确定位归档日志的存放位置.通过查询动态性能视图v$archive_dest可以取得归档日志所在目录.SELECT * FROM v$archive_dest;4.显示日志历史信息SELECT * FROM v$loghist;THREAD#用于标识重做线程号,SEQUNCE#用于标识日志序列号,FIRST_CHANGE#用于标识日志序列号对应的起始SCN值,FIRST_TIME用于标识起始SCN的发生时间.SWICTH_CHANGE#用于标识日志切换的SCN值.5.显示归档进程信息.进行日志切换时,ARCH进程会自动将重做日志内容复制到归档目录中,为了加快归档速度,应该启用多个ARCH进程.通过查询动态性能视图V$ARCHIVE_PROCESSES可以显示所有归档进程的信息!SELECT * FROM v$archive_processes;Porcess用于标识ARCH进程的编号,status用于标识ARCH进程的状态(ACTIVE:活动, STOPPED:未启动),log_sequence用于标识正在进行归档的日志序列号,state用于标识ARCH进程的工作状态步骤6(执行手工归档)从oracle database 10g开始,当将日志操作模式转变未ARCHIVELOG模式时,oracle会自动启动ARCH进程.如果要使用手工归档.那么在改变日志操作模式时必须使用命令ALTER DATABASE ARCHIVELOG MANUAL;需要注意,使用手工归档方式,数据库管理员必须手工执行归档命令.如果没有执行手工归档命令,日志组的原有内容将不能被覆盖.ALTER DATABASE ARCHIVELOG MANUAL 命令是为了与先前的版本兼容而保留的,将来的oracle版本会淘汰该命令,使用手工归档方式时,数据库管理员可以执行以下命令归档重做日志:alter system archive log all; --手动归档所有switch的日志alter system archive log sequence 545; --545为日志序列号alter system archive log current; --归档当前联机日志文件arter database archivelog; --用此命令再次将数据库改为自动归档,手动归档一般情况下在10g及后期版本其实已经没什么了注意点1 特别指出的是在Oracle 9i中还要修改参数log_archive_start = true才能生效,oracle 10g中已经废除了该参数,所以不需要设置该参数。
oracle 9i 设置log_archive_start = true的命令是:alter system set log_archive_start=TRUE scope=spfile;并且不用重启数据库,就可以生效;2 alter system switch logfile 是强制日志切换,不一定就归档当前的重做日志文件(若自动归档打开,就归档前的重做日志,若自动归档没有打开就不归档当前重做日志)3 10G如果没有设置归档路径,在设置了闪回目录的情况下默认会把归档日志放到闪回恢复目录中,如果闪回恢复目录也没设置那么会将归档日志放在$ORACLE_HOME/dbs/arch目录中。
show parameter db_recovery_file_dest停用归档(将数据库从归档变为非归档)在归档日志模式下,有可能会遇到归档日志大小超过最大值而出现讨厌的ORA-00257错误,前面说了如何把归档日志空间变大。
而在普通的开发环境下,其实是根本用不着归档日志的,设个时候我们就把数据库的归档日志给禁用了,也就是说把数据库变为非归档日志模式,应该怎么做呢。
1.如果是10G及后期的版本直接跳到步骤2,而10G之前的版本此步必须操作,用SYS用户进行登录,首先设置归档进程关闭。
alter system set log_archive_start=false scope=spfile;2.关闭数据库。
shutdown immediate3.再后面把数据库启动到mount的模式startup mount4.如果是10G及后期的版本直接跳至步骤5,而10G之前的版本必须关闭数据库的flash 模式,如果不关闭此功能在后面关闭归档日志的时候就会出现讨厌的ORA-38774错误;这个主要针对早期的版本,而对于10G及后期的版本此参数也是不需要改的,而且闪回功能最好是要开启否则数据库的整个闪回特性都失效,也是得不偿失的。
alter database flashback off5.接着把数据库改为非归档模式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 ARC STATUS FIRST_CHANGE# FIRST_TIME ---------- ---------- ---------- ---------- ---------- --- -------- ------------- -------------------1 1 1528 209715200 1 NO CURRENT 476386158 2010-04-20 13:20:132 1 1526 209715200 1 YES INACTIVE 476094078 2010-04-14 16:00:073 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 1ERROR at line 1:ORA-00259: log 1 of open instance ora10g (thread 1) is the current log, cannot archive错误提示很显然,当前日志组不允许归档。