众所周知,数据库的DML操作会记录在REDO日志中。如果启用了归档模式,REDO日志就可以长期保存而不会被覆盖。有时当闪回查询无法使用,或者需要从日志中挖掘过去某一时间点的操作内容或操作人信息时,这些日志就能作为重要的恢复依据。Oracle数据库提供的数据库挖掘LogMiner工具可以通过dbms_logmnr包来实现日志挖掘。而国产数据库达梦,同样支持类似的日志挖掘功能,而且语法与Oracle几乎一致。

开始测试

开启归档

alter database mount;ALTER DATABASE ADD ARCHIVELOG 'DEST = /home/dm8/arch, TYPE = local,FILE_SIZE = 128, SPACE_LIMIT = 2048';alter database archivelog;alter database open;

Note:在达梦中数据库模式可以在生命周期内open来回切mount(维护模式),不用重启实例,与Oracle不同。

SQL> select * from v$database;LINEID     NAME  CREATE_TIME         ARCH_MODE LAST_CKPT_TIME      STATUS$     ROLE$       MAX_SIZE             TOTAL_SIZE           DSC_NODES   OPEN_COUNT  STARTUP_COUNT        LAST_STARTUP_TIME---------- ----- ------------------- --------- ------------------- ----------- ----------- -------------------- -------------------- ----------- ----------- -------------------- -------------------1          anbob 2025-07-22 17:57:03 Y         2025-08-11 18:24:43 4           0           0                    52736                1           12          8                    2025-07-30 20:30:31SQL> select * from v$dm_arch_ini;LINEID     ARCH_NAME      ARCH_TYPE ARCH_DEST      ARCH_FILE_SIZE ARCH_SPACE_LIMIT ARCH_HANG_FLAG ARCH_TIMER_NAME ARCH_IS_VALID ARCH_WAIT_APPLY ARCH_INCOMING_PATH ARCH_CURR_DEST ARCH_FLUSH_BUF_SIZE---------- -------------- --------- -------------- -------------- ---------------- -------------- --------------- ------------- --------------- ------------------ -------------- -------------------           ARCH_RESERVE_TIME ARCH_LOCAL_SHARE ARCH_LOCAL_SHARE_CHECK ARCH_SEND_DELAY ARCH_DEST_IP ARCH_DEST_PORT ARCH_DEST_ID ARCH_ASM_MIRROR ARCH_ASM_STRIPING ARCH_RECOVER_TIME ARCH_CENTER_ID           ----------------- ---------------- ---------------------- --------------- ------------ -------------- ------------ --------------- ----------------- ----------------- --------------           ARCH_FAILOVER ARCH_SUBSCRIBE_MODE ARCH_THRESHOLD_PER_SECOND ARCH_STANDBY_APPLY           ------------- ------------------- ------------------------- ------------------1          ARCHIVE_LOCAL1 LOCAL     /home/dm8/arch 128            0                1              NULL            Y             NULL            NULL               /home/dm8/arch 2           0                 0                0                      0               NULL         NULL           NULL         NULL            NULL              NULL              NULL           NULL          NULL                NULL                      NULLSQL> 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 CLSN_OPEN_ID DB_OPEN_ID  ALMOST_FULL_STATUS           ---------------------- -------------------- ----------- -------------------- ---------------- --------------------- ------------ ----------- ------------ ----------- ------------------           PTX_RESERVED         RESERVE_THRESHOLD RESERVE_SIZE           -------------------- ----------------- ------------1          50601                50746                50746                50746                4001                 7           853592382            0           0              0           15282176             0           15220736             4294897664           4294959104           NULL         0                    0              640                  69           0                      4001                 0           0                    0                0                     V8.1.1.1     4           8            8           SAFE           0                    0                 32767SQL> 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           /home/dm8/dmdbms/data/anbob/anbob01.log anbob01.log 2025-07-22 17:57:03.000000 2147483648           V8.1.1.1     42          2           1           /home/dm8/dmdbms/data/anbob/anbob02.log anbob02.log 2025-07-22 17:57:03.000000 2147483648           V8.1.1.1     4

配置附加日志

SQL> show parameter RLOG_APPEND_LOGIC;LINEID     PARA_NAME         PARA_VALUE---------- ----------------- ----------1          RLOG_APPEND_LOGIC 0SQL>  alter system set 'RLOG_APPEND_LOGIC'=2;DMSQL executed successfullyused time: 8.385(ms). Execute id is 3802.SQL> show parameter RLOG_APPEND_LOGIC;LINEID     PARA_NAME         PARA_VALUE---------- ----------------- ----------1          RLOG_APPEND_LOGIC 2

RLOG_APPEND_LOGIC参数介绍

是否启用在日志中记录逻辑操作的功能,取值范围0、1、2、3、4

0:不启用;1、2、3、4启用。

1:如果有主键列,记录UPDATE和DELETE操作时只包含主键列信息,若没有主键列则包含所有列信息;

2:不论是否有主键列,记录UPDATE和DELETE操作时都包含所有列的信息;

3:记录UPDATE时包含更新列的信息以及ROWID,记录DELETE时只有ROWID;

4:只生成事务以及DDL相关的逻辑日志;

做一些DML操作

SQL> create table test_logmnr(id int primary key, name varchar(10));executed successfullyused time: 38.587(ms). Execute id is 3808.SQL> insert into test_logmnr values(1,'anbob');affect rows 1used time: 18.818(ms). Execute id is 3809.SQL> insert into test_logmnr values(2,'weejar');affect rows 1used time: 0.754(ms). Execute id is 3810.SQL> delete from test_logmnr where id=2;affect rows 1used time: 15.301(ms). Execute id is 3811.SQL> update test_logmnr set name=name||'.com' where id=1;affect rows 1used time: 14.085(ms). Execute id is 3812.SQL> commit;executed successfullyused time: 1.079(ms). Execute id is 3813.SQL> select * from test_logmnr;LINEID     ID          NAME---------- ----------- ---------1          1           anbob.com

日志挖掘

SQL> select RECID, SEQUENCE#,FIRST_TIME,NEXT_TIME,BLOCKS,BLOCK_SIZE,NAME from v$archived_log;LINEID     RECID       SEQUENCE#   FIRST_TIME                 NEXT_TIME                  BLOCKS      BLOCK_SIZE  NAME---------- ----------- ----------- -------------------------- -------------------------- ----------- ----------- --------------------------------------------------------------------1          NULL        1           2025-07-28 18:13:17.419246 2025-07-28 18:17:45.352318 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-13-17.log2          NULL        2           2025-07-28 18:22:48.030077 2025-07-29 17:59:40.692663 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-22-48.log3          NULL        3           2025-07-29 17:59:44.261038 2025-07-30 20:30:10.040709 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-29_17-59-44.log4          NULL        4           2025-07-30 20:30:31.731090 2025-07-30 20:41:27.369344 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-30-31.log5          NULL        5           2025-07-30 20:41:45.693322 2025-07-30 20:41:45.694952 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-41-45.log6          NULL        6           2025-07-30 21:00:31.822479 2025-07-30 21:00:31.822479 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_21-00-31.log6 rows gotused time: 1.570(ms). Execute id is 3815.SQL> alter system switch logfile;executed successfullySQL> select RECID, SEQUENCE#,FIRST_TIME,NEXT_TIME,BLOCKS,BLOCK_SIZE,NAME from v$archived_log;LINEID     RECID       SEQUENCE#   FIRST_TIME                 NEXT_TIME                  BLOCKS      BLOCK_SIZE  NAME---------- ----------- ----------- -------------------------- -------------------------- ----------- ----------- --------------------------------------------------------------------1          NULL        1           2025-07-28 18:13:17.419246 2025-07-28 18:17:45.352318 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-13-17.log2          NULL        2           2025-07-28 18:22:48.030077 2025-07-29 17:59:40.692663 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-22-48.log3          NULL        3           2025-07-29 17:59:44.261038 2025-07-30 20:30:10.040709 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-29_17-59-44.log4          NULL        4           2025-07-30 20:30:31.731090 2025-07-30 20:41:27.369344 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-30-31.log5          NULL        5           2025-07-30 20:41:45.693322 2025-07-30 20:41:45.694952 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-41-45.log6          NULL        6           2025-07-30 21:00:31.822479 2025-08-11 18:37:39.799113 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_21-00-31.log6 rows gotSQL> select RECID, SEQUENCE#,FIRST_TIME,NEXT_TIME,BLOCKS,BLOCK_SIZE,NAME from v$archived_log;LINEID     RECID       SEQUENCE#   FIRST_TIME                 NEXT_TIME                  BLOCKS      BLOCK_SIZE  NAME---------- ----------- ----------- -------------------------- -------------------------- ----------- ----------- --------------------------------------------------------------------1          NULL        1           2025-07-28 18:13:17.419246 2025-07-28 18:17:45.352318 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-13-17.log2          NULL        2           2025-07-28 18:22:48.030077 2025-07-29 17:59:40.692663 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-22-48.log3          NULL        3           2025-07-29 17:59:44.261038 2025-07-30 20:30:10.040709 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-29_17-59-44.log4          NULL        4           2025-07-30 20:30:31.731090 2025-07-30 20:41:27.369344 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-30-31.log5          NULL        5           2025-07-30 20:41:45.693322 2025-07-30 20:41:45.694952 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-41-45.log6          NULL        6           2025-07-30 21:00:31.822479 2025-07-30 21:00:31.822479 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_21-00-31.log6 rows gotused time: 1.570(ms). Execute id is 3815.SQL> alter system switch logfile;executed successfullySQL> select RECID, SEQUENCE#,FIRST_TIME,NEXT_TIME,BLOCKS,BLOCK_SIZE,NAME from v$archived_log;LINEID     RECID       SEQUENCE#   FIRST_TIME                 NEXT_TIME                  BLOCKS      BLOCK_SIZE  NAME---------- ----------- ----------- -------------------------- -------------------------- ----------- ----------- --------------------------------------------------------------------1          NULL        1           2025-07-28 18:13:17.419246 2025-07-28 18:17:45.352318 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-13-17.log2          NULL        2           2025-07-28 18:22:48.030077 2025-07-29 17:59:40.692663 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-22-48.log3          NULL        3           2025-07-29 17:59:44.261038 2025-07-30 20:30:10.040709 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-29_17-59-44.log4          NULL        4           2025-07-30 20:30:31.731090 2025-07-30 20:41:27.369344 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-30-31.log5          NULL        5           2025-07-30 20:41:45.693322 2025-07-30 20:41:45.694952 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-41-45.log6          NULL        6           2025-07-30 21:00:31.822479 2025-08-11 18:37:39.799113 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_21-00-31.log6 rows gotSQL> alter system archive log current;executed successfullyused time: 1.605(ms). Execute id is 0.SQL> select RECID, SEQUENCE#,FIRST_TIME,NEXT_TIME,BLOCKS,BLOCK_SIZE,NAME from v$archived_log;LINEID     RECID       SEQUENCE#   FIRST_TIME                 NEXT_TIME                  BLOCKS      BLOCK_SIZE  NAME---------- ----------- ----------- -------------------------- -------------------------- ----------- ----------- --------------------------------------------------------------------1          NULL        1           2025-07-28 18:13:17.419246 2025-07-28 18:17:45.352318 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-13-17.log2          NULL        2           2025-07-28 18:22:48.030077 2025-07-29 17:59:40.692663 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-28_18-22-48.log3          NULL        3           2025-07-29 17:59:44.261038 2025-07-30 20:30:10.040709 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-29_17-59-44.log4          NULL        4           2025-07-30 20:30:31.731090 2025-07-30 20:41:27.369344 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-30-31.log5          NULL        5           2025-07-30 20:41:45.693322 2025-07-30 20:41:45.694952 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_20-41-45.log6          NULL        6           2025-07-30 21:00:31.822479 2025-08-11 18:37:39.799113 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_21-00-31.log7          NULL        7           2025-08-11 18:42:43.398488 2025-08-11 18:43:12.360132 NULL        NULL        /home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-08-11_18-42-43.log

Note:达梦数据的switch log file并未生成新归档

SQL>  DBMS_LOGMNR.ADD_LOGFILE('/home/dm8/arch/ARCHIVE_LOCAL1_0x32E0C93E_EP0_2025-07-30_21-00-31.log');DMSQL executed successfullyused time: 31.794(ms). Execute id is 3820.SQL> DBMS_LOGMNR.START_LOGMNR(OPTIONS=>16 , STARTTIME=>TO_DATE('2025-08-11 18:12:43','YYYY-MM-DD HH24:MI:SS') ,     ENDTIME=>TO_DATE('2025-08-11 18:42:43','YYYY-MM-DD HH24:MI:SS'));DMSQL executed successfullyused time: 14.248(ms). Execute id is 3824.

Options

对应值

说明

COMMITTED_DATA_ONLY

2

仅从已交的事务的日志中挖掘信息

DICT_FROM_ONLINE_CATALOG

16

使用在线字典

NO_SQL_DELIMITER

64

拼写的SQL语句最后不添加分隔符

NO_ROWID_IN_STMT

2048

拼写的SQL语句中不包含ROWID

查看挖掘记录

SQL>  select SQL_REDO,TIMESTAMP ,START_TIMESTAMP ,COMMIT_TIMESTAMP ,OPERATION ,ROW_ID from V$LOGMNR_CONTENTS where table_name= 'TEST_LOGMNR';LINEID     SQL_REDO                                                                                    TIMESTAMP                  START_TIMESTAMP            COMMIT_TIMESTAMP           OPERATION ROW_ID---------- ------------------------------------------------------------------------------------------- -------------------------- -------------------------- -------------------------- --------- ------------------1          INSERT INTO "SYSDBA"."TEST_LOGMNR"("ID", "NAME") VALUES(1, 'anbob');                        2025-08-11 18:33:58.266000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 INSERT    AAAAAAAAAAAAAAAAAB2          INSERT INTO "SYSDBA"."TEST_LOGMNR"("ID", "NAME") VALUES(2, 'weejar');                       2025-08-11 18:34:17.043000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 INSERT    AAAAAAAAAAAAAAAAAC3          DELETE FROM "SYSDBA"."TEST_LOGMNR" WHERE "ID" = 2 AND "NAME" = 'weejar';                    2025-08-11 18:34:34.151000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 DELETE    AAAAAAAAAAAAAAAAAC4          UPDATE "SYSDBA"."TEST_LOGMNR" SET "NAME" = 'anbob.com' WHERE "ID" = 1 AND "NAME" = 'anbob'; 2025-08-11 18:34:58.183000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 UPDATE    AAAAAAAAAAAAAAAAABSQL>  select SQL_REDO,TIMESTAMP ,START_TIMESTAMP ,COMMIT_TIMESTAMP ,OPERATION ,ROW_ID from V$LOGMNR_CONTENTS where table_name= 'TEST_LOGMNR';LINEID     SQL_REDO                                                                                    TIMESTAMP                  START_TIMESTAMP            COMMIT_TIMESTAMP           OPERATION ROW_ID---------- ------------------------------------------------------------------------------------------- -------------------------- -------------------------- -------------------------- --------- ------------------1          INSERT INTO "SYSDBA"."TEST_LOGMNR"("ID", "NAME") VALUES(1, 'anbob');                        2025-08-11 18:33:58.266000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 INSERT    AAAAAAAAAAAAAAAAAB2          INSERT INTO "SYSDBA"."TEST_LOGMNR"("ID", "NAME") VALUES(2, 'weejar');                       2025-08-11 18:34:17.043000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 INSERT    AAAAAAAAAAAAAAAAAC3          DELETE FROM "SYSDBA"."TEST_LOGMNR" WHERE "ID" = 2 AND "NAME" = 'weejar';                    2025-08-11 18:34:34.151000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 DELETE    AAAAAAAAAAAAAAAAAC4          UPDATE "SYSDBA"."TEST_LOGMNR" SET "NAME" = 'anbob.com' WHERE "ID" = 1 AND "NAME" = 'anbob'; 2025-08-11 18:34:58.183000 2025-08-11 18:33:58.266000 2025-08-11 18:35:00.415000 UPDATE    AAAAAAAAAAAAAAAAABSQL> select sql_redo,sql_undo from V$LOGMNR_CONTENTS where table_name= 'TEST_LOGMNR';LINEID     SQL_REDO                                                                                    SQL_UNDO---------- ------------------------------------------------------------------------------------------- --------1          INSERT INTO "SYSDBA"."TEST_LOGMNR"("ID", "NAME") VALUES(1, 'anbob');                        NULL2          INSERT INTO "SYSDBA"."TEST_LOGMNR"("ID", "NAME") VALUES(2, 'weejar');                       NULL3          DELETE FROM "SYSDBA"."TEST_LOGMNR" WHERE "ID" = 2 AND "NAME" = 'weejar';                    NULL4          UPDATE "SYSDBA"."TEST_LOGMNR" SET "NAME" = 'anbob.com' WHERE "ID" = 1 AND "NAME" = 'anbob'; NULLused time: 1.510(ms). Execute id is 3830.

终止归档日志文件分析

DBMS_LOGMNR.END_LOGMNR();

Note:同Oracle一样,v$logmnr_log和v$logmnr_contents是会话级数据,数据在TEMP空间中,断开会话会自动释放。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐