DM8 閃回查詢

LEVEL7發表於2021-05-13

當使用者操作不慎導致錯誤的刪改資料時,非常希望有一種簡單快捷的方式可以恢復資料。閃回技術,就是為了使用者可以迅速處理這種資料邏輯損壞的情況而產生的。

閃回技術主要是通過回滾段儲存的UNDO記錄來完成歷史記錄的還原。設定ENABLE_FLASHBACK為1後,開啟閃回功能。DM會保留回滾段一段時間,回滾段保留的時間代表著可以閃回的時間長度。由UNDO_RETENTION引數指定。

開啟閃回功能後,DM會在記憶體中記錄下每個事務的起始時間和提交時間。通過使用者指定的時刻,查詢到該時刻的事務號,結合當前記錄和回滾段中的UNDO記錄,就可以還原出特定事務號的記錄。即指定時刻的記錄狀態。從而完成閃回查詢。閃回查詢功能完全依賴於回滾段管理,對於DROP等誤操作不能恢復。閃回特性可應用在以下方面:

Ø    自我維護過程中的修復:當一些重要的記錄被意外刪除,使用者可以向後移動到一個時間點,檢視丟失的行並把它們重新插入現在的表內恢復;

Ø    用於分析資料變化:可以對同一張表的不同閃回時刻進行連結查詢,以此檢視變化的資料。

1.     適用場景

軟體

版本

作業系統

Redhat 7  及以上版本

DM  資料庫

DM 8.0  及以上版本

CPU  架構

x86 、ARM、龍芯、飛騰等國內外主流 CPU

2.     相關引數設定

查詢閃回功能狀態,資料庫預設關閉(0-關閉,1-開啟)。示例語句如下所示:

SELECT

        name     ,

        TYPE     ,

        VALUE    ,

        sys_value,

        file_value

FROM

        v$parameter

WHERE

        name LIKE '%FLASHBACK%';

輸出結果:

NAME             TYPE VALUE SYS_VALUE FILE_VALUE

---------------- ---- ----- --------- ----------

ENABLE_FLASHBACK SYS  0     0         0

1)     開啟閃回功能方法一,示例語句如下所示:

SQL> alter system set 'enable_flashback'=1 both;

DMSQL  過程已成功完成

SQL> select name,type,value,sys_value,file_value from v$parameter where name='ENABLE_FLASHBACK';

 

NAME             TYPE VALUE SYS_VALUE FILE_VALUE

---------------- ---- ----- --------- ----------

ENABLE_FLASHBACK SYS  1     1         1

注意:該方法設定引數時,引數名必須加單引號。

2)     開啟閃回功能方法二,示例語句如下所示:

SP_SET_PARA_VALUE (1, 'ENABLE_FLASHBACK', 1);

//scope  為 1 表示 dm.ini 檔案和記憶體引數都修改,不需要重啟伺服器。

//scope  為 2 表示只修改 dm.ini 檔案,伺服器重啟後生效。

//value : 設定的值。

獲取引數,示例語句如下所示:

SELECT

        SF_GET_PARA_VALUE (1, 'ENABLE_FLASHBACK') in_file,

        SF_GET_PARA_VALUE (2, 'ENABLE_FLASHBACK') in_mem;

由於回滾段預設每秒種都會自動清理,所以需要延長回滾記錄的保留時間,單位是秒。回滾段引數太大容易引發回滾段膨脹,這裡設定為 1200s。示例語句如下所示:

ALTER SYSTEM SET 'undo_retention'=1200 BOTH;

 

SELECT

        name     ,

        TYPE     ,

        VALUE    ,

        sys_value,

        file_value

FROM

        v$parameter

WHERE

        name = 'UNDO_RETENTION';

輸出結果:

NAME           TYPE VALUE       SYS_VALUE   FILE_VALUE

-------------- ---- ----------- ----------- -----------

UNDO_RETENTION SYS  1200.000000 1200.000000 1200.000000

3.     閃回查詢

1)     按時間查詢歷史記錄

通過指定一個時間(timestamp型別),通常可以用一個日期時間字串表達。

測試在 disql 工具中進行,使用 dmhr 模式下的 city 表。示例語句如下所示:

SELECT * FROM dmhr.city WHERE city_id = 'CD';

UPDATE dmhr.city SET region_id = 10 WHERE city_id = 'CD';

SELECT * FROM dmhr.city WHERE city_id = 'CD';

SELECT

        *

FROM

        dmhr.city WHEN TIMESTAMP '2021-05-13 20:17:57'

WHERE

        city_id='CD';

輸出結果:

20:17:55  SQL> SELECT * FROM dmhr.city WHERE city_id = 'CD';

 

CITY_ID CITY_NAME REGION_ID 

------- --------- -----------

CD       成都    7

 

20:17:58  SQL> UPDATE dmhr.city SET region_id = 10 WHERE city_id = 'CD';

影響行數 1

 

20:18:05  SQL> SELECT * FROM dmhr.city WHERE city_id = 'CD';

 

CITY_ID CITY_NAME REGION_ID 

------- --------- -----------

CD       成都     10

 

20:18:21  SQL> SELECT

2           *

3   FROM

4           dmhr.city WHEN TIMESTAMP ' 2021-05-13 20:17:57'

5   WHERE

6           city_id='CD';

 

CITY_ID CITY_NAME REGION_ID 

------- --------- -----------

CD       成都     7

2)     按事務id號查詢歷史記錄

首先使用 versions_endtrxid 偽列查詢事務 id 號。使用者通過閃回版本查詢子句,可以得到指定表過去某個時間段內,事務導致記錄變化的全部記錄,指定條件可以為時刻或事務號。

執行閃回版本查詢,示例語句如下所示:

SELECT

        versions_endtrxid,

        *

FROM

        dmhr.job VERSIONS BETWEEN TIMESTAMP '2021-05-13 20:25:00' AND SYSDATE

WHERE

        JOB_ID = 22;

輸出結果:

VERSIONS_ENDTRXID    JOB_ID JOB_TITLE MIN_SALARY  MAX_SALARY

-------------------- ------ --------- ----------- -----------

NULL                 22      文員    2500        5000

NULL  表示該行的版本仍然是當前版本。

Ø    第一次調整文員的最低工資為 3500 並提交,示例語句如下所示:

UPDATE dmhr.job SET MIN_SALARY = 3500 WHERE JOB_ID = 22;

 

COMMIT;

Ø    第二次調整文員的最低工資為 2800 並提交,示例語句如下所示:

UPDATE dmhr.job SET MIN_SALARY = 2800 WHERE JOB_ID = 22;

 

COMMIT;

再次執行閃回版本查詢,示例語句如下所示:

SELECT

        versions_endtrxid,

        *

FROM

        dmhr.job VERSIONS BETWEEN TIMESTAMP '2021-05-13 20:25:00' AND SYSDATE

WHERE

        JOB_ID = 22;

輸出結果:

VERSIONS_ENDTRXID    JOB_ID JOB_TITLE MIN_SALARY  MAX_SALARY

-------------------- ------ --------- ----------- -----------

NULL                 22      文員    2800        5000

9337                 22      文員    3500        5000

9336                 22      文員    2500        5000

兩個事務分別對應了 2 個版本,可以隨意查詢任何版本。示例語句如下所示:

SELECT TRXID, * FROM dmhr.job WHEN TRXID 9336 WHERE JOB_ID=22

 

union all

 

SELECT TRXID, * FROM dmhr.job WHEN TRXID 9337 WHERE JOB_ID=22;

輸出結果:

TRXID                JOB_ID JOB_TITLE MIN_SALARY  MAX_SALARY

-------------------- ------ --------- ----------- -----------

9325                 22      文員    2500        5000

9336                 22      文員    3500        5000

顯示了第一次提交前和第一次提交後的資料。

4.     閃回事務查詢

閃回事務查詢提供系統檢視 V$FLASHBACK_TRX_INFO,檢視在事務級對資料庫所做的更改。根據該檢視資訊,可以確定如何還原指定事務或指定時間段內的修改。

查詢指定時間之後的事務資訊,示例語句如下所示:

SELECT commit_trxid, operation, table_name, undo_sql FROM V$FLASHBACK_TRX_INFO;

輸出結果:

COMMIT_TRXID         OPERATION TABLE_NAME UNDO_SQL                                        

-------------------- --------- ---------- -------------------------------------------------

9337                 O         NULL       NULL

9337                 U         JOB        UPDATE DMHR.JOB SET MIN_SALARY=2500 WHERE ROWID=5

9337                 C         NULL       NULL

9338                 O         NULL       NULL

9338                 U         JOB        UPDATE DMHR.JOB SET MIN_SALARY=3500 WHERE ROWID=5

9338                 C         NULL       NULL


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31516603/viewspace-2772206/,如需轉載,請註明出處,否則將追究法律責任。

相關文章