熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle10g數據庫中閃回表特性剖析

2013-11-13 16:05:41  來源: Oracle 

  Oraclei Database 推出了閃回查詢選項的概念以便檢索過去某個時間點的數據但它不能閃回 DDL 操作如刪除表的操作唯一的恢復方法是在另一個數據庫中使用表空間的時間點恢復然後使用導出/導入或其他方法在當前數據庫中重新創建表這一過程需要 DBA 進行大量工作並且耗費寶貴的時間更不用說還要使用另一個數據庫進行克隆使用 Oracle Database g 中的閃回表特性它使得被刪除表的恢復過程如同執行幾條語句一樣簡單讓我們來看該特性是如何工作的

  刪除那個表!

  首先讓我們查看當前模式中的表


  

  

  SQL> select * from tab;

TNAMETABTYPE CLUSTERID

  

RECYCLETEST TABLE

  現在我們意外地刪除了該表

  

  

  SQL> drop table recycletest;

Table dropped

 

  現在讓我們來查看該表的狀態

  

  

  SQL> select * from tab;

TNAME TABTYPE CLUSTERID



BIN$LhcpndanfgMAAAAAANPw==$ TABLE

  表RECYCLETEST 已不存在但是請注意出現新表BIN$LhcpndanfgMAAAAAANPw==$這就是所發生的事情被刪除的表 RECYCLETEST 並沒有完全消失而是重命名為一個由系統定義的名稱它存在於同一個表空間中具有與原始表相同的結構如果在該表上定義了索引或觸發器則它們也被重命名使用與表相同的命名規則任何相關源(如過程)都失效原始表的觸發器和索引被改為放置在重命名的表 BIN$LhcpndanfgMAAAAAANPw==$保持被刪除表的完整對象結構

  表及其相關對象被放置在一個稱為回收站的邏輯容器中它類似於您 PC 機中的回收站但是對象並沒有從它們原先所在的表空間中刪除它們仍然占用那裡的空間回收站只是一個列出被刪除對象目錄的邏輯結構在 SQL*Plus 提示符處使用以下命令來查看其內容(您需要使用 SQL*Plus 來進行此操作)

  

  

  SQL> show recyclebin

ORIGINAL NAME RECYCLEBIN NAMEOBJECT TYPE DROP TIME



RECYCLETESTBIN$LhcpndanfgMAAAAAANPw==$ TABLE :::

  結果顯示了表的原始名稱 RECYCLETEST並顯示了回收站中的新名稱該名稱與我們看到的刪除後所創建的新表名稱相同(注意確切的名稱可能因平台不同而不同)為恢復該表您所需要做的就是使用 FLASHBACK TABLE 命令

  

  

  SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;

FLASHBACK COMPLETE

SQL> SELECT * FROM TAB;

TNAME TABTYPE CLUSTERID



RECYCLETESTTABLE

  瞧!表毫不費力地恢復了如果現在查看回收站它將是空的記住將表放在回收站裡並不在原始表空間中釋放空間要釋放空間您需要使用以下命令清空回收站


  

  

  PURGE RECYCLEBIN;

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

  

  

  DROP TABLE RECYCLETEST PURGE;

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

  管理回收站

  如果在該過程中沒有實際刪除表 — 因而沒有釋放表空間 — 那麼當被刪除的對象占用了所有空間時會發生什麼事?

  答案很簡單這種情況根本不會出現當表空間被回收站數據完全占滿以至於必須擴展數據文件來容納更多數據時可以說表空間處於空間壓力情況下此時對象以先進先出的方式從回收站中自動清除在刪除表之前相關對象(如索引)被刪除

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

  此外有幾種方法可以手動控制回收站如果在刪除名為 TEST 的特定表之後需要從回收站中清除它可以執行

  

  

  PURGE TABLE TEST;

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

  

  

  PURGE TABLE BIN$LhcpndanfgMAAAAAANPw==$;

  此命令將從回收站中刪除表 TEST 及所有相關對象如索引約束等從而節省了空間但是如果要從回收站中永久刪除索引則可以使用以下命令來完成工作

  

  

  purge index in_test_;

  此命令將僅僅刪除索引而將表的拷貝留在回收站中有時在更高級別上進行清除可能會有用例如您可能希望清除表空間 USERS 的回收站中的所有對象可以執行

  

  

  PURGE TABLESPACE USERS;

 

  您也許希望只為該表空間中特定用戶清空回收站在數據倉庫類型的環境中用戶創建和刪除許多臨時表此時這種方法可能會有用您可以更改上述命令限定只清除特定的用戶

  

  

  PURGE TABLESPACE USERS USER SCOTT;

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

  

  

  PURGE RECYCLEBIN;

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

  

  

  PURGE DBA_RECYCLEBIN;

  可以看到可以通過多種不同方法來管理回收站以滿足特定的需要

  表版本和閃回功能

  用戶可能會經常多次創建和刪除同一個表

  

  

  CREATE TABLE TEST (COL NUMBER);

INSERT INTO TEST VALUES ();

commit;

DROP TABLE TEST;

CREATE TABLE TEST (COL NUMBER);

INSERT INTO TEST VALUES ();

commit;

DROP TABLE TEST;

CREATE TABLE TEST (COL NUMBER);

INSERT INTO TEST VALUES ();

commit;

DROP TABLE TEST;

  此時如果您要對表 TEST 執行閃回操作那麼列 COL 的值應該是什麼?常規想法可能認為從回收站取回表的第一個版本列 COL 的值是 實際上取回的是表的第三個版本而不是第一個因此列 COL 的值為 而不是

  此時您還可以取回被刪除表的其他版本但是表 TEST 的存在不允許出現這種情況您有兩種選擇

  使用重命名選項


  

  

  FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST;

FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST;

  這些語句將表的第一個版本恢復到 TEST將第二個版本恢復到 TEST TEST 和 TEST 中的列 COL 的值將分別是 或者使用表的特定回收站名稱進行恢復為此首先要識別表的回收站名稱然後執行

  

  

  FLASHBACK TABLE BIN$LhcpnoanfgMAAAAAANPw

==$ TO BEFORE DROP RENAME TO TEST;

FLASHBACK TABLE BIN$LhcpnqanfgMAAAAAANPw

==$ TO BEFORE DROP RENAME TO TEST;

  這些語句將恢復被刪除表的兩個版本

  警告

  取消刪除特性使表恢復其原始名稱但是索引和觸發器等相關對象並沒有恢復原始名稱它們仍然使用回收站的名稱在表上定義的源(如視圖和過程)沒有重新編譯仍然保持無效狀態必須手動得到這些原有名稱並應用到閃回表

  信息保留在名為 USER_RECYCLEBIN 的視圖中在對表進行閃回操作前請使用以下查詢來檢索原有名稱

  

  

  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_NAMEORIGINAL_N TYPE



BIN$LhcpnianfgMAAAAAANPw==$ IN_RT_  INDEX

BIN$LhcpnganfgMAAAAAANPw==$ TR_RT TRIGGER

  在表進行閃回操作後表 RECYCLETEST 上的索引和觸發器將按照 OBJECT_NAME 列中所示進行命名根據以上查詢可以使用原始名稱重新命名對象如下所示

  

  

  ALTER INDEX BIN$LhcpnianfgMAAAAAANPw==$ RENAME TO IN_RT_;

ALTER TRIGGER BIN$LhcpnganfgMAAAAAANPw==$ RENAME TO TR_RT;

  一個值得注意的例外情況是位圖索引當刪除位圖索引時它們並不放置在回收站中 — 因此無法檢索它們約束名稱也無法從視圖中檢索必須從其他來源對它們進行重命名


From:http://tw.wingwit.com/Article/program/Oracle/201311/17794.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.