oracle数据库要在归档模式下正常工作

oracle数据库要在归档模式下正常工作,要进行如下设置

一、设置数据库为归档模式

如果数据库归档模式没有开启,查询显示如下信息(非归档模式):

1、查询当前数据库的模式

SQL> archive log list;

数据库日志模式 非存档模式
自动存档 禁用
存档终点 D:oracleora81RDBMS
最早的概要信息日志序列 64
当前日志序列 66

2、shutdown immediate

3、
a.关闭数据库后,备份已有的数据,改变数据库的运行方式是对数据库的重要改动,所以要对数据库做备份,对可能出现的问题作出保护。
b.
修改初始化参数文件init.ora,在初始化参数文件中添加

#log_archive_start = true

#log_archive_dest = D:oracleoradatapeiyzarchive
#log_archive_duplex_dest = D:oracleoradatapeiyzarchiveachive

log_archive_dest_1='location=D:oracleoradatapeiyzarchive1'
log_archive_dest_3='location=D:oracleoradatapeiyzarchive3'

#log_archive_dest_2 = "SERVICE=standby_db1" //这里是把归档文件保存到远程standby机子上LOG_ARCHIVE_FORMAT = ARC%T%S.arc //这里变量 %s or %S 为日志序列号,%t or %T为线程号,都有操作系统自动生成(为文件名的一部分),另外%S为一固定长度,如果不够左边补0


注意:
这里log_archive_dest和log_archive_duplex_dest是一组;log_archive_dest_1到log_archive_dest_5是一组(8i中最多可有5个镜像目录而9i中可达10个镜像目录);这两组在初始化参数文件中只能设置一组,二者不能同时存在;

4、把数据库启动到mount状态,进行如下操作设置数据库为归档模式

SQL> alter database archivelog;

数据库已更改。

a、查看当前数据库归档模式是不是开启,如果在初始化参数文件中没有定义归档路径的话显示如下信息:

SQL> archive log list

数据库日志模式 存档模式
自动存档 禁用
存档终点 D:oracleora81RDBMS //注意,这里为在初始化参数文件中没有指定归档路径的情况下的默认归档
路径最早的概要信息日志序列 64
下一个存档日志序列 66
当前日志序列 66


b、而我当前的显示为:

SQL> archive log list;

数据库日志模式 存档模式
自动存档 禁用
存档终点 D:oracleoradatapeiyzarchive3 //当前日志切换时日志文件被归档到这个目录下
最早的概要信息日志序列 66
下一个存档日志序列 68
当前日志序列 68


5、手工修改数据库为自动归档模式(如果在初始化参数文件中设置了log_archive_start = true选项,则该步可以省略

SQL> archive log start;

已处理的语句

SQL> archive log list

数据库日志模式 存档模式
自动存档 启用 //已启动自动归档,如果在初始化参数文件中设置了log_archive_start = true选项,
则为启动实例后自动开启自动归档功能
存档终点 D:oracleoradatapeiyzarchive3
最早的概要信息日志序列 66
下一个存档日志序列 68
当前日志序列 68

6、打开数据库

SQL> alter database open;

数据库已更改。

7、做一些日志切换检查是否设置生效

SQL> alter system switch logfile;

系统已更改。

SQL> /

系统已更改。

检查操作系统目录 D:oracleoradatapeiyzarchive1和D:oracleoradatapeiyzarchive3下是否有归档文件生成,如果存在说明设置成功。

 

二、有关归档模式下测试的两个问题(rdbms:8.1.7.0/os:win2000)


A.在数据库打开的情况下,通过alter system set ...语句修改的归档路径在下次重启后会生效吗?

1、修改归档路径

SQL> alter system set log_archive_dest_2='location=D:oracleoradatapeiyzarchive2';

系统已更改。

SQL> alter system set log_archive_dest_3='location=D:oracleoradatapeiyzarchive4';

系统已更改。

2、手工进行日志切换

SQL> alter system switch logfile;

系统已更改。

SQL> /

系统已更改。

3、检查D:oracleoradatapeiyzarchive2和D:oracleoradatapeiyzarchive4目录下是否有新的归档日志文件生成检查发现仅有D:oracleoradatapeiyzarchive4目录下有新的归档文件生成;说明仅在初始化参数文件中定义的参数才能通过动态修改归档路径;那么虽然log_archive_dest_3参数路径能够修改并确实将归档文件归档到新的路径下了,那么重启系统后还能保存动态修改的归档路径吗,通过下面试验我们便知。

注意:如果通过alter system set log_archive_dest_2='location=D:oracleoradatapeiyzarchive2';修改,虽然修改成功而且操作系统中D:oracleoradatapeiyzarchive2目录也存在,但通过alter system switch logfile;日志切换,该目录下仍不会产生归档日志文件,因为改参数并没有在初始化参数中定义。

4、shutdown immediate


数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。

5、startup

ORACLE 例程已经启动。

Total System Global Area 51648540 bytes
Fixed Size 75804 bytes
Variable Size 42651648 bytes
Database Buffers 8388608 bytes
Redo Buffers 532480 bytes
数据库装载完毕。
数据库已经打开。


6、修改数据库为自动归档模式

SQL> archive log start;

已处理的语句

7、检查归档信息

SQL> archive log list

数据库日志模式 存档模式
自动存档 启用
存档终点 D:oracleoradatapeiyzarchive3
最早的概要信息日志序列 76
下一个存档日志序列 78
当前日志序列 78

8、手工进行日志切换

SQL> alter system switch logfile;

系统已更改。

SQL> /

系统已更改。

9、检查操作系统中归档目录

检查操作系统D:oracleoradatapeiyzarchive1和D:oracleoradatapeiyzarchive2和D:oracleoradatapeiyzarchive3和D:oracleoradatapeiyzarchive4目录下内容,仅有1和3下有归档文件生成,说明通过动态修改的参数在数据库重启后不能生效(8i中,如果想在重启后仍然生效9i中某些参数可以通过加scope=both指定),仍然保持初始化参数中定义的设置;如果想在下次重启后仍然生效必须通过修改初始化参数文件内容。

 


B、如果数据库处于归档模式但自动归档功能没有开启会产生什么后果呢,产生这种情况后又怎样解决呢,下面我将就这个问题进行一些

试验

1、启库

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 51648540 bytes
Fixed Size 75804 bytes
Variable Size 42651648 bytes
Database Buffers 8388608 bytes
Redo Buffers 532480 bytes
数据库装载完毕。
数据库已经打开

2、检查数据库归档情况

SQL> archive log list

数据库日志模式 存档模式
自动存档 禁用
存档终点 D:oracleoradatapeiyzarchive3
最早的概要信息日志序列 76
下一个存档日志序列 78
当前日志序列 78

注意:这里虽然数据库为归档模式,但自动存档功能并未开启。

3、手工进行日志切换看会出现什么情况

SQL> alter system switch logfile;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> / ...... //这里日志切换不了了,hang在这了,并没有“系统已更改。”提示,只是光标在闪

这时我检查操作系统相关归档目录并没有发现新的归档日志生成,说明日志切换一周后,最初的日志还没被归档,这时lgwr进程又要等这个日志被归档后才能使用,所以数据库hang在这了;
那么这个问题怎么解决呢?难道一直等在这吗?答案是否定的

可以通过如下方法解决

4、另开一个sqlplus窗口,以sysdba登陆到数据库

SQL> conn / as sysdba
已连接。

5、手工把数据库的自动归档功能打开

SQL> archive log start;

已处理的语句


6、查看刚才hang住的窗口,发现日志切换完成了

SQL> /

系统已更改。

7、检查操作系统中相关归档目录,发现新的归档日志生成。

数据库正常工作。

 

另一种方法为当数据库hang住后,另启一个sqlplus窗口,以sysdba登陆到数据库,进行如下操作:

1、首先查询归档信息

SQL> archive log list

数据库日志模式 存档模式
自动存档 禁用
存档终点 D:oracleoradatapeiyzarchive3
最早的概要信息日志序列 81
下一个存档日志序列 81
当前日志序列 83

2、手工进行归档,因为从查询结果来看启库后最早的联机日志为81号,所以首先进行归档81号联机日志文件。再归档82、83号文件:

SQL> alter system archive log sequence 81;

系统已更改。

注意:

这时到刚才hang住的窗口查看发现日志操作已经切换完毕,显示如下

SQL> /

系统已更改。

还需要注意一下:

a、如果先归档83号联机日志,则报如下错误(因为它为当前正在hang住的联机日志,不能进行归档):

SQL> alter system archive log sequence 83;

alter system archive log sequence 83
*
ERROR 位于第 1 行:
ORA-00259: 日志 2 (打开线程 1) 为当前日志,无法存档
ORA-00312: 联机日志 2 线程 1: 'D:ORACLEORADATAPEIYZREDO02.LOG'

b、如果先归档82号联机日志文件的话,系统自动把81号的联机日志文件一同进行归档了,不必要再进行81号联机文件的归档操作了

SQL> alter system archive log sequence 82;

系统已更改。

SQL> alter system archive log sequence 81;

alter system archive log sequence 81
*
ERROR 位于第 1 行:
ORA-00260: 无法找到联机日志序列 81 (线程 1)


3、查看操作系统中归档相关目录,发现所有联机日志都被归档完成;

4、当然这只是一种暂时的解决方法,要想不再使数据库被hang住又不要手工进行归档,必须通过开启自动归档功能,也即:

SQL> archive log start;

已处理的语句

或者

在初始化参数文件中添加log_archive_start=true参数选项。

posted on 2008-04-29 14:46  一江水  阅读(980)  评论(0编辑  收藏  举报