如果数据库处于非归档模式,联机日志在切换时online redo log files就会丢弃. 而在归档模式下,当发生日志切换的时候,归档写进程(ARCH/ARCn) 把原来redo log file 的信息复制到归档日志文件中。Oracle服务器保证在归档写进程没有将重做日志复制到归档日志文件中以前,LGWR进程是不能再写这组重做日志了。比如很容易出现以下的尴尬事情:
IfARCHIVELOG mode is activated and log_archive_start is set tofalse, the database freezes once all the online redo log files are filled. In thiscase, the background process ARCH is not triggered in order to write the onlineredo log files to the archiving directory. However, the online redo log filescannot be overwritten until they are archived.
就是说oracleserver开启了归档模式,但是自动归档设置为false。当你日志组发生切换的时候不能触发ARCH进程将原来的归档文件的信息复制到归档日志文件中。这样当所有的日志组写满的时候LGWR无法再往重做日志组写东西了,这个错误在alert_SID.log里面可以看到。(因为我用到的是9i,所以碰到了这种蛋疼的问题)
1、从非归档模式到归档模式:
1) SHUTDOWN NORMAL 或者 shutdown IMMEDIATE;
2) START MOUNT;
3) ALTER DATABASEARCHIVELOG;
4) ALTER DATABASE OPEN;
第五步是做一次完全的备份,因为非归档日志模式下产生的备份日志对于归档模式已经不再可用了.这一步非常重要!(注意!!!!!!!!)
2、改变归档模式到非归档模式:
前面的第三步骤改为ALTER DATABASE NOARCHIVELOG;
3、启用自动归档: LOG_ARCHIVE_START=TRUE(这里在10g开始就不用这个了,请看
http://www.eygle.com/archives/2005/04/oracle10gonieul.html)
a) 我当时用的是oracle9的版本,自动归档默认是禁用。
然后我在9i的pfile.txt中加入了这么一句话
*.log_archive_start=true
后面我就可以再启动的时候直接 startup open 就可以自动归档了。
show parameter log_archive_start来查看是否是启用了自动归档。这是我在另外一个11g上面的命令测试
即使LOG_ARCHIVE_START=false 但是依然是归档模式并且是自动归档的。(官方文档我没有找到这部分的说明,如果谁知道在哪个文档上麻烦告诉我下,谢谢。)
如果出现了归档模式下没有自动归档的情况下,紧急情况下可以先手动归档下,暂时用着,等数据库用的人少了的时候在重启后设置自动归档模式
命令:
归档当前日志文件 ALTER SYSTEM ARCHIVE LOG CURRENT;
归档序号为052的日志文件 ALTER SYSTEM ARCHIVE LOGSEQUENCE 052;
归档所有日志文件 ALTER SYSTEM ARCHIVE LOG ALL;
改变归档日志目标 ALTER SYSTEM ARCHIVE LOG CURRENT TO'&PATH';(不太懂这个)
如果归档过程会消耗大量的时间,那么可以启动多个归档进程,这是个动态参数,可以用ALTER SYSTEM动态修改. ALTER SYSTEM SETLOG_ARCHIVE_MAX_PROCESSES=10;
查看最大进程数配置 Show parameter LOG_ARCHIVE_MAX_PROCESSES;
与归档进程有关的动态性能视图 v$bgprocess, v$archive_processes
有了归档日志Oracleserver就可以保证所谓的全恢复。
归档模式和非归档模式区别:
1、 非归档模式只能做冷备份,并且恢复时只能做完全备份.最近一次完全备份到系统出错期间的数据不能恢复.
2、 归档模式可以做热备份,并且可以做增量备份,可以做部分恢复.用ARCHIVE LOG LIST 可以查看模式状态是归档模式还是非归档模式. (后面这部分是我做的笔记,可能有点乱,第一次写文章,请见谅。)