Oracle&DM Redo在线日志&Archive归档日志分析

-- 开启数据库归档&Redo在线日志&归档日志配置
-- Oracle 这里就不介绍了
-- DM
达梦数据库中与REDO日志相关的视图主要有:
1)V$RLOG 视图:用来查询日志的总体信息。包括当前日志的检查点LSN、文件LSN等
SQL> select * from v$rlog;
LINEID CKPT_LSN FILE_LSN FLUSH_LSN CUR_LSN NEXT_SEQ N_MAGIC DB_MAGIC FLUSH_PAGES
---------- -------------------- -------------------- -------------------- -------------------- -------------------- ----------- -------------------- -----------
FLUSHING_PAGES CUR_FILE CUR_OFFSET CKPT_FILE CKPT_OFFSET FREE_SPACE TOTAL_SPACE SUSPEND_TIME UPD_CTL_LSN
-------------- ----------- -------------------- ----------- -------------------- -------------------- -------------------- ------------ --------------------
N_RESERVE_WAIT TOTAL_FLUSH_PAGES TOTAL_FLUSH_TIMES TOTAL_ECPR_FLUSH_PAGES GLOBAL_NEXT_SEQ N_PRIMAY_EP PRIMARY_DB_MAGIC CKPT_N_PRIMAY_EP
-------------- -------------------- -------------------- ---------------------- -------------------- ----------- -------------------- ----------------
CKPT_PRIMARY_DB_MAGIC MIN_EXEC_VER MIN_DCT_VER
--------------------- ------------ -----------
1 26219 26693 26693 26693 4313 7 1710613152 0
0 0 6553600 0 6384128 536693248 536862720 NULL 0
0 331 18 0 4313 0 0 0
0 V8.1.1.1 4

2)V$RLOGFILE 视图:用来查询日志文件的具体信息。包括当前数据库的日志文件路径、大小、创建时间等信息
SQL> select * from v$rlogfile;
LINEID GROUP_ID FILE_ID PATH CLIENT_PATH CREATE_TIME RLOG_SIZE MIN_EXEC_VER MIN_DCT_VER
---------- ----------- ----------- --------------------------------------- ------------ -------------------------- -------------------- ------------ -----------
1 2 0 /opt/dm/dmdbms/data/testdb/testdb01.log testdb01.log 2022-09-15 14:30:53.000000 268435456 V8.1.1.1 4
2 2 1 /opt/dm/dmdbms/data/testdb/testdb02.log testdb02.log 2022-09-15 14:30:53.000000 268435456 V8.1.1.1 4

注意:达梦数据库的REDO日志文件是有最小大小限制的,最小大小为:4096 * 页大小,当前数据库的页大小可以通过如下语句查看:
SQL> select para_name,para_value from v$dm_ini where para_name = 'GLOBAL_PAGE_SIZE';
LINEID PARA_NAME PARA_VALUE
---------- ---------------- ----------
1 GLOBAL_PAGE_SIZE 8192

默认页大小为8192(8KB),所以当前数据库能够添加的REDO日志文件最小大小为 4096 * 8192=32MB,我们可以通过 alert database add logfile 的方式添加REDO日志文件,如下所示:

SQL> select file_id,path,rlog_size/1024/1024 as MB from v$rlogfile;
LINEID FILE_ID PATH MB
---------- ----------- --------------------------------------- --------------------
1 0 /opt/dm/dmdbms/data/testdb/testdb01.log 256
2 1 /opt/dm/dmdbms/data/testdb/testdb02.log 256


2)添加 DM REDO 日志文件
在服务器打开状态下,可以添加新的REDO日志文件。添加的数据文件大小最小为 4096 * 页大小,如页大小为 8 KB,则可添加的文件最小值为 4096 * 8 KB = 32 MB。例如:添加大小为 256 MB 的REDO日志文件 testdb03.log,操作如下:
ALTER DATABASE ADD LOGFILE '/opt/dm/dmdbms/data/testdb/testdb03.log' size 256;

3)扩展重做日志文件
在服务器打开状态下,可以扩展已有的重做日志文件的大小。例如:扩展重做日志文件DAMENG03.log 到 256 MB:
ALTER DATABASE RESIZE LOGFILE '/opt/dm/dmdbms/data/testdb/testdb03.log' to 256;

DM也提供了DBMS_LOGMNR系统包,数据库默认后该包已经自动创建(如果未创建,可以通过命令 SP_CREATE_SYSTEM_PACKAGES (1,‘DBMS_LOGMNR’); 来创建)。
用户可以使用 DBMS_LOGMNR 包对归档日志进行挖掘,重构出 DDL 和 DML 等操作,方便审计及跟踪数据库的操作,并通过获取的信息进行更深入的分析。但DM的DBMS_LOGMNR貌似只支持对归档日志进行分析、无法分析REDO日志文件。

DM数据库查看归档模式开启状态:
SQL> SELECT PARA_NAME, PARA_VALUE FROM V$DM_INI WHERE PARA_NAME IN ('ARCH_INI','RLOG_APPEND_LOGIC');
LINEID PARA_NAME PARA_VALUE
---------- ----------------- ----------
1 RLOG_APPEND_LOGIC 0
2 ARCH_INI 0
0 代表归档关闭、1 代表归档开启。

开启DM数据库的归档模式:
DM 服务器可以运行在两种模式下,即归档模式和非归档模式,这两种模式可以由用户进行设置,系统在归档模式下运行时,会产生归档日志文件,此时系统管理员应该事先预留出足够的磁盘空间以便存储归档日志文件。通过 dm.ini 和 dmarch.ini 可以配置归档。

1)修改 dm.ini 中的参数开启:

ARCH_INI = 1                           #0 代表关闭、1 代表开启归档模式
RLOG_APPEND_LOGIC = 2    #Type of logic records in redo logs. 0 关闭;1、2、3 启用。
                                                  #1: 如果有主键列,记录 UPDATE 和 DELETE 操作时只包含主键列信息,若没有主键列则包含所有列信息;
                                                  #2:无论是否有主键列,记录 UPDATE 和 DELETE 操作时都包含所有列的信息;
                                                  #3:记录 UPDATE 时包含更新列的信息以及 ROWID,记录 DELETE 时只有 ROWID;

2)创建/修改 dmarch.ini 文件、配置本地归档:

[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /opt/dm/dmarch
ARCH_FILE_SIZE = 512                 #单位 MB
ARCH_SPACE_LIMIT = 204800     #单位 MB,0 表示无限制,范围:1024~4294967294

达梦数据库归档模式下的归档日志有五种类型:本地归档、实时归档、即时归档、异步归档、远程归档。

-- 查看当前的REDO(在线)日志组状态

-- Oracle
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 归档日志文件。
 */

-- DML
-- 查看DM REDO 日志文件:
select * from v$RLOGFILE;

LINEID     GROUP_ID    FILE_ID     PATH                                    CLIENT_PATH  CREATE_TIME                RLOG_SIZE            MIN_EXEC_VER MIN_DCT_VER
---------- ----------- ----------- --------------------------------------- ------------ -------------------------- -------------------- ------------ -----------
1          2           0           /opt/dm/dmdbms/data/testdb/testdb01.log testdb01.log 2022-09-15 14:30:53.000000 268435456            V8.1.1.1     4
2          2           1           /opt/dm/dmdbms/data/testdb/testdb02.log testdb02.log 2022-09-15 14:30:53.000000 268435456            V8.1.1.1     4

-- 1.分析 Oracle Redo日志(在线日志)
-- Step1.创建测试表 & DML操作
CREATE TABLE REDO_TEST01 (ID NUMBER(10) NOT NULL PRIMARY KEY, 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日志的路径

-- DM
select * from v$RLOGFILE;
/*
LINEID     GROUP_ID    FILE_ID     PATH                                    CLIENT_PATH  CREATE_TIME                RLOG_SIZE            MIN_EXEC_VER MIN_DCT_VER
---------- ----------- ----------- --------------------------------------- ------------ -------------------------- -------------------- ------------ -----------
1          2           0           /opt/dm/dmdbms/data/testdb/testdb01.log testdb01.log 2022-09-15 14:30:53.000000 268435456            V8.1.1.1     4
2          2           1           /opt/dm/dmdbms/data/testdb/testdb02.log testdb02.log 2022-09-15 14:30:53.000000 268435456            V8.1.1.1     4

*/

-- Oracle
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日志

-- Oracle
-- 第一个添加的日志需指定 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 : 删除文件
*/

-- DM
DM 貌似不支持 dbms_logmnr.add_logfile 添加 REDO 日志文件


-- 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 权限):
-- Oracle
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

*/

-- DM 查询归档日志文件
SELECT * FROM SYS.V$ARCH_FILE;

/*
SQL> SELECT * FROM SYS.V$ARCH_FILE;
LINEID     DB_MAGIC             STATUS   LEN                  FREE                 ARCH_LSN             CLSN                 ARCH_SEQ             NEXT_SEQ            
---------- -------------------- -------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
           CREATE_TIME                CLOSE_TIME                 PATH                                                                PMNT_MAGIC           DSC_SEQNO  
           -------------------------- -------------------------- ------------------------------------------------------------------- -------------------- -----------
           CRC_CHECK   LAST_PKG_OFF         PREV_LSN             GLOBAL_NEXT_SEQ      SRC_DB_MAGIC        
           ----------- -------------------- -------------------- -------------------- --------------------
1          1710613152           INACTIVE 179200               179200               25430                26696                4295                 4317
           2022-09-15 19:59:26.000000 2022-09-15 18:37:39.006000 /opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_18-37-40.log 1279490324           0
           1           178176               0                    4317                 1710613152


LINEID     DB_MAGIC             STATUS   LEN                  FREE                 ARCH_LSN             CLSN                 ARCH_SEQ             NEXT_SEQ            
---------- -------------------- -------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
           CREATE_TIME                CLOSE_TIME                 PATH                                                                PMNT_MAGIC           DSC_SEQNO  
           -------------------------- -------------------------- ------------------------------------------------------------------- -------------------- -----------
           CRC_CHECK   LAST_PKG_OFF         PREV_LSN             GLOBAL_NEXT_SEQ      SRC_DB_MAGIC        
           ----------- -------------------- -------------------- -------------------- --------------------
2          1710613152           INACTIVE 5120                 5120                 26696                26696                4318                 4318
           2022-09-15 18:37:39.006000 2022-09-15 20:04:17.488234 /opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_20-02-38.log 1279490324           0
           1           4096                 0                    4318                 1710613152


LINEID     DB_MAGIC             STATUS   LEN                  FREE                 ARCH_LSN             CLSN                 ARCH_SEQ             NEXT_SEQ            
---------- -------------------- -------- -------------------- -------------------- -------------------- -------------------- -------------------- --------------------
           CREATE_TIME                CLOSE_TIME                 PATH                                                                PMNT_MAGIC           DSC_SEQNO  
           -------------------------- -------------------------- ------------------------------------------------------------------- -------------------- -----------
           CRC_CHECK   LAST_PKG_OFF         PREV_LSN             GLOBAL_NEXT_SEQ      SRC_DB_MAGIC        
           ----------- -------------------- -------------------- -------------------- --------------------
3          1710613152           ACTIVE   536870912            9728                 26696                26706                4319                 4325
           2022-09-15 20:04:17.488234 2022-09-15 20:07:38.019889 /opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_20-07-38.log 1279490324           0
           1           9216                 0                    4325                 1710613152
*/

SELECT SEQUENCE# SEQ , NAME , TO_CHAR(FIRST_TIME, 'YYYY-MM-DD HH24:MI:SS') FIRST_TIME, TO_CHAR(NEXT_TIME, 'YYYY-MM-DD HH24:MI:SS') NEXT_TIME , FIRST_CHANGE# , NEXT_CHANGE# FROM V$ARCHIVED_LOG;

/*
SQL> SELECT SEQUENCE# SEQ , NAME , TO_CHAR(FIRST_TIME, 'YYYY-MM-DD HH24:MI:SS') FIRST_TIME, TO_CHAR(NEXT_TIME, 'YYYY-MM-DD HH24:MI:SS') NEXT_TIME , FIRST_CHANGE# , NEXT_CHANGE# FROM V$ARCHIVED_LOG;

LINEID     SEQ         NAME                                                                FIRST_TIME          NEXT_TIME           FIRST_CHANGE#      NEXT_CHANGE#     
---------- ----------- ------------------------------------------------------------------- ------------------- ------------------- -------------------- --------------------
1          1           /opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_18-37-40.log 2022-09-15 19:59:26 2022-09-15 18:37:39 25430 26696

2          2           /opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_20-02-38.log 2022-09-15 18:37:39 2022-09-15 20:04:17 26696 26696

3          3           /opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_20-07-38.log 2022-09-15 20:04:17 2022-09-15 20:07:38 26696 26706
*/

-- 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
-- Oracle 
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);
-- 如果要删除则执行:
exec dbms_logmnr.remove_logfile ('/opt/oracle/oradata/ORCL/redo04.log');


-- DM
dbms_logmnr.add_logfile('/opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_18-37-40.log');
dbms_logmnr.add_logfile('/opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_20-02-38.log');
dbms_logmnr.add_logfile('/opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_20-07-38.log');
-- 如果要删除则执行:
dbms_logmnr.remove_logfile ('/opt/dm/dmarch/ARCHIVE_LOCAL1_0x65F5E2A0[0]_2022-09-15_20-07-38.log');


-- Step4.开始分析
--Oracle
--仅指定option,不指定查询时间范围和SCN. 如果要同时指定多个option,则多个option的值相加的和进行传参数即可,例如:options->2128
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);
--指定查询SCN,根据V$LOGMNR_LOGS中LOW_SCN和NEXT_SCN或者实际业务场景指定范围: select LOW_SCN, NEXT_SCN, LOW_TIME, HIGH_TIME, LOG_ID, FILENAME from V$LOGMNR_LOGS;
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog, startscn=>26709 , endscn=>26830);
-- 指定查询时间范围,根据V$LOGMNR_LOGS中LOW_TIME和HIGH_TIME或者实际业务场景指定范围: select LOW_SCN, NEXT_SCN, LOW_TIME, HIGH_TIME, LOG_ID, FILENAME from V$LOGMNR_LOGS;
exec dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog , STARTTIME=>TO_DATE('2022-09-15 00:00:00','YYYY-MM-DD HH24:MI:SS') , ENDTIME=>TO_DATE('2022-09-15 20:00:00','YYYY-MM-DD HH24:MI:SS'));

-- DM
--仅指定option,不指定查询时间范围和SCN. 如果要同时指定多个option,则多个option的值相加的和进行传参数即可,例如:options->2128
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog); 
--指定查询SCN,根据V$LOGMNR_LOGS中LOW_SCN和NEXT_SCN或者实际业务场景指定范围: select LOW_SCN, NEXT_SCN, LOW_TIME, HIGH_TIME, LOG_ID, FILENAME from V$LOGMNR_LOGS;
dbms_logmnr.start_logmnr(options=>2128 , startscn=>26709 , endscn=>26830);
-- 指定查询时间范围,根据V$LOGMNR_LOGS中LOW_TIME和HIGH_TIME或者实际业务场景指定范围: select LOW_SCN, NEXT_SCN, LOW_TIME, HIGH_TIME, LOG_ID, FILENAME from V$LOGMNR_LOGS;
dbms_logmnr.start_logmnr(options=>2128 , STARTTIME=>TO_DATE('2022-09-15 00:00:00','YYYY-MM-DD HH24:MI:SS') , ENDTIME=>TO_DATE('2022-09-15 20:00:00','YYYY-MM-DD HH24:MI:SS'));


--Step5.查看LOGMNR分析后的数据
select timestamp,sql_redo,sql_undo from v$logmnr_contents where table_name='REDO_TEST01'; 

-- Step6.结束LOGMNR分析
-- Oracle
exec dbms_logmnr.end_logmnr;

-- DM
dbms_logmnr.end_logmnr;
 


版权声明:本文为sunny05296原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。