-- 准备:查看当前的REDO(在线)日志组状态 SELECT GROUP#,THREAD#,MEMBERS,BYTES/1024/1024 AS SIZE_MB,STATUS FROM v$log;
/* ?SQL> SELECT GROUP#,THREAD#,MEMBERS,BYTES/1024/1024 AS SIZE_MB,STATUS FROM v$log;
? ? GROUP# ? ?THREAD# ? ?MEMBERS ? ?SIZE_MB STATUS ---------- ---------- ---------- ---------- ------------------------------------------------ ? ? ? ? ?1 ? ? ? ? ?1 ? ? ? ? ?1 ? ? ? 2048 CURRENT ? ? ? ? ?2 ? ? ? ? ?1 ? ? ? ? ?1 ? ? ? 2048 INACTIVE ? ? ? ? ?3 ? ? ? ? ?1 ? ? ? ? ?1 ? ? ? 2048 INACTIVE ? ? ? ? ?4 ? ? ? ? ?1 ? ? ? ? ?1 ? ? ? 2048 INACTIVE
?CURRENT 状态表示当前在线日志正在使用的日志组,如果要强制切换当前日志到新的日志组,可以执行命令切换(执行多次、可以多次切换): ?alter system switch logfile; ?手动切换REDO(在线)日志文件以后,会将在线日志文件归档、会在归档目录下生成一个新的 .arc 归档日志文件。 ?*/
-- 1.分析 Oracle Redo日志(在线日志) -- Step1.创建测试表 & DML操作 CREATE TABLE REDO_TEST01 (ID NUMBER, INFO VARCHAR2(64)); INSERT INTO REDO_TEST01 VALUES(1,'test01'); INSERT INTO REDO_TEST01 VALUES(2,'test02'); COMMIT;
UPDATE REDO_TEST01 SET INFO='test--001' WHERE ID=1; COMMIT;
DELETE FROM REDO_TEST01; COMMIT;
-- Step2.查看REDO日志的路径 SELECT GROUP#,MEMBER FROM v$logfile;
/* SQL> SELECT GROUP#,MEMBER FROM v$logfile;
? ? GROUP# MEMBER ---------- -------------------------------------------------------------------------------- ? ? ? ? ?1 /opt/oracle/oradata/ORCL/redo01.log ? ? ? ? ?2 /opt/oracle/oradata/ORCL/redo02.log ? ? ? ? ?3 /opt/oracle/oradata/ORCL/redo03.log ? ? ? ? ?4 /opt/oracle/oradata/ORCL/redo04.log */
-- Step3.添加REDO日志 -- 第一个添加的日志需指定 options=>dbms_logmnr.new,如果确定要查询的信息在指定的那一个REDO日志文件内,可以只添加那个REDO日志文件,而不需要再添加其他的日志文件。如果不确定、还添加其他REDO日志文件,添加时,不是第一个添加的日志文件需要指定 options=>dbms_logmnr.addfile exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/oradata/ORCL/redo01.log',options=>dbms_logmnr.new); exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/oradata/ORCL/redo02.log',options=>dbms_logmnr.addfile); exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/oradata/ORCL/redo03.log',options=>dbms_logmnr.addfile); exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/oradata/ORCL/redo04.log',options=>dbms_logmnr.addfile);
/* ?dbms_logmnr.add_logfile 说明: ?作用:用于为日志分析列表增加或删除日志文件,或者建立日志分析列表。 ?语法:dbms_logmnr.add_logfile(LogFileName in varchar2,Option in binary_integer default addfile); ?参数说明: ?LogFileName: 指定要增加或删除的日志文件名称, ?Option: 指定选项 ? ? ?dbms_logmnr.new : 建立日志分析列表 ? ? ?dbms_logmnr.addfile : 增加日志文件 ? ? ?dbms_logmnr.removefile : 删除文件 */
-- Step4.开始对添加的REDO进行分析 exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
也可以同时带多个Option参数: exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.committed_data_only);
/* ?dbms_logmnr.start_logmnr 说明: ?作用:用于启动logmnr会话。 ?语法:dbms_logmnr.start_logmnr(startscn in number default o, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? endscn in number default 0,? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? starttime in date default '01-jan-1988', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? endtime in date default '01-jan-2988', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dictfilename in varchar2 default '', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? option in binary_integer default 0); ?其中startscn指定日志分析的起始scn值,endscn指定日志分析的结束scn值,starttime指定日志分析的起始时间,endtime指定日志分析的结束时间, ?dictfilename指定日志分析要使用的字典文件名,option指定logminer分析选项。 */
-- Step5.查看LOGMNR分析后得到的信息,可能会比较耗时 select timestamp,sql_redo,sql_undo from v$logmnr_contents where table_name='REDO_TEST01';
-- Step6.结束LOGMNR分析 exec dbms_logmnr.end_logmnr;
-- 2.分析 Oracle 归档日志 -- 分析归档日志的操作和分析REDO的操作基本一样,最重要的就是准确的找到需要查找的信息在哪些归档日志内。既然是利用LOGMNR分析归档日志,数据库一定是在归档模式。 -- 查看数据库归档是否开启及归档日志路径(注意:需要 sysdba 权限): archive log list;
/* Database log mode ? ? ? ? ? ? ?Archive Mode Automatic archival ? ? ? ? ? ? Enabled Archive destination ? ? ? ? ? ?USE_DB_RECOVERY_FILE_DEST Oldest online log sequence ? ? 153 Next log sequence to archive ? 156 Current log sequence ? ? ? ? ? 156
如果 Archive destination 为 USE_DB_RECOVERY_FILE_DEST,说明是写的闪回空间文件,可以通过命令查看闪回空间文件路径:
show parameter db_recovery_file_dest;
NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TYPE ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?VALUE ------------------------------------ --------------------------------- ------------------------------ db_recovery_file_dest ? ? ? ? ? ? ? ?string ? ? ? ? ? ? ? ? ? ? ? ? ? ?/opt/oracle/flash_recovery_area db_recovery_file_dest_size ? ? ? ? ? big integer ? ? ? ? ? ? ? ? ? ? ? 300G
*/
-- Step1.切换日志,使REDO日志归档 alter system switch logfile; alter system switch logfile; alter system switch logfile; alter system switch logfile;
-- Step2.按照归档日志的时间,找到存放需要分析信息的归档日志(.arc 文件) $ ls -lh /opt/oracle/flash_recovery_area/ORCL/archivelog/2022_09_13 total 2.7G -rw-r----- 1 oracle oinstall 1.8G Sep 13 06:01 o1_mf_1_155_kkzc0omd_.arc -rw-r----- 1 oracle oinstall 813M Sep 13 19:23 o1_mf_1_156_kl0t20v6_.arc -rw-r----- 1 oracle oinstall ?65M Sep 13 19:42 o1_mf_1_157_kl0v4hhk_.arc -rw-r----- 1 oracle oinstall 1.4M Sep 13 19:42 o1_mf_1_158_kl0v56mz_.arc -rw-r----- 1 oracle oinstall 1.5M Sep 13 19:42 o1_mf_1_159_kl0v5qkj_.arc 后面时间为 19:xx 的4个文件是我四次日志切换所新生成的归档日志文件。
-- Step3.将归档日志添加到LOGMNR exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/flash_recovery_area/ORCL/archivelog/2022_09_13/o1_mf_1_155_kkzc0omd_.arc',options=>dbms_logmnr.new); exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/flash_recovery_area/ORCL/archivelog/2022_09_13/o1_mf_1_156_kl0t20v6_.arc',options=>dbms_logmnr.addfile); exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/flash_recovery_area/ORCL/archivelog/2022_09_13/o1_mf_1_157_kl0v4hhk_.arc',options=>dbms_logmnr.addfile); exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/flash_recovery_area/ORCL/archivelog/2022_09_13/o1_mf_1_158_kl0v56mz_.arc',options=>dbms_logmnr.addfile); exec dbms_logmnr.add_logfile(logfilename=>'/opt/oracle/flash_recovery_area/ORCL/archivelog/2022_09_13/o1_mf_1_159_kl0v5qkj_.arc',options=>dbms_logmnr.addfile);
-- Step4.开始分析 exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
--Step5.查看LOGMNR分析后的数据 select timestamp,sql_redo,sql_undo from v$logmnr_contents where table_name='REDO_TEST01';?
-- Step6.结束LOGMNR分析 exec dbms_logmnr.end_logmnr; ?
|