国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 數(shù)據(jù)庫(kù) > Oracle > 正文

Oracle Database 10g:刪除表

2024-08-29 13:44:55
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  
使用 Oracle Database 10g 中的閃回表特性,可以毫不費(fèi)力地恢復(fù)被意外刪除的表

以下是一個(gè)不該發(fā)生卻經(jīng)常發(fā)生的情況:用戶刪除了一個(gè)非常重要的表 — 當(dāng)然是意外地刪除 — 并需要盡快地恢復(fù)。(在某些時(shí)候,這個(gè)不幸的用戶可能就是 DBA!)

Oracle9i Database 推出了閃回查詢選項(xiàng)的概念,以便檢索過(guò)去某個(gè)時(shí)間點(diǎn)的數(shù)據(jù),但它不能閃回 DDL 操作,如刪除表的操作。唯一的恢復(fù)方法是在另一個(gè)數(shù)據(jù)庫(kù)中使用表空間的時(shí)間點(diǎn)恢復(fù),然后使用導(dǎo)出/導(dǎo)入或其他方法,在當(dāng)前數(shù)據(jù)庫(kù)中重新創(chuàng)建表。這一過(guò)程需要 DBA 進(jìn)行大量工作并且耗費(fèi)寶貴的時(shí)間,更不用說(shuō)還要使用另一個(gè)數(shù)據(jù)庫(kù)進(jìn)行克隆。

請(qǐng)使用 Oracle Database 10g 中的閃回表特性,它使得被刪除表的恢復(fù)過(guò)程如同執(zhí)行幾條語(yǔ)句一樣簡(jiǎn)單。讓我們來(lái)看該特性是如何工作的。

刪除那個(gè)表!

首先,讓我們查看當(dāng)前模式中的表。



SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------ ------- ----------RECYCLETEST TABLE


現(xiàn)在,我們意外地刪除了該表:



SQL> drop table recycletest;Table dropped.


現(xiàn)在讓我們來(lái)查看該表的狀態(tài)。



SQL> select * from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE


表 RECYCLETEST 已不存在,但是請(qǐng)注重出現(xiàn)新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發(fā)生的事情:被刪除的表 RECYCLETEST 并沒有完全消失,而是重命名為一個(gè)由系統(tǒng)定義的名稱。它存在于同一個(gè)表空間中,具有與原始表相同的結(jié)構(gòu)。假如在該表上定義了索引或觸發(fā)器,則它們也被重命名,使用與表相同的命名規(guī)則。任何相關(guān)源(如過(guò)程)都失效;原始表的觸發(fā)器和索引被改為放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被刪除表的完整對(duì)象結(jié)構(gòu)。


表及其相關(guān)對(duì)象被放置在一個(gè)稱為“回收站”的邏輯容器中,它類似于您 PC 機(jī)中的回收站。但是,對(duì)象并沒有從它們?cè)人诘谋砜臻g中刪除;它們?nèi)匀徽加媚抢锏目臻g。回收站只是一個(gè)列出被刪除對(duì)象目錄的邏輯結(jié)構(gòu)。在 SQL*Plus 提示符處使用以下命令來(lái)查看其內(nèi)容(您需要使用 SQL*Plus 10.1 來(lái)進(jìn)行此操作):


SQL> show recyclebinORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME---------------- ------------------------------ ------------ ------------------RECYCLETEST BIN$04LhcpndanfgMAAAAAANPw==$0 TABLE 2004-02-16:21:13:31



結(jié)果顯示了表的原始名稱 RECYCLETEST,并顯示了回收站中的新名稱,該名稱與我們看到的刪除后所創(chuàng)建的新表名稱相同。(注重:確切的名稱可能因平臺(tái)不同而不同。)為恢復(fù)該表,您所需要做的就是使用 FlashBACK TABLE 命令:


SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;FLASHBACK COMPLETE.SQL> SELECT * FROM TAB;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------RECYCLETEST TABLE



瞧!表毫不費(fèi)力地恢復(fù)了。假如現(xiàn)在查看回收站,它將是空的。

記住,將表放在回收站里并不在原始表空間中釋放空間。要釋放空間,您需要使用以下命令清空回收站:


PURGE RECYCLEBIN;


但是假如您希望完全刪除該表而不需要使用閃回特性,該怎么辦?在這種情況下,可以使用以下命令永久刪除該表:


DROP TABLE RECYCLETEST PURGE;


此命令不會(huì)將表重命名為回收站中的名稱,而是永久刪除該表,就象 10g 之前的版本一樣。

治理回收站

假如在該過(guò)程中沒有實(shí)際刪除表 — 因而沒有釋放表空間 — 那么當(dāng)被刪除的對(duì)象占用了所有空間時(shí),會(huì)發(fā)生什么事?

答案很簡(jiǎn)單:這種情況根本不會(huì)出現(xiàn)。當(dāng)表空間被回收站數(shù)據(jù)完全占滿,以至于必須擴(kuò)展數(shù)據(jù)文件來(lái)容納更多數(shù)據(jù)時(shí),可以說(shuō)表空間處于“空間壓力”情況下。此時(shí),對(duì)象以先進(jìn)先出的方式從回收站中自動(dòng)清除。在刪除表之前,相關(guān)對(duì)象(如索引)被刪除。



同樣,空間壓力可能由特定表空間定義的用戶限額而引起。
表空間可能有足夠的空余空間,但用戶可能將其在該表空間中所分配的部分用完了。在這種情況下,Oracle 自動(dòng)清除該表空間中屬于該用戶的對(duì)象。

此外,有幾種方法可以手動(dòng)控制回收站。假如在刪除名為 TEST 的特定表之后需要從回收站中清除它,可以執(zhí)行


PURGE TABLE TEST;


或者使用其回收站中的名稱:


PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";


此命令將從回收站中刪除表 TEST 及所有相關(guān)對(duì)象,如索引、約束等,從而節(jié)省了空間。但是,假如要從回收站中永久刪除索引,則可以使用以下命令來(lái)完成工作:


purge index in_test1_01;


此命令將僅僅刪除索引,而將表的拷貝留在回收站中。

有時(shí)在更高級(jí)別上進(jìn)行清除可能會(huì)有用。例如,您可能希望清除表空間 USERS 的回收站中的所有對(duì)象。可以執(zhí)行:


PURGE TABLESPACE USERS;


您也許希望只為該表空間中特定用戶清空回收站。在數(shù)據(jù)倉(cāng)庫(kù)類型的環(huán)境中,用戶創(chuàng)建和刪除許多臨時(shí)表,此時(shí)這種方法可能會(huì)有用。您可以更改上述命令,限定只清除特定的用戶:


PURGE TABLESPACE USERS USER SCOTT;


諸如 SCOTT 等用戶可以使用以下命令來(lái)清空自己的回收站


PURGE RECYCLEBIN;


DBA 可以使用以下命令清除任何表空間中的所有對(duì)象


PURGE DBA_RECYCLEBIN;


可以看到,可以通過(guò)多種不同方法來(lái)治理回收站,以滿足特定的需要。

表版本和閃回功能

用戶可能會(huì)經(jīng)常多次創(chuàng)建和刪除同一個(gè)表,如:


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;


此時(shí),假如您要對(duì)表 TEST 執(zhí)行閃回操作,那么列 COL1 的值應(yīng)該是什么?常規(guī)想法可能認(rèn)為從回收站取回表的第一個(gè)版本,列 COL1 的值是 1。實(shí)際上,取回的是表的第三個(gè)版本,而不是第一個(gè)。因此列 COL1 的值為 3,而不是 1。

此時(shí)您還可以取回被刪除表的其他版本。但是,表 TEST 的存在不答應(yīng)出現(xiàn)這種情況。您有兩種選擇: 使用重命名選項(xiàng):


FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2;FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1;


這些語(yǔ)句將表的第一個(gè)版本恢復(fù)到 TEST1,將第二個(gè)版本恢復(fù)到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值將分別是 1 和 2。或者, 使用表的特定回收站名稱進(jìn)行恢復(fù)。為此,首先要識(shí)別表的回收站名稱,然后執(zhí)行:


FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST2;FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST1;


這些語(yǔ)句將恢復(fù)被刪除表的兩個(gè)版本。

警告……

取消刪除特性使表恢復(fù)其原始名稱,但是索引和觸發(fā)器等相關(guān)對(duì)象并沒有恢復(fù)原始名稱,它們?nèi)匀皇褂没厥照镜拿Q。在表上定義的源(如視圖和過(guò)程)沒有重新編譯,仍然保持無(wú)效狀態(tài)。必須手動(dòng)得到這些原有名稱并應(yīng)用到閃回表。

信息保留在名為 USER_RECYCLEBIN 的視圖中。在對(duì)表進(jìn)行閃回操作前,請(qǐng)使用以下查詢來(lái)檢索原有名稱。


SELECT OBJECT_NAME, ORIGINAL_NAME, TYPEFROM USER_RECYCLEBINWHERE BASE_OBJECT = (SELECT BASE_OBJECT FROM USER_RECYCLEBINWHERE ORIGINAL_NAME = 'RECYCLETEST')AND ORIGINAL_NAME != 'RECYCLETEST';OBJECT_NAME ORIGINAL_N TYPE------------------------------ ---------- --------BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01 INDEXBIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT TRIGGER


在表進(jìn)行閃回操作后,表 RECYCLETEST 上的索引和觸發(fā)器將按照 OBJECT_NAME 列中所示進(jìn)行命名。根據(jù)以上查詢,可以使用原始名稱重新命名對(duì)象,如下所示:


ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;


一個(gè)值得注重的例外情況是位圖索引。當(dāng)刪除位圖索引時(shí),它們并不放置在回收站中 — 因此無(wú)法檢索它們。約束名稱也無(wú)法從視圖中檢索。必須從其他來(lái)源對(duì)它們進(jìn)行重命名。

閃回表的其他用途

閃回刪除表功能不僅限于恢復(fù)表的刪除操作。與閃回查詢類似,您還可以使用它將表恢復(fù)到不同的時(shí)間點(diǎn),利用表的“過(guò)去”版本來(lái)替代整個(gè)表。
例如,以下語(yǔ)句將表恢復(fù)到系統(tǒng)更改號(hào) (SCN) 2202666520。


FLASHBACK TABLE RECYCLETEST TO SCN 2202666520;


此特性使用 Oracle 數(shù)據(jù)泵技術(shù)來(lái)創(chuàng)建不同的表,使用閃回功能將該 SCN 處的數(shù)據(jù)版本填充到表中,然后用新表替代原始表。為找出能夠在何種程度上對(duì)表進(jìn)行閃回操作,可以使用 Oracle Database 10g 的版本控制特性。(更多具體信息請(qǐng)參見本系列第 1 周的內(nèi)容。)在閃回子句中也可以指定時(shí)間戳記而不是指定 SCN。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临城县| 和林格尔县| 柏乡县| 南充市| 台南市| 孟津县| 蓬莱市| 扶绥县| 呼玛县| 石棉县| 佛坪县| 临泉县| 安化县| 黄陵县| 四平市| 东阿县| 安龙县| 伊宁市| 正定县| 大城县| 秦皇岛市| 丘北县| 察雅县| 剑河县| 阜宁县| 昌黎县| 沙湾县| 铜鼓县| 宣化县| 邵阳市| 江源县| 青铜峡市| 洪湖市| 临漳县| 麟游县| 东阿县| 嘉善县| 北辰区| 凯里市| 垦利县| 鄂尔多斯市|