Oracle Flushback 學習測試
Oracle Flushback 學習測試:三思筆記
Flashback恢復
從9i開始,利用oracle查詢的多版本一致的特點,實現從回滾段中讀取一定時間內在表中操作的資料,被稱為 flashback query,到10g,利用recycle(回收站)和flask recovery area(閃回區)的特性,來實現快速恢復被刪除的表,甚至對整個db進行時間點的閃回,
1 閃回查詢
Flashback query利用oracle的多版本讀一致性從undo tablespace 中讀取操作前的資料,
要使用閃回查詢特性,
1.1應用flashback query查詢過去的資料
1.1.1基於時間的查詢(as of timestamp)
建立一個表
create table t_flashback as
select rownum rn from dual connect by rownum<10
然後 delete from t_flashback
select * from t_flashback as of timestamp sysdate-5/1440—得出5分中前的資料
然後在
insert into t_flashback
select * from t_flashback as of timestamp sysdate-5/1440
1.1.2 基於scn的恢復(as of scn)
基於scn,先得到scn
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
grant execute on DBMS_FLASHBACK to scott
-- select current_scn from v$database
恢復 select * from t_flashback as of scn 2412653
利用timestamp,也會轉換成scn
desc sys.smon_scn_time—時間與scn的對應表
CREATE TABLE SYS.SMON_SCN_TIME
(
THREAD NUMBER,
TIME_MP NUMBER,
TIME_DP DATE,
SCN_WRP NUMBER,
SCN_BAS NUMBER,
NUM_MAPPINGS NUMBER,
TIM_SCN_MAP RAW(1200),
SCN NUMBER DEFAULT 0,
ORIG_THREAD NUMBER DEFAULT 0 /* for downgrade */
)
CLUSTER SYS.SMON_SCN_TO_TIME(THREAD)
NOCOMPRESS ;
在10g中,系統平均每3秒產生一次與系統時間對應的scn的匹配並存入SYS.SMON_SCN_TIME中,
可以手動轉換
select timestamp_to_scn(sysdate) from dual—轉換為scn
select to_char(scn_to_timestamp(2412364),'yyyy-mm-dd hh24:mi:ss') from dual
1.1.3 使用DBMS_FLASHBACK實現flashback query
1.2 應用dbms_flashback查詢操作的事務
1.2.1 使用flashback version query 查詢記錄修改版本
通過version between能檢視指定時間段內的undo表空間中記錄的不同版本(只包括被提交的記錄)
select rn,versions_startscn,versions_endscn,versions_operation,versions_xid from T_FLASHBACK versions between scn 2413982 and 2413988
ORA-30054: invalid upper limit snapshot expression
1.2.2 利用flashback version query查詢事務資訊
檢視flashback_transaction_query
desc flashback_transaction_query
delete from t_flashback
commit
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual-- 2413988
獲取scn
Grant select any TRANSACTION to scott
select XID,COMMIT_SCN,COMMIT_TIMESTAMP,OPERATION,UNDO_SQL
from FLASHBACK_TRANSACTION_QUERY q where q.xid in(
select versions_xid from T_FLASHBACK versions between scn 2413982 and 2414572)
結果
080020001F060000 2413986 2013-8-5 16:22:52 INSERT delete from "SCOTT"."T_FLASHBACK" where ROWID = 'AAANM8AAAAAAAAAAAA';
1.3 flashb query的注意事項
1.3.1自動撤銷管理表空間
要使用flashback的相關特性,必須啟用自動撤銷管理表空間
是否啟用了自動撤銷表空間管理,有2個初始化引數
Undo_management:值為auto表示使用了自動撤銷管理,為manul表示手動
select * from v$parameter where name like'%undo_management%'
Undo_tablespace:oracle db可以建立多個undo 表空間,不過同時只能使用一個,當上個引數為auto時,此引數用來指定當前使用的undo tablespace,
select *from dba_tablespaces where contents='UNDO'
select * from v$parameter where name like'%undo_tablespace%'
Undo的大小,直接影響到flashback的能力,
select * from v$parameter
undo_tablespace UNDOTBS1
undo_retention 900
select * from v$tablespace
select file#,name,bytes/1024/1024 from v$datafile
/u01/app/oracle/oradata/hongquan/undotbs01.dbf
1.3.2 undo_retention引數
用來指定undo段中資料儲存的最短時間(預設900s),新事物的開始,undo被寫滿,則會覆蓋以前的undo資訊,沒寫滿,時間過了也不會被覆蓋,
只有在為undo指定了retention guarantee,在指定的日期之前不會覆蓋undo的資料
Alter tablespace undo1 retention guarantee 開啟
Alter tablespace undo1 retention noguarantee關閉
例如,procedure,在user_source中找到。
select * from DBA_source where type='PROCEDURE' AND NAME='P' --as of scn 2416811
select * from DBA_source as of scn 2416800 where type='PROCEDURE' AND NAME='P' conn / as sysdba
1.3.3 ddl的影響
修改並提交資料後,對該表做過ddl操作
Drop/modify列
Move表
Drop表(如果有partition)
Truncate table/partition 這些操作會令undo表空間中的撤銷資料消失,這些操作對錶使用後,進行flashback query操作會發生ora-01466
另外閃回查詢也支援對遠端資料訪問select* from [email protected] as of tiemstamp/scn
create table test12 (b number)
insert into test12
values(10)
alter table test12 add(c number)
select * from test12 as of timestamp sysdate-2/24----undo中已經失效
10
10
2 flashback table 閃回表
10g中引入了recycle bin(回收站)主要針對被刪除的表及關聯的物件,trigger,index,constraint,被刪除的物件並非真正的刪除,先修改資料字典,將其改名放入recycle bin中
2.1 從recycle bin 中恢復
2.1.1 簡單的刪除恢復
drop table t_flashback
select * from recyclebin—檢視被刪掉的表
T_FLASHBACK DROP TABLE YYHHQQ 2013-08-05:15:34:36 2013-08-05:17:26:26
flashback table T_FLASHBACK to before drop---表被恢復
此時在recyclebin 中T_FLASHBACK已經消失
表關聯的index也被恢復成功,但是名字需要改
Alter index xxx rename to xxx
create table test12 (b number)
insert into test12
values(10)
select * from test12
drop table test12
select * from recyclebin
flashback table TEST12 to before drop
drop table t_flashback
select * from recyclebin
flashback table t_flashback to before drop
select * from t_flashback
2.1.2 複雜的恢復
當恢復在oracle已經存在的表名,
flashback table T_FLASHBACK to before drop rename to T_FLASHBACK_OLD
2.1.3 從多次刪除中恢復
flashback table T_FLASHBACK to before drop
flashback table T_FLASHBACK to before drop rename to T_FLASHBACK2最先刪除的表最先被恢復
可以直接指定表名
Flashback table ‘xxxx’ to before drop
2.2 從undo中恢復
Flashback table T_FLASHBACK to scn 2416800 或者timestamp
----所有記錄恢復到指定的狀態
--select * from table1;
--select dbms_flashback.get_system_change_number from dual; 記錄scn2416800
--select *from table1 as of scn 2416800
--flushback table table1 to scn 2416800
2.3 應用flashback table的注意事項
2.3.1 基於undo的恢復
基於undo的被恢復的表必須啟用row movement
select row_movement from user_tables where table_name='T_FLASHBACK'
DISABLED/enabled
手動開啟 alter table T_FLASHBACK enable row movement
手動關閉 alter table T_FLASHBACK disable row movement
基於undo表的恢復注意ddl的影響
可以手動enable triggers
可以恢復索引,但是統計資訊不回恢復到指定時間段
基於undo的表恢復不支援:物化檢視,系統表,遠端表,物件表,巢狀表,表分割槽,子分割槽,聚簇表,高階佇列
2.3.2 基於recycle bin的恢復
Flashback drop,手動恢復constraint
所操作的表必須是存在本地表空間管理中
被恢復的index 等要重新命名
當刪除表時,被依賴的物化檢視也同時刪除,恢復時,不能恢復物化檢視
恢復時,缺失index等時資料檔案空間不足
可以同時恢復多個表
Flashback drop只能恢復被drop的表
2..4 認識和管理recycle bin
2.4.1 檢視recycle bin中的物件
Select * from recyclebin ;資料字典 user_recyclebin
Recycle bin中的內容允許訪問,不能修改,
查詢其一個表的內容
select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0"
recycle bin中的物件也能夠支援flashback query,
select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0" as of timestamp sysdate-1
2.4.2 recycle bin的管理
回收站的空間是有限的,主動觸發回收站清除內容,就是回收站空間不足,
表空間無足夠的空閒空間,並且沒有新的擴充套件,
該表空間內要建立新的物件,需要分配空間
Recycle bin清除的遠原則是先進先出。
2.4.3 主動清除recycle bin中的物件
1 修改初始化引數禁用或啟用recycle bin
10g後新增的recyclebin,預設是開啟,
SQL> show parameter recyclebin;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
recyclebin string
on
Alter session set recyclebin=off;/on 設定為off後,所有drop的物件都不會存放在回收站中
2 刪除時指定purge引數
當通過drop刪除表時,預設不會把這個表所佔用的空間給釋放,
drop table T_FLASHBACK
select * from recyclebin
flashback table "BIN$yOxeoMpGQwmdgemrC0lD7Q==$0"to before drop
drop table T_FLASHBACK purge—後不存在recyclebin中
3 清除recyclebin中的現有物件
create table T_FLASHBACK(id number)
drop table T_FLASHBACK
select * from recyclebin
purge table T_FLASHBACK
或者 purge recyclebin
或者 purge tablespace yyhhqq
3 flashback database閃回資料庫
Flashback database閃回資料庫,可以把db恢復到指定的時間點,
3.1 認識flashback database
3.1.1 瞭解flashback database
常規備份是“備份+有效歸檔”,
從啟用flashback database開始到當前那一刻,藉助於flashback database,可以將db修復到這中間點的任意時刻,
3.1.2 原理
Oracle 引入了另外一個日誌flashback logs,記錄下操作執行前要修改的資料,即資料的前映像,這些資訊被寫入一個專門的區域(閃回區),
Oracle建議flash recovery area,能容納下所有的(資料檔案,控制檔案,redo,備份檔案,增量備份檔案,以及尚未歸檔的檔案,和flash logs),
3.1.3 必要條件
1 資料庫必須處於歸檔模式
2 資料庫必須知道了flash recovery area
flash recovery area 兩個引數:db_recovery_file_dest 指定fra的路徑,可以指定一個檔案系統下的路徑,或者asm磁碟組,不能指向裸裝置,
db_recovery_file_dest_size:指定fra的大小
show parameter db_recover
SQL> show parameter db_recover;
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery
_area
db_recovery_file_dest_size big intege 2G
SQL> alter system set db_recovery_file_dest_size=4g;
System altered.
SQL> alter system set db_recovery_file_dest='f:\mydb\fra';
System altered.
3 資料庫必須啟動flashback on
select flashback_on from v$database
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38759: Database must be mounted by only one instance and not open.
要改變設定,db必須處於mount狀態,並且已經打開了歸檔模式,
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 109053520 bytes
Database Buffers 171966464 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
SQL> set time on-------多了一個程序
17:07:15 SQL> ho ps -ef|grep rvm
oracle 16473 21307 0 17:07 pts/0 00:00:00 /bin/bash -c ps -ef|grep rvm
4 初始化引數:db_flashback_retention_target
用來控制 flask logs的保留時間,或者希望flashback database最早恢復的時間點,預設1440分
select * from v$parameter where name='db_flashback_retention_target'(1天),
5 啟用force logging
Force logging用來強制把所有操作都記錄在redo中,
select force_logging from v$database
SQL> alter database force logging;
Database altered.
3.1.4 制約因素
1 flashback database用來恢復到某個時間點,不用於介質恢復,不能用flashback database恢復之前被刪除的資料檔案。
2 如果控制檔案被重建,再次之前產生的所有的flashback logs統統失效,
3 不支援對資料庫進行(shrink)操作後的恢復
3.2 flashback database示例
1 檢查是否啟用了fra
SQL> show parameter db_recover;
2 檢查是否啟用了歸檔
Sysdba
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5
3 檢查是否啟用了flashback on跟force logging
select force_logging ,flashback_on from v$database
4 查詢當前scn
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual---- 2449174
5 模擬誤操作
6 重做啟動到mount狀態
Shutdown immediate
Startup mount
Flashback database to scn 2449174
7 有2中方式修復資料庫
1 直接alter database open resetlogs:指定scn後的資料全部丟失,方式資料處於不一致的狀態
2 先執行alter database open read only,以read only模式開啟資料庫,然後立刻匯出誤操作的資料,再執行recover database以重新應用資料庫產生的redo,將db修復到flashback database操作之前,
一、何時使用閃回技術
當 Oracle 資料庫中發生了邏輯損壞時,如果您需要快速容易地恢復資料,就必須使用閃回技術。與發生人為錯誤的情況一樣,很難標識受錯誤事務處理影響的物件和行。
使用閃回技術時,可診斷出錯誤是如何引入到資料庫中的,然後可修復損壞的資料。您可以檢視導致特定行修改的事務處理,檢視某個時間段內指定行的整個版本集,或者
只檢視過去特定時間顯示的資料。幻燈片表中顯示了閃回技術的典型用法。
閃回資料庫使用閃回日誌執行閃回。閃回刪除使用回收站。其它所有功能都使用還原資料。並不是所有閃回功能都會修改資料庫。有些功能只是一些用來查詢資料
其它版本的方法。這些工具用來檢視問題並幫助進行恢復。根據閃回查詢結果,可執行下列其中一項操作:
確定執行哪種型別的資料庫修改閃回操作來修復問題。
將這些查詢結果集反饋到 INSERT、UPDATE 或 DELETE 語句以便於修復錯誤資料。
二、閃回資料庫概要
使用閃回資料庫時,通過還原自先前某個時間點以來發生的所有更改,可快速將資料庫恢復到較早的時間點。這個操作速度很快,因為不需要還原備份。
使用這個功能可撤消導致邏輯資料損壞的更改。如果資料庫發生介質丟失或物理損壞,則必須使用傳統恢復方法。
三、閃回資料庫減少還原時間
閃回資料庫比使用還原檔案和重做日誌檔案的傳統時間點恢復的速度要更快。隨著資料庫規模的增加,通過還原所有資料檔案來執行傳統的時間點恢復所需的時間長
度變得不太現實。使用閃回資料庫時,因為不需要還原資料檔案,所以恢復資料庫的時間與需要回退的更改數目(而不是資料庫大小)成比例。
閃回資料庫是通過使用一類被稱為閃回資料庫日誌的日誌檔案來實施的。Oracle 資料庫會定期將資料塊的“前像”記錄在閃回資料庫日誌中。為了快速將資料檔案更改
回退到捕獲閃回日誌的時間(就在所需目標時間之前),可以重用塊影象。然後,應用重做日誌檔案中的更改來填充間隔。在快速恢復區中會自動建立和管理閃回資料庫日誌。
四、閃回資料庫注意事項
在不能使用閃回資料庫功能的情況下,必須使用不完全恢復操作將資料庫返回到特定時間。閃回資料庫操作完成後,可在只讀模式下開啟資料庫,驗證是否使用了正確
的目標時間或系統更改號 (SCN)。如果沒有,可以再次閃回資料庫,或者通過執行恢復操作來前滾資料庫。因此,要撤消閃回資料庫操作,必須向前恢復資料庫。
注:閃回保留目標並不能絕對保證閃回可用。如果快速恢復區中必需存在的檔案需要佔用空間,可能會自動刪除閃回日誌。
五、閃回資料庫限制
不能使用閃回資料庫恢復自閃回目標時間以來已刪除的資料檔案。刪除的資料檔案會新增到控制檔案中且標記為離線,但是不會閃回。閃回資料庫不能閃回自閃回目
標時間以來已收縮的資料檔案。這種資料檔案必須先離線,才能執行閃回操作。
六、閃回資料庫實施
使用FLASHBACK DATABASE可以恢復資料庫到先前的某個時間點或者某個SCN號。在Oracle10g以前的版本中,要實現資料庫恢復到過去某個時間點或者SCN號,
只能夠通過資料庫的不完全恢復實現。從Oracle 10g開始,可以使用FLASHBACK DATABASE實現。使用FLASHBACK DATABASE要比執行資料庫系統的不完全恢復要快的多,但是需要對資料庫做以下的配置:
1、資料庫必須執行在歸檔模式下。
2、必須啟用資料庫的閃回功能。
3、必須配置初始化引數DB_FLASHBACK_RETENTION_TARGET。
注:db_flashback_retention_target引數是設定閃回資料的最長儲存時間,單位是分鐘;預設值是1440(60*24),即1天。
6.1 閃回操作的語法
FLASHBACK [STANDBY | DATABASE] [資料庫名稱] to SCN SCN號 | TIMESTAMP 時間表達式 | restore point 恢復點
6.2 配置閃回資料庫選項
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
SQL> select name,log_mode,open_mode,flashback_on from v$database;
NAME LOG_MODE OPEN_MODE FLASHBACK_ON
--------- ------------ ---------- ------------------
MYORACLE ARCHIVELOG MOUNTED NO
當前閃回資料庫的開關沒有開啟,需要設定開啟閃回開關。設定FLASHBACK_ON必須將資料庫載入到MOUNT狀態進行。
SQL> alter database flashback on;
資料庫已更改。
SQL> alter system set db_flashback_retention_target=3600;
系統已更改。
SQL> alter database open;
資料庫已更改。
6.3 閃回到某個時間點
SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss')
from v$flashback_database_log;
TO_CHAR(OLDEST_FLAS
-------------------
2011-07-12 10:20:59
SQL> drop table scott.emp;
表已刪除
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
SQL> flashback database to timestamp to_date('2011-07-12 10:20:59','yyyy-mm-dd hh24:mi:ss');
閃回完成。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250
……………………
已選擇14行。
6.4 閃回到某個系統更改號(SCN)
SQL> select oldest_flashback_scn from v$flashback_database_log;
OLDEST_FLASHBACK_SCN
--------------------
846734
SQL> truncate table scott.emp;
表被截斷。
SQL> select * from scott.emp;
未選定行
SQL> shutdown immediate;
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> startup mount;
ORACLE 例程已經啟動。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 96469672 bytes
Database Buffers 188743680 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
SQL> flashback database to scn 846734;
閃回完成。
SQL> alter database open resetlogs;
資料庫已更改。
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250
………………
已選擇14行。
七、Oracle資料庫回收站
Oracle也有回收站,如果不小心drop掉了哪張表,或誤刪了記錄,可以通過回收站閃回。首先查看回收站中有哪些物件被刪除:
SQL> select * from recyclebin t;
主要欄位有object_name、original_name、createtime、droptime,original_name就是你刪除物件之前在oracle裡面的名稱,根據droptime我們可以找到當時你刪除的版本的object_name,然後根據object_name就可以進行閃回。
SQL> flashback table "BIN$SxyIpbUaSlGWt9j/dEZEhw==$0" to before drop rename to gis_link;
注:object_name一定要用雙引號括起來,而不是單引號。