表空間(TABLESPACE)是ORACLE數據庫中最大的邏輯結構。ORACLE數據
庫是由一個或多個表空間組成的。它在物理上與磁盤上的數據文件相對應(一個表空間由一個或多個數據文件組成,但一個數據文件只能屬于一個表空間)。從物理
上說數據庫的數據被存放在數據文件中,而從邏輯上說是被存放在表空間中的。
數據庫的邏輯配置實際上就是指表空間的配置。
一、表空間概述
表空間是ORACLE數據庫中最大的邏輯結構。數據庫的所有對象和方案都被邏輯的保存在表空間中。
(一)表空間的特性與作用
數據庫管理系統(DBMS)是建立在操作系統(OS)基礎上的,它的數據也必須存儲在各個文件中,如數據文件、重做日志文件、歸檔日志文件等。
表不是文件,表不是空間。
表空間是組織結構和分配空間的邏輯結構。除了數據文件之外,控制文件、重做日志文件、歸檔日志文件等其他文件都不屬于任何表空間。
表空間的特性如下:
1.一個數據庫可以有多個表空間。可以在數據庫中創建、刪除表空間;
2.一個表空間只屬于一個數據庫;
3.一個表空間必須要有一個數據文件;
4.一個表空間的大小等于其中所有數據文件的大小之和。數據庫的大小等于其中所有表空間的大小之和;
5.表空間可以被聯機和脫機。SYSTEM表空間不能被脫機;
6.表空間可以在讀寫、只讀狀態之間切換;
7.每個表空間由一個或多個物理存在的操作系統的數據文件組成。這種數據文件可以具有固定的大小,或允許其自動變大。可以在表空間中添加、刪除數據文件;
8.方案對象、表、索引的數據都被存儲在表空間的數據文件中。一個數據文件存儲不下,就存儲在另一個數據文件中,只要該數據文件是本表空間中的就可以;
9.一個用戶默認使用一個表空間,但他的不同方案對象的數據可以被存儲在不同表空間中;
10.一個用戶使用的表空間的數量是有一定配額的,不能超出這個配額;
11.可以根據使用目的,創建不同類型的表空間,如永久表空間、臨時表空間、撤銷表空間、大表空間等。不同類型的表空間的格式、使用方式及目的是不同的。
表空間的作用:
1.控制數據庫所占用的磁盤空間;
2.控制用戶所占用的表空間配額,也就等于控制用戶所占用的配額空間;
3.通過將不同表的數據、分區表中不同分區的數據放置到不同的表空間中,可以提高數據庫的I/O性能,并有利于進行部分備份和恢復等管理工作;
4.能夠將一個表的數據和這個表的索引數據分別防止到不同的表空間中,同樣可以提高數據庫的I/O性能;
5.可以將表空間設置成只讀狀態而保持大量的靜態數據。
(二)表空間的類型
一個數據庫通常有SYSTEM,SYSAUX,TEMP三個默認表空間,一個或多個臨時表空間,而且還有一個撤銷表空間和幾個應用程序專用的應用表空間。
這些表空間可以劃分為系統表空間和非系統表空間兩類。
系統數據(數組字典表及其數據) 系統表空間
用戶數據(表、索引) 大表空間、小表空間
臨時數據 臨時表空間
撤銷數據 撤銷表空間
(1)系統表空間
系統表空間包括SYSTEM表空間和SYSAUX表空間,其余的表空間就是非系統表空間。系統表空間在所有數據庫中都是必須的。一般存放到ORACLE的
數據字典及其數據。
(2)臨時表空間
撤了撤銷(UNDO)表空間、相對于臨時(TEMPORARY)空間而言,其他表空間就是永久(PERMANENT)表空間。
當執行排序(ORDER BY)、分組匯總(GROUP BY)、索引(CREATE
INDEX)等功能的SQL語句時,會產生大量的臨時數據。服務器進程首先將臨時數據存放到內存結構的PGA區的排序區中,當排序區不夠用時,服務器進程
就會在臨時表空間中建立臨時段,并將這些臨時數據存放到臨時段中。
如果在創建用戶時沒有為用戶指定一個臨時表空間,那么就會使用SYSTEM表空間來說創建臨時段,存放臨時數據。這樣做的結果是:
1.占用了SYSTEM表空間的存儲空間,使可用的存儲空間下降;
2.頻繁的分配和釋放臨時段,會在SYSTEM表空間中產生大量的存儲碎片,使磁盤的讀取效率下降。
如果在數據運行過程中,經常有大量的并發排序,那么為了避免在SYSTEM表空間中存儲臨時數據,數據庫管理員應該在數據庫中創建一個專門的用來存
儲臨時數據的臨時表空間。
臨時表空間對應的是臨時文件,它與數據文件是有區別的。數據文件在創建時就被完全分配和初始化,而臨時文件不一定保證被分配到指定的磁盤空間。如:在
UNIX操作系統中,將不實際分配臨時文件的磁盤空間,而是知道某個操作需要臨時表空間時才為臨時文件分配磁盤空間。這種延遲式的分配方法允許臨時文件被
快速創建,但如果沒有預留出實際運行時所需的磁盤空間,就可能在運行時發生問題。
臨時表空間可以被所有用戶共享使用,如TEMP表空間可以被所有用戶共享使用。在ORACLE
8I中可以使用其他表空間作為臨時表空間,而在ORACLE 9I中就開始引入默認臨時表空間(DEFAULT TEMPORARY
TABLESPACE)的設計了,使用戶不能使用其他表空間作為臨時表空間。
某個用戶使用哪個臨時表空間應該是在創建該用戶時指定的。數據庫的默認臨時表空間是在創建(CREATE DATABASE)數據庫時,由DEFAULT
TEMPORARY TABLESPACE子句來指定的。
在臨時表空間中,同一個例程的所有SQL語句的排序操作將共享使用一個排序段(SORT
SEGMENT)。排序段在執行第一條排序操作的SQL語句時被創建,在例程關閉時被釋放。可以通過動態性能視圖V$SORT_SEGMENT來查詢排序
段的使用情況,通過動態性能視圖V$SORT_USAGE來查詢使用排序段的會話和用戶信息。
(3)撤銷表空間
在ORACLE 9I以前,對于回退段(ROLLBACK SEGMENT)的設置與管理是一項十分復雜的工作。從ORACLE
9I開始,引入了一個全新的概念,即自動撤銷管理(AUTOMATIC UNDO
MANAGEMENT),用撤銷(UNDO)表空間取代已經使用了20年的回退段。實際上是將回退段(撤銷段)放入了撤銷表空間,而由例程自動處理撤銷表
空間中的回退段。使用自動撤銷管理方式后,不僅可以減輕DBA的工作負擔,而且還可以獲得較好的回退性能。通過查詢數據字典視圖
DBA_ROLLBACK_SEGS,可以得到撤銷表空間中回退段的信息。
撤銷表空間存儲撤銷段,撤銷段主要用于入下目的:
1.用一條ROLLBACK語句明確的回退一個事務;
2.隱含的回退一個事務;
3.重構數據的一個讀一致圖像;
4.從邏輯錯誤中恢復。
在ORACLE中可以創建多個撤銷表空間,但同一時刻值允許激活一個撤銷表空間。在初始化參數文件中用UNDO_TABLESPACE指出要激活的
撤銷表空間。撤銷表空間的組織與管理由ORACLE內部自動完成。當回退段不足時,一個事務可以使用多個回退段,不會中止事務的運行。數據庫管理員只需了
解撤銷表空間是否有足夠的空間,而不必為每個事務設置回退段。
(4)大文件表空間與小文件表空間
大文件(BIGFILE)表空間是ORACLE
10G新引進的表空間。大文件表空間只能放置一個數據文件(或臨時文件)。但其數據文件可以包括4G個數據塊。
大文件表空間都是為超大型數據庫設計的。如果一個超大型數據庫具有上千個數據文件的話,更新數據文件頭部信息的操作就會花費很長時間。如果使用了
大文件表空間,就可以使用大數據文件來減少數據文件的數量,使更新數據文件頭部信息的操作更快一些。
要想創建一個大文件表空間,可以使用CREATE語句中的使用的BIGFILE關鍵字。CREATE BIGFILE TABLESPACE
mybigtbs01 DATAFILE 'e:\mybigtbs01_1.dbf' SIZE 20G SEGMENT SPACE
MANAGEMENT AUTO;
小文件(SMALLFILE)表空間是以前ORACLE表空間的新命名。在小文件表空間中可以放置多個數據文件。一個數據庫可以放置多達64K個數據文
件。
SYSTEM和SYSAUX表空間總是被創建為小文件表空間。
想要創建一個小文件表空間,可以在CREATE語句中使用SMALLFILE關鍵字(或者不適用此類關鍵字)。CREATE SMALLFILE
TEMPORARY TABLESPACE mytmptbs01 TEMPFILE 'e:\mytmptbs01_1.dbf' SIZE 4M
UNIFORM SIZE 64K;
(三)表空間的區、段管理方式
ORACLE 10G的表空間是按照區和段空間進行管理的。
(1)區管理方式
針對區的分配方式不同,表空間有兩種管理方式。ORACLE各個版本所支持的管理方式如下:
字典管理方式 ORACLE 7,ORACLE 8,ORACLE 8I,ORACLE 9I;
本地管理方式 ORACLE 8I,ORACLE 9I,ORACLE 10G;
字典管理方式(DICTIONARY-MANAGED TABLESPACE,DMT)
字典管理方式是傳統的管理方式,是為了與早期版本兼容而保留的區管理方式。在字典管理方式下,使用數據字典來管理存儲空間的分配。
當在表空間中分配新的區,或回收已分配的區時,ORACLE將對數據字典中的相關“基礎表”進行查詢、更新,并且在這一過程中,使用單線程搜索方法,速度
較慢。另外,對表的更新操作會產生會退信息和重做信息,因此,在分配區或回收區時,會在數據庫中產生會退信息和重做信息。這是字典管理方式的特點,也是它
的缺點。
在創建字典管理方式的表空間時,可以在DEFAULT
STORAGE子句中設置INITIAL,NEXT,MINEXTENTS,MAXENTENTS,PCTINCREASE等參數來為區設置存儲管理方
式,以指定表空間中區的默認分配方式。這樣,如果在這種表空間中創建表、索引等方案對象時,沒有使用DEFAULT
STORAGE子句,他們就會自動繼承表空間的存儲參數設置。
如果其他表空間要采用字典管理方式,則要求SYSTEM表空間也必須采用字典管理方式,并且必須在CREATE
TABLESPACE語句中顯示的使用EXTENT MANAGEMENT
DICTIONARY子句進行申明。字典管理方式是被淘汰的表空間管理方式,從ORACLE 9I開始不再支持這種方式。
本地管理方式(LOCAL-MANAGED TABLESPACE,LMT)
本地管理方式是一種新的、改進的管理方式。從ORACLE 9I開始,創建表空間時默認使用本地管理方式。
本地管理方式下,表空間中分配與區回收的管理信息都被存儲在表空間的數據文件中,而與數據字典無關。表空間會在每個數據文件中維護一個"位圖
(BITMAP)"結構,用于記錄表空間中所有區的分配情況。
ORACLE為每個可能的區都保留了一位。該位為1或0,表示該區正在使用或空閑。位圖圖像消耗64KB的表空間。當在表空間中分配的區,或回收已分配的
區時,ORACLE將對數據文件中的"位圖"進行更新。因此這種更新不是對表的更新操作,所以不會產生回退信息和重做信息。
與字典管理方式相比,本地管理方式具有如下的好處:
1.因為空間的分配和回收不需要對數據庫進行訪問,而只是簡單的改變數據文件中的位圖,所以能夠提高空間存儲管理的速度和并發性;
2.能夠避免在字典管理方式中空間分配期間可能出現的遞歸現象,所以提高了空間存儲管理的性能。
3.允許將數據庫作為只讀的備用數據庫(STANDBY
DATABASE)。由于不會產生會退信息和重做信息,所以不會向數據庫中寫信息,這樣就可以將整個數據庫設置為只讀狀態。這種數據庫可以作為備用數據
庫。
4.簡化了空間分配,以為當指定了AUTOALLOCATE子句時,ORACLE會自動選擇合適的區大小,不再需要用戶進行任何干預;
5.減少用戶對數據庫字典的依賴,因為必要的信息都被存儲在數據文件的位圖中了,而不是保存在數據字典中;
6.不存在磁盤碎片問題。使用位圖的方法去查詢空閑空間,相鄰的空閑塊被視為一個大的空閑塊,從設計上保證自動合并磁盤碎片,碎片產生后由系統自動消除;
7.DBMS_SPACE_ADMIN包對本地管理的表空間提供維護過程。
在字典管理方式下,如果對某個表進行了更新,這時會產生存儲管理操作,而該存儲管理操作肯定會產生回退信息和重做信息,導致對回退段和重做日志文件
進行讀寫,從而又產生存儲管理操作,形成了遞歸現象。
在字典管理方式下,如果查詢操作包含排序,則數據庫需要為排序分配臨時段,這會引起存儲空間的分配操作,也就會對數據字典進行更新,所以數據庫必須處于讀
寫狀態,而不能處于只讀狀態。
在本地管理方式下,可以用以下兩個選項來指定表空間的區的分配方式:
1.
統一(UNIFORM):統一分配,指定表空間中所有區的大小都相同。區的大小的默認值是1MB,也可以指定這個大小。但不能在撤銷表空間中使用這個選
項;
2.自動(AUTOALLOCATE或SYSTEM)自動分配,指定由ORACLE系統來自動管理區的大小,這是默認的設置。
在自動去的分配方式下,區的大小隨表的大小自動動態改變,他們之間的對應關系如下:
表大小 區大小
64KB(或前16個區) 64KB
1MB(接下來的63個區) 1MB
64MB(接下來的120個區) 8MB
1000MB(以后的區) 64MB
當表的大小不超過64KB時,表空每個區的大小為64K;
當表的大小不達到1MB時,表中每個區的大小為1MB;
當表的大小超過64MB且小于1000MB時,區的大小都是8MB;當表的大小達到1000MB時,區的大小為64MB。
也就是ishuo,這個算法只能使小表取小區,大表取大區,避免大表擁有過多的區。所以,自動選項最適合于由小表和大表構成的一個多用途的數據庫系統。但
是,對于數據超過1GB的大表,系統在分配磁盤空間時一次分配64MB,如果所插入的數據沒有達到64MB,則可能造成空間的浪費。
通常,使用自動是最佳的選擇。
(2)段空間管理方式
在本地管理方式的表空間中,除了可以用UNIFORM和AUTOALLOCATE來指定區的分配方式之外,還可以指定段空間的管理方式。段空間管理方式主
要是指ORACLE用來管理段中已用數據塊和空閑數據塊的機制。
在本地管理方式下,可以用如下兩個關鍵字來指定表空間的段空間管理方式:
1.MANUAL(手動)方式,這時ORACLE將使用空閑列表(FREE LIST)來管理段的空閑數據塊。這是為了與以前的版本相兼容而保留的。
2.AUTO(自動)方式,這時ORACLE將使用位圖(BITMAP)來管理段的已用數據塊和空閑數據塊。即,通過位圖中單元的取值來判斷段匯總的數據
塊是否可用。
空閑列表(FREELIST)是傳統的段空間管理方式,段中所有的空閑數據塊都被放入一個空閑列表中,在需要存儲空間時據在該列表中進行搜索。與空閑列表
相比,使用位圖的自動方式能夠提供更好的存儲利用率。因為在自動方式下,用戶不需要在創建方案對象時通過指定
PCTFREE,PCTUSED,FREELIST,FREELIST GROUP等參數來為段設置存儲管理方式,即使設置了,也將會被忽略。
當SYSTEM表空間的區管理方式是本地管理方式時則不可能創建字典管理的表空間,但可以創建本地管理的表空間。
另外,創建表空間這種修改數據庫物理結構的信息會同時被記錄到預警日志文件中。
(四)表空間的狀態
處于不同狀態的表空間,其使用方式有所不同。
SYSTEM表空間不能被設置為只讀狀態或脫機狀態,因為在數據庫進行過程中始終會使用到SYSTEM表空間中的數據。
(1)讀寫狀態
讀寫(READ-WRITE)
默認情況下所有的表空間都是讀寫狀態的。任何具有表空間配額并且具有適當權限的用戶都可以讀寫該表空間中的數據。
只讀(READ-ONLY)
如果將表空間設置為只讀狀態,則任何用戶都無法向表空間中寫入數據,也無法修改表空間中已有的數據。這種限制與用戶的權限無關。將表空間設置為只讀狀態的
主要目的是,避免對數據庫進行修改。使用戶只能查詢其中的數據,而不能修改其中的數據。同時,由于只讀表空間中的數據不會被修改,因此DBA只需將只讀表
空間備份一次即可,不必再次對這個表空間進行備份。如果數據庫中保存大量的不允許用戶修改、但又允許用戶訪問的數據。
(2)脫機狀態
通過將某個表空間設置為脫機狀態,以使該表空間暫時不讓用戶訪問。
脫機模式有以下4種:
1.正常(NORMAL):默認的脫機模式。
2.臨時(TEMPORARY):
3.立即(IMMEDIATE):
4.用于恢復(FOR RECOVER):
二、管理表空間的準則
(一)確定表空間的大小
(1)確定表的大小
(2)確定表空間的大小
(二)表空間的配置
(1)表空間的層次結構
(2)表空間的分配
(三)為用戶設置表空間配額和臨時表空間