首页 » ORACLE 9i-23ai » oracle 10g logminer笔记(一)

oracle 10g logminer笔记(一)

数据已经发生了变化如何恢复?是谁操作的? 想回滚部分变化 ?基于备份的时间点恢复、10G以后后强大的flashback、logminer..

对于搞ORACLE数据库的人来说,LOGMINER这个装备已并不陌生,开始是ORACLE内部的工具出了问题,只能发送EMAIL耐心等待,从oracle 8i开始官方公开了LOGMINER工具,可以分析REDO日志文件包括在线或已归档,因为知道数据库的操作都记录在REDO日志中,logminer和tkprof 一样,不过tkprof是分析TRACE文件,logminer是分析redo log/archivelog. 所以要求是归档模式

logminer的教程网上已经屡见不鲜,操作也都雷同,同时用到时有几点需要注意的地方,需要注意一下。

1,启动归档

LogMiner 要求数据库是open、readwrite,并且处于 ARCHIVELOG 模式,并且 已启用存档。

检查数据库日志记录 模式:

select log_mode from v$database; 启用存档,打开数据库,并使其写:
alter database archivelog;
alter database open read write;

2,附加最小日志 supplemental_log_data_min

10G默认是没有打开的,所以在开始分析时会发现分析出的结果只有DDL记录,没有DML记录,由于 Oracle 已知问题,要为表启用补充日志记录,您必须先 为数据库启用 Minimum Supplemental Logging。要在源生成的记录中包含所有字段,请启用 full supplemental 表或数据库级别的日志记录。完整的补充日志记录提供来自所有 列、数据未更改的列以及主键和已更改的列。

要验证是否为数据库启用了补充日志记录

SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM v$database;

可以启用PK键或完全补充日志记录以从中检索数据 重做日志。您无需同时启用:

启用PK键日志记录
您可以为单个表启用PK键日志记录,或者 数据库中的所有表:
  • 对于单个表

    在 SQL shell 中,使用以下命令 命令为 数据库,然后为 您想要的每张表 用:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
  • 对于所有表

    在 SQL shell 中,使用以下命令 为整个 数据库:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
启用完全补充日志记录
您可以为单个表启用完全补充日志记录,或者 数据库中的所有表:
  • 对于单个表

    在 SQL shell 中,使用以下命令启用 数据库的最小补充日志记录,然后 为您 想要 用:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
  • 对于所有表

    在 SQL shell 中,使用以下命令 命令为整个 数据库:

    ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

 

启用一后会带来一定影响下篇日志中解释。

禁用supplemental_log_data_min,执行

alter database drop supplemental log data;

确认

SELECT name, supplemental_log_data_min FROM v$database;

3,数据字典dictionary,logminer可以有多个数据字典,
分为三种:
A分析库上的online data dictionary(不用建数据字典),
B是独立的数据字典文件(flat file),可以打开直接查看
C把数据字典集成在redo log中, 因为会每个REDO日志记录数据库元数据(对象名logmnrg_%$),导致归档量增加。

B和C要在源数据库通过dbms_logmnr_d来创建,可以分析其它数据库的redo;A查看分析的结果中用到内部对象logminer以16进制字符显示无法生成可执行sql,这也是为什么要创建数据字典的原因,并且它只能分析本地数据库的redo log;

4,分析其它数据库的REDO里对字符集、OS、硬件环境要求也非常严格

 

— update  2025-1-7 —

在国产化或国外如IBM streams或dbz 在做CDC 基于logminer时,可以创建独立的用户

5, 用户权限

可以使用sysdba 或dba,如果有外部软件或CDC时需要独立用户也可以.

12c、18c 或 19c 多租户数据库

对于多租户 Oracle 和 Oracle RAC 12c、18c 和 19c 数据库,请创建一个 common user account 的 common user account 中。

ALTER SESSION SET CONTAINER=cdb$root;
CREATE USER <user name> IDENTIFIED BY <password> CONTAINER=all;
GRANT create session, alter session, set container, logmining, execute_catalog_role TO <user name> CONTAINER=all;
GRANT select on GV_$DATABASE to <user name>;
GRANT select on V_$DATABASE to <user name>;
GRANT select on V_$DATABASE_INCARNATION to <user name>;
GRANT select on V_$LOGMNR_CONTENTS to <user name>;
GRANT select on V_$ARCHIVED_LOG to <user name>;
GRANT select on V_$LOG to <user name>;
GRANT select on V_$LOGFILE to <user name>;
GRANT select on V_$LOGMNR_LOGS to <user name>;
ALTER SESSION SET CONTAINER=<pdb>;
GRANT select on <db>.<table> TO <user name>;

12c、18c 或 19c 标准数据库
对于标准 Oracle 和 Oracle RAC 12c、18c 和 19c 数据库,请创建一个 具有必要权限的用户帐户

CREATE USER <user name> IDENTIFIED BY <password>;
GRANT create session, alter session, logmining, execute_catalog_role TO <user name>;
GRANT select on GV_$DATABASE to <user name>;
GRANT select on V_$DATABASE to <user name>;
GRANT select on V_$DATABASE_INCARNATION to <user name>;
GRANT select on V_$LOGMNR_CONTENTS to <user name>;
GRANT select on V_$ARCHIVED_LOG to <user name>;
GRANT select on V_$LOG to <user name>;
GRANT select on V_$LOGFILE to <user name>;
GRANT select on V_$LOGMNR_LOGS to <user name>;
GRANT select on <db>.<table> TO <user name>;

11G 数据库
对于 Oracle 11g 数据库,请创建一个具有必要 特权:

CREATE USER <user name> IDENTIFIED BY <password>;
GRANT create session, alter session, execute_catalog_role, select any transaction, select any table to <user name>;
GRANT select on GV_$DATABASE to <user name>;
GRANT select on V_$DATABASE to <user name>;
GRANT select on V_$DATABASE_INCARNATION to <user name>;
GRANT select on V_$LOGMNR_CONTENTS to <user name>;
GRANT select on V_$ARCHIVED_LOG to <user name>;
GRANT select on V_$LOG to <user name>;
GRANT select on V_$LOGFILE to <user name>;
GRANT select on V_$LOGMNR_LOGS to <user name>;
GRANT select on <db>.<table> TO <user name>;

提取 Log Miner 字典 (Redo Logs)
当使用 redo logs 作为字典源时, 在启动 管道。定期重复此步骤,以确保包含 词典仍然可用。数据库必须处于打开状态并处于模式,并且必须启用存档。将字典提取到 redo 日志流时,无法执行任何 DDL 语句。因此,提取到重做日志文件的字典可以保证是一致的。

Oracle 建议您仅在非高峰时段提取字典,因为 提取可能会消耗数据库资源。

要提取所有 Oracle 和 Oracle RAC 标准数据库的字典,请运行 以后 命令:

EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

提取 Oracle 和 Oracle RAC 12c、18c 或 19c 多租户的字典 databases 中,运行以下命令 命令:

ALTER SESSION SET CONTAINER=cdb$root;
EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);

将字典提取到重做日志文件的过程确实会消耗数据库资源,但如果将提取限制在非高峰时段,则这应该不是问题,并且比提取到平面文件更快。根据词典的大小,它可能包含在多个重做日志文件中。如果相关的重做日志文件已存档,则可以找出哪些重做日志文件包含提取的词典的开头和结尾。

SQL> EXECUTE DBMS_LOGMNR_D.BUILD( -
   OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);>

PL/SQL procedure successfully completed.

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES  BLOCKSIZE    MEMBERS ARCHIV STATUS                           FIRST_CHANGE# FIRST_TIME          NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- ------ -------------------------------- ------------- ------------------- ------------ -------------------
         1          2       1092 1073741824        512          1 YES    ACTIVE                              2.4419E+10 2025-01-07 17:32:03   2.4419E+10 2025-01-07 17:32:06
         2          2       1093 1073741824        512          1 YES    ACTIVE                              2.4419E+10 2025-01-07 17:32:06   2.4419E+10 2025-01-07 17:32:45
         5          1       1114 1073741824        512          1 YES    ACTIVE                              2.4419E+10 2025-01-07 17:32:02   2.4419E+10 2025-01-07 17:32:05
         6          1       1115 1073741824        512          1 NO     CURRENT                             2.4419E+10 2025-01-07 17:32:05   2.8147E+14
         7          1       1112 1073741824        512          1 YES    INACTIVE                            2.4407E+10 2025-01-01 22:25:17   2.4415E+10 2025-01-05 18:00:38
         8          1       1113 1073741824        512          1 YES    ACTIVE                              2.4415E+10 2025-01-05 18:00:38   2.4419E+10 2025-01-07 17:32:02
        11          2       1094 1073741824        512          1 NO     CURRENT                             2.4419E+10 2025-01-07 17:32:45   2.8147E+14
        12          2       1091 1073741824        512          1 YES    ACTIVE                              2.4419E+10 2025-01-07 17:32:00   2.4419E+10 2025-01-07 17:32:03

8 rows selected.

SQL> alter system archive log current;
System altered.

SQL>SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES' or  DICTIONARY_END='YES'

NAME
----------------------------------------------------------------------------------------------------




+FRA/rac11g/archivelog/2025_01_07/thread_2_seq_1091.1647.1189791123
+FRA/rac11g/archivelog/2025_01_07/thread_2_seq_1092.1732.1189791127

6 rows selected.

SQL> EXECUTE DBMS_LOGMNR_D.BUILD( -
   OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);>

PL/SQL procedure successfully completed.

SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN='YES' or  DICTIONARY_END='YES';

NAME
----------------------------------------------------------------------------------------------------




+FRA/rac11g/archivelog/2025_01_07/thread_2_seq_1091.1647.1189791123
+FRA/rac11g/archivelog/2025_01_07/thread_2_seq_1092.1732.1189791127
+FRA/rac11g/archivelog/2025_01_07/thread_2_seq_1098.1746.1189791395
+FRA/rac11g/archivelog/2025_01_07/thread_2_seq_1099.1571.1189791397

Note:
执行了两次刷dict 到redo ,可以看到2个时段都有一组包含 dict的redo.

— over —

打赏

,

对不起,这篇文章暂时关闭评论。