﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-深蓝的天空下,有你有我...-随笔分类-Oracle</title><link>http://www.blogjava.net/liuyxit/category/23254.html</link><description>共享酸、甜、苦、辣</description><language>zh-cn</language><lastBuildDate>Sat, 18 Jun 2011 20:43:08 GMT</lastBuildDate><pubDate>Sat, 18 Jun 2011 20:43:08 GMT</pubDate><ttl>60</ttl><item><title>用PL/SQL自动处理logminer恢复的数据</title><link>http://www.blogjava.net/liuyxit/archive/2011/06/19/352606.html</link><dc:creator>三刀流の逆风</dc:creator><author>三刀流の逆风</author><pubDate>Sat, 18 Jun 2011 18:11:00 GMT</pubDate><guid>http://www.blogjava.net/liuyxit/archive/2011/06/19/352606.html</guid><wfw:comment>http://www.blogjava.net/liuyxit/comments/352606.html</wfw:comment><comments>http://www.blogjava.net/liuyxit/archive/2011/06/19/352606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyxit/comments/commentRss/352606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyxit/services/trackbacks/352606.html</trackback:ping><description><![CDATA[--创建一个表来保存提取出来的sql
create table logmnr_content tablespace tools as  scn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents where 1=0;

--通过dba_objects 查到表对应的 object_id  and   data_object_id ,用来在log中提取该表相关的sql_undo
select object_id,data_object_id from dba_objects where object_name = ???

--通过在os中找到的归档日志范围，进行联机提取
将undo  sql 插入一个表中,比如我的日志序号范围是 5813 到 5850
为了防止临时空间不足，一个一个归档日志文件处理。


begin
for i in 5813..5850 loop



dbms_logmnr.add_logfile(LogFileName=>'/disk2/oradata/arch/crmcn/crmcn_1_'||i||'.arc');
dbms_logmnr.start_logmnr(Options => sys.dbms_logmnr.DICT_FROM_ONLINE_CATALOG);
dbms_logmnr.start_logmnr();

insert into logmnr_content(scn,cscn,TIMESTAMP,sql_undo )
select   scn,cscn,TIMESTAMP,sql_undo from v$logmnr_contents 
where DATA_OBJD# = 67540 ;

commit;
dbms_logmnr.end_logmnr();


end loop;


end;



--将提取出来的sql通过动态sql执行插入表

declare
sql_str varchar2(4000);
begin
for c in (select * from logmnr_content) loop
sql_str := replace(c.sql_undo,';','');
execute immediate sql_str;
end loop;
commit;
end;
注意：如果在这段日志中还有其他对该表的操作的话，可以结合操作类型  OPERATION  和 提交scn    cscn 来判断 到底是不是该恢复的这部分数据。
转自：http://www.itpub.net/thread-324926-1-1.html
<img src ="http://www.blogjava.net/liuyxit/aggbug/352606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyxit/" target="_blank">三刀流の逆风</a> 2011-06-19 02:11 <a href="http://www.blogjava.net/liuyxit/archive/2011/06/19/352606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>联机重做日志组损坏的处理</title><link>http://www.blogjava.net/liuyxit/archive/2008/08/14/221929.html</link><dc:creator>三刀流の逆风</dc:creator><author>三刀流の逆风</author><pubDate>Thu, 14 Aug 2008 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/liuyxit/archive/2008/08/14/221929.html</guid><wfw:comment>http://www.blogjava.net/liuyxit/comments/221929.html</wfw:comment><comments>http://www.blogjava.net/liuyxit/archive/2008/08/14/221929.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyxit/comments/commentRss/221929.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyxit/services/trackbacks/221929.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#ff0066">做以后操作前,强烈建议做好备份。</font>
		</p>
		<p>1.查看日志组的使用情况<br />SQL&gt; select * from v$log;<br />2.查日志组对应的物理文件<br />SQL&gt; select member from v$logfile;<br />3.删除损坏的日志组,例如1<br />SQL&gt; alter database drop logfile group 1;<br />4.删除日志成员文件<br />SQL&gt; ! rm /opt/oracle/oradata/means/redo01.log<br />5.创建日志成员文件<br />SQL&gt; alter databasee add logfile group 1 '/opt/oracle/oradata/means/redo01.log' size 300m;<br />6.切换当前日志组<br />SQL&gt; alter system switch logfile;<br />7.多个日志组重建或修改大小，需重复步骤 3 - 6。</p>
<img src ="http://www.blogjava.net/liuyxit/aggbug/221929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyxit/" target="_blank">三刀流の逆风</a> 2008-08-14 11:36 <a href="http://www.blogjava.net/liuyxit/archive/2008/08/14/221929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>实战:在linux as4的oracle9i (9.2.0.6.0)利用logminer恢复误删数据</title><link>http://www.blogjava.net/liuyxit/archive/2007/07/10/129468.html</link><dc:creator>三刀流の逆风</dc:creator><author>三刀流の逆风</author><pubDate>Tue, 10 Jul 2007 15:39:00 GMT</pubDate><guid>http://www.blogjava.net/liuyxit/archive/2007/07/10/129468.html</guid><wfw:comment>http://www.blogjava.net/liuyxit/comments/129468.html</wfw:comment><comments>http://www.blogjava.net/liuyxit/archive/2007/07/10/129468.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyxit/comments/commentRss/129468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyxit/services/trackbacks/129468.html</trackback:ping><description><![CDATA[
		<p>实战:在linux as4的oracle9i (9.2.0.6.0)利用logminer恢复误删数据<br />author: LiuYX<br />date:2007-06-23 <br />Blog: <a title="我的BLOG" href="/liuyxit" target="_blank">http://www.blogjava.net/liuyxit</a></p>
		<p>   今天在客户现场开发，突然计划排产员跑了上来，说发现一件很奇怪的事，刚打印的生产计划单，再也找不到了，另有一张未审的单也同时不见了。<br />打开应用系统的日志，发现他只删了一张单，经确认这张是的确要删的单据，并不是上面两张单的其中之一。<br />   唯一解析是有人误删了这两张单,没有办法之下只有查看Oracle的操作日志了,于是logminer就摆了上台,之前大部分在测试环境下操作,这次来了个实战,心底未免有些紧张。<br />下面记录恢复过程以备后用!</p>
		<p>1.打开SecureCRT用root用户登陆数据服务器</p>
		<p>2.转到oracle用户<br />su - oracle</p>
		<p>3.运行sqlplus,用管理员权限连接<br />sqlplus /nolog<br />SQL&gt; conn /as sysdba</p>
		<p>4.先查一下系统参数UTL_FILE_DIR的当前值<br />SQL&gt; show parameter UTL_FILE_DIR</p>
		<p>NAME                                 TYPE        VALUE<br />------------------------------------ ----------- ------------------------------<br />utl_file_dir                         string      </p>
		<p>当前还没有设值,好!那就设吧<br />alter system set UTL_FILE_DIR ='/home/oracle/logdict' scope=both;</p>
		<p>发现出错<br />ERROR at line 1:<br />ORA-02095: specified initialization parameter cannot be modified</p>
		<p>才发现原来一些参数不能即时生效的，必须修改到spfile，重启数据库才可以。只好：<br />alter system set UTL_FILE_DIR ='/home/oracle/logdict' scope=spfile;</p>
		<p>5.关闭实例,并重新开闭<br />shutdown immediate;<br />startup;</p>
		<p>6.安装logminer工具需要运行下面两个sql(环境变量$ORACLE_HOME用实际的路径代替)<br />SQL&gt; @$ORACLE_HOME/rdbms/admin/dbmslm.sql<br />SQL&gt; @$ORACLE_HOME/rdbms/admin/dbmslmd.sql<br />注：　这两个脚本必须均以SYS用户身份运行。其中第一个脚本用来创建DBMS_LOGMNR包，该包用来分析日志文件。第二个脚本用来创建DBMS_LOGMNR_D包，该包用来创建数据字典文件。</p>
		<p>
				<br />7.创建数据字典文件<br />EXECUTE dbms_logmnr_d.build( 'dictionary.ora', '/home/oracle/logdict'); </p>
		<p>注:第二个参数的路径应该先建好,如<br />cd /home/oracle<br />mkdir logdict</p>
		<p>8.加入需要分析的在线重作日志文件<br />EXECUTE dbms_logmnr.add_logfile('/opt/oracle/oradata/means/redo01.log', dbms_logmnr.new);<br />EXECUTE dbms_logmnr.add_logfile('/opt/oracle/oradata/means/redo02.log', dbms_logmnr.addfile);<br />EXECUTE dbms_logmnr.add_logfile('/opt/oracle/oradata/means/redo03.log', dbms_logmnr.addfile);</p>
		<p>注：<br />如果需要从分析列表里去掉一个文件用<br />EXECUTE dbms_logmnr.add_logfile('d:\ORACLE\ORADATA\ORA\REDO03_1.LOG',dbms_logmnr.removefile);</p>
		<p>查询在线日志文件用<br />select * from v$log; --根据显示结果可知当前日志的组号为2</p>
		<p>GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS<br />---------- ---------- ---------- ---------- ---------- --- ----------------<br />FIRST_CHANGE# FIRST_TIM<br />------------- ---------<br />         1          1        169  104857600          1 NO  INACTIVE<br />     14162736 23-JUN-07</p>
		<p>         2          1        170  104857600          1 NO  CURRENT<br />     14181604 23-JUN-07</p>
		<p>         3          1        171  104857600          1 NO  INACTIVE<br />     14230307 23-JUN-07</p>
		<p>
				<br />select * from v$logfile; --/根据组号可以找到对应的日志文件为redo02.log<br /> GROUP# STATUS  TYPE<br />---------- ------- -------<br />MEMBER<br />--------------------------------------------------------------------------------<br />         1         ONLINE<br />/opt/oracle/oradata/means/redo01.log</p>
		<p>         2         ONLINE<br />/opt/oracle/oradata/means/redo02.log</p>
		<p>         3         ONLINE<br />/opt/oracle/oradata/means/redo03.log</p>
		<p>如果确认操作是在当前日志中，可以只分析redo02.log。</p>
		<p>9.执行日志分析(全部分析出来)<br />EXECUTE dbms_logmnr.start_logmnr( DictFileName=&gt;'/home/oracle/logdict/dictionary.ora'); </p>
		<p>不知为什么，我按网上的资料定了日期段,就是不通过,执行结果如下：<br />EXECUTE dbms_logmnr.start_logmnr( DictFileName =&gt; '/home/oracle/logdict/dictionary.ora',StartTime =&gt; to_date('2007-6-23 00:00:00','YYYY-MM-DD HH24:MI:SS'),EndTime =&gt; to_date('2007-6-23 11:00:00','YYYY-MM-DD HH24:MI:SS')); <br />ERROR at line 1:<br />ORA-01291: missing logfile<br />ORA-06512: at "SYS.DBMS_LOGMNR", line 53<br />ORA-06512: at line 1</p>
		<p>10.这时可就可根据V$logmnr_contents视图的内容来查阅数据的历史操作了</p>
		<p>11.导出执行过的sql<br />set   heading   off<br />spool /home/oracle/logdict/log.txt  <br />SELECT sql_redo FROM V$logmnr_contents WHERE sql_redo like 'delete from "MEANS"."AL_MAIN_PLAN" where "L_ORDER_ID" = ''6073''%';<br />spool off</p>
		<p>12.后来发现有更方便的方法<br />create table means.log_contents as select * from V$logmnr_contents</p>
		<p>13.然后用toad来查就更方便了!</p>
		<p>
				<br />如有错漏请高手指教，TKS!</p>
		<p>附v$logmnr_contents的结构和常用字段说明</p>
		<p> Name                                      Null?    Type<br /> ----------------------------------------- -------- ----------------------------<br /> SCN                                                NUMBER --System Change Number 可用select dbms_flashback.get_system_change_number from dual;获得当前改变号<br /> CSCN                                               NUMBER<br /> TIMESTAMP                                          DATE --执行操作的时间<br /> COMMIT_TIMESTAMP                                   DATE<br /> THREAD#                                            NUMBER<br /> LOG_ID                                             NUMBER<br /> XIDUSN                                             NUMBER<br /> XIDSLT                                             NUMBER<br /> XIDSQN                                             NUMBER<br /> PXIDUSN                                            NUMBER<br /> PXIDSLT                                            NUMBER<br /> PXIDSQN                                            NUMBER<br /> RBASQN                                             NUMBER<br /> RBABLK                                             NUMBER<br /> RBABYTE                                            NUMBER<br /> UBAFIL                                             NUMBER<br /> UBABLK                                             NUMBER<br /> UBAREC                                             NUMBER<br /> UBASQN                                             NUMBER<br /> ABS_FILE#                                          NUMBER<br /> REL_FILE#                                          NUMBER<br /> DATA_BLK#                                          NUMBER<br /> DATA_OBJ#                                          NUMBER<br /> DATA_OBJD#                                         NUMBER<br /> SEG_OWNER                                          VARCHAR2(32)<br /> SEG_NAME                                           VARCHAR2(256)<br /> SEG_TYPE                                           NUMBER<br /> SEG_TYPE_NAME                                      VARCHAR2(32)<br /> TABLE_SPACE                                        VARCHAR2(32)<br /> ROW_ID                                             VARCHAR2(19)<br /> SESSION#                                           NUMBER<br /> SERIAL#                                            NUMBER<br /> USERNAME                                           VARCHAR2(30)<br /> SESSION_INFO                                       VARCHAR2(4000)<br /> TX_NAME                                            VARCHAR2(256)<br /> ROLLBACK                                           NUMBER<br /> OPERATION                                          VARCHAR2(32)<br /> OPERATION_CODE                                     NUMBER<br /> SQL_REDO                                           VARCHAR2(4000)<br /> SQL_UNDO                                           VARCHAR2(4000)<br /> RS_ID                                              VARCHAR2(32)<br /> SEQUENCE#                                          NUMBER<br /> SSN                                                NUMBER<br /> CSF                                                NUMBER<br /> INFO                                               VARCHAR2(32)<br /> STATUS                                             NUMBER<br /> REDO_VALUE                                         RAW(4)<br /> UNDO_VALUE                                         RAW(4)<br /> SQL_COLUMN_TYPE                                    VARCHAR2(32)<br /> SQL_COLUMN_NAME                                    VARCHAR2(32)<br /> REDO_LENGTH                                        NUMBER<br /> REDO_OFFSET                                        NUMBER<br /> UNDO_LENGTH                                        NUMBER<br /> UNDO_OFFSET                                        NUMBER</p>
<img src ="http://www.blogjava.net/liuyxit/aggbug/129468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyxit/" target="_blank">三刀流の逆风</a> 2007-07-10 23:39 <a href="http://www.blogjava.net/liuyxit/archive/2007/07/10/129468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让oracle穿透windosXP sp2防火墙</title><link>http://www.blogjava.net/liuyxit/archive/2007/06/10/123190.html</link><dc:creator>三刀流の逆风</dc:creator><author>三刀流の逆风</author><pubDate>Sun, 10 Jun 2007 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/liuyxit/archive/2007/06/10/123190.html</guid><wfw:comment>http://www.blogjava.net/liuyxit/comments/123190.html</wfw:comment><comments>http://www.blogjava.net/liuyxit/archive/2007/06/10/123190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuyxit/comments/commentRss/123190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuyxit/services/trackbacks/123190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这几天在客户处现声开发，苦于不能Share自己的Oracle出来,搞得忙于同步结构并且浪费空间(和同事都装了Oracle)。<br>今天终于找到解决方法，记录于此(让oracle穿透windosXP sp2防火墙)！&nbsp;&nbsp;<a href='http://www.blogjava.net/liuyxit/archive/2007/06/10/123190.html'>阅读全文</a><img src ="http://www.blogjava.net/liuyxit/aggbug/123190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuyxit/" target="_blank">三刀流の逆风</a> 2007-06-10 15:10 <a href="http://www.blogjava.net/liuyxit/archive/2007/06/10/123190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>