利用归档日志恢复数据

1、设定用于LogMiner分析的数据文件存放的位置 这是设定utl_file_dir参数的过程
我的示例:
a、在initctc.ora文件中加入如下一行
utl_file_dir=E:\log

注意:在dba下面有三个初始化文件:
Spfile
Init
init

执行顺序依次为Spfile,init,INIT 如果都没有系统就会报错。
我们可以先看系统默认是执行哪个参数:
show parameter spfile

SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string E:\ORACLE\PRODUCT\10.2.0\DB_2\DBS\SPFILEORCL.ORA

如果value有值,我们可以将spfile转换为init文件
SQL> create pfile from spfile;

文件已创建。

然后修改生成的文件,修改完毕后,再将文件转换为spfile
Create spfile from pfile

注:生成的文件,如果是linux则在dbs目录下面,如果是windows则在database目录下面


b、重启数据库
oracle>sqlplus /nolog
sql>conn / as sysdba
sql>shutdown immediate
sql>startup
Show一下参数,如果utl_file_dir的VALUE值为空,恭喜悲剧才刚刚开始
SQL> show parameter utl_file_dir;

NAME TYPE VALUE
------------------------------------ ----------- ----------
utl_file_dir string e:\log

2、生成数据字典文件,是通过dbms_logmnr_d.build()来完成。
SQL> BEGIN
dbms_logmnr_d.build(dictionary_filename => 'dic.ora',
dictionary_location => '/log');
END;
/

PL/SQL 过程已成功完成。

dictionary_location指的是Logminer数据字典文件存放的位置,它必须匹配utl_file_dir的设定。
其中的dictionary_filename指的是放于存放位置的字典文件的名字,名字可以任意取。

3、建立一个日志分析表
a、建立日志分析表数据库必须在mount或nomount状态,启动数据库到mount状态。
sqlplus /nolog
sql>conn / as sysdba
sql>shutdown immediate
sql>startup mount

b、建立日志分析表,使用dbms_logmnr.add_logfile()



--修改归档日志所在路径


SQL> alter system set log_archive_dest_1='location=e:\log\recovery' scope =both;

System altered.
--顺便查看下是否修改成功
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /log
Oldest online log sequence 14
Next log sequence to archive 14
Current lo

g sequence 16


--切换日志
alter system switch logfile

--查看当前数据库最大maxlogfiles
select type ,dd.RECORDS_TOTAL from v$controlfile_record_section dd

--查看归档日志所在路径
SHOW PARAMETER RECOVERY
SQL> BEGIN
dbms_logmnr.add_logfile(options => dbms_logmnr.new,
logfilename => '/dy/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/archivelog/2011_10_08/o1_mf_1_7_790o9rqp_.arc');
END;
/

PL/SQL 过程已成功完成。
其中的options有三种取值,dbms_logmnr.new用于建一个日志分析表;dbms_logmnr.addfile用于加入用于分析的的日志文件;dbms_logmnr.removefile用于移出用于分析的日志文件。

4、添加用于分析的日志文件。
SQL> BEGIN
dbms_logmnr.add_logfile(options => dbms_logmnr.addfile,
logfilename => '/dy/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/archivelog/2011_10_08/o1_mf_1_7_790o9rqp_.arc');

END;
/

PL/SQL 过程已成功完成。

使用则可以把这个文件从日志分析表中移除,从而不进行分析。
SQL> BEGIN
2 dbms_logmnr.add_logfile(options => dbms_logmnr.removefile,
3 logfilename => '/dy/oracle/product/10.2.0/db_1/flash_recovery_area/ORCL/archivelog/2011_10_08/o1_mf_1_7_790o9rqp_.arc');
4
5 END;
6 /

查看当前分析列表中有多少个日志文件
select filename from v$logmnr_logs;

5、启动LogMiner进行分析。
BEGIN
dbms_logmnr.start_logmnr(
dictfilename => '/log/dic.ora',
starttime => to_date('20101008 12:15:00','yyyymmdd hh24:mi:ss'),
endtime => to_date('20101008 15:40:30','yyyymmdd hh24:mi:ss')
);
END;
/ 即分析2003年5月1日这天12:15至15:40这段时间,并把分析结果放到数据字典中以用于查询。还有两个参数StartScn(起始scn号)及EndScn(终止Scn)号。
6、查看日志分析的结果,通过查询v$logmnr_contents可以查询到
a、查看DML操作,示例:
SELECT operation,
sql_redo,
sql_undo,
FROM V$logmnr_contents
WHERE seg_name = 'QIUYB';

OPERATION SQL_REDO SQL_UNDO
---------- -------------------------- --------------------------
INSERT inser into qiuyb.qiuyb ... delete from qiuyb.qiuyb...

其中operation指的是操作,sql_redo指的是实际的操作,sql_undo指的是用于取消的相反的操作。
注意:这里日期格式可能有点问题TO_DATE('07-MAR-11', 'DD-MON-RR'),系统MON不能识别MAR,会报无效月份
可修改为:
select replace(d.sql_undo,'DD-MON-RR','DD-MON-RR'',''NLS_DATE_LANGUAGE=AMERICAN') from nickqqqqq d where d.operation like 'DELETE' and d.table_name='TB_PURDB';
也可以用replace替换下

b、查看DDL操作,示例:


SELECT timstamp,
sql_redo
FROM v$logmnr_contents
WHERE upper(sql_redo) like '%TRUNCATE%';
7、结束LogMiner的分析。
SQL>BEGIN
dbms_logmnr.end_logmnr;
end;
/

三、与LogMiner相关的数据字典。
1、v$loglist 它用于显示历史日志文件的一些信息
2、v$logmnr_dictionary 因logmnr可以有多个字典文件,该视图用于显示这方面信息。
3、v$logmnr_parameters 它用于显示logmnr的参数
4、v$logmnr_logs 它用于显示用于分析的日志列表信息。

相关文档
最新文档