<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    [Oracle10G新特性]_05.閃回表
    ?
    ??? 這是10g新添加的一個非??岬墓δ埽噍^flashback的操作,這個功能更加有應用價值。是值得深入了解的知識!主要還是要了解那些邊邊角角的功能。另外以前也沒接觸過這個內容,今天才知道那一大堆的BIN表是用來做什么的,呵呵??磥硪院髣h除表的時候,都需要在后面加上一個PURGE子句了。
    ?
    -----------------------------------------------------------------------
    ?
    閃回表
    ?
    使用 Oracle Database 10g 中的閃回表特性,可以毫不費力地恢復被意外刪除的表
    ?
    ??? 以下是一個不該發生卻經常發生的情況:用戶刪除了一個非常重要的表 — 當然是意外地刪除 — 并需要盡快地恢復。(在某些時候,這個不幸的用戶可能就是 DBA?。?
    ?
    ??? Oracle9i Database 推出了閃回查詢選項的概念,以便檢索過去某個時間點的數據,但它不能閃回 DDL 操作,如刪除表的操作。唯一的恢復方法是在另一個數據庫中使用表空間的時間點恢復,然后使用導出/導入或其他方法,在當前數據庫中重新創建表。這一過程需要 DBA 進行大量工作并且耗費寶貴的時間,更不用說還要使用另一個數據庫進行克隆。
    ?
    ??? 請使用 Oracle Database 10g 中的閃回表特性,它使得被刪除表的恢復過程如同執行幾條語句一樣簡單。讓我們來看該特性是如何工作的。
    ?

    刪除那個表!
    ?
    ??? 首先,讓我們查看當前模式中的表。

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

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

    SQL> drop table recycletest;
    ?
    Table dropped.

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

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

    ??? 表 RECYCLETEST 已不存在,但是請注意出現新表 BIN$04LhcpndanfgMAAAAAANPw==$0。這就是所發生的事情:被刪除的表 RECYCLETEST 并沒有完全消失,而是重命名為一個由系統定義的名稱。它存在于同一個表空間中,具有與原始表相同的結構。如果在該表上定義了索引或觸發器,則它們也被重命名,使用與表相同的命名規則。任何相關源(如過程)都失效;原始表的觸發器和索引被改為放置在重命名的表 BIN$04LhcpndanfgMAAAAAANPw==$0 上,保持被刪除表的完整對象結構。
    ?
    ??? 表及其相關對象被放置在一個稱為“回收站”的邏輯容器中,它類似于您 PC 機中的回收站。但是,對象并沒有從它們原先所在的表空間中刪除;它們仍然占用那里的空間?;厥照局皇且粋€列出被刪除對象目錄的邏輯結構。在 SQL*Plus 提示符處使用以下命令來查看其內容(您需要使用 SQL*Plus 10.1 來進行此操作):

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

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

    SQL> FLASHBACK TABLE RECYCLETEST TO BEFORE DROP;
    ?
    FLASHBACK COMPLETE.
    ?
    SQL> SELECT * FROM TAB;
    ?
    TNAME????????????????????????? TABTYPE? CLUSTERID
    ------------------------------ ------- ----------
    RECYCLETEST??????????????????? TABLE
    ?
    ??? 瞧!表毫不費力地恢復了。如果現在查看回收站,它將是空的。
    ?
    ??? 記住,將表放在回收站里并不在原始表空間中釋放空間。要釋放空間,您需要使用以下命令清空回收站:

    PURGE RECYCLEBIN;

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

    ??? 此命令不會將表重命名為回收站中的名稱,而是永久刪除該表,就象 10g 之前的版本一樣。
    ?
    ?
    管理回收站
    ?
    ??? 如果在該過程中沒有實際刪除表 — 因而沒有釋放表空間 — 那么當被刪除的對象占用了所有空間時,會發生什么事?
    ?
    ??? 答案很簡單:這種情況根本不會出現。當表空間被回收站數據完全占滿,以至于必須擴展數據文件來容納更多數據時,可以說表空間處于“空間壓力”情況下。此時,對象以先進先出的方式從回收站中自動清除。在刪除表之前,相關對象(如索引)被刪除。

    ??? 同樣,空間壓力可能由特定表空間定義的用戶限額而引起。表空間可能有足夠的空余空間,但用戶可能將其在該表空間中所分配的部分用完了。在這種情況下,Oracle 自動清除該表空間中屬于該用戶的對象。
    ?
    ??? 此外,有幾種方法可以手動控制回收站。如果在刪除名為 TEST 的特定表之后需要從回收站中清除它,可以執行
    ?
    PURGE TABLE TEST;
    ?
    ??? 或者使用其回收站中的名稱:
    ?
    PURGE TABLE "BIN$04LhcpndanfgMAAAAAANPw==$0";
    ?
    ??? 此命令將從回收站中刪除表 TEST 及所有相關對象,如索引、約束等,從而節省了空間。但是,如果要從回收站中永久刪除索引,則可以使用以下命令來完成工作:
    ?
    purge index in_test1_01;
    ?
    ??? 此命令將僅僅刪除索引,而將表的拷貝留在回收站中。
    ?
    ??? 有時在更高級別上進行清除可能會有用。例如,您可能希望清除表空間 USERS 的回收站中的所有對象??梢詧绦校?
    ?
    PURGE TABLESPACE USERS;
    ?
    ??? 您也許希望只為該表空間中特定用戶清空回收站。在數據倉庫類型的環境中,用戶創建和刪除許多臨時表,此時這種方法可能會有用。您可以更改上述命令,限定只清除特定的用戶:
    ?
    PURGE TABLESPACE USERS USER SCOTT;
    ?
    ??? 諸如 SCOTT 等用戶可以使用以下命令來清空自己的回收站
    ?
    PURGE RECYCLEBIN;
    ?
    ??? DBA 可以使用以下命令清除任何表空間中的所有對象
    ?
    PURGE DBA_RECYCLEBIN;
    ?
    ??? 可以看到,可以通過多種不同方法來管理回收站,以滿足特定的需要。
    ?
    ?
    表版本和閃回功能
    ?
    ??? 用戶可能會經常多次創建和刪除同一個表,如:
    ?
    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 執行閃回操作,那么列 COL1 的值應該是什么?常規想法可能認為從回收站取回表的第一個版本,列 COL1 的值是 1。實際上,取回的是表的第三個版本,而不是第一個。因此列 COL1 的值為 3,而不是 1。
    ?
    ??? 此時您還可以取回被刪除表的其他版本。但是,表 TEST 的存在不允許出現這種情況。您有兩種選擇:
    ?
    ??? ●使用重命名選項:
    ?
    ??? FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST2;
    ??? FLASHBACK TABLE TEST TO BEFORE DROP RENAME TO TEST1;
    ?
    ??? 這些語句將表的第一個版本恢復到 TEST1,將第二個版本恢復到 TEST2。 TEST1 和 TEST2 中的列 COL1 的值將分別是 1 和 2?;蛘撸?
    ?
    ??? ●使用表的特定回收站名稱進行恢復。為此,首先要識別表的回收站名稱,然后執行:
    ?
    ??? FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST2;
    ??? FLASHBACK TABLE "BIN$04LhcpnqanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST1;
    ?
    ??? 這些語句將恢復被刪除表的兩個版本。
    ?
    ?
    警告……
    ?
    ??? 取消刪除特性使表恢復其原始名稱,但是索引和觸發器等相關對象并沒有恢復原始名稱,它們仍然使用回收站的名稱。在表上定義的源(如視圖和過程)沒有重新編譯,仍然保持無效狀態。必須手動得到這些原有名稱并應用到閃回表。
    ?
    ??? 信息保留在名為 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_NAME??????????????????? ORIGINAL_N TYPE
    ------------------------------ ---------- --------
    BIN$04LhcpnianfgMAAAAAANPw==$0 IN_RT_01?? INDEX
    BIN$04LhcpnganfgMAAAAAANPw==$0 TR_RT????? TRIGGER
    ?
    ??? 在表進行閃回操作后,表 RECYCLETEST 上的索引和觸發器將按照 OBJECT_NAME 列中所示進行命名。根據以上查詢,可以使用原始名稱重新命名對象,如下所示:
    ?
    ALTER INDEX "BIN$04LhcpnianfgMAAAAAANPw==$0" RENAME TO IN_RT_01;
    ALTER TRIGGER "BIN$04LhcpnganfgMAAAAAANPw==$0" RENAME TO TR_RT;
    ?
    ??? 一個值得注意的例外情況是位圖索引。當刪除位圖索引時,它們并不放置在回收站中 — 因此無法檢索它們。約束名稱也無法從視圖中檢索。必須從其他來源對它們進行重命名。
    ?
    ?
    閃回表的其他用途
    ?
    ??? 閃回刪除表功能不僅限于恢復表的刪除操作。與閃回查詢類似,您還可以使用它將表恢復到不同的時間點,利用表的“過去”版本來替代整個表。例如,以下語句將表恢復到系統更改號 (SCN) 2202666520。
    ?
    ??? FLASHBACK TABLE RECYCLETEST TO SCN 2202666520;
    ?
    ??? 此特性使用 Oracle 數據泵技術來創建不同的表,使用閃回功能將該 SCN 處的數據版本填充到表中,然后用新表替代原始表。為找出能夠在何種程度上對表進行閃回操作,可以使用 Oracle Database 10g 的版本控制特性。(更多詳細信息請參見本系列第 1 周的內容。)在閃回子句中也可以指定時間戳記而不是指定 SCN。
    ?
    ?
    ?
    您可以在 Oracle 數據庫管理員指南 10g 1 (10.1) 中閱讀有關閃回表特性的更多內容。
    ?
    ?
    ?
    posted on 2009-08-06 22:50 decode360 閱讀(199) 評論(0)  編輯  收藏 所屬分類: 08.DBA
    主站蜘蛛池模板: 中文字幕一精品亚洲无线一区| 久久亚洲中文字幕精品一区四| 亚洲第一se情网站| 久久精品国产亚洲AV不卡| 5g影院5g天天爽永久免费影院| 亚洲一区二区三区在线观看网站| 亚洲精品97久久中文字幕无码| 久草福利资源网站免费| 亚洲av永久无码天堂网| 亚洲日韩v无码中文字幕| 天天操夜夜操免费视频| 男人j进入女人j内部免费网站| 亚洲中文无码mv| 亚洲AV无码乱码国产麻豆穿越 | 亚洲男人第一av网站| 性色av免费观看| 色欲国产麻豆一精品一AV一免费 | 一个人看www免费高清字幕| 亚洲视频一区二区在线观看| 国产成人精品男人免费| 24小时日本韩国高清免费| 久久久久久久久久免免费精品 | 亚洲伊人久久成综合人影院| 成年轻人网站色免费看| 国产无遮挡无码视频免费软件| 亚洲熟女乱色一区二区三区| 亚洲人成依人成综合网| 久久亚洲AV永久无码精品| 色视频色露露永久免费观看| 久久精品无码专区免费东京热| 亚洲精品视频免费| 最新亚洲人成无码网www电影| 亚洲人成高清在线播放| 亚洲国产美女精品久久久久∴| 日韩在线免费电影| 国产免费久久精品99re丫y| 免费人妻无码不卡中文字幕系| 久久99久久成人免费播放| 国产亚洲福利精品一区二区| 亚洲国产精品综合久久20| 91亚洲国产成人久久精品网站|