重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
1、Flashback Database(利用閃回日志恢復(fù))
創(chuàng)新互聯(lián)建站專注于臨汾企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計,電子商務(wù)商城網(wǎng)站建設(shè)。臨汾網(wǎng)站建設(shè)公司,為臨汾等地區(qū)提供建站服務(wù)。全流程按需定制制作,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
Oracle Flashback Database特性允許通過SQL語句Flashback Database語句,讓數(shù)據(jù)庫前滾到當(dāng)前的前一個時間點或者SCN,而不需要做時間點的恢復(fù)。閃回數(shù)據(jù)庫可以迅速將數(shù)據(jù)庫回到誤操作或人為錯誤的前一個時間點,如Word中的"撤消"操作,可以不利用備份就快速的實現(xiàn)基于時間點的恢復(fù)。Oracle通過創(chuàng)建新的Flashback Logs(閃回日志),記錄數(shù)據(jù)庫的閃回操作。如果希望能閃回數(shù)據(jù)庫,需要設(shè)置如下參數(shù):DB_RECOVER_FILE_DEST日志的存放位置,DB_RECOVER_FILE_DEST_SIZE恢復(fù)區(qū)的大小。在創(chuàng)建數(shù)據(jù)庫的時候,Oracle將自動創(chuàng)建恢復(fù)區(qū),但默認(rèn)是關(guān)閉的,需要執(zhí)行alter database flashback on命令。
例:執(zhí)行Flashback Database命令格式。
SQLflashback database to time to_timestamp(xxx);
SQLflashback database to scn xxx
2、Flashback Table(利用UNDO保留信息恢復(fù))
Oracle Flashback Table特性允許利用Flashback Table語句,確保閃回到表的前一個時間點。與Oracle 9i中的Flashback Query相似,利用回滾段信息來恢復(fù)一個或一些表到以前的一個時間點(一個快照)。要注意的是,F(xiàn)lashback Table不等于Flashback Query,F(xiàn)lashback Query僅僅是查詢以前的一個快照點而已,并不改變當(dāng)前表的狀態(tài),而Flashback Table將改變當(dāng)前表及附屬對象一起回到以前的時間點。
語法:
flashback table tablename to timestamp xxx或
flashback table tablename to scn xxx
注意:如果需要閃回一個表,需要以下條件:
需要有flashback any table的系統(tǒng)權(quán)限或者是該表的flashback對象權(quán)限;
需要有該表的select,insert,delete,alter權(quán)限;
必須保證該表row movement。
例:執(zhí)行將test表閃回到2011年5月7日下午3點。
SQLflashback table test to timestamp to_timestamp(’2011-05-07 15:00:00’,’yyyy-mm-dd hh24:mi:ss’);
3、Flashback Drop(利用回收站功能恢復(fù))
注:由于目前的環(huán)境為了實現(xiàn)OGG的DDL同步,關(guān)閉了回收站功能,故這個功能不可用。
4、Flash Version Query(利用UNDO保留信息恢復(fù))
Oracle Flashback Version Query特性,利用保存的回滾信息,可以看到特定的表在時間段內(nèi)的任何修改,如電影的回放一樣,可以了解表在該期間的任何變化。Flashback version query一樣依賴于AUM,提供了一個查看行改變的功能,能找到所有已經(jīng)提交了的行的記錄,分析出過去時間都執(zhí)行了什么操作。Flashback version query采用VERSIONS BETWEEN語句來進(jìn)行查詢,常用的方法:
·VERSIONS_SCN - 系統(tǒng)改變號
·VERSIONS_TIMESTAMP - 時間
例如:在test表中,時間1插入一條記錄,時間2刪除了這條記錄,對于時間3執(zhí)行select * from test當(dāng)然查詢不到這條記錄,只能看到該表最后的提交記錄。這時如果利用Flash Table或者是Flash Query,只能看到過去的某一時間點的一個快照,而利用Flashback Version Query,能夠把時間1、時間2的操作給記錄下來,并詳細(xì)的查詢出對表進(jìn)行的任何操作。
基于SCN的閃回查詢:
SQL select count(*) from lm_mtrp_syn_channelinfo as of scn 708000000;
COUNT(*)
----------
21
基于時間段的閃回查詢:
SQLselect versions_starttime,versions_endtime, versions_xid,versions_operation,id
from test versions
between timestamp minvalue and maxvalue
order by versions_starttime;
5,Flashback Transaction Query(利用UNDO保留信息恢復(fù))
Oracle Flashback Transaction Query特性確保檢查數(shù)據(jù)庫的任何改變在一個事務(wù)級別,可以利用此功能進(jìn)行診斷問題、性能分析和審計事務(wù)。它其實是Flashback Version Query查詢的一個擴(kuò)充,F(xiàn)lashback Version Query說明了可以審計一段時間內(nèi)表的所有改變,但是也僅僅是能發(fā)現(xiàn)問題,對于錯誤的事務(wù),沒有好的處理辦法。而Flashback Transaction Query提供了從FLASHBACK_TRANSACTION_QUERY視圖中獲得事務(wù)的歷史以及Undo_sql(回滾事務(wù)對應(yīng)的sql語句),也就是說審計一個事務(wù)到底做了什么,甚至可以回滾一個已經(jīng)提交的事務(wù)。
例:Flashback Transaction Query的操作實例。
(1)在test表中刪除記錄,獲得事務(wù)的標(biāo)識XID,然后提交。
SQLdelete from test where id=2;
SQLselect xid from v$transaction;
XID
----------------
04001200AE010000
SQLcommit;
在測試中方便起見,在事務(wù)沒有提交的時候,獲得事務(wù)的XID為04001F0035000000。實際情況下,不可能去跟蹤每個事務(wù),想要獲得已提交事務(wù)的XID,就必須通過上面的Flashback Version Query。
(2)進(jìn)行Flashback Transaction Query
SQLselect * from FLASHBACK_TRANSACTION_QUERY
where xid=’04001F0035000000’;
UNDO_SQL
insert into "FLASHTEST"."TEST"("ID") values (’2’);
注意:這個刪除語句對應(yīng)的是1個Insert語句,如果想回滾這個事務(wù),執(zhí)行這個Insert語句即可。
可以看到,F(xiàn)lashback Transaction Query主要用于審計一個事務(wù),并可以回滾一個已經(jīng)提交的事務(wù)。如果確定出錯的事務(wù)是最后一個事務(wù),我們利用Flashback Table或者Flashback Query就可以解決問題。但是,如果執(zhí)行了一個錯誤的事務(wù)之后,又執(zhí)行了一系列正確的事務(wù),那么上面的方法就無能為力,利用Flashback Transaction Query可以查看或回滾這個錯誤的事務(wù)。
另:ORACLE 11G還多了一個閃回數(shù)據(jù)歸檔的功能,即可將UNDO的信息進(jìn)行歸檔,這個功能對于一些比較重要的表,
一
首先查看是否開啟閃回:
SQL select flashback_on from V$database;
FLASHBACK_ON
------------------
NO
二
如果已經(jīng)開啟了閃回,無須執(zhí)行下面的操作。
cd /u01
mkdir flashback(生成閃回目錄)
SQL alter system set db_recovery_file_dest_size=30G scope=both;
SQL alter system set db_recovery_file_dest='/u01/flashback' scope=both;
SQL shutdown immediate
SQL startup mount
SQL alter database archivelog;
SQL alter database flashback on;
SQL alter database open;
三
再進(jìn)行確認(rèn):
SQL select flashback_on from V$database;
FLASHBACK_ON
------------------
YES
1,只需要執(zhí)行以下個腳本即可。
2,查看utl_file_dir設(shè)置
3, 可以通過命令行修改此參數(shù),也可以通過修改pfile文件設(shè)置此參數(shù)。
4,該參數(shù)為靜態(tài)參數(shù),需重啟數(shù)據(jù)庫后生效,創(chuàng)建LOGMNR數(shù)據(jù)字典。
5,添加需要分析的歸檔日志。
6,開始日志挖掘,分析日志。
7,查看日志信息,就可以了。
先關(guān)閉數(shù)據(jù)庫
再start mount
再打開閃回功能
最后 alter database open
可按以下步驟配置閃回數(shù)據(jù)庫:(確保數(shù)據(jù)庫處于ARCHIVELOG 模式。)
1. 配置快速恢復(fù)區(qū)。
2. 使用初始化參數(shù)DB_FLASHBACK_RETENTION_TARGET 設(shè)置保留目標(biāo)。可指定
一個上限(以分鐘為單位),指示數(shù)據(jù)庫能夠閃回到多長時間以前。本示例使用
了 2880 分鐘,相當(dāng)于兩天。此參數(shù)只是一個目標(biāo),并不提供任何保證。閃回時間
間隔取決于快速恢復(fù)區(qū)中保留的閃回數(shù)據(jù)量的大小。
3. 使用以下命令啟用閃回數(shù)據(jù)庫:
ALTER DATABASE FLASHBACK ON;
必須先配置數(shù)據(jù)庫以進(jìn)行歸檔,且必須在 MOUNT EXCLUSIVE 模式下啟動數(shù)據(jù)庫
后,才能發(fā)出此命令來啟用閃回數(shù)據(jù)庫。
可以使用以下查詢來確定是否已啟用閃回數(shù)據(jù)庫:
SELECT flashback_on FROM v$database;
可以使用ALTER DATABASE FLASHBACK OFF 命令禁用閃回數(shù)據(jù)庫。這樣,會自動刪
除所有現(xiàn)有的閃回數(shù)據(jù)庫日志。
注:僅當(dāng)在獨占模式下裝載(而不是打開)數(shù)據(jù)庫時才能啟用閃回數(shù)據(jù)庫。
1.確認(rèn)當(dāng)前模式
SYS AS SYSDBA on 29-MAR-05 select flashback_on from v$database;
FLA
---
NO
2.檢查/修改恢復(fù)區(qū)設(shè)置
SYS AS SYSDBA on 29-MAR-05 show parameter db_recovery_file_dest
NAME TYPEVALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_deststring /u01/app/oracle/flash_recovery_areadb_recovery_file_dest_size big integer 10G
SYS AS SYSDBA on 29-MAR-05 alter system set db_recovery_file_dest='/u01/app/oracle/flash_recovery_area';
SYS AS SYSDBA on 29-MAR-05 alter system set db_recovery_file_dest_size=15G;
3.檢查/修改閃回時間設(shè)置
SYS AS SYSDBA on 29-MAR-05 show parameter db_flashback_retention_target
NAME TYPEVALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_targetinteger 60
SYS AS SYSDBA on 29-MAR-05 alter system set db_flashback_retention_target=1440;--分鐘
System altered.
如何設(shè)置flash recovery area
(1).db_recovery_file_dest:指定閃回恢復(fù)區(qū)的位置
(2).db_recovery_file_dest_size:指定閃回恢復(fù)區(qū)的可用空間大小
(3).db_flashback_retention_target:指定數(shù)據(jù)庫可以回退的時間,單位為分鐘,默認(rèn)1440分鐘,也就是一天。當(dāng)然,實際上可回退的時間還決定于閃回恢復(fù)區(qū)的大小,因為里面保存了回退所需要的 flash log。所以這個參數(shù)要和db_recovery_file_dest_size配合修改。
alter system set db_flashback_retention_target=1440;
alter system set db_recovery_file_dest='/u01/app/oracle/flash_recovery_area';
alter system set db_recovery_size=15G;
4.重新啟動數(shù)據(jù)庫到Mount狀態(tài)
啟動flashback database選項。
SYS AS SYSDBA on 29-MAR-05 shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS AS SYSDBA on 29-MAR-05 startup mount exclusive;
ORACLE instance started.
Total System Global Area 314572800 bytes
Fixed Size 1301704 bytes
Variable Size 261890872 bytes
Database Buffers 50331648 bytes
Redo Buffers1048576 bytes
Database mounted.
SYS AS SYSDBA on 29-MAR-05 alter database flashback on;
Database altered.
SYS AS SYSDBA on 29-MAR-05 alter database open;
Database altered.
查看回收站中表
select?object_name,original_name,partition_name,type,ts_name,createtime,droptime?from?recyclebin;
恢復(fù)表
SQLflashback?table?test_drop?to?before?drop;或
SQLflashback?table?"BIN$b+XkkO1RS5K10uKo9BfmuA==$0"?to?before?drop;
注:必須9i或10g以上版本支持,flashback無法恢復(fù)全文索引
以下為參考資料
使用 Oracle Database 10g 中的閃回表特性,可以毫不費力地恢復(fù)被意外刪除的表
以下是一個不該發(fā)生卻經(jīng)常發(fā)生的情況:用戶刪除了一個非常重要的表 ― 當(dāng)然是意外地刪除 ― 并需要盡快地恢復(fù)。(在某些時候,這個不幸的用戶可能就是 DBA!)
Oracle9i Database 推出了閃回查詢選項的概念,以便檢索過去某個時間點的數(shù)據(jù),但它不能閃回 DDL 操作,如刪除表的操作。唯一的恢復(fù)方法是在另一個數(shù)據(jù)庫中使用表空間的時間點恢復(fù),然后使用導(dǎo)出/導(dǎo)入或其他方法,在當(dāng)前數(shù)據(jù)庫中重新創(chuàng)建表。這一過程需要 DBA 進(jìn)行大量工作并且耗費寶貴的時間,更不用說還要使用另一個數(shù)據(jù)庫進(jìn)行克隆。
請使用 Oracle Database 10g 中的閃回表特性,它使得被刪除表的恢復(fù)過程如同執(zhí)行幾條語句一樣簡單。讓我們來看該特性是如何工作的。
刪除那個表!
首先,讓我們查看當(dāng)前模式中的表。
SQL?select?*?from?tab;
TNAME
TABTYPE
CLUSTERID
---------------------?-?--?--?---?------
RECYCLETEST
TABLE
現(xiàn)在,我們意外地刪除了該表:
SQL?drop?table?recycletest;
Table?dropped.
現(xiàn)在讓我們來查看該表的狀態(tài)。
SQL?select?*?from?tab;
TNAME
TABTYPE
CLUSTERID
---------------------------?-?--?--?---?------
BIN$04LhcpndanfgMAAAAAANPw==$0?TABLE
表 RECYCLETEST 已不存在,但是請注意出現(xiàn)新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發(fā)生的事情:被刪除的表 RECYCLETEST 并沒有完全消失,而是重命名為一個由系統(tǒng)定義的名稱。它存在于同一個表空間中,具有與原始表相同的結(jié)構(gòu)。如果在該表上定義了索引或觸發(fā)器,則它們也被重命名,使用與表相同的命名規(guī)則。任何相關(guān)源(如過程)都失效;原始表的觸發(fā)器和索引被改為放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被刪除表的完整對象結(jié)構(gòu)。
表及其相關(guān)對象被放置在一個稱為"回收站"的邏輯容器中,它類似于您 PC 機(jī)中的回收站。但是,對象并沒有從它們原先所在的表空間中刪除;它們?nèi)匀徽加媚抢锏目臻g。回收站只是一個列出被刪除對象目錄的邏輯結(jié)構(gòu)。在 SQL*Plus 提示符處使用以下命令來查看其內(nèi)容(您需要使用 SQL*Plus 10.1 來進(jìn)行此操作):
SQL?show?recyclebin
ORIGINAL?NAME
RECYCLEBIN?NAME
OBJECT?TYPE
DROP?TIME
-------------?-?--?-----------------------?-?--?-----?-?--?--------------
RECYCLETEST
BIN$04LhcpndanfgMAAAAAANPw==$0?TABLE
2004-02-16:21:13:31
結(jié)果顯示了表的原始名稱 RECYCLETEST,并顯示了回收站中的新名稱,該名稱與我們看到的刪除后所創(chuàng)建的新表名稱相同。(注意:確切的名稱可能因平臺不同而不同。)為恢復(fù)該表,您所需要做的就是使用 FLASHBACK TABLE 命令:
SQL?FLASHBACK?TABLE?RECYCLETEST?TO?BEFORE?DROP;
FLASHBACK?COMPLETE.
SQL?SELECT?*?FROM?TAB;
TNAME
TABTYPE
CLUSTERID
---------------------------?-?--?--?---?------
RECYCLETEST
TABLE
瞧!表毫不費力地恢復(fù)了。如果現(xiàn)在查看回收站,它將是空的。
記住,將表放在回收站里并不在原始表空間中釋放空間。要釋放空間,您需要使用以下命令清空回收站:
PURGE?RECYCLEBIN;
但是如果您希望完全刪除該表而不需要使用閃回特性,該怎么辦?在這種情況下,可以使用以下命令永久刪除該表:
DROP?TABLE?RECYCLETEST?PURGE;
此命令不會將表重命名為回收站中的名稱,而是永久刪除該表,就象 10g 之前的版本一樣。
管理回收站
如果在該過程中沒有實際刪除表 ― 因而沒有釋放表空間 ― 那么當(dāng)被刪除的對象占用了所有空間時,會發(fā)生什么事?
答案很簡單:這種情況根本不會出現(xiàn)。當(dāng)表空間被回收站數(shù)據(jù)完全占滿,以至于必須擴(kuò)展數(shù)據(jù)文件來容納更多數(shù)據(jù)時,可以說表空間處于"空間壓力"情況下。此時,對象以先進(jìn)先出的方式從回收站中自動清除。在刪除表之前,相關(guān)對象(如索引)被刪除。
同樣,空間壓力可能由特定表空間定義的用戶限額而引起。表空間可能有足夠的空余空間,但用戶可能將其在該表空間中所分配的部分用完了。在這種情況下,Oracle 自動清除該表空間中屬于該用戶的對象。
此外,有幾種方法可以手動控制回收站。如果在刪除名為 TEST 的特定表之后需要從回收站中清除它,可以執(zhí)行
PURGE?TABLE?TEST;
或者使用其回收站中的名稱:
PURGE?TABLE?"BIN$04LhcpndanfgMAAAAAANPw==$0";
此命令將從回收站中刪除表 TEST 及所有相關(guān)對象,如索引、約束等,從而節(jié)省了空間。但是,如果要從回收站中永久刪除索引,則可以使用以下命令來完成工作:
purge?index?in_test1_01;
此命令將僅僅刪除索引,而將表的拷貝留在回收站中。
有時在更高級別上進(jìn)行清除可能會有用。例如,您可能希望清除表空間 USERS 的回收站中的所有對象。可以執(zhí)行:
PURGE?TABLESPACE?USERS;
您也許希望只為該表空間中特定用戶清空回收站。在數(shù)據(jù)倉庫類型的環(huán)境中,用戶創(chuàng)建和刪除許多臨時表,此時這種方法可能會有用。您可以更改上述命令,限定只清除特定的用戶:
PURGE?TABLESPACE?USERS?USER?SCOTT;
諸如 SCOTT 等用戶可以使用以下命令來清空自己的回收站
PURGE?RECYCLEBIN;
DBA 可以使用以下命令清除任何表空間中的所有對象
PURGE?DBA_RECYCLEBIN;
可以看到,可以通過多種不同方法來管理回收站,以滿足特定的需要。
表版本和閃回功能
用戶可能會經(jīng)常多次創(chuàng)建和刪除同一個表,如:
CREATE?TABLE?TEST?(COL1?NUMBER);
INSERT?INTO?TEST?VALUES?(1);
commit;
DROP?TABLE?TEST;
CREATE?TABLE?TEST?(COL1?NUMBER);
INSERT?INTO?TEST?VALUES?(2);
commit;
DROP?TABLE?TEST;
CREATE?TABLE?TEST?(COL1?NUMBER);
INSERT?INTO?TEST?VALUES?(3);
commit;
DROP?TABLE?TEST;
此時,如果您要對表 TEST 執(zhí)行閃回操作,那么列 COL1 的值應(yīng)該是什么?常規(guī)想法可能認(rèn)為從回收站取回表的第一個版本,列 COL1 的值是 1。實際上,取回的是表的第三個版本,而不是第一個。因此列 COL1 的值為 3,而不是 1。
此時您還可以取回被刪除表的其他版本。但是,表 TEST 的存在不允許出現(xiàn)這種情況。您有兩種選擇:
使用重命名選項:
FLASHBACK?TABLE?TEST?TO?BEFORE?DROP?RENAME?TO?TEST2;
FLASHBACK?TABLE?TEST?TO?BEFORE?DROP?RENAME?TO?TEST1;
這些語句將表的第一個版本恢復(fù)到 TEST1,將第二個版本恢復(fù)到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值將分別是 1 和 2。或者,
使用表的特定回收站名稱進(jìn)行恢復(fù)。為此,首先要識別表的回收站名稱,然后執(zhí)行:
FLASHBACK?TABLE?"BIN$04LhcpnoanfgMAAAAAANPw==$0"?TO?BEFORE?DROP?RENAME?TO?TEST2;
FLASHBACK?TABLE?"BIN$04LhcpnqanfgMAAAAAANPw==$0"?TO?BEFORE?DROP?RENAME?TO?TEST1;
這些語句將恢復(fù)被刪除表的兩個版本。
警告......
取消刪除特性使表恢復(fù)其原始名稱,但是索引和觸發(fā)器等相關(guān)對象并沒有恢復(fù)原始名稱,它們?nèi)匀皇褂没厥照镜拿Q。在表上定義的源(如視圖和過程)沒有重新編譯,仍然保持無效狀態(tài)。必須手動得到這些原有名稱并應(yīng)用到閃回表。
信息保留在名為 USER_RECYCLEBIN 的視圖中。在對表進(jìn)行閃回操作前,請使用以下查詢來檢索原有名稱。
SELECT?OBJECT_NAME,?ORIGINAL_NAME,?TYPE
FROM?USER_RECYCLEBIN
WHERE?BASE_OBJECT?=?(SELECT?BASE_OBJECT?FROM?USER_RECYCLEBIN
WHERE?ORIGINAL_NAME?=?'RECYCLETEST')
AND?ORIGINAL_NAME?!=?'RECYCLETEST';
OBJECT_NAME
ORIGINAL_N?TYPE
---------------------------?-?--?---?-?--?----
BIN$04LhcpnianfgMAAAAAANPw==$0?IN_RT_01
INDEX
BIN$04LhcpnganfgMAAAAAANPw==$0?TR_RT
TRIGGER
在表進(jìn)行閃回操作后,表 RECYCLETEST 上的索引和觸發(fā)器將按照 OBJECT_NAME 列中所示進(jìn)行命名。根據(jù)以上查詢,可以使用原始名稱重新命名對象,如下所示:
ALTER?INDEX?"BIN$04LhcpnianfgMAAAAAANPw==$0"?RENAME?TO?IN_RT_01;
ALTER?TRIGGER?"BIN$04LhcpnganfgMAAAAAANPw==$0"?RENAME?TO?TR_RT;
一個值得注意的例外情況是位圖索引。當(dāng)刪除位圖索引時,它們并不放置在回收站中 ― 因此無法檢索它們。約束名稱也無法從視圖中檢索。必須從其他來源對它們進(jìn)行重命名。
閃回表的其他用途
閃回刪除表功能不僅限于恢復(fù)表的刪除操作。與閃回查詢類似,您還可以使用它將表恢復(fù)到不同的時間點,形如flashback table tmm2076 TO TIMESTAMP to_timestamp('2007-05-22
12:00:00','yyyy-mm-dd hh24:mi:ss')
彈出ORA-08189錯誤,需要執(zhí)行以下命令先:
alter table tmm2076 enable row movement這個命令的作用是,允許oracle修改分配給行的rowid。
然后再flashback,數(shù)據(jù)被恢復(fù)完畢。