第 1 行出现错误:
ORA-01609: 日志 3 是线程 1 的当前日志 - 无法删除成员 ORA-00312: 联机日志 3 线程 1:
'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG'
ORA-00312: 联机日志 3 线程 1: 'D:\\ORADATA\\REDO3B.LOG'
SQL> ALTER SYSTEM SWITCH LOGFILE; 系统已更改。
SQL> ALTER DATABASE DROP LOGFILE MEMBER 'D:\\ORADATA\\REDO3B.LOG'; 数据库已更改。
5.4.5 清除重做日志文件
在数据库实例处于打开状态时,重做日志文件可能发生损坏而不能归档,导致数据库停止提供服务。此时,可以在不关闭数据库的情况下使用ALTER DATABASE CLEAR LOGFILE语句清除重做日志文件的内容。
下面的语句清除了GROUP 3中的日志文件内容。
SQL>ALTER DATABASE CLEAR LOGFILE GROUP 3; 数据库已更改。
此时,该重做日志组的STATUS为UNUSED,序列号为0。
如果受到损坏的重做日志文件还没有归档,可以使用下面的语句。
SQL>ALTER DATABASE CLEAR UNARCHIVED LOGFILE GROUP 3;
这样,可以清除损坏没有归档的重做日志,并避免归档这些日志。
Oracle系统规定当系统中仅存在两个重做日志组或者受到损坏的重做日志文件处于当前组时不能清除重做日志。
5.4.6 设置数据库为归档模式
Oracle数据库可以运行在两种模式下:归档模式和非归档模式。Oracle数据库默认运行在非归档模式下。归档就是Oracle自动将写满(或被切换)的联机重做日志文件复制到指定路径下,并按照相应规则重命名。归档模式能提高Oracle数据库的可恢复性。在开发和测试环境中,数据库一般运行在非归档模式下,有利于系统应用的调整,也避免生成大量的归档日志文件占用额外的磁盘空间。但生产数据库都应该运行在归档模式下,因为这将有效预防灾难,保证系统安全。
归档模式应该和相应的备份策略相结合,通过定时备份数据库和在两次备份间隔之间的日志文件,可以有效的恢复这段时间的任何时间点的数据,在很多时候可以挽回或最大可能地减少数据丢失。
下面介绍如何将数据库设置为归档模式。首先查看当前数据库的运行模式。
SQL> ARCHIVE LOG LIST
数据库日志模式 非存档模式 自动存档 禁用
存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 158 当前日志序列 160
或者使用下面的语句查看数据库的运行模式。
SQL> SELECT NAME,LOG_MODE FROM V$DATABASE; NAME LOG_MODE
--------- ------------ ORCL NOARCHIVELOG
切换归档模式之前关闭正在运行的数据库
SQL> SHUTDOWN IMMEDIATE; 数据库已经关闭。 已经卸载数据库。
ORACLE 例程已经关闭。
启动并装载数据库,但不打开数据库。
SQL> STARTUP MOUNT ORACLE 例程已经启动。
Total System Global Area 778387456 bytes Fixed Size 1374808 bytes Variable Size 486540712 bytes Database Buffers 285212672 bytes Redo Buffers 5259264 bytes 数据库装载完毕。
修改数据库的运行模式为归档模式,如果要将归档模式切换为非归档模式,则使用ALTER DATABASE NOARCHIVELOG语句。
SQL> ALTER DATABASE ARCHIVELOG; 数据库已更改。
接下来打开数据库。
SQL> ALTER DATABASE OPEN; 数据库已更改。
此时,查看数据库的运行模式,发现已经是归档模式。
SQL> ARCHIVE LOG LIST;
数据库日志模式 存档模式 自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST 最早的联机日志序列 158 下一个存档日志序列 160 当前日志序列 160
在归档模式下,当重做日志文件被重用前,Oracle首先需要确认该重做日志是否已经被归档,如果没有,那么首先必须对该重做日志进行归档,而后才能重用该联机重做日志文件。虽然每个联机重做日志文件组中可以有多个成员,不过归档时,每组仅会生成一个归档文件。
在默认情况下,ARCn后台进程会在联机重做日志文件被写满之后再触发归档操作,当然DBA也可以通过手动进行归档。下面的语句可对所有未归档的重做日志归档:
SQL>ALTER SYSTEM SYSTEM ARCHIVE LOG ALL;
5.4.7 LogMiner工具的使用
LogMiner是Oracle系统用于分析日志文件的工具,包括对重做日志文件和归档日志文件进行分析,分析结果保存到V$LOGMNR_CONTENTS中,用户通过查询该视图从而获取对Oracle数据库操作的历史信息。
1. 安装LogMiner
首先安装LogMiner,调用下面的脚本。
SQL> @?/RDBMS/ADMIN/DBMSLM.SQL 程序包已创建。 授权成功。
同义词已创建。
SQL> @?/RDBMS/ADMIN/DBMSLMD.SQL 程序包已创建。
同义词已创建。
这样,LogMiner工具就安装好了。其中,DBMSLM.SQL是用来创建DBMS_LOGMNR的系统包,这个包是用来分析日志的。DBMSLMD.SQL是用来创建DBMS_LOGMNR_D的系统包,这个包是用来创建数据字典文件的。注意以上两个包的创建用户须具有SYSDBA系统权限。
2. 创建数据字典文件
安装好LogMiner之后,为了能够正常使用LogMiner,还需创建数据字典文件,用于日志分析需要。在初始化参数文件SPFILE中,通过设定UTL_FILE_DIR参数来指定数据字典文件的位置目录。
下面的语句用来设置UTL_FILE_DIR参数并创建数据字典文件。
SQL> SHOW PARAMETER SPFILE; NAME TYPE VALUE
---------- ----------- --------------------------------- spfile string D:\\APP\\ADMINISTRATOR\\PRODUCT\\11.2.0\\ DBHOME_1\\DATABASE\\SPFILEORCL.ORA
SQL>ALTER SYSTEM SET UTL_FILE_DIR='D:\\ORACLE' SCOPE=SPFILE; 系统已更改。
重启数据库系统后,该参数才能生效。需执行下面的语句。
SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP
SQL> SHOW PARAMETER UTL_FILE_DIR NAME TYPE VALUE
---------- ---------------- -------------------- utl_file_dir string d:\\oracle
接着开始创建数据字典。
SQL>EXEC DBMS_LOGMNR_D.BUILD(DICTIONARY_FILENAME=>'DICT.ORA', DICTIONARY_LOCATION=>'D:\\ORACLE'); PL/SQL 过程已成功完成。
此时,查看D盘下的Oracle目录,可以发现已经存在DICT.ORA文件。至此,数据字典文件也已经创建成功。
3. 添加分析列表中的日志文件
添加需要进行分析的日志文件列表语句如下。
SQL> SELECT MEMBER FROM V$LOGFILE; MEMBER
----------------------------------------------------- D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG
已选择3行。
这里,将日志成员添加到分析列表,语句如下:
SQL>EXEC DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME=>'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG', OPTIONS=>DBMS_LOGMNR.ADDFILE); PL/SQL 过程已成功完成。
SQL>EXEC DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME=>'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG', OPTIONS=>DBMS_LOGMNR.ADDFILE); PL/SQL 过程已成功完成。
SQL>EXEC DBMS_LOGMNR.ADD_LOGFILE(
LOGFILENAME=>'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG', OPTIONS=>DBMS_LOGMNR.ADDFILE); PL/SQL 过程已成功完成。
查看V$LOGMNR_LOGS动态性能视图,可以看到分析列表中目前的日志成员。
SQL> SELECT FILENAME FROM V$LOGMNR_LOGS; FILENAME
---------------------------------------------------- D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG
如果需要从分析列表里去掉一个文件用,如执行下面的语句。
SQL> EXEC DBMS_LOGMNR.REMOVE_LOGFILE(
'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO02.LOG'); PL/SQL 过程已成功完成。
SQL> SELECT FILENAME FROM V$LOGMNR_LOGS; FILENAME
------------------------------------------------- D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO01.LOG D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO03.LOG
4. 分析并查询日志的分析结果
利用LogMiner进行日志分析用到DBMS_LOGMNR系统包中的START_LOGMNR过程。
SQL>EXEC DBMS_LOGMNR.START_LOGMNR(
DICTFILENAME=>'D:\\ORACLE\\DICT.ORA'); PL/SQL 过程已成功完成。
START_LOGMNR过程可以指定要分析的时间范围,如下面的语句。
SQL> EXEC DBMS_LOGMNR.START_LOGMNR(
OPTIONS=>DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG, ENDTIME=>TO_DATE('2012-10-14','YYYY-MM-DD')); PL/SQL 过程已成功完成。
分析完毕后所有分析的内容都保存到了GV$LOGMNR_CONTENTS和V$LOGMNR_CONTENTS动态性能视图里,首先查看V$LOGMNR_LOGS的结构信息。
SQL> DESC V$LOGMNR_LOGS;
名称 是否为空? 类型
---------------- -------- ------------- LOG_ID NUMBER
FILENAME VARCHAR2(512) LOW_TIME DATE HIGH_TIME DATE DB_ID NUMBER
DB_NAME VARCHAR2(8) RESET_SCN NUMBER RESET_SCN_TIME DATE THREAD_ID NUMBER THREAD_SQN NUMBER LOW_SCN NUMBER NEXT_SCN NUMBER …… ……
同样,可以查看GV$LOGMNR_CONTENTS的结构信息。 接着就可以查询我们感兴趣的内容,如下面的语句。
SQL>SELECT SCN,TIMESTAMP, SESSION#, SQL_REDO FROM V$LOGMNR_CONTENTS; SCN TIMESTAMP SESSION# SQL_REDO
------- ----------------- ------------------------------------- 5190145 14-10月-12 0 set transaction read write; 5190145 14-10月-12 0 5190145 14-10月-12 0
5190146 14-10月-12 0 commit;
5190146 14-10月-12 0 set transaction read write; 5190148 14-10月-12 0 commit;
5190161 14-10月-12 0 ALTER DATABASE DROP LOGFILE MEMBER
'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO4A.LOG';
5190164 14-10月-12 0 commit;
5190165 14-10月-12 0 set transaction read write; 5190165 14-10月-12 0
5190166 14-10月-12 0 ALTER DATABASE DROP LOGFILE MEMBER
'D:\\APP\\ADMINISTRATOR\\ORADATA\\ORCL\\REDO4B.LOG'; 5190169 14-10月-12 0 commit; ... ... ... ... 已选择18行。
当分析结束后,应当把V$LOGMNR_CONTENTS关闭,释放内存。
SQL> EXEC DBMS_LOGMNR.END_LOGMNR; PL/SQL 过程已成功完成。
5.5 OMF
5.5.1 什么是OMF
从Oracle 9i数据库开始,Oracle系统可以使用OMF(Oracle Manage File)技术管理物理文件。OMF就是让Oracle来管理文件而无需手动指定文件名称、大小以及存放位置等信息。
使用OMF需要配置以下两个初始化参数。
(1)DB_CREATE_FILE_DEST:指定数据文件和临时文件默认的存放位置,该目录必须是已经存在。可以通过ALTER SESSION或者ALTER SYSTEM命令动态地改变这个参数。
(2)DB_CREATE_ONLINE_LOG_DEST_n:指定联机重做日志和控制文件的默认存放位置,该目录必须已经存在。对于多路复用的联机重做日志和控制文件,n可以是从1到5的值。可以通过ALTER SESSION或者ALTER SYSTEM命令动态地改变这个参数。如果没有指定DB_CREATE_ONLINE_LOG_DEST_n 参数,则联机重做日志和控制文件将以DB_CREATE_FILE_DEST作为默认的存放位置。