下面小編就為大家分享一篇基於Oracle閃回詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧:
Oracle 9i 開始支援閃回,Oracle10g開始全面支援閃回功能,Oracle11g有所完善,為大家快速的恢復資料,查詢歷史資料提供了很大的便捷方法。
本文主要對Oracle常用閃回使用做些詳細介紹,其中對於不常用的事務和版本閃回,這裡就不做介紹
一、Oracle閃回概述
二、Oracle閃回使用詳解
1、閃回開啟
(1)開啟閃回必要條件
a.開啟歸檔日誌
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /home/U01/app/oracle/oradata/testdb/arch
Oldest online log sequence 844
Next log sequence to archive 846
Current log sequence 846
##如未開啟,在mount狀態執行alter database archivelog;
b.設定合理的閃回區
db_recovery_file_dest:指定閃回恢復區的位置
db_recovery_file_dest_size:指定閃回恢復區的可用空間大小
db_flashback_retention_target:指定資料庫可以回退的時間,單位為分鐘,預設1440分鐘(1天),實際取決於閃回區大小
(2)檢查是否開啟閃回
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
NO
(3)開啟閃回
a.開啟歸檔
mount狀態:alter database archivelog;
b.設定閃回區
SQL> alter system set db_recovery_file_dest='/home/U01/app/oracle/fast_recovery_area' scope=both;
System altered.
SQL> alter system set db_recovery_file_dest_size=60G scope=both;
System altered.
SQL> alter system set db_flashback_retention_target=4320 scope=both;
System altered.
c.開啟flashback (10g在mount開啟)
SQL> alter database flashback on;
Database altered.
(4)確定閃回開啟
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
(5)關閉閃回
SQL> alter database flashback off;
Database altered.
2、閃回使用
(1)閃回查詢
閃回查詢主要是根據Undo表空間資料進行多版本查詢,針對v$和x$動態效能檢視無效,但對DBA_、ALL_、USER_是有效的
a.閃回查詢
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
SQL> delete from scott.dept where deptno=40;
row deleted.
SQL> commit;
Commit complete.
SQL> select * from scott.dept as of timestamp sysdate-10/1440;
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
SQL> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
SQL> select * from scott.dept as of scn 16801523;
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
b.閃回版本查詢
用於查詢行級資料庫隨時間變化的方法
c.閃回事務查詢
用於提供檢視事務級別資料庫變化的方法
(2)閃回表(update/insert/delete)
閃回表就是對錶的資料做回退,回退到之前的某個時間點,其利用的是undo的歷史資料,與undo_retention設定有關,預設是14400分鐘(1天)
同樣,sys使用者表空間不支援閃回表,要想表閃回,需要允許表啟動行遷移(row movement)
閃回表示例:
SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss')
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
SQL> select row_movement from dba_tables where table_name='DEPT' and owner='SCOTT';
ROW_MOVE
--------
DISABLED
SQL> alter table scott.dept enable row movement;
Table altered.
SQL> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
SQL> select * from scott.dept;
DEPTNO DNAME LOC
---------- -------------- -------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
OPERATIONS BOSTON
SQL> alter table scott.dept disable row movement;
Table altered.
(3)閃回DROP(drop table)
當一個表被drop掉,表會被放入recyclebin回收站,可通過回收站做表的閃回。表上的索引、約束等同樣會被恢復
不支援sys/system使用者表空間物件,可通過alter system set recyclebin=off;關閉回收站功能
閃回DROP示例:
SQL> select * from t ;
ID NAME
---------- ---------------------------------------
2
4
SQL> drop table t;
Table dropped.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$YEh2QcvZdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:02:06
SQL> flashback table t to before drop;
Flashback complete.
SQL> select * from t;
ID NAME
---------- -------------------------------------
2
4
備註:即使不開始flashback,只要開啟了recyclebin,那麼就可以閃回DROP表。
但如果連續覆蓋,就需要指定恢復的表名,如果已經存在表,則需要恢復重新命名。
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
T BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:27
SQL> flashback table "BIN$YEh2QcvcdJLgUxyAgQpnVQ==$0" to before drop ;
Flashback complete.
SQL> show recyclebin;
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
T BIN$YEh2QcvddJLgUxyAgQpnVQ==$0 TABLE 2017-12-14:15:07:54
SQL> flashback table t to before drop rename to tt;
Flashback complete.
(4)閃回資料庫(truncate/多表資料變更)
資料庫閃回必須在mounted狀態下進行,基於快照的可以再open下進行閃回庫
閃回資料庫主要是將資料庫還原值過去的某個時間點或SCN,用於資料庫出現邏輯錯誤時,需要open database resetlogs
a.全庫閃回
資料庫閃回示例
SQL> select * from scott.EMP;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
SMITH CLERK 7902 1980-12-17 00:00:00 800 20
ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
KING PRESIDENT 1981-11-17 00:00:00 5000 10
TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
JAMES CLERK 7698 1981-12-03 00:00:00 950 30
FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
rows selected.
SQL> truncate table scott.EMP;
Table truncated.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 9.4067E+10 bytes
Fixed Size 2263936 bytes
Variable Size 9395242112 bytes
Database Buffers 8.4557E+10 bytes
Redo Buffers 112766976 bytes
Database mounted.
SQL> flashback database to timestamp to_timestamp('2017-12-14 14:12:46','yyyy-mm-dd HH24:MI:SS');
Flashback complete.
SQL> alter database open resetlogs;
Database altered.
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
SMITH CLERK 7902 1980-12-17 00:00:00 800 20
ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
KING PRESIDENT 1981-11-17 00:00:00 5000 10
TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
JAMES CLERK 7698 1981-12-03 00:00:00 950 30
FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
rows selected.
b.快照閃回
針對主庫和備庫都可以建立閃回快照點,然後恢復到指定的快照點,但主庫一旦恢復到快照點,備庫的同步則需要重新同步
SQL> select * from scott.dept;
DEPTNO DNAME LOC ADDR
---------- -------------- ------------- ------------------------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
SQL> create restore point before_201712151111 guarantee flashback database;
Restore point created.
SQL> create table scott.t as select * from scott.dept;
Table created.
SQL> truncate table scott.t;
Table truncated.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 9.4067E+10 bytes
Fixed Size 2263936 bytes
Variable Size 9663677568 bytes
Database Buffers 8.4289E+10 bytes
Redo Buffers 112766976 bytes
Database mounted.
SQL> flashback database to restore point before_201712151111;
Flashback complete.
SQL> alter database open resetlogs;
Database altered.
此時主庫scott.t已不存在:
SQL> select * from scott.t;
select * from scott.t
*
ERROR at line 1:
ORA-00942: table or view does not exist
此時從庫的scott.依舊存在,主備同步終止
解決方案:在主庫建立快照時間點,從庫自動停止應用日誌,等主庫閃回後,重新應用日誌即可。
如果已經做了上述操作,從庫可以選擇重建
ALTER DATABASE REGISTER LOGFILE '/xx/xx/archive.dbf';
c.閃回snapshot standby
此功能在11GR2非常實用,可自動建立閃回點、開啟閃回日誌,可完成線上資料測試後,然後做資料庫閃回恢復主備關係
select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
select database_role,open_mode,db_unique_name,flashback_on from v$database;
SQL> set line 200;
SQL> set pagesize 2000;
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY testdbms NO
SQL> ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
Database altered.
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
SNAPSHOT STANDBY MOUNTED testdbms RESTORE POINT ONLY
SQL> alter database open;
Database altered.
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
此時備庫操作:
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
SMITH CLERK 7902 1980-12-17 00:00:00 800 20
ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
KING PRESIDENT 1981-11-17 00:00:00 5000 10
TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
JAMES CLERK 7698 1981-12-03 00:00:00 950 30
FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
rows selected.
SQL> truncate table scott.emp;
Table truncated.
主庫操作:
SQL> create table scott.t as select * from scott.dept;
Table created.
SQL> select * from scott.t;
DEPTNO DNAME LOC ADDR
---------- -------------- ------------- ------------------------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
備庫恢復到物理standby
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 9.4067E+10 bytes
Fixed Size 2263936 bytes
Variable Size 9663677568 bytes
Database Buffers 8.4289E+10 bytes
Redo Buffers 112766976 bytes
Database mounted.
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
Database altered.
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup ;
ORACLE instance started.
Total System Global Area 9.4067E+10 bytes
Fixed Size 2263936 bytes
Variable Size 9663677568 bytes
Database Buffers 8.4289E+10 bytes
Redo Buffers 112766976 bytes
Database mounted.
Database opened.
##此時備庫的資料已經恢復到轉變snapshot standby時間點
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY testdbms NO
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
SMITH CLERK 7902 1980-12-17 00:00:00 800 20
ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
JONES MANAGER 7839 1981-04-02 00:00:00 2975 20
MARTIN SALESMAN 7698 1981-09-28 00:00:00 1250 1400 30
BLAKE MANAGER 7839 1981-05-01 00:00:00 2850 30
CLARK MANAGER 7839 1981-06-09 00:00:00 2450 10
SCOTT ANALYST 7566 1987-04-19 00:00:00 3000 20
KING PRESIDENT 1981-11-17 00:00:00 5000 10
TURNER SALESMAN 7698 1981-09-08 00:00:00 1500 0 30
ADAMS CLERK 7788 1987-05-23 00:00:00 1100 20
JAMES CLERK 7698 1981-12-03 00:00:00 950 30
FORD ANALYST 7566 1981-12-03 00:00:00 3000 20
MILLER CLERK 7782 1982-01-23 00:00:00 1300 10
rows selected.
SQL> alter database recover managed standby database using current logfile disconnect;
Database altered.
SQL> select * from scott.t;
DEPTNO DNAME LOC ADDR
---------- -------------- ------------- ------------------------------
ACCOUNTING NEW YORK
RESEARCH DALLAS
SALES CHICAGO
SQL> select database_role,open_mode,db_unique_name,flashback_on from v$database;
DATABASE_ROLE OPEN_MODE DB_UNIQUE_NAME FLASHBACK_ON
---------------- -------------------- ------------------------------ ------------------
PHYSICAL STANDBY READ ONLY WITH APPLY testdbms NO
3、閃回注意事項
(1)資料庫閃回需要在mounted下進行,並且open時需要使用resetlogs
(2)閃回DROP只能用於非系統表空間和本地管理的表空間,外來鍵約束無法恢復,對方覆蓋、重新命名需注意
(5)閃迴歸檔,必須在assm管理tablespace和undo auto管理下進行
(6)注意閃回區管理,防止磁碟爆滿,閃回區空間不足等
(7)主庫做庫的閃回,會影響備庫,需要重新同步
(8)snapshot standby 不支援最高保護模式
三、備註
1、相關資料字典
V$FLASHBACK_DATABASE_LOG ##檢視資料庫可閃回的時間點/SCN等資訊 V$flashback_database_stat ##檢視閃回日誌空間記錄資訊
2、常用查詢語句
(1)檢視資料庫狀態
SQL> select NAME,OPEN_MODE ,DATABASE_ROLE,CURRENT_SCN,FLASHBACK_ON from v$database;
NAME OPEN_MODE DATABASE_ROLE CURRENT_SCN FLASHBACK_ON
------------- -------------------- ---------------- ----------- ------------------
TESTDB READ WRITE PRIMARY 16812246 YES
(2)獲取當前資料庫的系統時間和SCN
SQL> select to_char(systimestamp,'yyyy-mm-dd HH24:MI:SS') as sysdt , dbms_flashback.get_system_change_number scn from dual;
SYSDT SCN
2017-12-14 14:28:33 16813234
(3)檢視資料庫可恢復的時間點
SQL> select * from V$FLASHBACK_DATABASE_LOG;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TI RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- ------------------- ---------------- -------------- ------------------------
16801523 2017-12-14 11:35:05 4320 104857600 244113408
(4)檢視閃回日誌空間情況
SQL> select * from V$flashback_database_stat;
BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
------------------- ------------------- -------------- ---------- ---------- ------------------------
2017-12-14 14:34:53 2017-12-14 14:56:43 1703936 9977856 1487872 0
(5)SCN和timestamp裝換關係查詢
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
(6)檢視閃回restore_point
select scn, STORAGE_SIZE ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,NAME from v$restore_point;
(7)閃回語句
a.閃回資料庫
FLASHBACK DATABASE TO TIMESTAMP to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd HH24:MI:SS');;
flashback database to scn 16813234;
b.閃回DROP
flashback table table_name to before drop;
flashback table table_name to before drop rename to table_name_new;
c.閃回表
flashback table table_name to scn scn_number;
flashback table table_name to timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');
d.閃回查詢
select * from table_name as of timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');
select * from scott.dept as of scn 16801523;
e.閃回快照
create restore point before_201712151111 guarantee flashback database;
flashback database to restore point before_201712151111;
(7)閃回空間爆滿問題處理
請參照 基於ORA-19815閃回空間爆滿問題的處理方法