閃回
當(dāng)用戶操作不慎導(dǎo)致錯(cuò)誤的刪改數(shù)據(jù)時(shí),非常希望有一種簡(jiǎn)單快捷的方式可以恢復(fù)數(shù)據(jù)。閃回技術(shù),就是為了用戶可以迅速處理這種數(shù)據(jù)邏輯損壞的情況而產(chǎn)生的。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到鐵嶺網(wǎng)站設(shè)計(jì)與鐵嶺網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、成都做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)頁(yè)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋鐵嶺地區(qū)。
閃回技術(shù)主要是通過(guò)回滾段存儲(chǔ)的UNDO記錄來(lái)完成歷史記錄的還原。設(shè)置ENABLE_FLASHBACK為1后,開啟閃回功能。DM會(huì)保留回滾段一段時(shí)間,回滾段保留的時(shí)間代表著可以閃回的時(shí)間長(zhǎng)度。由UNDO_RETENTION參數(shù)指定。
SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK'); LINEID SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK') ---------- --------------------------------------- 1 0 used time: 204.313(ms). Execute id is 62. SQL> select sf_get_para_value(1,'UNDO_RETENTION'); LINEID SF_GET_PARA_VALUE(1,'UNDO_RETENTION') ---------- ------------------------------------- 1 90 used time: 6.236(ms). Execute id is 63.
下面修改動(dòng)態(tài)參數(shù)ENABLE_FLASHBACK,scope=1同時(shí)修改內(nèi)存和dm.ini文件
SQL> call sp_set_para_value(1,'ENABLE_FLASHBACK',1); DMSQL executed successfully used time: 13.216(ms). Execute id is 64. SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK'); LINEID SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK') ---------- --------------------------------------- 1 1 used time: 5.703(ms). Execute id is 65.
回滾段保留的時(shí)間缺省值為90秒,我們要修改它為1天
SQL> select sf_get_para_value(1,'UNDO_RETENTION'); LINEID SF_GET_PARA_VALUE(1,'UNDO_RETENTION') ---------- ------------------------------------- 1 90 used time: 6.236(ms). Execute id is 63. SQL> call sp_set_para_value(1,'UNDO_RETENTION',86400); DMSQL executed successfully used time: 7.155(ms). Execute id is 74. SQL> select sf_get_para_value(1,'UNDO_RETENTION'); LINEID SF_GET_PARA_VALUE(1,'UNDO_RETENTION') ---------- ------------------------------------- 1 86400 used time: 5.877(ms). Execute id is 75.
開啟閃回功能后,DM會(huì)在內(nèi)存中記錄下每個(gè)事務(wù)的起始時(shí)間和提交時(shí)間。通過(guò)用戶指定的時(shí)刻,查詢到該時(shí)刻的事務(wù)號(hào),結(jié)合當(dāng)前記錄和回滾段中的UNDO記錄,就可以還原出特定事務(wù)號(hào)的記錄。即指定時(shí)刻的記錄狀態(tài)。從而完成閃回查詢。閃回查詢功能完全依賴于回滾段管理,對(duì)于DROP等誤操作不能恢復(fù)。閃回特性可應(yīng)用在以下方面:
1. 自我維護(hù)過(guò)程中的修復(fù):當(dāng)一些重要的記錄被意外刪除,用戶可以向后移動(dòng)到一個(gè)時(shí)間點(diǎn),查看丟失的行并把它們重新插入現(xiàn)在的表內(nèi)恢復(fù);
2. 用于分析數(shù)據(jù)變化:可以對(duì)同一張表的不同閃回時(shí)刻進(jìn)行鏈接查詢,以此查看變化的數(shù)據(jù)。
閃回查詢
當(dāng)系統(tǒng)INI參數(shù)ENABLE_FLASHBACK置為1時(shí),閃回功能開啟,可以進(jìn)行閃回查詢。MPP環(huán)境不支持閃回查詢。
SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK'); LINEID SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK') ---------- --------------------------------------- 1 1 used time: 5.703(ms). Execute id is 65. [root@shard1 jydm]# strings dm.ini | grep flash ENABLE_FLASHBACK = 1 #Whether to enable flashback function
閃回查詢子句
閃回查詢子句的語(yǔ)法,是在數(shù)據(jù)查詢語(yǔ)句(參考第4章)的基礎(chǔ)上,為FROM子句增加了閃回查詢子句。
語(yǔ)法格式
< 閃回查詢子句>::=WHEN |
參數(shù)
1.time_exp 一個(gè)日期表達(dá)式,一般用字符串方式表示
2.trxid 指定事務(wù)ID號(hào)
語(yǔ)句功能
用戶通過(guò)閃回查詢子句,可以得到指定表過(guò)去某時(shí)刻的結(jié)果集。指定條件可以為時(shí)刻,或事務(wù)號(hào)
使用說(shuō)明
1.閃回查詢只支持普通表(包括加密表與壓縮表)、臨時(shí)表和堆表,不支持水平分區(qū)表、垂直分區(qū)表、列存儲(chǔ)表、外部表與視圖;
2.閃回查詢中trxid的值,一般需要由閃回版本查詢(見下節(jié))的偽列來(lái)確定。實(shí)際使用中多采用指定時(shí)刻的方式。
例1閃回查詢特定時(shí)刻的PERSON_TYPE表。
查詢PERSON_TYPE表。
SQL> SELECT * FROM PERSON.PERSON_TYPE; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 used time: 15.321(ms). Execute id is 78.
在插入數(shù)據(jù)之前記錄時(shí)間,在閃回查詢時(shí)使用
SQL> select sysdate; LINEID SYSDATE ---------- --------------------------- 1 2019-12-01 23:34:12.761683 used time: 0.480(ms). Execute id is 79. SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('防損員'); affect rows 1 used time: 0.615(ms). Execute id is 80. SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('保潔員'); affect rows 1 used time: 0.562(ms). Execute id is 81. SQL> commit; executed successfully used time: 16.237(ms). Execute id is 82. SQL> SELECT * FROM PERSON.PERSON_TYPE; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 7 防損員 6 8 保潔員 6 rows got used time: 0.626(ms). Execute id is 83.
使用閃回查詢?nèi)〉?019-12-01 23:34:12時(shí)刻的數(shù)據(jù)。此時(shí)刻在插入數(shù)據(jù)的操作之前,可見此時(shí)的結(jié)果集不應(yīng)該有2019-12-01 23:34:12時(shí)刻以后插入的數(shù)據(jù)。
SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2019-12-01 23:34:12'; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 used time: 1.416(ms). Execute id is 84.
在2019-12-01 23:39:26時(shí)刻刪除數(shù)據(jù),并提交。
SQL> select sysdate; LINEID SYSDATE ---------- --------------------------- 1 2019-12-01 23:39:26.865328 used time: 0.580(ms). Execute id is 85. SQL> DELETE FROM PERSON.PERSON_TYPE WHERE PERSON_TYPEID > 5; affect rows 2 used time: 1.797(ms). Execute id is 86. SQL> commit; executed successfully used time: 19.834(ms). Execute id is 87. SQL> SELECT * FROM PERSON.PERSON_TYPE; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 5 防損員 used time: 0.691(ms). Execute id is 88.
使用閃回查詢得到刪除前的數(shù)據(jù)。
SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2019-12-01 23:39:26'; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 5 防損員 6 6 保潔員 6 rows got used time: 1.262(ms). Execute id is 89.
閃回查詢指定TRXID的PERSON_TYPE表。
要獲得TRXID信息,需要通過(guò)閃回版本查詢的偽列VERSIONS_ENDTRXID。
在2019-12-01 23:45:27 時(shí)刻修改數(shù)據(jù),并提交。
SQL> select sysdate; LINEID SYSDATE ---------- --------------------------- 1 2019-12-01 23:48:27.983996 used time: 0.509(ms). Execute id is 90. SQL> SELECT * FROM PERSON.PERSON_TYPE; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 9 防損員 6 10 保潔員 6 rows got used time: 0.515(ms). Execute id is 97. SQL> UPDATE PERSON.PERSON_TYPE SET NAME='保安員' WHERE PERSON_TYPEID=9; affect rows 1 used time: 1.460(ms). Execute id is 99. SQL> commit; executed successfully used time: 16.640(ms). Execute id is 100. SQL> UPDATE PERSON.PERSON_TYPE SET NAME='收銀員' WHERE PERSON_TYPEID=9; affect rows 1 used time: 1.851(ms). Execute id is 101. SQL> commit; executed successfully used time: 16.781(ms). Execute id is 102. SQL> SELECT * FROM PERSON.PERSON_TYPE; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 9 收銀員 6 10 保潔員 6 rows got used time: 0.516(ms). Execute id is 103.
進(jìn)行閃回版本查詢,確定TRXID。
SQL> SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2019-12-01 23:48:27.983996' AND SYSDATE; LINEID VERSIONS_ENDTRXID NAME ---------- -------------------- -------- 1 NULL 采購(gòu)經(jīng)理 2 NULL 采購(gòu)代表 3 NULL 銷售經(jīng)理 4 NULL 銷售代表 5 NULL 收銀員 6 NULL 保潔員 7 749195 保安員 7 rows got used time: 1.384(ms). Execute id is 104.
根據(jù)TRXID確定版本。
SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749195; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 9 保安員 6 10 保潔員 6 rows got used time: 1.261(ms). Execute id is 105.
第二次更新的事務(wù)ID為749195,那么第一次更新的事務(wù)ID為749194
SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749194; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 9 防損員 6 10 保潔員 6 rows got
閃回版本查詢
語(yǔ)法格式
< 閃回版本查詢子句>::=VERSIONS BETWEEN |
參數(shù)
1.time_exp 日期表達(dá)式,一般用字符串方式表示。time_exp1表示起始時(shí)間,time_exp2表示結(jié)束時(shí)間
2. trxid 指定事務(wù)ID號(hào),整數(shù)表示。trxid1表示起始trxid,trxid2表示結(jié)束trxid
使用說(shuō)明
1.閃回版本查詢支持普通表(包括加密表與壓縮表)、臨時(shí)表和堆表,不支持水平分區(qū)表、垂直分區(qū)表、列存儲(chǔ)表、外部表與視圖;
2.支持偽列,作為閃回版本查詢的輔助信息。
偽列 說(shuō)明
VERSIONS_START{TRXID|TIME} 起始TRXID或時(shí)間戳
VERSIONS_END{TRXID|TIME} 提交TRXID或時(shí)間戳。如果該值為NULL,表示行版本仍然是當(dāng)前版本
VERSIONS_OPERATION 在行上的操作(I=Insert,D=Delete,U=Update)
語(yǔ)句功能
用戶通過(guò)閃回版本查詢子句,可以得到指定表過(guò)去某個(gè)時(shí)間段內(nèi),事務(wù)導(dǎo)致記錄變化的全部記錄。指定條件可以為時(shí)刻,或事務(wù)號(hào)。
例1 閃回版本查詢指定時(shí)間段內(nèi),PERSON_TYPE表的記錄變化
SQL> select sysdate; LINEID SYSDATE ---------- --------------------------- 1 2019-12-02 00:00:18.221877 used time: 0.662(ms). Execute id is 107.
在2019-12-02 00:00:18時(shí)刻修改數(shù)據(jù),并提交。
SQL> UPDATE PERSON.PERSON_TYPE SET NAME='打字員' WHERE PERSON_TYPEID=9; affect rows 1 used time: 1.758(ms). Execute id is 110. SQL> commit; executed successfully used time: 16.964(ms). Execute id is 111. SQL> SQL> UPDATE PERSON.PERSON_TYPE SET NAME='衛(wèi)生員' WHERE PERSON_TYPEID=9; affect rows 1 used time: 1.268(ms). Execute id is 112. SQL> commit; executed successfully used time: 15.983(ms). Execute id is 113. SQL> SELECT * FROM PERSON.PERSON_TYPE; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 9 衛(wèi)生員 6 10 保潔員 6 rows got used time: 0.669(ms). Execute id is 114.
進(jìn)行閃回版本查詢,獲得指定時(shí)間段內(nèi)變化的記錄。
SQL> SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2019-12-02 00:00:17' AND SYSDATE; LINEID VERSIONS_ENDTRXID NAME ---------- -------------------- -------- 1 NULL 采購(gòu)經(jīng)理 2 NULL 采購(gòu)代表 3 NULL 銷售經(jīng)理 4 NULL 銷售代表 5 NULL 衛(wèi)生員 6 NULL 保潔員 7 749197 打字員 7 rows got used time: 1.412(ms). Execute id is 115.
第二次更新的事務(wù)ID為749197
SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749197; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 9 打字員 6 10 保潔員 6 rows got used time: 1.371(ms). Execute id is 120.
第一次更新的事務(wù)ID為749196
SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749196; LINEID PERSON_TYPEID NAME ---------- ------------- -------- 1 1 采購(gòu)經(jīng)理 2 2 采購(gòu)代表 3 3 銷售經(jīng)理 4 4 銷售代表 5 9 收銀員 6 10 保潔員 6 rows got used time: 0.585(ms). Execute id is 121.
閃回事務(wù)查詢
閃回事務(wù)查詢提供系統(tǒng)視圖V$FLASHBACK_TRX_INFO供用戶查看在事務(wù)級(jí)對(duì)數(shù)據(jù)庫(kù)所做的更改。根據(jù)視圖信息,可以確定如何還原指定事務(wù)或指定時(shí)間段內(nèi)的修改。
使用說(shuō)明
系統(tǒng)視圖名為V$FLASHBACK_TRX_INFO,定義如下所示。
SQL> desc V$FLASHBACK_TRX_INFO LINEID NAME TYPE$ NULLABLE ---------- ---------------- ------------- -------- 1 START_TRXID BIGINT Y 事務(wù)中第一個(gè)DML的TRXID 2 START_TIMESTAMP DATETIME(6) Y 事務(wù)中第一個(gè)DML的時(shí)間戳 3 COMMIT_TRXID BIGINT Y 提交事務(wù)的TRXID 4 COMMIT_TIMESTAMP DATETIME(6) Y 提交事務(wù)時(shí)的時(shí)間戳 5 LOGIN_USER VARCHAR(256) Y 擁有事務(wù)的用戶 6 UNDO_CHANGE# INTEGER Y 記錄修改順序序號(hào) 7 OPERATION CHAR(1) Y DML操作類型 D:刪除;U:修改;I:插入;N:更新插入(專門針對(duì)CLUSTER PRIMARY KEY的插入);C:事務(wù)提交;P:預(yù)提交記錄;O:default 8 TABLE_NAME VARCHAR(256) Y DML 修改的表 9 TABLE_OWNER VARCHAR(256) Y DML修改表的擁有者 10 ROW_ID BIGINT Y DML修改行的ROWID 11 UNDO_SQL VARCHAR(3900) Y 撤銷DML操作的SQL語(yǔ)句 11 rows got used time: 88.801(ms). Execute id is 122.
查詢指定時(shí)間之后的事務(wù)信息,可為閃回查詢操作提供參考
SQL> SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2019-12-01 23:13:28'; LINEID START_TRXID START_TIMESTAMP COMMIT_TRXID COMMIT_TIMESTAMP LOGIN_USER UNDO_CHANGE# OPERATION TABLE_NAME TABLE_OWNER ROW_ID UNDO_SQL ---------- -------------------- --------------------------- -------------------- --------------------------- ---------- ------------ --------- ---------- ----------- -------------------- -------- 1 749189 2019-12-01 23:13:28.000000 749190 2019-12-01 23:33:57.588000 SYSDBA 16 C NULL NULL NULL NULL used time: 1.437(ms). Execute id is 126.