標籤:rman 物理 nbsp 位元組 table $0 預設 閃回技術 字典
Oracle flashback 是一種方便快捷的資料庫恢複技術,它不使用備份檔案,通過閃回日誌可以使資料庫恢複到過去的某個狀態,當使用者發生邏輯錯誤時(誤刪表資料、表、資料表空間等)需要快速恢複資料庫,可以使用Flashback 實現。
1 啟用Flashback 資料庫
Oracle 預設不啟動flashback 資料庫,使用flashback 技術必須先啟動資料庫到flashback 狀態,且資料庫必須處於archive 模式下,並啟用閃回恢複區,因為閃回記錄檔必須存放在閃回恢複區中。
1) 檢查資料庫的歸檔狀態
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 4
Next log sequence to archive 6
Current log sequence 6
SQL>
如果資料庫沒有啟動到歸檔模式,需要手動啟動到模式下。
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog
2) 確定閃回恢複區的目錄
SQL> show parameter DB_RECOVERY_FILE_DEST;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /usr/oracle/app/flash_recovery
_area
db_recovery_file_dest_size big integer 3882M
3) 查看並設定db_flashback_retention_target參數
該參數是一個以分為單位的數字,預設為1440分鐘,表示從當前開始計算最大可以把資料庫閃回到過去的時間。
SQL> show parameter db_flashback_retention_target;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 2880
此處必須明確Oracle 不保證一定可以閃回到時間段內的某個時間點,因為閃回日誌是由快閃恢複區自動維護的,如果由於備份資料庫或者其他動作引起磁碟空間不足,閃回日誌將會被刪除,所以我們在資料庫運行時要評估快閃恢複區的空間,可以通過下面的參數查看
4) 評估快閃恢複區的空間
可以通過訪問資料字典v$flashback_database_log來評估需要的快閃恢複區空間。
SQL> select *
2 from v$flashback_database_log;
OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE
-------------------- --------------------- ---------------- -------------- ------------------------
6202363 2017/6/19 星期一 22:24:4 2880 92143616 546471936
ESTIMATED_FLASHBACK_SIZE表示系統估計的快閃恢複區的大小為546471936位元組, FLASHBACK_SIZE表示當前閃回資料的大小為92143616位元組。
5) 啟動資料庫到可閃回狀態
要啟動閃回資料庫,必須先將系統啟動到mount狀態,然後啟動閃回資料庫
SQL> startup mount
SQL> alter database flashback on
SQL> alter databse open
查看當前資料庫是否啟動了閃回狀態,可以訪問資料字典v$database
SQL> select dbid, name, flashback_on from v$database;
DBID NAME FLASHBACK_ON
---------- --------- ------------------
1452257309 ORCL YES
6) 查詢資料表空間是否處於閃回保護狀態
SQL> select name, flashback_on
2 from v$tablespace;
NAME FLASHBACK_ON
------------------------------ ---------------
SYSTEM YES
SYSAUX YES
UNDOTBS1 YES
USERS YES
TEMP YES
CTRR_DATA YES
APSALU3_DATA YES
DEFAULT_TABLESPACE YES
TEMP02 YES
RMAN_TS YES
7) 開啟或者關閉某個資料表空間閃回狀態
首先資料庫必須處於mount狀態下才能進行此操作
SQL> startup mount
SQL> alter tablespace users flashback on/off
2 閃回資料庫的實施步驟
1) 資料庫層級閃回
使用scott使用者建立測試表插入一部分資料然後刪除。
擷取一個刪除前的時間點用於閃回恢複
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual;
2017-06-21 12:36:49
刪除測試表
drop table t_test1;
drop table t_test3;
commit;
關閉資料庫啟動到mount狀態
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 450953216 bytes
Fixed Size 2214256 bytes
Variable Size 348128912 bytes
Database Buffers 96468992 bytes
Redo Buffers 4141056 bytes
Database mounted.
使用閃回命令將資料庫恢複到刪除表之前的時間點
flashback database to timestamp to_timestamp(‘2017-06-21 12:36:49‘,‘yyyy-MM-dd hh24:mi:ss‘);
SQL> flashback database to timestamp to_timestamp(‘2017-06-21 12:36:49‘,‘yyyy-MM-dd hh24:mi:ss‘);
Flashback complete.
然後使用read only 模式開啟資料庫驗證刪除的表是否已經恢複
alter database open read only
驗證無誤之後再重新啟動資料到mount狀態,然後使用resetlogs 開啟資料庫,閃回日誌仍然有效,我們還可以繼續閃回到resetlogs以前的某一個時間點,但是這裡需要明確一點資料庫不能再閃回到resetlogs 之後的某個時間點了,例如這次我們閃回的時間點為:2017-06-21 12:36:49,我們只能閃回到此時間點之前的某個時間點,之後的時間點不能再閃回了。
SQL> startup mount
SQL> alter database open resetlogs
查看之前刪除的兩個表已經恢複回來了。
2) 刪除使用者測試
建立使用者
create user latiny identified by XXXXX
default tablespace default_tablespace
temporary tablespace temp;
grant connect, resource to latiny;
建立表插入測試資料
create table t_test1(id number not null primary key);
迴圈插入1000條資料
擷取系統目前時間,用以刪除之後閃回恢復點
select to_char(sysdate,‘yyyy-mm-dd hh24:mi:ss‘) from dual;
2017-06-21 12:36:49
latiny使用者退出登入,使用sys使用者刪除建立的使用者
drop user latiny cascade;
關閉資料庫啟動到mount狀態下
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 450953216 bytes
Fixed Size 2214256 bytes
Variable Size 352323216 bytes
Database Buffers 92274688 bytes
Redo Buffers 4141056 bytes
Database mounted.
將資料庫恢複到latiny使用者被刪之前的時刻
SQL> flashback database to timestamp to_date(‘2017-06-21 12:36:49‘,‘yyyy-MM-dd hh24:mi:ss‘);
Flashback complete.
唯讀方式開啟資料檢查被刪的使用者latiny是否已被恢複。
SQL> alter database open read only;
Database altered.
使用者跟使用者建立的表都已恢複
關閉資料庫,啟動到mount狀態,然後再以resetlogs狀態啟動到open狀態
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 450953216 bytes
Fixed Size 2214256 bytes
Variable Size 352323216 bytes
Database Buffers 92274688 bytes
Redo Buffers 4141056 bytes
Database mounted.
SQL> alter database open resetlogs;
Database altered.
2 閃回刪除
如果使用者使用drop table命令,該表不會立即刪除,而是保持原本位置,並且將刪除的表資訊儲存在資源回收筒中保留原表名並且賦予一個新的名字,顯然此時被刪除的表佔有的空間沒有立刻被釋放,記錄的資訊在資源回收筒中會保留一段時間,直到資源回收筒空間不足或者使用purge 指令永久刪除資源回收筒中的記錄。
資源回收筒是一個邏輯結構,不具有物理資料結構,只要刪除的表資訊記錄在其中就可以通過閃回技術恢複。
1) 查看資料庫閃回刪除是否啟動
SQL> show parameter recyclebin;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string on
已啟動,如未啟動可以使用如下命令
SQL> alter system set recyclebin=on scope=both;
2) 資源回收筒的使用
通過查詢資料字典USER_RECYCLEBIN與 DBA_RECYCLEBIN 可以得到資源回收筒刪除表的所有資訊
select *
from dba_recyclebin;
select *
from user_recyclebin;
刪除latiny使用者下建立的測試表
SQL> drop table t_test1;
Table dropped
SQL> commit;
Commit complete
然後用sql查看資源回收筒資訊,可以發現被刪除的表資訊。
恢複刪除的表
SQL> flashback table T_TEST1 to before drop;
Done
可以查看到該表已恢複。
這裡需要注意一點,表被刪除之後相關的資料庫物件(索引,觸發器)等都將被刪除閃回之後這些對象也會跟著被恢複,但是名字不再是未刪除之前的名字,它會改變,是系統自動起的名字,不易閱讀理解,需要手工修改。
3) 多個同名的表恢複
在實際使用中,可能不同的庫或者同一庫在不同時間裡刪除相同名字的表,那麼在恢複前我們需要通過表的結構,刪除時間等來確定哪一個表是真正需要恢複的表。
建立測試表t_test1,並且插入一些資料
create table t_test1(id number not null primary key);
然後刪除
再建立測試表t_test1,並且插入一些資料
create table t_test1(id number not null primary key, name varchar2(25));
查看資源回收筒發現兩個一樣的表
SQL> select object_name, original_name, type, droptime
2 from user_recyclebin;
OBJECT_NAME ORIGINAL_NAME TYPE DROPTIME
------------------------------ -------------------------------- ------------------------- -------------------
BIN$UneF8OUhYlbgUAB/AQBq2g==$0 T_TEST1 TABLE 2017-06-21:19:36:23
BIN$UneF8OUgYlbgUAB/AQBq2g==$0 SYS_C0012828 INDEX 2017-06-21:19:36:23
BIN$UneF8OUkYlbgUAB/AQBq2g==$0 SYS_C0012830 INDEX 2017-06-21:19:36:39
BIN$UneF8OUlYlbgUAB/AQBq2g==$0 T_TEST1
使用desc 查看錶結構,注意一定要在系統裡通過sqlplus進去使用該命令,使用PL/SQL或者其他遠端連線工具的command 視窗查詢不到表結構,會提示object_name對應的表名不存在。
SQL> desc "BIN$UneF8OUhYlbgUAB/AQBq2g==$0";
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
SQL> desc "BIN$UneF8OUlYlbgUAB/AQBq2g==$0";
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NOT NULL NUMBER
NAME VARCHAR2(25)
使用object_name恢複表
SQL> flashback table "BIN$UneF8OUlYlbgUAB/AQBq2g==$0" to before drop rename to t_test1_new;
Flashback complete.
查詢恢複的表存在,並且就是之前建立的有兩個欄位的t_test1;
4) purge 永久刪除表
如果非常確定一個表沒有用了,可以永久刪除,可以使用purge命令,此命令刪除的表資源回收筒不會存它的任何記錄。
SQL> drop table t_test1_new purge;
Table dropped
如果一個表已經在資源回收筒想永久刪除,可以使用如下命令
SQL> purge table t_test1;
Done
此時查看資源回收筒已經沒有任何資訊了,因為之前的兩個測試表資訊都已經使用帶purge命令刪除與清空了
SQL> show recyclebin;
SQL>
Oracle Flashback 詳解