通过generate解析SQL日志生成xml进行SQL回放
1)设置Oracle数据字典导出路径参数(可选)
shutdown immediate
alter system set UTL_FILE_DIR='/opt/oracle/utl' scope=spfile;
execute dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora', dictionary_location => '/opt/oracle/utl');
startup
2)增加需要分析的重做日志文件(在线归档均可)
execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo01.log', options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo02.log', options=>dbms_logmnr.new);
execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo03.log', options=>dbms_logmnr.new);
3)执行日志加载
使用数据字典
execute dbms_logmnr.start_logmnr(DictFileName=> '/opt/oracle/utl/logminer_dict.ora') ;
使用在线字典
execute dbms_logmnr.start_logmnr(Options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG) ;
4)查看日志
SELECT sql_redo FROM v$logmnr_contents;
5)结束分析,卸载日志
execute dbms_logmnr.end_logmnr;
在PL/SQL中利用XML ,Oracle提供了几个组件,让开发人员能轻松地利用XML技术。这些组件包括:
1.XML分析程序。即用来分析、构造和验证XML文档。
2.XPath引擎。它是使用Xpath(XML标准的另一个元素)说明语法在内存中搜索XML文档的实用程序。SLT处理器。它在Oracle数据库中支持XSLT,允许您把XML文档转换成其他格式。
3.XML SQL实用程序。可以使用SQL产生XML文档,使您可以在Oracle数据库表格中轻松地插入基于XML的数据。
对于PL/SQL开发人员而言,XML分析程序是最重要的组件。通过它,您可以在Oracle数据库中分析、操纵和转换XML文档。XML分析程序由一套APIs(应用程序编程接口)构成。

===================================================================================================================================================================================
xml generate
生成Test.xml,内容如下
|
1
2
3
4
5
6
7
8
9
10
|
<staff content = "name and id"> <member> <name>Arwen</name> <eno>123</eno> </member> <member> <name>Tom</name> <eno>456</eno> </member> </staff> |
1.生成xml的plsql code:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
declare doc XMLDOM.DOMDOCUMENT; doc_node XMLDOM.DOMNODE; root_node XMLDOM.DOMNODE; user_node XMLDOM.DOMNODE; item_node XMLDOM.DOMNODE; root_elmt XMLDOM.DOMELEMENT; user_elmt XMLDOM.DOMELEMENT; item_elmt XMLDOM.DOMELEMENT; item_text XMLDOM.DOMTEXT;begin doc := XMLDOM.NEWDOMDOCUMENT; xmldom.setVersion(doc, '1.0'); xmldom.setCharset(doc, 'UTF-8'); --根节点 doc_node := XMLDOM.MAKENODE(doc); root_elmt := XMLDOM.CREATEELEMENT(doc,'staff'); XMLDOM.SETATTRIBUTE(root_elmt,'content ','name and id'); root_node:=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(root_elmt)); --节点1 user_elmt := XMLDOM.CREATEELEMENT(doc,'member'); user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt)); item_elmt :=XMLDOM.CREATEELEMENT(doc,'name'); item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt)); item_text := XMLDOM.CREATETEXTNODE(doc,'Arwen'); item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text)); item_elmt :=XMLDOM.CREATEELEMENT(doc,'eno'); item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt)); item_text := XMLDOM.CREATETEXTNODE(doc,'123'); item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text)); --节点2 user_elmt := XMLDOM.CREATEELEMENT(doc,'member'); user_node :=XMLDOM.APPENDCHILD(root_node, XMLDOM.MAKENODE(user_elmt)); item_elmt :=XMLDOM.CREATEELEMENT(doc,'name'); item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt)); item_text := XMLDOM.CREATETEXTNODE(doc,'tom'); item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text)); item_elmt :=XMLDOM.CREATEELEMENT(doc,'eno'); item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt)); item_text := XMLDOM.CREATETEXTNODE(doc,'456'); item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text)); --写入操作系统文件中 XMLDOM.WRITETOFILE(doc,'DIR'||'\Test.xml');--注意必须先创建一个文件目录dir --可以通过语句 : create or replace directory dir as 'd:\temp' XMLDOM.FREEDOCUMENT(doc); end; |
2.将xml encode 成clob 写入文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
declare l_f utl_file.file_type; clobpart varchar2(2048); offset integer; l_xmltype XMLTYPE; cloblen integer; response_clob CLOB; resp_domdoc DBMS_XMLDOM.DOMDOCUMENT;begin l_f := utl_file.fopen('TEST_DIR',l_full_file_name,'w'); utl_file.put_line(l_f,'<?xml version="1.0" encoding="utf-8" standalone="yes"?>'||chr(13)); resp_domdoc := SoapEncPrcnScnrPckgRead.encd_root_prcn_scnr_pckg_read(p_psp_resp_doc); l_xmltype := dbms_xmldom.getXmlType(resp_domdoc); dbms_xmldom.freeDocument(resp_domdoc); response_clob := l_xmltype.getClobVal; cloblen := LENGTH(response_clob); while offset < cloblen loop clobPart := dbms_lob.substr(response_clob, 1024, offset); utl_file.put(l_f, clobPart); offset := offset + 1024; end loop; utl_file.fflush(l_f); utl_file.fclose(l_f);end;/ |
3.结合使用XMLDOM和utl_file
这样生成XML文件非常方便,能满足一般的应用了.但是XMLDOM有个缺点,就是一次性在内存中生成所有xml文件内容,然后写入到磁盘文件中.如果 xml文件太大,比如说有个table有几个G,想把它保存成xml文件.这样可能就会出现内存不足,生成文件失败.那该咋整呢?
可能首先想到的是用UTL_FILE去生成文件.
里面的内容全部手动写成xml格式的,然后保存成xml后缀的文件.这样确实可行.但有个麻烦问题时如果一些节点内容含有xml的五个保留字符的话 (&,<,>,'," 分别是和号,小于号,大于号,单引号,双引号),我们如果以文本方式打开xml文件是看不到节点内容里面有这些保留字的,都转换成了对应 的&, >, <, &apos, ".节点指定的是上面的Arwen或123,假如有名字(A&r<w>e'n")则保存到xml文件中应该改成 (A&r>w<e&aposn").如果用xmldom会默认去转换,不用我们管了.如 果用UTL_FILE必须手动写代码去转换.
假如有表staff(name varchar2(30), eno integer),里面有几个G的内容,要转换成开头讲的那种格式的xml文件。
--生成xml的代码其中XML文件的头和尾用UTL_FILE直接写入文件中,节点内容用xmldom生成,然后写到clob变量中,再把clob变量值用utl_file写入到xml文件中。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
declare STAFFINFO UTL_FILE.FILE_TYPE; v_temp clob; cursor c_table_info is select name,eno from staff; v_name varchar2(30); v_eno integer; doc XMLDOM.DOMDOCUMENT; doc_node XMLDOM.DOMNODE; root_node XMLDOM.DOMNODE; user_node XMLDOM.DOMNODE; item_node XMLDOM.DOMNODE; root_elmt XMLDOM.DOMELEMENT; user_elmt XMLDOM.DOMELEMENT; item_elmt XMLDOM.DOMELEMENT; item_text XMLDOM.DOMTEXT;begin --xml header STAFFINFO :=utl_file.fopen_nchar('DIR','Test.xml','W',32767);--跟前面说的一样必须先创建一个directory才行 UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,'<staff content = "name and id">'); UTL_FILE.FFLUSH(STAFFINFO );--直接写入到磁盘文件中,不会停留在内存中 UTL_FILE.FCLOSE(STAFFINFO ); open c_table_info; loop fetch c_table_info into v_name,v_eno; exit when c_table_info%notfound; --XML节点 doc := XMLDOM.NEWDOMDOCUMENT; xmldom.setCharset(doc, 'UTF-8'); doc_node := XMLDOM.MAKENODE(doc); user_elmt := XMLDOM.CREATEELEMENT(doc,'member'); user_node :=XMLDOM.APPENDCHILD(doc_node, XMLDOM.MAKENODE(user_elmt)); item_elmt :=XMLDOM.CREATEELEMENT(doc,'name'); item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt)); item_text := XMLDOM.CREATETEXTNODE(doc,v_name); item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text)); item_elmt :=XMLDOM.CREATEELEMENT(doc,'eno'); item_node :=XMLDOM.APPENDCHILD(user_node, XMLDOM.MAKENODE(item_elmt)); item_text := XMLDOM.CREATETEXTNODE(doc,'eno'); item_node:=XMLDOM.APPENDCHILD(item_node, XMLDOM.MAKENODE(item_text)); v_temp :=' '; --写入到临时变量v_temp中 XMLDOM.WRITETOCLOB(doc,v_temp); STAFFINFO :=utl_file.fopen_nchar('DIR','Test.xml','A',32767);--以a模式会在文件后添加内容,用w会覆盖之前的内容 UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,v_temp); UTL_FILE.FFLUSH(STAFFINFO ); UTL_FILE.FCLOSE(STAFFINFO ); XMLDOM.FREEDOCUMENT(doc); end loop; close c_table_info; --xml tail STAFFINFO :=utl_file.fopen_nchar('DIR','Test.xml','a',32767); UTL_FILE.PUT_LINE_NCHAR(STAFFINFO ,'</staff>'); UTL_FILE.FFLUSH(STAFFINFO ); UTL_FILE.FCLOSE(STAFFINFO );end; |
通过generate解析SQL日志生成xml进行SQL回放的更多相关文章
- ADO.NET 快速入门(十二):从 SQL Server 生成 XML 数据
本文演示如何使用2种不同的方法从 SQL Server 生成 XML. 方法1:使用了 SqlCommand 的 ExecuteXmlReader 方法获取 XmlReader,然后使用 Data ...
- mysql 打开sql日志,记录所有sql
我使用的mysql版本为:5.7.11 win7环境 记录下下载地址,省得每次百度搜了:http://dev.mysql.com/downloads/installer/ mysql 默认没有开启sq ...
- sql server 生成数据库字典 sql语句
SELECT TOP 100 PERCENT --a.id, CASE WHEN a.colorder = 1 THEN d.name ELSE '' END AS 表名, ...
- java 解析并生成 XML
在 java 中使用 Dom4j 解析 XML 对 XML 文件的解析,通常使用的是 Dom4j 和 jdom 作为XML解析工具. 在此只介绍下 Dom4j 对 XML 文件的解析使用方法. 1. ...
- sql server 操作xml例子
sql server 操作xml例子 /* sql xml 入门: --by jinjazz --http://blog.csdn.net/jinjazz 1.xml: 能认识元素.属性和值 2.xp ...
- Android 下用 Pull 解析和生成 XML
Java 中是可以用 SAX 和 DOM 解析 XML 的,虽然在 Android 下也可以用这2中方式,但是还是推荐用 Pull.Pull 使用简单,效率相对高,Android 下是集成了 Pul ...
- maven中使用dom4j解析、生成XML的简易方法
此片文章主要写一些关于如何在maven工程中使用dom4j来解析或生成XML的建议方法,实际可使用的写法不仅限于如下所写的样例代码.此处进攻快速入手和提供思路使用. 首先配置pom.xml中的依赖的包 ...
- Android 解析XML文件和生成XML文件
解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...
- 使用XML序列化器生成XML文件和利用pull解析XML文件
首先,指定XML格式,我指定的XML格式如下: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <message&g ...
随机推荐
- 雨后清风U盘启动盘的五大用处及制作方法
如果有一个U盘可以帮助你安装系统,或者在你的电脑系统崩溃时帮助你修复系统,是不是很方便呢?雨后清风U盘启动盘就能帮你实现这样的效果.除此之外,雨后清风U盘启动盘还有另外一些用处.下面就来和大家分享一下 ...
- Scyther GUI 攻击输出图的解释
1.在声明事件的安全属性的时候也就是整个过程要验证的 对象: Scythe 的安全属性 分为下面几种: Secrecy: 表示数据传输过程中是安全的,即使通过不信任的网络传也不能被攻击者获得 SKR ...
- 用js刷剑指offer(跳台阶)
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 牛客网链接 思路 这一题和斐波那契数列思路完全一样. 假如青蛙从第n个 ...
- 在 Queue 中 poll()和 remove()有什么区别?(未完成)
在 Queue 中 poll()和 remove()有什么区别?(未完成)
- 18 Candidates for the Top 10 Algorithms in Data Mining
Classification============== #1. C4.5 Quinlan, J. R. 1993. C4.5: Programs for Machine Learning.Morga ...
- java学习笔记13-重写与重载
重写 重写是子类对父类允许访问的方法实现过程进行重新编写,返回值和参数都不能变. 重写方法不能抛出新的检查异常和比被重写方法更加宽泛的异常 访问权限不能比被重写方法低 声明为final的方法不能被重写 ...
- 【Jenkins】忘记admin密码,可以用此方法帮你解决
突然有一日发现自己忘记了jenkins的管理员密码,因为我一直登录的是另外一个非管理员账户.如果出现必须要使用管理员账户操作的,比如用户管理那里的,必须要管理员账号吧,这就尴尬了. 很方的我打开安装j ...
- 大数据之路week03--day05(线程 I)
真的,身体这个东西一定要爱护好,难受的时候电脑都不想去碰,尤其是胃和肾... 这两天耽误了太多时间,今天好转了立刻学习,即刻不能耽误!. 话不多说,说正事: 1.多线程(理解) (1)多线程:一个应用 ...
- 02-命令篇——基础命令&常用命令
基础命令 docker 启动与停止 启动docker systemctl start docker 停止docker systemctl stop docker 重启docker systemctl ...
- python协程初步--gevent库使用以及解释什么是猴子补丁monkey_patch
协程工作的特点是遇到阻塞或耗时的任务时就切换,协程的生存依赖于线程,线程依赖于进程 一个似乎有点问题的例子 import gevent,time def kisscpc(num): for i in ...