1 LogMiner 案例 Enable Supplemental Logging Extract a LogMiner Dictionary(unless you plan to use the online catalog) Specify Redo Log Files for Analysis Start LogMiner Query V$LOGMNR_CONTENTS End the LogMiner Session 1.1 显式指定重做日志文
1 LogMiner案例
Enable Supplemental Logging
Extract a LogMiner Dictionary(unless you plan to use the online catalog)
Specify Redo Log Files for Analysis
Start LogMiner
Query V$LOGMNR_CONTENTS
End the LogMiner Session
1.1 显式指定重做日志文件的LogMiner实例
本节内容必须开启最小补充日志:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;另外有些实例用到日期格式,这里事先设置日期格式:
SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'dd-mon-yyyy hh24:mi:ss';
1.1.1 查询最新归档重做文件中所有的更改操作
最简单的检查数据库的修改历史是在源数据库中使用在线联机日志来解析重做日志文件,本节案例找出了数据库生成的最后的归档日志中的所有的修改操作(假定该数据不是RAC数据库)。
1.查找最新归档的重作日志。
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME = (SELECT MAX(FIRST_TIME) FROM V$ARCHIVED_LOG);
2.添加重做日志文件
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE( - LOGFILENAME => '/usr/oracle/data/db1arch_1_16_482701534.dbf', - OPTIONS => DBMS_LOGMNR.NEW);
3.开始分析
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR( - OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
4.查询结果
SQL> SELECT username AS USR, (XIDUSN || '.' || XIDSLT || '.' || XIDSQN) AS XID, SQL_REDO, SQL_UNDO FROM V$LOGMNR_CONTENTS WHERE username IN ('HR', 'OE');
5.关闭LogMiner会话
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
1.1.2 查询提交事务中的DML语句
如上节所示,默认情况下LogMiner显示重做日志文件中所有的修改操作,不管事务是否提交,由上节查询结果可知属于同一事务DML语句没有罗列在一起,查询结果不那么易读。虽然可以使用SQL来控制想要的输出结果,但是LogMiner提供了一个更简单的方法。在这个例子中,最新的归档重做日志文件将再次被分析,但它将只返回提交的事务。
除了分析步骤,其他步骤与上节完全一样,分析语句如下:
SQL>EXECUTE DBMS_LOGMNR.START_LOGMNR( - OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + - DBMS_LOGMNR.COMMITTED_DATA_ONLY);
1.1.3 重构SQL语句
如果想输出的结果更为直观易读,可以通过指定PRINT_PRETTY_SQL参数来美化输出结果。
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(- OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + - DBMS_LOGMNR.COMMITTED_DATA_ONLY + - DBMS_LOGMNR.PRINT_PRETTY_SQL);
1.1.4 使用重作日志文件中的LogMiner字典
当LogMiner字典存于在线联机日志文件中,必须在源数据库分析重做日志文件,而当LogMiner字典存于重作日志文件中,就可以在不同的数据库分析重做日志文件。
1.查找最新归档的重作日志。
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME = (SELECT MAX(FIRST_TIME) FROM V$ARCHIVED_LOG);
2.查找包含字典的重做日志文件
- 查找包含字典提取结束的重做日志文件
SQL> SELECT NAME, SEQUENCE#, DICTIONARY_BEGIN d_beg, DICTIONARY_END d_end FROM V$ARCHIVED_LOG WHERE SEQUENCE# = (SELECT MAX (SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DICTIONARY_END = 'YES' and SEQUENCE# <p></p>
- 查找包含字典提取开始的重做日志文件
SQL> SELECT NAME, SEQUENCE#, DICTIONARY_BEGIN d_beg, DICTIONARY_END d_end FROM V$ARCHIVED_LOG WHERE SEQUENCE# = (SELECT MAX (SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN = 'YES' and SEQUENCE# <p></p>
- 添加重做日志文件
SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(- LOGFILENAME => '/usr/oracle/data/db1arch_1_210_482701534.dbf', - OPTIONS => DBMS_LOGMNR.NEW); SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(- LOGFILENAME => '/usr/oracle/data/db1arch_1_208_482701534.dbf'); SQL> EXECUTE DBMS_LOGMNR.ADD_LOGFILE(- LOGFILENAME => '/usr/oracle/data/db1arch_1_207_482701534.dbf');
- 通过V$LOGMNR_LOGS查询重做日志文件分析列表
SQL> SELECT FILENAME AS name, LOW_TIME, HIGH_TIME FROM V$LOGMNR_LOGS;
3.开始分析
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(- OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + - DBMS_LOGMNR.COMMITTED_DATA_ONLY + - DBMS_LOGMNR.PRINT_PRETTY_SQL);
4.查询分析结果
SQL> SELECT USERNAME AS usr, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER IS NULL OR SEG_OWNER NOT IN ('SYS', 'SYSTEM') AND TIMESTAMP > '10-jan-2003 15:59:53';
5.关闭LogMiner会话
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
1.1.5 跟踪内部字典的DDL语句
其他步骤与上节相同,唯一不同的事步骤3开始分析,如下:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(- OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS + - DBMS_LOGMNR.DDL_DICT_TRACKING + - DBMS_LOGMNR.COMMITTED_DATA_ONLY + - DBMS_LOGMNR.PRINT_PRETTY_SQL);
1.1.6 通过时间范围过滤输出
前面的例子中都是通过查询分析结果的时间限定的SQL子句来过滤输出结果,然而有一个更高效的方法来达到这个目的,这就是通过指定DBMS_LOGMNR.START_LOGMNR的时间范围。
1.创建重做日志列表
-- -- my_add_logfiles -- Add all archived logs generated after a specified start_time. -- CREATE OR REPLACE PROCEDURE my_add_logfiles (in_start_time IN DATE) AS CURSOR c_log IS SELECT NAME FROM V$ARCHIVED_LOG WHERE FIRST_TIME >= in_start_time; count pls_integer := 0; my_option pls_integer := DBMS_LOGMNR.NEW; BEGIN FOR c_log_rec IN c_log LOOP DBMS_LOGMNR.ADD_LOGFILE(LOGFILENAME => c_log_rec.name, OPTIONS => my_option); my_option := DBMS_LOGMNR.ADDFILE; DBMS_OUTPUT.PUT_LINE('Added logfile ' || c_log_rec.name); END LOOP; END; / EXECUTE my_add_logfiles(in_start_time => '13-jan-2003 14:00:00');
2.查询V$LOGMNR_LOGS确定重做日志文件列表
SQL> SELECT FILENAME name, LOW_TIME start_time, FILESIZE bytes FROM V$LOGMNR_LOGS;
3.调整重做日志列表
假定要分析的时产生于3 p.m.到4 p.m的重做日志文件:
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(- STARTTIME => '13-jan-2003 15:00:00', - ENDTIME => '13-jan-2003 16:00:00', - OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + - DBMS_LOGMNR.COMMITTED_DATA_ONLY + - DBMS_LOGMNR.PRINT_PRETTY_SQL);
4.查询V$LOGMNR_CONTENTS
SQL> SELECT TIMESTAMP, (XIDUSN || '.' || XIDSLT || '.' || XIDSQN) AS XID, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'OE';
5.关闭LogMiner会话
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
1.2 未指定重做日志文件列表的LogMiner实例
上一节的诸多实例都是显式指定要分析的重做日志文件或者归档文件,但是,对于同一数据库生成的重做日志文件,可以通过指定时间或者SCN范围来确定要分析的重做日志列表,这个可以通过使用DBMS_LOGMNR.START_LOGMNR过程的DBMS_LOGMNR.CONTINUOUS_MINE来完成。
1.2.1 在给定的时间范围内分析重做日志
1.确定包含数据字典起始的重做日志文件时间戳
SQL> SELECT NAME, FIRST_TIME FROM V$ARCHIVED_LOG WHERE SEQUENCE# = (SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG WHERE DICTIONARY_BEGIN = 'YES');
2.查出该时间戳到现在所有的重做日志
该步骤不是必须的,但是它可以用来证明CONTINUOUS_MINE是按预期来进行的,用来步骤4作对比。
SQL> SELECT FILENAME name FROM V$LOGMNR_LOGS WHERE LOW_TIME > '10-jan-2003 12:01:34';
3.开始分析
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(- STARTTIME => '10-jan-2003 12:01:34', - ENDTIME => SYSDATE, - OPTIONS => DBMS_LOGMNR.DICT_FROM_REDO_LOGS + - DBMS_LOGMNR.COMMITTED_DATA_ONLY + - DBMS_LOGMNR.PRINT_PRETTY_SQL + - DBMS_LOGMNR.CONTINUOUS_MINE);
4.查询V$LOGMNR_LOGS
该步骤用来显示带有CONTINUOUS_MINE参数的DBMS_LOGMNR.START_LOGMNR过程所执行的所有的重做日志文件,参见步骤2.
SQL> SELECT FILENAME name FROM V$LOGMNR_LOGS;
5.查询V$LOGMNR_CONTENTS
SQL> SELECT USERNAME AS usr,(XIDUSN || '.' || XIDSLT || '.' || XIDSQN) as XID, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER IS NULL OR SEG_OWNER NOT IN ('SYS', 'SYSTEM') AND TIMESTAMP > '10-jan-2003 15:59:53';
6.关闭LogMiner会话
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
1.2.2 在给定的SCN范围内分析重做日志
1.确定上一检查点的SCN
SQL> SELECT CHECKPOINT_CHANGE#, CURRENT_SCN FROM V$DATABASE;
2.开始LogMiner并指定CONTINUOUS_MINE
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(- STARTSCN => 56453576, - ENDSCN => 56454208, - OPTIONS => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + - DBMS_LOGMNR.COMMITTED_DATA_ONLY + - DBMS_LOGMNR.PRINT_PRETTY_SQL + - DBMS_LOGMNR.CONTINUOUS_MINE);
3.查询LogMiner中的重做日志列表
SQL> SELECT FILENAME name, LOW_SCN, NEXT_SCN FROM V$LOGMNR_LOGS;
请注意,LogMiner添加的重做日志文件不包括整个SCN范围,当用指定CONTINUOUS_MINE参数来执行DBMS_LOGMNR.START_LOGMNR时,LogMiner仅仅是添加归档日志。根据查询需要,LogMiner会自动添加SCN范围内其他的在线重做日志,用如下的SQL来确定最新的归档文件中是否包含了该重做日志文件。
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE SEQUENCE# = (SELECT MAX(SEQUENCE#) FROM V$ARCHIVED_LOG);
4.查询V$LOGMNR_CONTENTS
该查询不返回1.6.1911事务的SET TRANSACTION READ WRITE和COMMIT语句,因为这些语句没有SEG_OWNER。
SQL> SELECT SCN, (XIDUSN || '.' || XIDSLT || '.' || XIDSQN) as XID, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER NOT IN ('SYS', 'SYSTEM');
5.关闭LogMiner会话
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();
1.2.3 在包含未来值的查询中使用连续分析
指定一个查询到指定的时间或者SCN才停止,可以通过设置DBMS_LOGMNR.START_LOGMNR的CONTINUOUS_MINE参数和设置一个未来时间点的ENDTIME或未来的ENDSCN参数来达到目的。
下面的例子,假设你想使用在线字典来监控hr.employees表现在开始到5小时后所有的变化,
1.开始LogMiner
SQL> EXECUTE DBMS_LOGMNR.START_LOGMNR(- STARTTIME => SYSDATE, - ENDTIME => SYSDATE + 5/24, - OPTIONS => DBMS_LOGMNR.CONTINUOUS_MINE + - DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG);
2.查询V$LOGMNR_CONTENTS
该查询操作直到查到指定的时间范围内(5小时后)生成的第一个重做日志文件记录才会停止,当然你也可以通过Ctrl+C结束查询。本例中“SET ARRAYSIZE”语句使得查询结果格式可以跟它在重做日志文件中一样,如果不这样设置,那么查询结果的SQL会填满行才换行,不够美观易读。
SQL> SET ARRAYSIZE 1; SQL> SELECT USERNAME AS usr, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'HR' AND TABLE_NAME = 'EMPLOYEES';
3.停止LogMiner
SQL> EXECUTE DBMS_LOGMNR.END_LOGMNR();本文参阅Oracle官方文档翻译,不足之处欢迎批评指正!

oracle asm指的是“自动存储管理”,是一种卷管理器,可自动管理磁盘组并提供有效的数据冗余功能;它是做为单独的Oracle实例实施和部署。asm的优势:1、配置简单、可最大化推动数据库合并的存储资源利用;2、支持BIGFILE文件等。

方法:1、利用“select*from user_indexes where table_name=表名”语句查询表中索引;2、利用“select*from all_indexes where table_name=表名”语句查询所有索引。

在Oracle中,可利用lsnrctl命令查询端口号,该命令是Oracle的监听命令;在启动、关闭或重启oracle监听器之前可使用该命令检查oracle监听器的状态,语法为“lsnrctl status”,结果PORT后的内容就是端口号。

在oracle中,可以利用“TO_SINGLE_BYTE(String)”将全角转换为半角;“TO_SINGLE_BYTE”函数可以将参数中所有多字节字符都替换为等价的单字节字符,只有当数据库字符集同时包含多字节和单字节字符的时候有效。

在oracle中,可以利用“drop sequence sequence名”来删除sequence;sequence是自动增加数字序列的意思,也就是序列号,序列号自动增加不能重置,因此需要利用drop sequence语句来删除序列。

在oracle中,可以利用“select ... From all_tab_columns where table_name=upper('表名') AND owner=upper('数据库登录用户名');”语句查询数据库表的数据类型。

方法:1、利用“LOWER(字段值)”将字段转为小写,或者利用“UPPER(字段值)”将字段转为大写;2、利用“REGEXP_LIKE(字符串,正则表达式,'i')”,当参数设置为“i”时,说明进行匹配不区分大小写。

方法:1、利用“alter system set sessions=修改后的数值 scope=spfile”语句修改session参数;2、修改参数之后利用“shutdown immediate – startup”语句重启服务器即可生效。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

Atom编辑器mac版下载
最流行的的开源编辑器

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Dreamweaver Mac版
视觉化网页开发工具