Oracle資料庫的閃回查詢功能簡介
Flashback query(閃回查詢)原理
從Oracle 9i開始,Oracle提供閃回查詢功能,Oracle根據undo資訊,利用undo資料,類似一致性讀取方法,可以把表置於一個刪除前的時間點(或SCN),從而將資料找回。
Flashback query(閃回查詢)前提:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
其中undo_management = auto,設定自動undo管理(AUM),該引數預設設定為:auto;
undo_retention = n(秒),設定決定undo最多的儲存時間,其值越大,就需要越多的undo表空間的支援,如果undo足夠大或者系統產生的undo足夠少,資料在undo裡面保留的時間會比undo_retention設定的時間長。
修改undo_retention的命令如下:
SQL> alter system set undo_retention = 3600;
System altered
閃回實現方式
1.獲取資料刪除前的一個時間點或scn,如下:
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;
TIME SCN
------------------- ----------------------------------------
2013-12-26 15:58:13 302044764
2.查詢該時間點(或scn)的資料,如下:
SQL> delete from t_user where isvalid=0;
11163 rows deleted
SQL> commit;
Commit complete
SQL> select count(*) from t_user as of timestamp to_timestamp('2013-12-26 15:58:13', 'yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
28614
SQL> select count(*) from t_user as of scn 302044764;
COUNT(*)
----------
28614
3.將查詢到的資料,新增到表中。也可用更直接的方法,如:
SQL> create table t_test as select * from t_user as of timestamp to_timestamp('2013-12-26 15:58:13', 'yyyy-mm-dd hh24:mi:ss') where isvalid=0;
Table created
SQL> insert into t_user select * from tab_test;
11163 rows inserted
SQL> commit;
Commit complete
SQL> select count(1) from t_user;
COUNT(1)
----------
28614
附:
查詢5分鐘前的資料
SQL> select count(*) from t_user as of timestamp(systimestamp - interval '5' minute);
COUNT(*)
----------
17451
將10分鐘前的t_user表與1小時前的t_user表以id為條件進行關聯(Join):
select e.username, d.username
from t_user as of timestamp(systimestamp - interval '10' minute) e,
t_user as of timestamp(systimestamp - interval '1' hour) d
where e.id = d.id;
將 admin 使用者的EMAIL欄位修改為15分鐘前的值:
update t_user
set email =
(select email
from t_user as of timestamp(systimestamp - interval '15' minute)
where username = 'admin')
where username = 'admin';
注:推薦使用scn,由於oracle9i中,因為scn與時間點的同步需要5分鐘,如果最近5分鐘之內的資料需要Falshback query查詢,可能會查詢丟失,而scn則不存在這個問題。Oracle10g中這個問題已修正(scn與時間點的大致關係,可以透過logmnr分析歸檔日誌獲得)。
Falshback query查詢的侷限:
1. 不能Falshback到5天以前的資料。
2. 閃回查詢無法恢復到表結構改變之前,因為閃回查詢使用的是當前的資料字典。
3. 受到undo_retention引數的影響,對於undo_retention之前的資料,Flashback不保證能Flashback成功。
4. 對drop,truncate等不記錄回滾的操作,不能恢復。
5. 普通使用者使用dbms_flashback包,必須透過管理員授權。命令如下:
SQL>grant execute on dbms_flashback to scott;
閃回時間點查詢的另一種方法是首先用PL/SQL包dbms_flashback的enable_at_time或enable_at_scn儲存過程鎖定一個會話級別的閃回時間目標,即進入閃回模式,隨後的查詢命令就可以省略“as of”,但也能達到使用“as of”的閃回效果,直到呼叫dbms_flashback. disable儲存過程關閉閃回模式為止。
比如,將閃回模式會話定格在15分鐘前:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);
PL/SQL procedure successfully completed.
現在,雖然沒有“as of”子句,以下查詢命令的含義就是檢視15分鐘前的t_user表:
SQL> select count(*) from t_user;
COUNT(*)
----------
17451
需要注意此時若訪問SYSDATE、SYSTIMESTAMP等日期函式,它們的返回值還是正常的當前的值,而不是靜止在15分鐘以前。另外,處於閃回會話模式時,執行dml和ddl將報錯:
SQL> update t_user u set u.realname='test' where id=1;
update t_user u set u.realname='test' where id=1
ORA-08182: operation not supported while in Flashback mode
還有,SYS使用者不能呼叫enable_at_time和enable_at_scn:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);
BEGIN dbms_flashback.enable_at_time(systimestamp - interval '15' minute); END;
*
ERROR at line 1:
ORA-08185: Flashback not supported for user SYS
ORA-06512: at "SYS.DBMS_FLASHBACK", line 3
ORA-06512: at line 1
在回到過去對所有感興趣的表查詢一番後,再呼叫disable儲存過程關閉閃回會話模式回到正常狀態:
SQL> exec dbms_flashback.disable;
PL/SQL procedure successfully completed
從Oracle 9i開始,Oracle提供閃回查詢功能,Oracle根據undo資訊,利用undo資料,類似一致性讀取方法,可以把表置於一個刪除前的時間點(或SCN),從而將資料找回。
Flashback query(閃回查詢)前提:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
其中undo_management = auto,設定自動undo管理(AUM),該引數預設設定為:auto;
undo_retention = n(秒),設定決定undo最多的儲存時間,其值越大,就需要越多的undo表空間的支援,如果undo足夠大或者系統產生的undo足夠少,資料在undo裡面保留的時間會比undo_retention設定的時間長。
修改undo_retention的命令如下:
SQL> alter system set undo_retention = 3600;
System altered
閃回實現方式
1.獲取資料刪除前的一個時間點或scn,如下:
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;
TIME SCN
------------------- ----------------------------------------
2013-12-26 15:58:13 302044764
2.查詢該時間點(或scn)的資料,如下:
SQL> delete from t_user where isvalid=0;
11163 rows deleted
SQL> commit;
Commit complete
SQL> select count(*) from t_user as of timestamp to_timestamp('2013-12-26 15:58:13', 'yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
28614
SQL> select count(*) from t_user as of scn 302044764;
COUNT(*)
----------
28614
3.將查詢到的資料,新增到表中。也可用更直接的方法,如:
SQL> create table t_test as select * from t_user as of timestamp to_timestamp('2013-12-26 15:58:13', 'yyyy-mm-dd hh24:mi:ss') where isvalid=0;
Table created
SQL> insert into t_user select * from tab_test;
11163 rows inserted
SQL> commit;
Commit complete
SQL> select count(1) from t_user;
COUNT(1)
----------
28614
附:
查詢5分鐘前的資料
SQL> select count(*) from t_user as of timestamp(systimestamp - interval '5' minute);
COUNT(*)
----------
17451
將10分鐘前的t_user表與1小時前的t_user表以id為條件進行關聯(Join):
select e.username, d.username
from t_user as of timestamp(systimestamp - interval '10' minute) e,
t_user as of timestamp(systimestamp - interval '1' hour) d
where e.id = d.id;
將 admin 使用者的EMAIL欄位修改為15分鐘前的值:
update t_user
set email =
(select email
from t_user as of timestamp(systimestamp - interval '15' minute)
where username = 'admin')
where username = 'admin';
注:推薦使用scn,由於oracle9i中,因為scn與時間點的同步需要5分鐘,如果最近5分鐘之內的資料需要Falshback query查詢,可能會查詢丟失,而scn則不存在這個問題。Oracle10g中這個問題已修正(scn與時間點的大致關係,可以透過logmnr分析歸檔日誌獲得)。
Falshback query查詢的侷限:
1. 不能Falshback到5天以前的資料。
2. 閃回查詢無法恢復到表結構改變之前,因為閃回查詢使用的是當前的資料字典。
3. 受到undo_retention引數的影響,對於undo_retention之前的資料,Flashback不保證能Flashback成功。
4. 對drop,truncate等不記錄回滾的操作,不能恢復。
5. 普通使用者使用dbms_flashback包,必須透過管理員授權。命令如下:
SQL>grant execute on dbms_flashback to scott;
閃回時間點查詢的另一種方法是首先用PL/SQL包dbms_flashback的enable_at_time或enable_at_scn儲存過程鎖定一個會話級別的閃回時間目標,即進入閃回模式,隨後的查詢命令就可以省略“as of”,但也能達到使用“as of”的閃回效果,直到呼叫dbms_flashback. disable儲存過程關閉閃回模式為止。
比如,將閃回模式會話定格在15分鐘前:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);
PL/SQL procedure successfully completed.
現在,雖然沒有“as of”子句,以下查詢命令的含義就是檢視15分鐘前的t_user表:
SQL> select count(*) from t_user;
COUNT(*)
----------
17451
需要注意此時若訪問SYSDATE、SYSTIMESTAMP等日期函式,它們的返回值還是正常的當前的值,而不是靜止在15分鐘以前。另外,處於閃回會話模式時,執行dml和ddl將報錯:
SQL> update t_user u set u.realname='test' where id=1;
update t_user u set u.realname='test' where id=1
ORA-08182: operation not supported while in Flashback mode
還有,SYS使用者不能呼叫enable_at_time和enable_at_scn:
SQL> exec dbms_flashback.enable_at_time(systimestamp - interval '15' minute);
BEGIN dbms_flashback.enable_at_time(systimestamp - interval '15' minute); END;
*
ERROR at line 1:
ORA-08185: Flashback not supported for user SYS
ORA-06512: at "SYS.DBMS_FLASHBACK", line 3
ORA-06512: at line 1
在回到過去對所有感興趣的表查詢一番後,再呼叫disable儲存過程關閉閃回會話模式回到正常狀態:
SQL> exec dbms_flashback.disable;
PL/SQL procedure successfully completed
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9399028/viewspace-1065008/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫閃回Oracle資料庫
- Oracle閃回技術 為Oracle閃回配置資料庫Oracle資料庫
- Oracle 11G 閃回技術 閃回版本查詢和閃回事務查詢Oracle
- 【Oracle 12c資料庫支援閃回庫功能】實驗Oracle資料庫
- Oracle 閃回資料庫測試Oracle資料庫
- 詳解oracle資料庫閃回Oracle資料庫
- Oracle 11G 閃回技術 使用Oracle閃回事務查詢Oracle
- Oracle資料庫閃回區空間不足Oracle資料庫
- Oracle閃回功能恢復偶然丟失的資料(轉)Oracle
- DM7閃回與閃回查詢
- Oracle資料庫的查詢變慢了Oracle資料庫
- 【Flashback】Flashback Database閃回資料庫功能實驗Database資料庫
- Oracle:容器資料庫簡介Oracle資料庫
- Oracle - 資料庫的組成簡介Oracle資料庫
- Oracle資料庫中的分頁查詢Oracle資料庫
- Oracle ACE尹海文:查詢是資料庫工具的核心功能Oracle資料庫
- DM8 閃回查詢
- Oracle資料庫審計功能介紹Oracle資料庫
- Oracle 12.2新特性: PDB級閃回資料庫(Flashback PDB)Oracle資料庫
- 關於Oracle資料庫的時間查詢Oracle資料庫
- Orcale利用閃回功能恢復資料
- Oracle的service功能簡介Oracle
- 第1章 Oracle資料庫簡介-RMOracle資料庫
- 第1章 Oracle資料庫簡介-DBMSOracle資料庫
- MySQL - 資料查詢 - 簡單查詢MySql
- dg_閃回資料庫實驗資料庫
- 資料庫的簡介和MySQL增刪改查資料庫MySql
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- 概括SQL Server實時查詢Oracle資料庫WSSQLServerOracle資料庫
- java中資料庫查詢,搭配簡單的圖形介面進行查詢Java資料庫
- 「Oracle」Oracle高階查詢介紹Oracle
- [轉]Oracle資料庫ASH和AWR的簡單介紹Oracle資料庫
- 找到Oracle資料庫中效能最差的查詢語句BSOracle資料庫
- Oracle 查詢多個資料Oracle
- jinq 入門介紹-java中編寫資料庫查詢的簡單自然的方式Java資料庫
- Newlife.XCode的查詢與資料初始化功能介紹XCode
- langchain_chatchat+ollama部署本地知識庫,聯網查詢以及對資料庫(Oracle)資料進行查詢LangChain資料庫Oracle
- 資料庫高階查詢之子查詢資料庫