首頁>技術>

下面小編就為大家分享一篇基於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閃回空間爆滿問題的處理方法

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • SpringMVC載入流程