當(dāng) Oracle 數(shù)據(jù)庫發(fā)生邏輯損壞時,可以使用閃回技術(shù)簡單快捷地進(jìn)行數(shù)據(jù)庫的恢復(fù)。
閃回數(shù)據(jù)庫使用閃回日志執(zhí)行閃回。閃回刪除使用回收站。其它所有技術(shù)都使用還原數(shù)據(jù)。并不
是所有閃回功能都會修改數(shù)據(jù)庫。有些功能只是一些用來查詢數(shù)據(jù)以往版本的方法
一、閃回數(shù)據(jù)庫
使用閃回數(shù)據(jù)庫,通過還原自先前某個時間點以來發(fā)生的所有更改,可快速將數(shù)據(jù)庫恢復(fù)到過去
的某個時間點上的狀態(tài)。使用閃回數(shù)據(jù)庫功能時,不需要還原備份。閃回數(shù)據(jù)庫功能可以方便地
撤消導(dǎo)致邏輯數(shù)據(jù)損壞的更改。如果數(shù)據(jù)庫發(fā)生介質(zhì)丟失或物理損壞,則必須使用傳統(tǒng)的方法進(jìn)
行恢復(fù)。
1. 配置閃回數(shù)據(jù)庫的方法
SQL>shutdown immediate;
SQL>startup mount exclusive;
SQL>alter system set db_flashback_retention_terget=2880 scope=both;
SQL>alter system set DB_RECOVERY_FILE_DEST_SIZE=20G scope=both;
SQL>alter system set db_recovery_file_dest='+FRA' scope=both;
SQL>alter database flashback on;
SQL>alter database open;
注意:DB_FLASHBACK_RETENTION_TARGET 初始化參數(shù)用來設(shè)置保留目標(biāo),可指定數(shù)據(jù)庫所
能閃回的上限(以分鐘為單位)。此參數(shù)只是一個目標(biāo),并不提供任何保證,閃回時間間隔取決
于在快速恢復(fù)區(qū)中保存的閃回日志的數(shù)據(jù)量。
查詢確認(rèn)閃回數(shù)據(jù)庫是否已經(jīng)啟用:
SQL>select flashback_on from v$database;
2. 閃回數(shù)據(jù)庫的方法
閃回數(shù)據(jù)庫必須以 EXCLUSIVE 模式裝載才能執(zhí)行 FLASHBACK DATABASE 命令,而且在完成時
必須使用 RESETLOGS 選項打開數(shù)據(jù)庫。
在使用 RMAN 命令 FLASHBACK DATABASE 命令執(zhí)行閃回數(shù)據(jù)庫操作時,可以使用 SEQUENCE
和 THREAD 指定作為下限的重做日志序列號和線程號,RMAN 只選擇可用于閃回到指定序列號(但
不包括指定序列號)的文件。
也可以使用 FLASHBACK DATABASE 的 SQL 命令將數(shù)據(jù)庫恢復(fù)到過去的某個時間或 SCN. 如果
使用 TO SCN 子句,則必須提供一個編號。如果指定 TO TIMESTAMP, 則必須提供一個時間戳
值。還可以指定還原點名稱,例如:
RMAN> FLASHBACK DATABASE TO TIME="TO_DATE('2013-05-27 09:00:00',
'YYYY-MM-DD HH24:MI:SS')";
RMAN> FLASHBACK DATABASE TO SCN=23565;
RMAN> FLASHBACK DATABASE TO SEQUENCE=223 THREAD=1;
或者:
SQL> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24);
SQL> FLASHBACK DATABASE TO SCN 53943;
SQL> FLASHBACK DATABASE TO RESTORE POINT b4_load;
3. 閃回數(shù)據(jù)庫測試
本節(jié)實驗測試基于時間戳的數(shù)據(jù)庫閃回。
1) 創(chuàng)建用于實驗的測試表 hr.t_obj:
SQL>create table hr.t_obj as select * from dba_objiects;
SQL>select count(*) from hr.t_obj;
2) 獲取當(dāng)前系統(tǒng)時間:
SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') tm from dual;
3) 刪除 hr 用戶及其對象:
SQL>drop user hr cascade;
SQL>select count(*) from hr.t_obj;
4) 建立對照表
SQL>select count(*) from system.tab1;
5) 執(zhí)行閃回數(shù)據(jù)庫操作,恢復(fù) hr
SQL>shutdown immediate;
SQL>startup mount;
SQL>flashback database to timestamp to_timestamp
? ? 2? ?('2014-11-03 10:48:48','yyyy-mm-dd hh24:mi:ss');
SQL>alter database open resetlogs;
6) 驗證
SQL>select count(*) from hr.t_obj;
SQL>select count(*) from system tab1;
可以看到,執(zhí)行閃回數(shù)據(jù)庫時間戳之前的更改都得到了恢復(fù),之后的更改不再有效。因此,閃回
數(shù)據(jù)庫是對數(shù)據(jù)庫的整體回退。
?二、表的刪除閃回
表刪除(drop)閃回的原理是使用回收站技術(shù),被刪除的對象會臨時放入回收站中并且仍屬于其
所有者。當(dāng)刪除的表移到回收站時,會使用系統(tǒng)生成的名稱重命名該表及其關(guān)聯(lián)對象和約束條件。
回收站本身也是一個數(shù)據(jù)字典表,它用來維護(hù)刪除對象的原始名稱與其系統(tǒng)生成名稱之間的關(guān)系。
使用 DBA_RECYCLEBIN, USER_RECYCLEBIN 視圖可查詢回收站的內(nèi)容。
要使用閃回刪除功能,必須將 FLASHBACK TABLE 或 FLASHBACK ANY TABLE 系統(tǒng)權(quán)限授予
使用閃回表功能的用戶。此外,還必須將 SELECT, INSERT, DELETE 和 ALTER 對象權(quán)限授予
用戶。
1. 表的刪除閃回語法
FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];
2. 表的刪除閃回測試
1) 刪除 hr.t_obj 表:
SQL>conn hr/hr
SQL>select count(*) from hr.t_obj;
SQL>drop table hr.t_obj;
SQL>select count(*) from hr.t_obj;
2) 查詢回收站并執(zhí)行閃回刪除:
SQL>select object_name, original_name, can_undrop, base_object
? ? 2? ?from user_recyclebin;
SQL>flashback table hr.t_obj to before drop;
SQL>select count(*) from hr.t_obj;
三、閃回查詢
閃回查詢通常用于檢索一條記錄的所有歷史版本,回溯單獨的事務(wù)或者回溯從指定時間以來對特
定表的所有變化。
1. 閃回查詢的語法
SELECT <column_name_list> FROM <table_name>?
AS OF <SCN> --- 使用 as of scn
或 AS OF <TIMESTAMP> --- 使用 as of timestamp
?
[WHERE <filter_conditions>]
[GROUP BY <unaggregated columns>]
[HAVING <group_filter>]
[ORDER BY <column_positions_or_name>]
2. 閃回查詢測試
1) 創(chuàng)建實驗用測試表 tab1:
SQL>create table hr.tab1 as select user_id, username?from dba_users where 1=0;
SQL>insert into hr.tab1 select user_id, username from dba_users where user_id < 10;
SQL>commit;
SQLselect * from hr.tab1;
2) 對表進(jìn)行刪除操作,并進(jìn)行閃回查詢:
SQL>conn hr/hr;
SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') tm from dual;
SQL>delect tab1 where username='SYS';
SQL>select * from tab1;
SQL>seelct *from tab1 as of timestamp to_timestamp ('2022-08-01 11:00:00', 'yyyy-mm-dd hh24:mi:ss');
四、閃回表
1. 表閃回的方法
使用閃回表的先決條件是必須啟用表的行遷移:
ALTER TABLE schema_name.table_name ENABLE ROW MOVEMENT;
表閃回的語法:
FLASHBACK TABLE schema_name.table_name TO SCN <scn_number>
-- 基于 SCN 的表閃回
或 TO TIMESTAMP <timestamp> -- 基于 TIMESTAMP 的表閃回
或 TO RESTORE POINT <restore_point> -- 基于 RESTORE POINT 的表閃回
[<ENABLE | DISABLE> TRIGGERS]
2. 表閃回測試
本節(jié)實驗基于 RESTORE POINT 的表閃回。
基于 RESTORE POINT 的表閃回首先要創(chuàng)建適當(dāng)?shù)倪€原點,創(chuàng)建還原點的語法為:
CREATE RESTORE POINT point_name;
對于閃回成功之后無用的閃回點可以及時刪除掉,刪除閃回點的語法為:
DROP RESTORE POINT point_name;
1) 創(chuàng)建用于閃回表的測試表 hr.tab2,并創(chuàng)建還原點 p1:
SQL>create table hr.tab2 as select user_id, username from dba_users where 1 = 0;
SQL>alter table hr.tab2 enanle row movement;
SQL>insert into hr.tab2 seelct user_id, username from dba_users where user_id < 10;
SQL>select * from hr.tab2;
SQL>create restore point p1;
2) 對表 hr.tab2 進(jìn)行插入操作,并創(chuàng)建還原點 p2:
SQL>insert into hr.tab2 select user_id, username from dba_users
? ? 2? ?where user_id >= 10 and user_id < 20;
SQL> select * from hr.tab2;
SQL>select * from hr.tab2;
SQL>create restore point p2;
?
3) 從表 hr.tab2 進(jìn)行刪除,創(chuàng)建還原點 p3:
SQL>delect hr.tab2 where user_id = 5;
SQL>seelct * from hr.tab2;
SQL>create restore point p3;
4) 開始執(zhí)行閃回表操作:
SQL>flashback table hr.tab2 to restore point p1;
SQL>select * from hr.tab2;
SQL>flashback table hr.tab2 to restore point p2;
SQL>select * from hr.tab;
SQL>flashback table hr.tab2 to restore point p3;
SQL>select * from hr.tab2;
5) 刪除還原點:
SQL>fdrop restore point p1;
SQL>drop restore point p2;
SQL>drop restore point p3;
五、閃回版本查詢
閃回版本查詢指的是 Oracle 可以針對特定的對象來查詢某一特定時段內(nèi)該對象變化的所有情
況,也可以根據(jù)特定的需要來將該對象修正到特定的時刻。
閃回版本查詢同閃回查詢、閃回表一樣,都是使用了 UNDO 段的數(shù)據(jù),即數(shù)據(jù)變更的歷史副本,
當(dāng) UNDO 段的數(shù)據(jù)由于空間變化而被清除后,則無法進(jìn)行閃回。
1. 閃回版本查詢語法
SELECT <columns> FROM <schema_name.table_name>
VERSIONS BETWEEN SCN <minimum_scn> AND <maximum_scn>
-- 基于 SCN 的版本查詢
或者:
SELECT <columns> FROM <schema_name.table_name>
VERSIONS BETWEEN timestamp?
to_timestamp('start_timestamp') and to_timestamp('end_timestamp')
-- 基于 TIMESTAMP 的版本查詢
2. 閃回版本查詢測試
使用上節(jié)課閃回表查詢創(chuàng)建的測試表 hr.tab2:
SQL>col USER_ID format 99999
SQL>col USERNAME format a10
SQL>seelct user_ID, username, versions_xid, versions_startscn,
? ?2? ? versions_endscn, versions_operation
? ?3? ? from hr.tab2 versions between scn minvalue and maxvalue;
其中:
versions_xid - 記錄指定版本事務(wù)的唯一標(biāo)識符。
versions_startscn - 記錄的起始 SCN 號。
versions_endscn -- 記錄的終止 SCN 號。
versions_operation - 記錄的操作類型(I 表示插入,U 表示更新,D 表示刪除)。
閃回事務(wù)查詢是對閃回版本查詢的擴(kuò)展。從某種程度上來說,閃回版本查詢通常用于更細(xì)粒度的
查詢,如針對特定的記錄。而閃回事務(wù)則是針對某一事務(wù)進(jìn)行閃回,是基于事務(wù)級別的。閃回事
務(wù)查詢是通過查詢視圖 flashback_transaction_query 來獲得某個或多個特定事務(wù)信息,
同時可根據(jù)該視圖中提供的 undo_sql 列中的語句來反轉(zhuǎn)事務(wù),從而保證數(shù)據(jù)的完整性。
要使用閃回事務(wù)查詢,必須要啟用補(bǔ)充日志記錄功能并建立正確的權(quán)限。例如,要對上一節(jié)閃表
操作創(chuàng)建的測試表 tab2 使用閃回事務(wù)處理,就要以 SYSDBA 權(quán)限在 SQL*Plus 中執(zhí)行下列設(shè)
置步驟:
SQL>alter database add supplemental log data;
SQL>alter database add supplemental log data (primary key)? columns;
SQL>grant execute on dbms_flashback to hr;
SQL>grant select any transaction to hr;文章來源:http://www.zghlxwxcb.cn/news/detail-613664.html
然后對 hr.tab2 進(jìn)行增刪改操作,然后按照十六進(jìn)制的行 ID 進(jìn)行閃回事務(wù)查詢了:文章來源地址http://www.zghlxwxcb.cn/news/detail-613664.html
到了這里,關(guān)于Oracle數(shù)據(jù)庫的閃回技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!