通过generate解析SQL日志生成xml进行SQL回放

阅读: 评论:0

通过generate解析SQL日志生成xml进行SQL回放

通过generate解析SQL日志生成xml进行SQL回放

查看Oracle redo日志来分析SQL执行记录

1)设置Oracle数据字典导出路径参数(可选)

shutdown immediate
alter system set UTL_FILE_DIR='/opt/oracle/utl' scope=spfile; 
execute dbms_logmnr_d.build(dictionary_filename => 'a', dictionary_location => '/opt/oracle/utl');
startup

 

2)增加需要分析的重做日志文件(在线归档均可)

execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo01.log', options=>w);
execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo02.log', options=>w);
execute dbms_logmnr.add_logfile(LogFileName=>'/opt/oracle/OraBase/oradata/inomc/redo03.log', options=>w);

3)执行日志加载

使用数据字典

execute dbms_logmnr.start_logmnr(DictFileName=> '/opt/oracle/utl/a') ;

使用在线字典

execute dbms_logmnr.start_logmnr(Options=>dbms_logmnr.DICT_FROM_ONLINE_CATALOG) ;

4)查看日志

SELECT sql_redo FROM v$logmnr_contents;

5)结束分析,卸载日志
execute d_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

生成l,内容如下

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' || 'l' ); --注意必须先创建一个文件目录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 := d_root_prcn_scnr_pckg_read(p_psp_resp_doc);      l_xmltype := XmlType(resp_domdoc);      dbms_xmldom.freeDocument(resp_domdoc);      response_clob := ClobVal;      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文件是看不到节点内容里面有这些保留字的,都转换成了对应 的&amp, &gt, &lt, &apos, &quot.节点指定的是上面的Arwen或123,假如有名字(A&r<w>e'n")则保存到xml文件中应该改成 (A&ampr&gtw&lte&aposn&quot).如果用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' , &#l' , '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' , &#l' , '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' , &#l' , 'a' ,32767);      UTL_FILE.PUT_LINE_NCHAR(STAFFINFO , '</staff>' );      UTL_FILE.FFLUSH(STAFFINFO );      UTL_FILE.FCLOSE(STAFFINFO ); end ;

 

转载于:.html

本文发布于:2024-02-02 15:17:07,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170685822644653.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

上一篇:tsql 正则
下一篇:XML generate
标签:日志   generate   SQL   xml
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23