表空間是資料庫的邏輯組織形式,在一個資料庫中可以創建多個表空間。 表空間的主要作用是將不同用途的數據分離開來,以提高數據的安全性,並提高系統的性能。表空間在資料庫中起著非常重要的作用。 一方面,表空間在邏輯結構上由多個段組成,數據都存儲在表空間的段中,另一方面,表空間在物理結構上對應著多個數據文件, ...
表空間是資料庫的邏輯組織形式,在一個資料庫中可以創建多個表空間。
表空間的主要作用是將不同用途的數據分離開來,以提高數據的安全性,並提高系統的性能。
表空間在資料庫中起著非常重要的作用。
一方面,表空間在邏輯結構上由多個段組成,數據都存儲在表空間的段中,另一方面,表空間在物理結構上對應著多個數據文件,資料庫對象中的數據最終存儲在這些數據文件中。
表空間的類型較多,根據不同的分類標準,將得到不同的分類結果。
根據存儲數據類型的不同,表空間可分為系統表空間、UNDO表空間、臨時表空間和用戶表空間。
根據存儲空間方式的不同,表空間可分為字典管理表空間和本地管理表空間。
根據是否支持大文件來劃分,表空間可分為大文件表空間和小文件表空間。
表空間的管理主要涉及各種類型表空間的創建、刪除、擴展、修改狀態等。
表空間的結構
一個表空間由多個段組成,每個段可能代表一個資料庫對象。
當用戶創建表、索引、簇等資料庫對象時,在表空間中將自動創建一個段,以存儲該對象的數據。
一個段占用一個或多個區,當區的空間被寫滿後,段就會自動擴展。
在創建表空間時就需要指定區的分配方式。
區管理方式
區管理方式指的是為一個資料庫對象分配存儲空間的方式,在創建表空間時需要指定區管理方式。
Oracle支持兩種區管理方式,字典管理和本地管理。
在創建字典管理的表空間時,需要指定若幹存儲參數,以後在這個表空間中創建資料庫對象時,就按照這些存儲參數為資料庫對象分配所需要的區,當這些區被寫滿後,資料庫伺服器將按照存儲參數為資料庫對象分配新的區。
表空間的存儲參數記錄在數據字典中。
在創建字典管理的表空間時,可以指定以下幾個存儲參數:
•INITIAL(初始) :指定第一個區的大小,即首先要為資料庫對象分配的區的大小。
•NEXT :指定下一個區的大小。
• MINEXTENTS :為資料庫對象分配的最少區的個數,預設值為1。
• MAXEXTENTS : 最多為資料庫對象分配的區個數。
• PCTINCREASE :從第三個區開始,每一個區在前一個區的基礎上增長的百分比。
在字典管理表空間中,區的分配和回收都是基於數據字典進行的。
當為資料庫對象分配區時,需要從數據字典中查詢存儲參數,分配結束後,需要把分配的結果寫入數據字典。
這樣要在數據字典上執行很多的查詢操作和DML操作,並且產生重做日誌和回滾數據。
另外,由於資料庫對象中的區大小不同,隨著資料庫伺服器的運行,在段中將產生越來越的存儲碎片
在本地管理表空間中,區的大小都是相同的。
在創建表空間時,可以通過參數指定統一的區大小,或者由資料庫伺服器根據實際情況自動指定區的大小。
與字典管理方式相比,本地管理方式有以下優點:
·區的分配和回收不再基於數據字典,從而避免了對數據字典的遞歸訪問,也不會產生重做日誌和回滾數據。
·所有區的大小都相同,這就減少了存儲空間中的存儲碎片。
·不需要合併表空間中的存儲碎片,資料庫伺服器自動監視存儲空間的使用情況,併合並相鄰的空閑存儲空間。
Oracle建議大家使用本地管理表空間。
在Oracle 11g的資料庫中創建的表空間預設就是本地管理的,如SYSTEM表空間目前是字典管理的,可以通過下麵的方式,調用PL/SQL程式包中的存儲過程,把它轉化為本地管理表空間:
EXECUTE DBMS_SPACE_ADMIN.tablespace_migrate_to_local('SYSTEM');
段管理方式
當用戶向表中寫入數據時,這些數據被寫入表段中的空閑數據塊中,伺服器進程先查找表中的空閑數據塊,然後將數據寫入數據塊,最後還要修改數據塊的狀態。
對於段空間管理,Oracle提供了兩種方式,一種是手工管理,另一種是自動管理。
手工管理段空間的方式是這樣實現的:在每個段的頭部都有一段保留空間,在保留空間中維護一個空閑列表,在這個列表中記錄當前段中所有的空閑塊。
當用戶向表中寫數據時,伺服器進程在這個空閑列表中查找足夠數量的空閑塊,將數據寫入這些塊。
如果一個塊已經被寫滿了,這個塊就從空閑列表中被刪除。
在查找空閑塊的過程中,為防止其他伺服器進程使用同樣的空閑塊,伺服器進程將對空閑列表加鎖,只有空閑列表上的鎖被釋放後,其他伺服器進程才可以在空閑列表中查找空閑塊。
如果用戶在某個表上的事務很頻繁,那麼空閑列表將成為延緩事務執行的瓶頸。
自動管理方式是Oracle 11g資料庫預設採用的段管理方式。
這種管理方式是這樣實現的:在每個段的頭部有一個點陣圖,在點陣圖中記錄當前段中每個數據塊的狀態,用二進位數0和1表示數據塊的狀態,每個數據塊在點陣圖中只占一位。
使用點陣圖的好處首先是節省空間,其次,當用戶向表中寫入數據時,伺服器進程只要掃描點陣圖就可以查找空閑數據塊,而且不需要對點陣圖加鎖。
在創建表空間時,需要為表空間指定段空間管理方式。
數據文件
表空間中的所有數據都是以數據文件的形式存儲在磁碟上的。
一個表空間包含一個或多個數據文件。
在創建表空間時,至少要為表空間指定一個數據文件。
如果表空間只包含一個數據文件,那麼表空間中的數據將全部存儲在這個數據文件中。
如果表空間中包含多個文件,表空間中的數據將以區為單位分佈在各個數據文件中。
假設某個表空間中有三個數據文件,那麼在該表空間中創建一個表時,表中的第一、四、七……個區將位於第一個數據文件,第二、五、八、……個區將位於第二個數據文件中,依此類推。
如果將數據文件存放在不同的磁碟上,那麼用戶在訪問表空間中的數據時,可以同時讀寫多個數據文件,從而減少了磁碟讀寫的衝突次數。
當表空間中的存儲空間被消耗完時,用戶將無法再寫入數據。
資料庫管理員必須擴展表空間,為其分配新的存儲空間。
可以向表空間中增加新的數據文件,也可以手工擴展現有的數據文件,還可以激活數據文件的自動擴展功能,使它能夠自動擴展。
本地管理表空間的管理
本地管理表空間是Oracle 11g 中的預設表空間類型。
對這種表空間的管理主要涉及創建、刪除、修改等操作。
本地管理表空間的創建
創建表空間的任務一般由SYS 用戶完成,普通用戶如果希望執行這樣的操作,需要具有
CREATE TABLESPACE 系統許可權。
在創建表空間時,需要指定表空間的區管理方式、段管理方式以及表空間所包含的數據文件。
在Oracle 11g 中,表空間的預設區管理方式是本地管理( LOCAL )。
例如,通過以下語句創建本地管理表空間ts1 :
CREATE TABLESPACE ts1
DATAFILE 'C:\Users\john\Desktop\tbs\ts1_1.dbf' SIZE 1M
EXTENT MANAGEMENT local
SEGMENT SPACE MANAGEMENT auto;
註意:DATAFILE實際SIZE 並不是1M,因為EXTENT的大小是數據塊的整數倍。
在上面的語句中, EXTENT MANAGEMENT LOCAL用於指定表空間的區管理方式為本地管理,這是可以省略的,因為表空間預設的區管理方式就是本地管理。
但是如果在CREATE語句中指定了AUTOALLOCATE或者UNIFORM SIZE ,那麼EXTENT MANAGEMENT LOCAL是不能省略的。
AUTOALLOCATE表示這個表空間中的區大小由資料庫伺服器根據實際情況自動指定,預設為64KB 。
如果在這個表空間中創建可變大小的資料庫對象,而且這個對象需要大小不同的區,那麼AUTOALLOCATE是一種很好的選擇。
如果希望控製表空間中區的使用,則通過UNIFORM SIZE指定統一的區大小。
SEGMENT SPACE MANAGEMENT用於指定表空間中段空間的管理方式,目前有兩種可選方式,即AUTO 和MANUAL 。
AUTO 使用點陣圖的方式跟蹤段中每個數據塊的狀態,而MANUAL方式是通過空閑列表來記錄每個段中的空閑塊的。
由於AUTO使段空間管理更加高效,所以Oracle建議為表空間指定這種段管理方式,而且這也是預設方式。
DATAFILE用於指定表空間所包含的數據文件及其大小,一個表空間包含一個或多個數據文件。
在UNIX/Linux系統中,為了在某個目錄下創建數據文件,需要保證操作系統中的oracle用戶對該目錄具有寫許可權。
下麵的語句用於創建表空間TS2 ,表空間中區的統一大小為256KB 。
如果沒有通過SIZE子句指定大小,則採用預設值1MB 。
CREATE TABLESPACE ts2
DATAFILE 'C:\Users\john\Desktop\tbs\ts2_2.dbf' SIZE 1M
EXTENT MANAGEMENT local UNIFORM SIZE 256K
SEGMENT SPACE MANAGEMENT auto;
資料庫中的數據塊大小通過初始化參數DB_BLOCK_SIZE指定,通過這個參數指定的數據塊稱為標準塊。
表空間中的數據塊預設也採用標準塊大小。
如果希望在資料庫中定義其他大小的非標準塊,那麼在創建表空間時需要指定它所採用的數據塊大小。
例如,通過下麵的語句創建的表空間具有2KB 的數據塊:
CREATE TABLESPACE ts3
DATAFILE 'C:\Users\john\Desktop\tbs\ts3_3.dbf' SIZE 1M,
'C:\Users\john\Desktop\tbs\ts3_4.dbf' SIZE 1M
BLOCKSIZE 2K;
非標準塊中的數據是不能被讀到一般的資料庫高速緩存中的。
為了能夠訪問這種表空間中的數據,在創建表空間之前,需要通過初始化參數DB_nK_CACHE_SIZE在記憶體中為非標準塊定義相應的資料庫高速緩存,緩存也是由許多緩衝區組成,緩衝區的大小與非標準塊大小相同。
例如:
ALTER SYSTEM SET db_2k_cache_size=48M;
表空間信息的查詢
與表空間有關的相關信息可以從數據字典中獲得,與表空間有關的數據字典視圖有兩個,dba_tablespaces和dba_data_files。
從數據字典dba_tablespaces 中可以獲得表空間的基本信息。
下麵是有關數據字典視圖dba_tablespaces的信息:
DBA_TABLESPACES
describes all tablespaces in the database.
Related View
USER_TABLESPACES
describes the tablespaces accessible to the current user. This view does not display the PLUGGED_IN
column.
Column | Datatype | NULL | Description |
---|---|---|---|
|
|
|
Name of the tablespace |
|
|
|
Tablespace block size (in bytes) |
|
|
Default initial extent size (in bytes) |
|
|
|
Default incremental extent size (in bytes) |
|
|
|
|
Default minimum number of extents |
|
|
Default maximum number of extents |
|
|
|
Default maximum size of segments (in Oracle blocks) |
|
|
|
Default percent increase for extent size |
|
|
|
Minimum extent size for this tablespace (in bytes) |
|
|
|
Tablespace status:
|
|
|
|
Tablespace contents:
|
|
|
|
Default logging attribute:
|
|
|
|
Indicates whether the tablespace is under force logging mode ( |
|
|
|
Indicates whether the extents in the tablespace are dictionary managed ( |
|
|
|
Type of extent allocation in effect for the tablespace:
|
|
|
|
Indicates whether the tablespace is plugged in ( |
|
|
|
Indicates whether the free and used segment space in the tablespace is managed using free lists ( |
|
|
|
Indicates whether default table compression is enabled ( Note: Enabling default table compression indicates that all tables in the tablespace will be created with table compression enabled unless otherwise specified. |
|
|
|
Undo tablespace retention:
|
|
|
|
Indicates whether the tablespace is a bigfile tablespace ( |
|
|
|
Indicates whether predicates are evaluated by host ( |
|
|
|
Indicates whether the tablespace is encrypted ( |
|
|
|
Default compression for what kind of operations: |
|
|
|
Indicates whether the In-Memory Column Store (IM column store) is by default enabled ( |
|
|
|
Indicates the default priority for In-Memory Column Store (IM column store) population for this tablespace. Possible values:
|
|
|
|
Indicates how the IM column store is distributed by default for this tablespace in an Oracle Real Application Clusters (Oracle RACE) environment:
|
|
|
|
Indicates the default compression level for the IM column store for this tablespace:
|
|
|
|
Indicates the duplicate setting for the IM column store in an Oracle RAC environment:
|
例如,通過下麵的SELECT語句可以獲得表空間的名稱、區管理方式、段管理方式、內容類型、狀態等信息:
SELECT tablespace_name, extent_management, segment_space_management, contents, status FROM dba_tablespaces;
從數據字典dba_data_fies可以獲得表空間中數據文件的信息,如文件名稱、大小(以MB 為單位)、狀態等信息。
下麵是有關數據字典dba_data_fies的信息:
DBA_DATA_FILES
describes database files.
Column | Datatype | NULL | Description |
---|---|---|---|
|
|
Name of the database file |
|
|
|
File identifier number of the database file |
|
|
|
Name of the tablespace to which the file belongs |
|
|
|
Size of the file in bytes |
|
|
|
Size of the file in Oracle blocks |
|
|
|
File status: |
|
|
|
Relative(相對的) file number |
|
|
|
Autoextensible indicator(指示符) |
|
|
|
Maximum file size in bytes |
|
|
|
Maximum file size in blocks |
|
|
|
Number of Oracle blocks used as autoextension increment |
|
|
|
The size of the file available for user data. The actual size of the file minus the |
|
|
|
Number of blocks which can be used by the data |
|
|
|
Online status of the file:
|
例如:
SELECT file_name, bytes/1024/1024 MB, status FROM dba_data_files WHERE tablespace_name='TS1';
表空間的刪除
當一個表空間不再需要時,可以將其從資料庫中刪除。
刪除表空間的操作一般由SYS用戶完成,普通用戶如果希望執行這樣的操作,需要具有DROP TABLESPACE系統許可權。
刪除表空間的命令格式為:
DROP TABLESPACE 表空間名;
例如,下麵的命令用於刪除表空間ts3:
DROP TABLESPACE ts3;
需要註意的是,如果用戶已經在這個表空間中創建了表、索引的資料庫對象,這個表空間是不能被直接刪除的,需要先把表空間中的所有資料庫對象刪除。
例如,下麵的DROP語句用於刪除表空間以及其中的資料庫對象:
DROP TABLESPACE ts2 INCLUDING CONTENTS;
表空間雖然被刪除了,但是表空間所包含的數據文件並沒有被刪除,還占用磁碟上的存儲空間,這些文件需要通過手工方式刪除。
在有些情況下,手工刪除數據文件可能不太容易,如在裸設備中或ASM磁碟組中。
下麵的DROP語句用於刪除表空間以及其中的資料庫對象和對應的數據文件:
DROP TABLESPACE ts1 INCLUDING CONTENTS AND DATAFILES;
大文件表空間的管理
大文件( BigFile )表空間是一種特殊類型的表空間,在每個大文件表空間中只包含一個數據文件,但這個數據文件的大小可以達到4GB 個數據塊。
使用大文件表空間的最大好處是可以大大擴展資料庫的容量。
假設數據塊的大小為8KB,那麼一個數據文件的大小就可以達到8KB ( 4GB=32TB。另外,使用大文件表空間可以大大減少數據文件的數目,因為一個表空間只有一個數據文件。
Oracle推出大文件表空間的主要目的是支持自動存儲管理( ASM )和RAID 、條帶狀邏輯捲,這些技術結合起來,為資料庫提供大容量的、對用戶透明的存儲空間。
需要註意的是,大文件表空間的區管理方式只能是本地管理,段管理方式只能是自動管理。
UNDO表空間、臨時表空間和SYSTEM表空間屬於例外情況,如果把它們指定為大文件表空間,它們的區管理方式只能是本地管理,但是段管理方式可以是自動管理或手工管理。
大文件表空間的支持
在預設情況下,資料庫中表空間的類型為小文件( SmallFile )表空間,如果要創建大文件表空間,則需要通過關鍵字BIGFILE指定。
在創建資料庫時,可以將預設的表空間類型指定為大文件表空間,這樣以後在資料庫中創建的表主間預設都屬於大文件表空間。
在創建資料庫的CREATE DATABASE命令中,如果使用了SET DEFAULT BIGFILE TABLESPACE子句,那麼表空間的預設類型將為大文件表空間。
如果使用了SET DEFAULT SMALLFILE TABLESPACE子句,或者這兩條子句都沒有使用,那麼表空間的預設類型將為小文件表空間。
例如,以下語句在創建資料庫時指定表空間的預設類型為大文件表空間:
CREATE DATABASE test
SET DEFAULT BIGFILE TABLESPACE
...
在資料庫的運行過程中,資料庫管理員也可以動態修改表空間的預設類型,修改以後的表空間類型對以後創建的所有表空間起作用。
例如:
ALTER DATABASE SET DEFAULT BIGFILE TABLESPACE;
ALTER DATABASE SET DEFAULT SMALLFILE TABLESPACE;
從數據字典視圖database_properties 中可以獲得資料庫的屬性,包括預設的表空間類型。
例如:
SELECT property_value, description FROM database_properties WHERE property_name=UPPER('default_tbs_type');
大文件表空間的刪除方法與普通表空間相同。
大文件表空間的創建
在資料庫的運行過程中,資料庫管理員可以創建一個大文件表空間。
這個表空間的區管理方式為本地管理,段管理方式為自動管理,在創建表空間的語句中可以不指定這些信息。
在創建大文件表空間的語句中,只能指定一個數據文件。
例如:
CREATE BIGFILE TABLESPACE ts1 DATAFILE 'C:\Users\john\Desktop\tbs\ts1.dbf' SIZE 1M;
如果資料庫中表空間的預設類型已經是大文件表空間,那麼在創建大文件表空間的語句中可以省略BIGFILE關鍵字。
但如果要創建一個小文件表空間,則必須在CREATE TABLESPACE語句中使用SMALLFILE關鍵字,反之亦然。
大文件表空間的修改
修改大文件表空間的操作涉及兩個方面的內容:重新指定數據文件的大小以及修改數據文件的自動擴展屬性。
由於大文件表空間只有一個數據文件,所以在修改時不需要指定數據文件的信息。
例如,下麵的語句用來把數據文件TS1.DBF的大小改為2M:
ALTER TABLESPACE ts1 RESIZE 2M;
下麵的語句用於修改數據文件的自動擴展屬性:
ALTER TABLESPACE ts1 AUTOEXTEND ON NEXT 1M MAXSIZE 5M;
臨時表空間的管理
臨時表空間用於存儲臨時數據。
當用戶執行排序、創建索引這樣的操作時,將產生大量的中間結果,這些臨時數據將首先存儲在PGA的排序區中。
當排序區的大小不足以容納這些數據時,將用到臨時表空間。
如果沒有為用戶指定臨時表空間,那麼用戶在執行排序操作時將把SYSTEM表空間作為臨時表空間,併在SYSTEM表空間中創建臨時段,以存儲臨時數據。
由於用戶的排序操作會在SYSTEM表空間中頻繁地產生臨時段和釋放臨時段,這樣在SYSTEM表空間中將產生大量的存儲空間碎片,從而降低資料庫的性能。
Oracle建議在資料庫中創建專門的臨時表空間,並為用戶指定一個臨時表空間。
在臨時表空間中只能創建臨時段,而不能創建數據段、索引段等永久性的段。
在資料庫中第一次執行排序操作時,臨時段自動創建,在資料庫關閉時,臨時段被刪除。
這些臨時段為所有用戶所共用。
臨時表空間的創建
就像創建普通表空間一樣,在創建臨時表空間時需要指定區管理方式、段管理方式、區的大小等信息,也可以創建大文件臨時表空間。
在創建表空間時需要指定關鍵字TEMPORARY 。
例如,以下語句用來創建本地管理臨時表空間tts1:
CREATE TEMPORARY TABLESPACE tts1
TEMPFILE 'C:\Users\john\Desktop\tbs\tts1_1.dbf' SIZE 1M
EXTENT MANAGEMENT LOCAL
UNIFORM SIZE 128K;
在創建本地管理臨時表空間時,首先要用關鍵字TEMPORARY指定表空間的類型為臨時性的,其次,要通過TEMPFILE子句指定表空間的數據文件,而不是使用DATAFFILE子句。
另外,只能通過UNIFORM子句為臨時表空間指定的區大小,而不能使用AUTOALLOCATE子句。
在創建臨時表空間時, Oracle建議將臨時表空間的大小設置為排序區的整數倍,以減少存儲空間的碎片,使資料庫獲得最佳性能。
排序區的大小通過初始化參數SORT_AREA_SIZE來確定。
臨時表空間的作用僅限於存儲臨時數據,因而與普通表空間相比它有一些特殊的地方。
從數據字典視圖dba_tablespaces 中查詢臨時表空間的信息時,發現LOGGING 列的值為NOLOGGING ,這就意味著對臨時空間中的數據所做的任何修改都不會產生重做日誌。
用戶執行排序等操作時,臨時文件中的數據是不斷變化的,因而臨時文件的訪問許可權不能為只讀方式。
另外,還需要註意的是,臨時表空間中的數據文件的信息是從數據字典視圖dba_temp_files 中獲得的。
在創建資料庫時,預設就創建了一個臨時表空間,它就作為資料庫的預設臨時表空間。
如果更改資料庫的臨時表空間,可以執行下麵的ALTER語句:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tts1;
臨時表空間組
在資料庫中只有一個預設臨時表空間,所有用戶都是用這個臨時表空間。
如果在資料庫中有大量的排序、創建索引,或者以併發方式向表中寫入大量數據,這時可以創建多個臨時表空間,為每個用戶指定不同的臨時表空間,每個用戶都使用自己的臨時表空間,這樣做的好處是可以將磁碟I/O分佈在不同的磁碟上,減少了磁碟I/O的衝突,從總體上可以提高資料庫的性能。
例如,下麵的ALTER為用戶指定臨時表空間:
ALTER USER scott TEMPORARY TABLESPACE tts1;
由於不同用戶對資料庫的訪問是不同的,因而對這些臨時表空間的使用頻率也是不同的。
如果能使所有用戶平均地使用資料庫中的多個臨時表空間,就能進一步提高資料庫的性能。
臨時表空間組是解決這個問題的最佳途徑。
臨時表空間組是一組臨時表空間的邏輯集合,當為用戶指定臨時表空間組時,用戶可以平均地使用其中的所有臨時表空間。
臨時表空間組不需要創建,只要在創建或修改臨時表空間時為臨時表空間組指定一個名稱即可。
例如:
ALTER TABLESPACE tts1 TABLESPACE GROUP group1;
CREATE TEMPORARY TABLESPACE tts3 TEMPFILE 'C:\Users\john\Desktop\tbs\tts3_1.dbf' SIZE 2M TABLESPACE GROUP group1;
然後將這個臨時表空間組作為資料庫的預設臨時表空間,或者作為某個用戶的預設臨時表空間。
例如:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE group1;
從臨時表空間組中刪除臨時表空間的操作也很簡單,只要為臨時表空間指定一個空的臨時表空間組即可。
臨時表空間雖然在邏輯上不再屬於任何臨時表空間組,但它在資料庫中依然存在,還可以作為資料庫或者某個用戶的預設臨時表空間。
下麵的語句用於將臨時表空間TTS1從臨時表空間組中刪除。
ALTER TABLESPACE tts1 TABLESPACE GROUP '';
臨時表空間組的信息可以從數據字典視圖dba_tablespace_groups 中獲得。
例如,下麵的語句用於查詢一個臨時表空間組中所包含的臨時表空間:
SELECT tablespace_name FROM dba_tablespace_groups WHERE group_name='GROUP1';
UNDO表空間的管理
當用戶在資料庫中執行INSERT 、DELETE 、UPDATE等DML操作時,相關的命令集合組成一個事務。
在事務提交之前,用戶還有機會回滾事務。
事務回滾之後對資料庫所作的修改將被取消,就好像沒有發生任何事情一樣。
回滾事務的結果是將被修改的數據還原為原狀,也就是將回滾數據重新寫回原來的地方。
回滾數據也稱為UNDO數據,是事務執行以前的數據,這些數據被存儲在回滾段中。
當用戶提交事務時,回滾數據就失去了存在的意義。
而當用戶回滾事務時,資料庫伺服器將回滾數據從回滾段重新寫入數據段,於是數據被恢復為原狀。
回滾數據對於維護數據的一致性有非常重要的意義。
例如,某個用戶要在兩個銀行賬號之間轉賬,資料庫先在第一個賬戶上減去轉賬的金額,然後在第二個賬戶上加上相同的金額。
這兩步操作就構成一個事務,作為一整體來執行。
假設在第一步剛執行完時,系統突然斷電,結果會怎樣呢?
兩個賬戶上的金額就對不上了。
Oracle能夠很好地解決這個問題。
當數據伺服器重新啟動時,這個未提交的事務將被回滾,資料庫伺服器將回滾數據寫入原來的位置,於是這次轉賬以失敗告終,這樣就保證了兩個銀行賬戶之間不會出現收支不平衡的現象。
回滾數據被存儲在資料庫中一段特殊的存儲區域中。
在Oracle 11 g 中,有兩種管理回滾數據的方式,一種是自動方式,這種方式利用專門的UNDO表空間管理UNDO數據。
第二種方法利用回滾段管理UNDO數據,這種方式稱為手工方式。
在一個資料庫中我們只能選擇使用其中一種方式。
手工方式即回滾段方式,是以前的Oracle版本使用的傳統方式,這種方式的管理相當複雜,需要數據管理員做大量的工作,如確定回滾段的數量和大小,指定可用的回滾段等。
如果回滾段的數量太少,或者空間太小,用戶的事務可能被延緩執行,這時管理員需要回滾段進行手工擴展。
自動方式利用專門的UNDO表空間來管理回滾數據。
如果創建了UNDO表空間,資料庫伺服器將自動使用UNDO表空間來管理回滾數據,整個過程不需要人工干預,從而大大減輕了管理員的負擔。
如果將UNDO表空間設置為可自動擴展,那麼當用戶的事務太多時,資料庫伺服器可以根據需要對UNDO表空間進行擴展。
Oracle建議採用自動管理方式。
實際上自動方式也是利用回滾段來管理回滾數據的,回滾段包含在專門的UNDO表空間中,只不過回滾段不需要資料庫管理員管理,而是由資料庫伺服器根據需要自動建立和刪除的。
在創建資料庫時,將自動創建一個UNDO表空間,表空間的名稱為UNDOTBS。
在自動管理方式下,如果沒有建立UNDO表空間,資料庫伺服器將利用SYSTEM表空間中的回滾段管理回滾數據。
雖然資料庫伺服器也能運行,但這屬於一種異常情況,將產生一條警告信息,而且這種情況將導致在SYSTEM 表空間中產生大量存儲碎片。
因此, Oracle 強烈建議創建一個UNDO表空間。
UNDO表空間的創建
有兩種創建UNDO表空間的方式,一種是在創建資料庫的同時創建UNDO表空間,另一種方式是在資料庫運行過程中,通過CREATE UNDO TABLESPACE命令來創建。
創建資料庫時,在預設情況下,將自動創建UNDO表空間UNDOTBS1。
通過CREATE命令創建UNDO表空間的命令語也與普通表空間類似,主要的區別在於使用了“ UNDOTABLESPACE”子句。
例如,以下語句用來創建大文件UNDO表空間UNDOTBS2:
CREATE UNDO TABLESPACE undotbs2 DATAFILE 'C:\Users\john\Desktop\tbs\tbs2_1.dbf' SIZE 1M REUSE EXTENT MANAGEMENT LOCAL;
UNDO表空間的切換
資料庫伺服器可以採用自動方式,也可以採用手工方式管理回滾數據,這取決於初始化參數UNDO_MANAGEMENT 的設置。
如果參數值為AUTO ,則採用自動方式,如果設置為MANUAL ,則採用手工方式。
如果希望從一種方式切換到另一種方式,需要修改初始化參數UNDO_MANAGEMENT的值。
與回滾數據的管理方式有關的初始化參數還有以下幾個:
•UNDO_TABLESPACE 用來指定一個可用的UNDO表空間。
這個表空間必須存在。
如果採用手工方式,這個參數的設置無效。
在資料庫伺服器運行的過程中,這個參數的值可以動態修改。
• UNDO_RETENTION(保留) 指定已經無效的UNDO數據在UNDO表空間中可以保留的時間,預設為900秒。
這個參數的值也可以動態修改。
UNDO表空間在創建之後,為了保證用戶能夠使用這個表空間,首先必須將資料庫UNDO管理方式設置為自動管理方式,即確保初始化參數UNDO_MANAGENT的值為AUTO 。
另外,還需要將初始化參數UNDO_TABLESPACE的值設置為新創建的UNDO表空間。
例如:
ALTER SYSTEM SET UNDO_MANAGEMENT=auto scope=spfile;
ALTER SYSTEM SET UNDO_TABLESPACE=undotbs3;
初始化參數UNDO_MANAGEMENT的值需要在參數文件中修改,並且只有在數據伺服器重新啟動之後才能起作用。
而初始化參數UNDO_TABLESPACE的值可以在參數文件中修改,也可以動態修改。
在切換UNDO表空間時,如果指定的UNDO表空間不存在,或者指定的表空間不是UNDO表空間,或者有另一個實例正在使用這個表空間,切換操作將無法正常進行。
在切換UNDO表空間之後,新的事務將使用切換後的UNDO表空間。
但是原來的UNDO表空間不會馬上失去作用,如果一個事務開始於切換表空間之前,並一直持續到切換之後,那麼它還將繼續使用原來的表空間,這樣原來的UNDO表空間需要一直等待在其中運行的事務都結束後才能失去作用。
UNDO表空間的擴展和刪除方法與普通表空間相同。
表空間的擴展
在創建表空間時,需要表空間中的數據文件及其大小,表空間中的數據就寫在這些數據文件中。
如果數據文件的空間被寫滿,新的數據將無法寫入,用戶的事務可能無法順利執行。
在創建表空間或擴展表空間時應該根據以下原則l指定數據文件:
·儘量使用少量的大文件,而不要使用大量的小文件。
·同一個表空間的不同數據文件應該存放在不同的磁碟上。
·應該將數據文件和重做日誌文件分別存放在不同的磁碟上。
在資料庫中能夠容納的數據文件數目是有限的,文件數目越多,在打開文件時就需要越多的記憶體空間。
數據文件的數目受兩個因素的制約,一是在創建資料庫時指定的MAXDATAFILES永久參數,二是初始化參數DB_FILES 。
MAXDATAFILES 永久參數指定了一個最大數據文件數目,這個數目將被記錄在控制文件中。
當使用CREATE DATABASE命令創建資料庫,或者執行CREATE CONTROLFILES命令創建控制文件時,都可以通過這個參數指定數據文件的最大數量。
然而如果實際的數據文件數目超過指定的數目時,資料庫伺服器將擴展控制文件,以記錄更多的數據文件。
初始化參數DB_FILES指定在資料庫中可以創建的數據文件的最大數目。
當實際的數據文件數目達到這個數目時,將無法創建或添加新的數據文件。
但是初始化參數DB_FILES 的值是可以修改的。
在參數文件中為這個參數指定新值,然後重新啟動資料庫伺服器,新的參數值將起作用。
DB_FILES 的值並不是越大越好,大的參數值固然允許你創建更多的數據文件,也將消耗更多的記憶體空間。
將數據文件存放在不同的磁碟上,並將其與重作日誌文件分開存放,這種做法的目的是將磁碟的讀寫操作分散在各個磁碟上,從而減少磁碟的I/O 衝突。
擴展表空間的方法有兩種,一種是向表空間中添加新的數據文件,另一種方法是擴展現有的數據文件。
擴展數據文件又可以分為兩種方法,一種是允許數據文件自動擴展,另一種方法是手工擴展數據文件。
如何添加新的數據文件
在向表空間中添加數據文件時,通過ADD子句指定數據文件的路徑和大小。例如:
ALTER TABLESPACE ts2 ADD DATAFILE 'C:\Users\john\Desktop\tbs\ts2_1.dbf' SIZE 1M REUSE;
在添加數據文件時,通過SIZE關鍵字指定文件的大小。
如果在指定的位置已經存在一個同名的數據文件,可通過使用REUSE關鍵字將其覆蓋。
如果要向表空間中添加多個數據文件,由DATAFILE關鍵字引導多個文件,每個文件分別指定路徑和大小。
例如:
ALTER TABLESPACE ts2 ADD DATAFILE 'C:\Users\john\Desktop\tbs\ts2_3.dbf' SIZE 1M REUSE, 'C:\Users\john\Desktop\tbs\ts2_2.dbf' SIZE 1M REUSE;
對於本地管理的臨時表空間,在添加數據文件時需要通過ADD TEMPFILE子句指定新的臨時文件。
例如,以節語句用於向臨時表空間TTSl 中添加臨時文件TTS1_2.DBF: