程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORACLE回收站機制介紹,oracle回收站機制

ORACLE回收站機制介紹,oracle回收站機制

編輯:Oracle教程

ORACLE回收站機制介紹,oracle回收站機制


回收站概念

從ORACLE 10g開始,引入了一個叫回收站(Recycle Bin)的概念。它的全稱叫Tablespace Recycle Bin。回收站實際是一個邏輯容器(邏輯區域),原理有點類似於WINDOW系統的回收站。它以表空間中現有已經分配的空間為基礎,而不是從表空間上物理劃出一個固定區域用作回收站。這意味著回收站和表空間中的對象共用存儲區域、系統沒有給回收站預留空間。因此,當表被DROP後,如果可用空間充足,並且沒有對回收站進行清理,那麼被DROP掉的對象會一直存在回收站中,但是如果可用空間緊張的情況下,數據庫會根據先進先出的順序覆蓋Recycle Bin中的對象。所以回收站機制也不是百分百的保險機制。另外從原理上來說它就是一個數據字典表,放置用戶Drop掉的數據庫對象信息。用戶進行Drop操作的對象並沒有真正被數據庫刪除,仍然會占用空間。除非是由於用戶手工進行Purge或者因為存儲空間不夠而被數據庫清掉。數據庫有了這樣的功能,能夠減少很多不必要的麻煩。當用戶、開發人員、甚至DBA誤操作刪除了表,那麼我們不必還原整個數據庫或表空間,直接使用ORACLE 10g的閃回(FLASHBACK,閃回)功能來還原被刪除的表。這樣我們就能避免大量的人工誤操作。這是一個對DBA相當有用的功能。

 

回收站功能

回收站這個特性主要的好處就是在誤刪除一個表時有一個恢復機制,不必通過數據庫還原來實現。避免大量的人工誤操作。以及數據庫還原等復雜的操作。讓數據庫的管理、維護更加簡單、方便。如果是SQL SERVER數據庫,就必須還原整個數據庫來找到被DROP掉的表。可見回收站功能確實是一個開創性的功能。

 

管理回收站

開啟、關閉回收站

首先你可以通過命令查看數據庫是否開啟了回收站機制, 如下所示 VALUE= ON表示開啟了回收站機制。OFF則表示回收站機制關閉。

SQL> SHOW PARAMETER RECYCLEBIN;
 
NAME              TYPE        VALUE
--------     ----------- ----------
recyclebin      string         ON
 
 
SQL> SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME='recyclebin';
 
NAME                      VALUE
----------------- --------------------
recyclebin                  on

可以通過設置初始化參數recyclebin啟用或禁用回收站功能。當然也可以用命令關閉回收站

SQL> ALTER SYSTEM SET RECYCLEBIN=OFF;
 
System altered.
 
SQL> ALTER SESSION SET RECYCLEBIN=OFF;
 
Session altered.
 
SQL> SHOW PARAMETER RECYCLEBIN;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      OFF

可以用命令開啟回收站

SQL> ALTER SYSTEM SET RECYCLEBIN=ON;
 
System altered.
 
SQL> ALTER SESSION SET RECYCLEBIN =ON;
 
Session altered.
 
SQL> SHOW PARAMETER RECYCLEBIN;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
recyclebin                           string      ON

 

查看回收站對象

我們先來看看一個例子,如下所示,假如不小心誤操作DROP了表test,那麼我們如何在回收站查看被DROP的表對象呢?

SQL> show user
USER is "ODS"
 
SQL> create table test(name varchar2(16));
 
Table created.
 
SQL> insert into test select 'kerry' from dual;
 
1 row created.
 
SQL> insert into test select 'ken' from dual;
 
1 row created.
 
SQL> commit;
 
Commit complete.
 
SQL> drop table test;
 
Table dropped.

SQL 1:

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vltN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:11:25:38

SQL 2: 其中RECYCLEBIN是USER_RECYCLEBIN 的同義詞。

COL OBJECT_NAME FOR A30
COL ORIGINAL_NAME FOR A8
COL OPERATION FOR A9
COL TYPE FOR A8
COL DROPTIME FOR A19
COL TS_NAME FOR A30
SELECT OBJECT_NAME 
          ,ORIGINAL_NAME
          ,OPERATION
          ,TYPE
          ,DROPTIME
          ,TS_NAME
FROM RECYCLEBIN;
 
 
--查看數據庫當前用戶的回收站對象
 
SQL> SELECT * FROM RECYCLEBIN

SQL 3:

--查看數據庫當前用戶的回收站對象

SQL> SELECT * FROM USER_RECYCLEBIN;

SQL 4: 需要相關權限才能查詢。

--查看數據庫回收站所有對象

SQL> SELECT * FROM DBA_RECYCLEBIN;

為了避免被刪除的表與同類對象名稱的重復,被刪除的表以及相依的對象放到回收站後,ORACLE數據庫會對被刪除的對象名稱進行重命名,例如表TEST表

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vltN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:11:25:38

我們又創建了表TEST,然後刪除了該表TEST,如下所示,雖然ORIGINAL_NAME一致,但是RECYCLEBIN NAME則有所不同。

SQL> create table test(name varchar2(16));
 
Table created.
 
SQL> drop table test;
 
Table dropped.
 
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vluN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:14:40:52
TEST             BIN$BLmi9vltN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:11:25:38

RECYCLEBIN NAME的命名規則為BIN$GUID$Version 其中GUID為GlobalUID,是一個全局唯一、24個字符長的標識對象,它是ORACLE內部使用的標識。 其中$version是ORACLE數據庫分配的版本號。

 

還原回收站對象

還原回收站被刪除的表、索引等對象, 是通過Flashback Drop實現的。如下所示。

SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
 
Flashback complete.
 
 
SQL> SELECT * FROM TEST;
 
NAME
----------------
kerry
ken

但是如果出現上面兩個TEST表都被刪除時,此時的Flashback Drop就有點意思了

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vlxN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:25
TEST             BIN$BLmi9vlwN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:09
SQL> flashback table test to before drop;
 
Flashback complete.
 
SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vlwN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:09
 
SQL> select * from test;
 
no rows selected

如上所示,如果兩個相同名字的表TEST被刪除了,此時閃回被DROP的表TEST,實質是閃回最後一個被刪除的表(後進先出原則),如果此時繼續閃回操作就會報ORA-38312錯誤

 
SQL> flashback table test to before drop;
flashback table test to before drop
*
ERROR at line 1:
ORA-38312: original name is used by an existing object

此時可以在閃回過程中對表名進行重命名解決問題。。

SQL> flashback table test to before drop rename to test_2;
 
Flashback complete.
 
SQL> select * from test_2;
 
NAME
----------------
kerry
ken

另外,如果回收站有兩個被DROP掉的表TEST, 如果想閃回第一個被刪除的表,那該怎麼辦呢?

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
TEST             BIN$BLmi9vlxN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:25
TEST             BIN$BLmi9vlwN3TgUKjAgYxoiA==$0 TABLE        2014-10-06:15:10:09

其實這個也很好處理,直接指定RECYCLEBIN NAME進行閃回即可。

SQL> flashback table "BIN$BLmi9vlwN3TgUKjAgYxoiA==$0" to before drop;

 

清空回收站

數據庫對象刪除後,數據庫會把它重命名為BIN$開頭的對象,你可以通過ORIGINAL_NAME查看它對應的原始對象名稱。記住,將表放在回收站裡並不在原始表空間中釋放空間。如果您希望完全刪除該表,而不讓該表放入回收站,可以使用以下命令永久刪除該表。當然這樣操作後,你也不能通過使用閃回特性閃回該表了。

DROP TABLE TABLE_NAME PURGE;

如果數據庫中刪除表時都放入回收站,因而沒有釋放所占空間,那麼當空閒的空間不足時,已經刪除的表是否還會侵占存儲空間呢?

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

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

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

PURGE TABLE TABLE_NAME;

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

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

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

PURGE INDEX IN_TEST1_O1;

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

PURGE TABLESPACE USERS;

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

PURGE TABLESPACE USERS USER SCOTT;

要釋放整個回收站占用的空間,您需要使用以下命令清空回收站:

PURGE RECYCLEBIN;

記住PURGE RECYCLEBIN只是清除當前用戶回收站中的對象,DBA_RECYCLEBIN下的的對象並沒有刪除,如果你要清除當前數據庫回收站的對象,必須使用下面命令(DBA權限)

PURGE DBA_RECYCLEBIN

 

Flashback Drop注意事項

1:只能用於非系統表空間和本地管理的表空間。

如下所示,在系統表空間中,表對象刪除後就真的從系統中刪除了,而不是存放在回收站中。

SQL> show user
USER is "SYS"
SQL> create table test(name varchar2(12));
 
Table created.
 
SQL> drop table test;
 
Table dropped.
 
SQL> show recyclebin;

2:對象的參考約束不會被恢復,指向該對象的外鍵約束需要重建。

3:對象能否恢復成功,取決於對象空間是否被覆蓋重用。

4:當刪除表時,依賴於該表的物化視圖也會同時刪除,但是由於物化視圖並不會放入recycle binzhong,因此當你執行flashback drop時,

並不能恢復依賴其的物化視圖。需要DBA手工重建。

5:對於回收站(Recycle Bin)中的對象,只支持查詢。不支持任何其他DML、DDL等操作。

 

參考資料:

http://blog.csdn.net/tianlesoftware/article/details/4677378


oracle 回收站自動清除

有自己的機制,會自動清除。
不過細節記不住了。以前學ocp時好像對這個有點印象。
 

oracle--對鎖機制的理解-

1 引言—數據庫鎖的基本概念
為了確保並發用戶在存取同一數據庫對象時的正確性(即無丟失修改、可重復讀、不讀“髒”數據),數據庫中引入了鎖機制。基本的鎖類型有兩種:排它鎖(Exclusive locks記為X鎖)和共享鎖(Share locks記為S鎖)。
排它鎖:若事務T對數據D加X鎖,則其它任何事務都不能再對D加任何類型的鎖,直至T釋放D上的X鎖;一般要求在修改數據前要向該數據加排它鎖,所以排它鎖又稱為寫鎖。
共享鎖:若事務T對數據D加S鎖,則其它事務只能對D加S鎖,而不能加X鎖,直至T釋放D上的S鎖;一般要求在讀取數據前要向該數據加共享鎖,所以共享鎖又稱為讀鎖。
2 Oracle 多粒度封鎖機制介紹
根據保護對象的不同,Oracle數據庫鎖可以分為以下幾大類:
(1) DML lock(data locks,數據鎖):用於保護數據的完整性;
(2) DDL lock(dictionary locks,字典鎖):用於保護數據庫對象的結構(例如表、視圖、索引的結構定義);
(3) internal locks 和l a t c h es(內部鎖與闩):保護內部數據庫結構;
(4) distributed locks(分布式鎖):用於OPS(並行服務器)中;
(5) PCM locks(並行高速緩存管理鎖):用於OPS(並行服務器)中。
本文主要討論DML(也可稱為data locks,數據鎖)鎖。從封鎖粒度(封鎖對象的大小)的角度看,Oracle DML鎖共有兩個層次,即行級鎖和表級鎖。
2.1 Oracle的TX鎖(行級鎖、事務鎖)
許多對Oracle不太了解的技術人員可能會以為每一個TX鎖代表一條被封鎖的數據行,其實不然。TX的本義是Transaction(事務),當一個事務第一次執行數據更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語句進行查詢時,它即獲得一個TX(事務)鎖,直至該事務結束(執行COMMIT或ROLLBACK操作)時,該鎖才被釋放。所以,一個TX鎖,可以對應多個被該事務鎖定的數據行。
在Oracle的每行數據上,都有一個標志位來表示該行數據是否被鎖定。Oracle不象其它一些DBMS(數據庫管理系統)那樣,建立一個鏈表來維護每一行被加鎖的數據,這樣就大大減小了行級鎖的維護開銷,也在很大程度上避免了其它數據庫系統使用行級封鎖時經常發生的鎖數量不夠的情況。數據行上的鎖標志一旦被置位,就表明該行數據被加X鎖,Oracle在數據行上沒有S鎖。
2.2 TM鎖(表級鎖)
2.2.1 意向鎖的引出
表是由行組成的,當我們向某個表加鎖時,一方面需要檢查該鎖的申請是否與原有的表級鎖相容;另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。比如一個事務要在一個表上加S鎖,如果表中的一行已被另外的事務加了X鎖,那麼該鎖的申請也應被阻塞。如果表中的數據很多,逐行檢查鎖標志的開銷將很大,系統的性能將會受到影響。為了解決這個問題,可以在表級引入新的鎖類型來表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。
意向鎖的含義是如果對一個結點加意向鎖,則說明該結點的下層結點正在被加鎖;對任一結點加鎖時,必須先對它的上層結點加意向鎖。如:對表中的任一行加鎖時,必須先對它所在的表加意向鎖,然後再對該行加鎖。這樣一來,事務對表加鎖時,就不再需要檢查表中每行記錄的鎖標志位了,系統效率得以大大提高。
2.2.2 意向鎖的類型
由兩種基本的鎖類型(S鎖、X鎖),可以自然地派生出兩種意向鎖:
意向共享鎖(Intent Shar......余下全文>>
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved