怎么利用oracle的日志挖掘实现回滚
这篇文章主要讲解了“怎么利用oracle的日志挖掘实现回滚”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么利用oracle的日志挖掘实现回滚”吧!
archery对mysql的支持非常完美,虽然也支持oracle,但是对oracle只支持查询和执行,不支持备份和审核,还是有很大的遗憾。
现在,我们急需要一个oracle的备份功能,于是我想到了oracle自带的功能——日志挖掘,它可以实现sql语句的备份功能。
下面是我对日志挖掘的演示。
0、启动最小日志,这一步是为了日志更加详细,完整(必须)
alterdatabaseaddsupplementallogdata;
1、登录用户
SQL>connczx/xxx;Connected.
2、创建一张测试表
SQL>createtablet(idnumber,namevarchar2(10));Tablecreated.
3、插入一些测试数据
SQL>insertintotvalues(1,'a');1rowcreated.SQL>insertintotvalues(2,'b');1rowcreated.SQL>insertintotvalues(3,'c');1rowcreated.SQL>insertintotvalues(4,'d');1rowcreated.SQL>insertintotvalues(5,'e');1rowcreated.SQL>commit;Commitcomplete.SQL>select*fromt;IDNAME--------------------1a2b3c4d5e
4、 查看当前会话的sid和serial#
SQL>selects.sid,s.serial#fromv$sessionswheres.sid=(selectsidfromv$mystatwhererownum=1);SIDSERIAL#--------------------363755
5、查看当前数据库时间,供后面的starttime用
SQL>altersessionsetnls_date_format='yyyy-mm-ddhh34:mi:ss';Sessionaltered.SQL>selectsysdatefromdual;SYSDATE-------------------2020-03-1519:02:53
6、执行一些sql语句,模拟上线sql
SQL>deletefromtwhereid<3;2rowsdeleted.SQL>updatetsetname='dddd'whereid=4;1rowupdated.SQL>insertintotvalues(6,'f');1rowcreated.SQL>insertintotvalues(7,'g');1rowcreated.SQL>commit;Commitcomplete.SQL>select*fromt;IDNAME--------------------3c4dddd5e6f7g
7、再查看一下现在数据库时间,供后面的endtime用
SQL>selectsysdatefromdual;SYSDATE-------------------2020-03-1519:08:16
8、通过时间范围,用在线字典方式将redo日志自动加载到v$logmnr_contents这个视图中
注意:starttime和endtime就是上面获得的两个当前数据库时间。
SQL>begindbms_logmnr.start_logmnr(starttime=>to_date('2020-03-1519:02:53','yyyy-mm-ddhh34:mi:ss'),endtime=>to_date('2020-03-1519:08:16','yyyy/mm/ddhh34:mi:ss'),options=>dbms_logmnr.dict_from_online_catalog+dbms_logmnr.continuous_mine);end;/PL/SQLproceduresuccessfullycompleted.
9、查看v$logmnr_contents视图的sql_redo和sql_undo内容,就会得到上述执行sql的原始语句和对应的回滚语句
sql>SELECTsql_redo,sql_undo,SESSION#,serial#,username,OS_USERNAME,MACHINE_NAME,SESSION_INFO,operation,xidFROMv$logmnr_contentsWHERESESSION#=(SELECTs.sidFROMv$sessionsWHEREs.sid=(SELECTsidFROMv$mystatWHEREROWNUM=1))ANDserial#=(SELECTserial#FROMv$sessionsWHEREs.sid=(SELECTsidFROMv$mystatWHEREROWNUM=1));SESSION#SERIAL#USERNAMEOPERATIONXIDSQL_REDOSQL_UNDO------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------363755CZXSTART0A000900C8060000settransactionreadwrite;363755CZXDELETE0A000900C8060000deletefrom"CZX"."T"where"ID"='1'and"NAME"='a'andROWID='AAAVSdAAEAAinsertinto"CZX"."T"("ID","NAME")values('1','a');363755CZXDELETE0A000900C8060000deletefrom"CZX"."T"where"ID"='2'and"NAME"='b'andROWID='AAAVSdAAEAAinsertinto"CZX"."T"("ID","NAME")values('2','b');363755CZXUPDATE0A000900C8060000update"CZX"."T"set"NAME"='dddd'where"ID"='4'and"NAME"='d'andROWIDupdate"CZX"."T"set"NAME"='d'where"ID"='4'and"NAME"='dddd'andROWID363755CZXINSERT0A000900C8060000insertinto"CZX"."T"("ID","NAME")values('6','f');deletefrom"CZX"."T"where"ID"='6'and"NAME"='f'andROWID='AAAVSdAAEAA363755CZXINSERT0A000900C8060000insertinto"CZX"."T"("ID","NAME")values('7','g');deletefrom"CZX"."T"where"ID"='7'and"NAME"='g'andROWID='AAAVSdAAEAA363755CZXCOMMIT0A000900C8060000commit;7rowsselected
如果会vue.js和django,就可以把上面这个功能做成web界面形式的。
10、记得最后用完了关闭日志挖掘功能
SQL>begindbms_logmnr.end_logmnr;end;/PL/SQLproceduresuccessfullycompleted.
感谢各位的阅读,以上就是“怎么利用oracle的日志挖掘实现回滚”的内容了,经过本文的学习后,相信大家对怎么利用oracle的日志挖掘实现回滚这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。