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键日志记录,或者 数据库中的所有表:
- 启用完全补充日志记录
- 您可以为单个表启用完全补充日志记录,或者 数据库中的所有表:
启用一后会带来一定影响下篇日志中解释。
禁用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 —
对不起,这篇文章暂时关闭评论。