Oracle FlashBack 學習筆記
這部分的內容,其實早在10年年初就學習過,也記錄了相關的筆記.但很多知識不用就慢慢被遺忘了.今天無意中聽到同事在討論問題:為什麼刪除了一個佔用空間大的表後,表空間並沒有釋放呢?
職業的原因,自己在想Oracle Drop table的過程是怎麼實現的,是不是要做個跟蹤看下.後來想起在10g後,Oracle有了Flashback的功能,刪除表的時候會先放在RecycleBin中,並不真正的物理刪除,所以表空間dba_free_space是不是不會有變化?
今天重新翻了下之前的筆記,並做了試驗,發現dba_free_space也是會體現變化的,這是不是哪個環節理解上有問題,還需要再測試下.
目錄
1 Flashback Database 架構
2 Flashback Database
3 Flashback Drop
4 Flashback Query and Flashback Table
5 小結
#####################################################
1 Flashback Database 架構
#####################################################
Flashback Database 整個架構包括一個程式Recover Writer(RVWR)後臺程式,Flashback Database Log日誌和Flash Recovery Area
一旦資料庫啟用了Flash Database, RVWR程式會啟動,RVWR程式會向Flash Recovery Area內寫入Flashback Database Log, 這些日誌包括資料塊的"前映象"
#####################################################
2 Flashback Database
#####################################################
1 啟用Flashback Database
1.1 配置Flash Recovery Area
1)啟用Flash Recovery Area
Alter system set db_recovery_file_dest_size=1G scope=both;
Alter system set db_recovery_file_dest='/u01/backup/fb' scope=both;
注意這個目錄必須是Oracle:dba,屬主
col name format a32 heading 'Parameter'
col value format a32 heading 'Setting'
select name, value from v$parameter where name like '%flash%' or name like '%recovery%' order by name;
2) 啟用資料庫Flashback功能
資料庫必須處於歸檔模式
#重啟資料庫
startup mount(在Open下也可以開啟)
#檢查有沒有開啟Flashback功能
select name, current_scn, flashback_on from v$database;
#啟動Flashback功能
alter database flashback on;
#確認啟動
select name, current_scn, flashback_on from v$database;
#確認Flashback Log生成在/u01/backup/fb/目錄下,該目錄為OMF管理
> ll /u01/backup/fb/MOUSE/flashback
total 8020
-rw-r----- 1 oracle dba 8200192 Aug 2 16:32 o1_mf_65f0nym9_.flb
# 設定db_flashback_retention_target引數
Alter system set db_flashback_retention_target=1440 scope=both;
單位為分鐘
如果/u01/backup/fb/目錄下的空間不夠儲存一天的回退資料怎麼辦呢?
Override;
#開啟資料庫
Alter database open;
2 Flashback Database
1) 確認能夠恢復的時間點
SQL> desc v$flashback_database_log;
Name Null? Type
----------------------------------------- -------- ----------------------------
OLDEST_FLASHBACK_SCN NUMBER
OLDEST_FLASHBACK_TIME DATE
RETENTION_TARGET NUMBER
FLASHBACK_SIZE NUMBER
ESTIMATED_FLASHBACK_SIZE NUMBER
OLDEST_FLASHBACK_SCN: 資料庫能回退的最早SCN
OLDEST_FLASHBACK_TIME: 資料庫能回退的最早時間
RETENTION_TARGET:當前系統設定引數
FLASHBACK_SIZE: Current size (in bytes) of the flashback data 當前的Flashback Log空間
ESTIMATED_FLASHBACK_SIZE: 為了達到Retention_target定義的要求,預計需要多大的空間,這個值用於指導設定Flash Recovery Area大小
這個會改變
2) Flashback database
Flashback Database 實際上是對資料庫的一個不完全恢復操作,因此需要關閉資料庫,重啟資料庫到Mount狀態;但與不完全恢復不同的是,它不需要執行restore操作。
flashback之前,先對資料庫做個備份
#backup database;
#Shutdown immediate
#startup mount
#flashback database to timestamp to_timestamp('2010-08-02 17:10:04','yyyy-mm-dd hh24:mi:ss');
如何精確到找到恢復時間點呢?SCN_TO_TIMESTATMP()函式可以將SCN號轉換成TimeStamp
如何找到某個操作的精確時間點,AUDIT?
#alter database open read only;
#select count(*) from xxx; 確認資料被找回
#shutdown immediate;
#Startup mount;
#alter database open resetlogs;
#backup database;
3 命令和檢視
1) 檢查是否啟用了Flashback database 功能
Select flashback_on from v$database
2) v$flashback_database_log
這個檢視用來描述Flashback log對Flash Recovery Area的佔用情況
select * from v$flashback_database_log;
3) v$flashback_database_stat
這個檢視用來對Flashback log的空間情況進行更細粒度的記錄和估計
4) Flashback命令
這個命令既可以在SQL*Plus中使用,也可以在RMAN中使用,
Flashback [device type =
to [before] scn =
to [before] sequence =
to [before] time = '
Oracle允許使用3種方式指定回退的時間點,SCN,時間,日誌序列號,
TO -- 代表回退到指定點
Before -- 代表恢復到指定點之前的一點就可以。
#####################################################
3 Flashback Drop
#####################################################
這個功能是從Oracle 10g開始出現的,用於恢復使用者誤刪的物件(表,索引)。這個技術依賴於Tablespace Recycle Bin(表空間回收).功能類似於Windows的回收站。
1 Tablespace Recycle Bin
從10g開始,每個表空間都會有一個叫作回收站的邏輯區域(佔用表空間所在的空間),當使用者執行Drop 命令時,被刪除的表和表的關聯物件(包括索引,約束,觸發器,LOB段,LOB Index段)
不會被物理刪除,而是先轉移到回收站中,使用Flashback Table命令可以恢復這個物件和所有的關聯物件。
不會物理清楚,是不是說明佔用的物理空間仍沒有釋放,從dba_free_space能否反映空間的變化呢?
預設情況下recyclebin功能是開啟的
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
show recyclebin 檢視Recyclebin的物件列表(注意 RecycleBin是表空間級的,每個表空間都對應一個RecycleBin物件池)
也可以透過檢視來檢視Recyclebin物件列表
select object_name, original_name from recyclebin;
既然是表空間級的,那這個語句反映的是哪個Recycelbin 池的內容呢?是執行語句的使用者的預設表空間吧;
可以像檢視普通表一樣,檢視Recycle Bin中的物件內容
select count(*) from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0";
對Recyclebin中的物件執行DDL/DML動作是不允許的.
SQL> delete from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0";
delete from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0"
*
ERROR at line 1:
ORA-38301: can not perform. DDL/DML over objects in Recycle Bin
2 Flashback Drop 操作
flashback table t to before drop;
如果在recyclebin中有同名的物件,如兩個表T都被刪除,則恢復:
flashback table "BIN$jOLWvgYhgyXgQOYKHREVtA==$0" to before drop;
在恢復表的同時還可以重新命名
flashback table t to before drop rename to t_bak;
Note: 一旦完成恢復,RecycleBin中的物件就消失
3 Recycle Bin的維護
Recycle Bin 是和普通物件共用表空間儲存區域的,或者說RecycelBin的物件要和普通物件搶奪儲存空間。如果發生空間不夠,Oracle會按照先入先出的順序,
也就是物件被刪除的時間順序覆蓋Recycle Bin中的物件。也可以透過如下辦法手動清除Recycle Bin佔用的空間。
1) #清空某個表空間的RecycleBin池
Purge tablespace tablespace_name;
2) #清空某個表空間內的某個使用者的物件
Purge tablespace tablespace_name user user_name;
3) 清除刪除當前使用者的物件
purge recyclebin
4) 清除所有使用者的物件
Purge dba_recyclebin
需要Sysdba許可權
5) Drop table xxx purge 永久刪除
6) purge index object_name 清除物件的關聯索引
4 Flashback Drop 的侷限性
Flashback drop 是一個非常實用的技術,減少了很多不完全恢復的需要。 但仍存在一些侷限性:
1) 只能用於非系統表空間和本地管理表空間
2) 不能對Recycle Bin中的物件執行DDL,DML操作,只支援查詢
3)物件的參考約束不會被恢復,也就是外來鍵約束需要重建
#####################################################
4 Flashback Query and Flashback Table
#####################################################
這些功能的實現也依賴於Flashback 功能的開啟嗎?是的;
Flashback Query 實際包含3個工具,即Flashback Query, Flashback Version Query 和 Flashback Transaction Query. 這些工具都是利用Undo的內容來實現回退功能。
前兩個屬於分析工具,用於找出想要回退到的時間點,而Flashback Table才真正完成回退的操作。
1 Flashback Query
#查詢過去某個時間點時的資料
select * from emp as of timestamp to_timestamp('2010-08-03 10:55:15','yyyy-mm-dd hh24:mi:ss');
# 恢復資料
Insert into emp select * from emp as of timestamp to_timestamp('2010-08-03 10:55:15','yyyy-mm-dd hh24:mi:ss');
2 Flashback Version Query
相對於Flashback Query只能看到某一點的物件狀態,Oracle 10g引入的Flashback Version Query可以看到過去某個時間段內,記錄如何變化的。
根據這個變化的歷史,可以決斷資料是在什麼時間點發生了錯誤。
#檢視錶EMP的操作歷史
col versions_xid format a16 heading 'XID'
col versions_startscn format 99999999 heading 'Vsn|Start|SCN'
col versions_endscn format 99999999 heading 'Vsn|End|SCN'
col versions_operation format a12 heading 'Operation'
select versions_xid, versions_startscn, versions_endscn,
decode( versions_operation, 'I', 'Insert', 'U', 'Update', 'D', 'Delete', 'Original') "operation",
id, name
from emp
versions between scn minvalue and maxvalue;
注意結果主從下向上看。Original代表最開始的資料。
3 相關的偽列
1) ORA_ROWSCN
記錄最後一次被修改時的SCN, 這裡的修改是指"被提交的修改",如果沒有提交,那麼這個偽列不會發生變化。
ORA_ROWSCN 預設是資料塊級別的,也就是一個資料塊內的所有記錄都是一個ORA_ROWSCN. 資料塊內的任意一條記錄被修改,這個資料塊內的所有記錄ORA_ROWSCN都會同時改變。
透過在建表時使用關鍵字rowdependencies, 可以改變這我們預設行為。使用這個關鍵字後,每條記錄都有自己的ORA_ROWSCN.
建立表時,如果沒有使用rowdependencies關鍵字,則ORA_ROWSCN使用的是資料塊頭的SCN,因此在一個資料塊內所有記錄的ORA_ROWSCN都一樣。
如果使用了rowdependencies關鍵字,則每個記錄都有自己的ORA_ROWSCN。這個值來自於ITL或dscn欄位。
2)VERSIONS_STARTSCN
表示這行記錄獲得的值是在哪個SCN獲得的,如果為NULL,則表明這一行的值早於versions between scn MINVALUE and MAXVALUE中的MINVALUE。
3) VERSIONS_STARTTIME
同上
4) VERSIONS_ENDSCN
這行記錄的這個值是到哪個SCN過期的。
5) VERSIONS_TIME
同上
6) VERSIONS_XID
導致事務修改的事務號
7) VERSIONS_OPERATION
修改型別
U: update
I: insert
D: delete
兩個函式:
SCN_TO_TIMESTAMP(current_scn)
select current_scn,scn_to_timestamp(current_scn) curr_time from v$database;
TIMESTAMP_TO_SCN('yyyy-mm-dd hh24:mi:ss1')
Notes
要使用Flashback Version Query, 使用者首先要有物件的Select, flashback許可權,對錶執行過DDL語句之後,就只能檢視DDL語句之後的版本,
也就是說Flashback Version Query 不會跨越DDL操作。
Oracle 11g有沒有改變,如果可以跨越DDL的話,就可以作為小範圍內的審計了;??
4 Flashback Transaction Query
Flashback Transaction Query 與Flashback Version Query類似,也是使用UNDO資訊來實現,利用這個功能可以檢視某個事務執行的所有變化。
使用這個功能,需要訪問Flashback_transaction_query檢視
select xid, operation, commit_scn, undo_sql
from flashback_transaction_query
where xid in(
select versions_xid
from emp
versions between scn minvalue and maxvalue);
XID OPERATION COMMIT_SCN UNDO_SQL
---------------- -------------------------------- ---------- --------------------------------------------------------------------------------
0500260003030000 INSERT 2160333 delete from "GZDC"."EMP" where ROWID = 'AAANPcAAEAAAABUAAB';
0500260003030000 BEGIN 2160333
0A00050086020000 INSERT 2160316 delete from "GZDC"."EMP" where ROWID = 'AAANPcAAEAAAABUAAA';
0A00050086020000 INSERT 2160316 delete from "GZDC"."DEP" where ROWID = 'AAANPbAAEAAAABMAAA';
0A00050086020000 BEGIN 2160316
可以看到每個事務的操作歷史。
5 Flashback table
Flashback table 真正進行資料的回退。
如果想對錶進行Flashback,必須允許row movement.
alter table t1 enable row movement;
flashback table emp,dep to scn xxxx;
6 UNDO Retention
UNDO_RETENTION引數定義的是提交修改後的UNDO記錄還要保留多長時間,但是Oracle並不強制保留,如果UNDO空間不夠,即使時間沒有達到限制,這些記錄還是會被覆蓋。
可以透過在UNDO表空間或者資料庫設定Retention Guanrantee來強制保留,預設沒有開啟這個功能。
select tablespace_name, retention from dba_tablespaces;
TABLESPACE_NAME RETENTION
------------------------------ -----------
SYSTEM NOT APPLY
UNDOTBS1 NOGUARANTEE
SYSAUX NOT APPLY
TEMP NOT APPLY
USERS NOT APPLY
alter tablespace UNDOTBS1 retention guarantee;
SQL> select tablespace_name, retention from dba_tablespaces;
TABLESPACE_NAME RETENTION
------------------------------ -----------
SYSTEM NOT APPLY
UNDOTBS1 GUARANTEE
SYSAUX NOT APPLY
TEMP NOT APPLY
USERS NOT APPLY
即使強制後,如果空間出現不夠時,如何處理?
#####################################################
5 小結
#####################################################
Flashback 家族技術總結:
工具 -- 相關技術 -- 目的
1) Flashback database -- Flashback Log -- 回滾資料庫
2) Flashback drop -- Tablespace Bin -- 恢復使用者誤刪的物件
3) Flashback Version Query -- UNDO -- 恢復使用者誤刪的操作
4) Flashback Transaction Query -- UNDO -- 恢復使用者誤刪的操作
5) Flashback table -- UNDO -- 恢復使用者誤刪的操作,在表級別上的操作
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10248702/viewspace-704337/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- flashback學習筆記筆記
- flashback學習日記
- oracle學習筆記Oracle筆記
- oracle 學習筆記 (ORACLE NET )Oracle筆記
- CUUG筆記 ORACLE索引學習筆記筆記Oracle索引
- oracle學習筆記《一》Oracle筆記
- Oracle學習筆記2Oracle筆記
- Oracle學習筆記1Oracle筆記
- ORACLE dataguard學習筆記Oracle筆記
- ORACLE學習筆記(zt)Oracle筆記
- Oracle學習筆記-1Oracle筆記
- oracle flashback特性學習總結Oracle
- 全面學習oracle flashback特性(3.2)--Flashback Database操作示例OracleDatabase
- 全面學習oracle flashback特性(2.1)--Flashback Table之RECYCLEBINOracle
- Oracle DBA學習日記筆記Oracle筆記
- Oracle Scheduler學習筆記分享Oracle筆記
- oracle之awr學習筆記Oracle筆記
- Oracle基礎學習筆記Oracle筆記
- Oracle學習筆記之二Oracle筆記
- oracle 原理學習筆記(一)Oracle筆記
- oracle學習筆記--oracle常用的命令Oracle筆記
- oracle 學習筆記---效能優化學習(1)Oracle筆記優化
- 全面學習oracle flashback特性(2.3)--Flashback Table之注意事項Oracle
- Oracle學習筆記(6)——函式Oracle筆記函式
- oracle學習筆記-常用的命令Oracle筆記
- oracle學習筆記——檢視、索引Oracle筆記索引
- oracle9i學習筆記Oracle筆記
- 吳劍筆記--Flashback筆記
- numpy的學習筆記\pandas學習筆記筆記
- Oracle體系結構學習筆記Oracle筆記
- oracle學習筆記8: 分析函式Oracle筆記函式
- oracle學習筆記零碎(三)Oracle筆記
- oracle學習筆記零碎(二)Oracle筆記
- oracle學習筆記零碎(一)Oracle筆記
- ORACLE學習筆記--效能優化FAQ。Oracle筆記優化
- oracle 學習筆記---效能優化(1)Oracle筆記優化
- oracle 學習筆記---效能優化(2)Oracle筆記優化
- oracle 學習筆記---效能優化(3)Oracle筆記優化