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