DM7闪回与闪回查询
闪回
当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。
闪回技术主要是通过回滚段存储的UNDO记录来完成历史记录的还原。设置ENABLE_FLASHBACK为1后,开启闪回功能。DM会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由UNDO_RETENTION参数指定。
SQL>selectsf_get_para_value(1,'ENABLE_FLASHBACK');LINEIDSF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')-------------------------------------------------10usedtime:204.313(ms).Executeidis62.SQL>selectsf_get_para_value(1,'UNDO_RETENTION');LINEIDSF_GET_PARA_VALUE(1,'UNDO_RETENTION')-----------------------------------------------190usedtime:6.236(ms).Executeidis63.
下面修改动态参数ENABLE_FLASHBACK,scope=1同时修改内存和dm.ini文件
SQL>callsp_set_para_value(1,'ENABLE_FLASHBACK',1);DMSQLexecutedsuccessfullyusedtime:13.216(ms).Executeidis64.SQL>selectsf_get_para_value(1,'ENABLE_FLASHBACK');LINEIDSF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')-------------------------------------------------11usedtime:5.703(ms).Executeidis65.
回滚段保留的时间缺省值为90秒,我们要修改它为1天
SQL>selectsf_get_para_value(1,'UNDO_RETENTION');LINEIDSF_GET_PARA_VALUE(1,'UNDO_RETENTION')-----------------------------------------------190usedtime:6.236(ms).Executeidis63.SQL>callsp_set_para_value(1,'UNDO_RETENTION',86400);DMSQLexecutedsuccessfullyusedtime:7.155(ms).Executeidis74.SQL>selectsf_get_para_value(1,'UNDO_RETENTION');LINEIDSF_GET_PARA_VALUE(1,'UNDO_RETENTION')-----------------------------------------------186400usedtime:5.877(ms).Executeidis75.
开启闪回功能后,DM会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的UNDO记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于DROP等误操作不能恢复。闪回特性可应用在以下方面:
1. 自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;
2. 用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。
闪回查询
当系统INI参数ENABLE_FLASHBACK置为1时,闪回功能开启,可以进行闪回查询。MPP环境不支持闪回查询。
SQL>selectsf_get_para_value(1,'ENABLE_FLASHBACK');LINEIDSF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')-------------------------------------------------11usedtime:5.703(ms).Executeidis65.[root@shard1jydm]#stringsdm.ini|grepflashENABLE_FLASHBACK=1#Whethertoenableflashbackfunction
闪回查询子句
闪回查询子句的语法,是在数据查询语句(参考第4章)的基础上,为FROM子句增加了闪回查询子句。
语法格式
< 闪回查询子句>::=WHEN |
参数
1.time_exp 一个日期表达式,一般用字符串方式表示
2.trxid 指定事务ID号
语句功能
用户通过闪回查询子句,可以得到指定表过去某时刻的结果集。指定条件可以为时刻,或事务号
使用说明
1.闪回查询只支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图;
2.闪回查询中trxid的值,一般需要由闪回版本查询(见下节)的伪列来确定。实际使用中多采用指定时刻的方式。
例1闪回查询特定时刻的PERSON_TYPE表。
查询PERSON_TYPE表。
SQL>SELECT*FROMPERSON.PERSON_TYPE;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表usedtime:15.321(ms).Executeidis78.
在插入数据之前记录时间,在闪回查询时使用
SQL>selectsysdate;LINEIDSYSDATE-------------------------------------12019-12-0123:34:12.761683usedtime:0.480(ms).Executeidis79.SQL>INSERTINTOPERSON.PERSON_TYPE(NAME)VALUES('防损员');affectrows1usedtime:0.615(ms).Executeidis80.SQL>INSERTINTOPERSON.PERSON_TYPE(NAME)VALUES('保洁员');affectrows1usedtime:0.562(ms).Executeidis81.SQL>commit;executedsuccessfullyusedtime:16.237(ms).Executeidis82.SQL>SELECT*FROMPERSON.PERSON_TYPE;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表57防损员68保洁员6rowsgotusedtime:0.626(ms).Executeidis83.
使用闪回查询取得2019-12-01 23:34:12时刻的数据。此时刻在插入数据的操作之前,可见此时的结果集不应该有2019-12-01 23:34:12时刻以后插入的数据。
SQL>SELECT*FROMPERSON.PERSON_TYPEWHENTIMESTAMP'2019-12-0123:34:12';LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表usedtime:1.416(ms).Executeidis84.
在2019-12-01 23:39:26时刻删除数据,并提交。
SQL>selectsysdate;LINEIDSYSDATE-------------------------------------12019-12-0123:39:26.865328usedtime:0.580(ms).Executeidis85.SQL>DELETEFROMPERSON.PERSON_TYPEWHEREPERSON_TYPEID>5;affectrows2usedtime:1.797(ms).Executeidis86.SQL>commit;executedsuccessfullyusedtime:19.834(ms).Executeidis87.SQL>SELECT*FROMPERSON.PERSON_TYPE;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表55防损员usedtime:0.691(ms).Executeidis88.
使用闪回查询得到删除前的数据。
SQL>SELECT*FROMPERSON.PERSON_TYPEWHENTIMESTAMP'2019-12-0123:39:26';LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表55防损员66保洁员6rowsgotusedtime:1.262(ms).Executeidis89.
闪回查询指定TRXID的PERSON_TYPE表。
要获得TRXID信息,需要通过闪回版本查询的伪列VERSIONS_ENDTRXID。
在2019-12-01 23:45:27 时刻修改数据,并提交。
SQL>selectsysdate;LINEIDSYSDATE-------------------------------------12019-12-0123:48:27.983996usedtime:0.509(ms).Executeidis90.SQL>SELECT*FROMPERSON.PERSON_TYPE;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表59防损员610保洁员6rowsgotusedtime:0.515(ms).Executeidis97.SQL>UPDATEPERSON.PERSON_TYPESETNAME='保安员'WHEREPERSON_TYPEID=9;affectrows1usedtime:1.460(ms).Executeidis99.SQL>commit;executedsuccessfullyusedtime:16.640(ms).Executeidis100.SQL>UPDATEPERSON.PERSON_TYPESETNAME='收银员'WHEREPERSON_TYPEID=9;affectrows1usedtime:1.851(ms).Executeidis101.SQL>commit;executedsuccessfullyusedtime:16.781(ms).Executeidis102.SQL>SELECT*FROMPERSON.PERSON_TYPE;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表59收银员610保洁员6rowsgotusedtime:0.516(ms).Executeidis103.
进行闪回版本查询,确定TRXID。
SQL>SELECTVERSIONS_ENDTRXID,NAMEFROMPERSON.PERSON_TYPEVERSIONSBETWEENTIMESTAMP'2019-12-0123:48:27.983996'ANDSYSDATE;LINEIDVERSIONS_ENDTRXIDNAME--------------------------------------1NULL采购经理2NULL采购代表3NULL销售经理4NULL销售代表5NULL收银员6NULL保洁员7749195保安员7rowsgotusedtime:1.384(ms).Executeidis104.
根据TRXID确定版本。
SQL>SELECT*FROMPERSON.PERSON_TYPEWHENTRXID749195;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表59保安员610保洁员6rowsgotusedtime:1.261(ms).Executeidis105.
第二次更新的事务ID为749195,那么第一次更新的事务ID为749194
SQL>SELECT*FROMPERSON.PERSON_TYPEWHENTRXID749194;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表59防损员610保洁员6rowsgot
闪回版本查询
语法格式
< 闪回版本查询子句>::=VERSIONS BETWEEN |
参数
1.time_exp 日期表达式,一般用字符串方式表示。time_exp1表示起始时间,time_exp2表示结束时间
2. trxid 指定事务ID号,整数表示。trxid1表示起始trxid,trxid2表示结束trxid
使用说明
1.闪回版本查询支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图;
2.支持伪列,作为闪回版本查询的辅助信息。
伪列 说明
VERSIONS_START{TRXID|TIME} 起始TRXID或时间戳
VERSIONS_END{TRXID|TIME} 提交TRXID或时间戳。如果该值为NULL,表示行版本仍然是当前版本
VERSIONS_OPERATION 在行上的操作(I=Insert,D=Delete,U=Update)
语句功能
用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录。指定条件可以为时刻,或事务号。
例1 闪回版本查询指定时间段内,PERSON_TYPE表的记录变化
SQL>selectsysdate;LINEIDSYSDATE-------------------------------------12019-12-0200:00:18.221877usedtime:0.662(ms).Executeidis107.
在2019-12-02 00:00:18时刻修改数据,并提交。
SQL>UPDATEPERSON.PERSON_TYPESETNAME='打字员'WHEREPERSON_TYPEID=9;affectrows1usedtime:1.758(ms).Executeidis110.SQL>commit;executedsuccessfullyusedtime:16.964(ms).Executeidis111.SQL>SQL>UPDATEPERSON.PERSON_TYPESETNAME='卫生员'WHEREPERSON_TYPEID=9;affectrows1usedtime:1.268(ms).Executeidis112.SQL>commit;executedsuccessfullyusedtime:15.983(ms).Executeidis113.SQL>SELECT*FROMPERSON.PERSON_TYPE;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表59卫生员610保洁员6rowsgotusedtime:0.669(ms).Executeidis114.
进行闪回版本查询,获得指定时间段内变化的记录。
SQL>SELECTVERSIONS_ENDTRXID,NAMEFROMPERSON.PERSON_TYPEVERSIONSBETWEENTIMESTAMP'2019-12-0200:00:17'ANDSYSDATE;LINEIDVERSIONS_ENDTRXIDNAME--------------------------------------1NULL采购经理2NULL采购代表3NULL销售经理4NULL销售代表5NULL卫生员6NULL保洁员7749197打字员7rowsgotusedtime:1.412(ms).Executeidis115.
第二次更新的事务ID为749197
SQL>SELECT*FROMPERSON.PERSON_TYPEWHENTRXID749197;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表59打字员610保洁员6rowsgotusedtime:1.371(ms).Executeidis120.
第一次更新的事务ID为749196
SQL>SELECT*FROMPERSON.PERSON_TYPEWHENTRXID749196;LINEIDPERSON_TYPEIDNAME-------------------------------11采购经理22采购代表33销售经理44销售代表59收银员610保洁员6rowsgotusedtime:0.585(ms).Executeidis121.
闪回事务查询
闪回事务查询提供系统视图V$FLASHBACK_TRX_INFO供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。
使用说明
系统视图名为V$FLASHBACK_TRX_INFO,定义如下所示。
SQL>descV$FLASHBACK_TRX_INFOLINEIDNAMETYPE$NULLABLE-----------------------------------------------1START_TRXIDBIGINTY事务中第一个DML的TRXID2START_TIMESTAMPDATETIME(6)Y事务中第一个DML的时间戳3COMMIT_TRXIDBIGINTY提交事务的TRXID4COMMIT_TIMESTAMPDATETIME(6)Y提交事务时的时间戳5LOGIN_USERVARCHAR(256)Y拥有事务的用户6UNDO_CHANGE#INTEGERY记录修改顺序序号7OPERATIONCHAR(1)YDML操作类型D:删除;U:修改;I:插入;N:更新插入(专门针对CLUSTERPRIMARYKEY的插入);C:事务提交;P:预提交记录;O:default8TABLE_NAMEVARCHAR(256)YDML修改的表9TABLE_OWNERVARCHAR(256)YDML修改表的拥有者10ROW_IDBIGINTYDML修改行的ROWID11UNDO_SQLVARCHAR(3900)Y撤销DML操作的SQL语句11rowsgotusedtime:88.801(ms).Executeidis122.
查询指定时间之后的事务信息,可为闪回查询操作提供参考
SQL>SELECT*FROMV$FLASHBACK_TRX_INFOWHERECOMMIT_TIMESTAMP>'2019-12-0123:13:28';LINEIDSTART_TRXIDSTART_TIMESTAMPCOMMIT_TRXIDCOMMIT_TIMESTAMPLOGIN_USERUNDO_CHANGE#OPERATIONTABLE_NAMETABLE_OWNERROW_IDUNDO_SQL----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------17491892019-12-0123:13:28.0000007491902019-12-0123:33:57.588000SYSDBA16CNULLNULLNULLNULLusedtime:1.437(ms).Executeidis126.
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。