SlideShare a Scribd company logo
1 of 51
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
第六章 表格空間
前言
當一個資料庫建立完成後,除了基本的表格空間外,資料庫管理者還可以建立一些額外的表格空間,這些
的表格空間可以讓資料庫的整體架構在管理面、效能面上,有著更佳的效能表現。而且整個資料庫中,表
格空間佔據整體空間中最大部分,充分地了解表格空間的真正內涵,是每個資料庫管理者的重要課題之一。
6.1 基本的表格空間
每個資料庫建立後,一定會有一些基本且必要的表格空間如:SYSTEM 與 SYSAUX 表格空間。在正常
的資料庫架構下,還會有一個還原(UNDO)型態的表格空間與一個暫時(TEMPORARY)型態的表格空間存
在。現在就開始對這些基本的表格空間進行基礎的說明。
6.1.1 系統表格空間-SYSTEM TABLESPACE
每個資料庫中ㄧ定會有一個而且只有一個系統表格空間。這個表格空間主要是用來存放所謂的資料辭典
(Data Dictionary),這些資料辭典表格是由 SYS 這個使用者擁有,其中的資料用來描述資料庫中的相關
結構,例如:資料庫的邏輯結構、表格的結構、索引的結構等等。所以 Oracle 執行處理可以透過資料辭
典了解整個資料庫的結構。正因為此表格空間的特殊性值,因此不建議放任何非資料辭典的物件在此表格
空間中。同時系統表格空間中還有一個還原區段:SYSTEM ROLLBACK SEGMENT(系統還原區段),這
個還原區段專門用來存放在系統表格空間中的區段上所產生的還原資訊。這個表格空間的非常重要,所以
一定要存在而且不能改名、離線或唯讀。
資料辭典
因為 Oracle 資料庫是依循關連式資料庫理論所誕生的第一個資料庫,所以它遵守著關連式資料庫的重要
準則:Codd’s 12 Rules。其中的第四條規則為”資料庫必須有ㄧ個線上目錄(Online Catalog),其中存
有此資料庫的描述資料,讓有存取權限的管理者,可以透過查詢語言查詢資料庫的結構”。這個要求在
Oracle 資料庫中是以資料辭典來提供此功能。所以使用者可以透過 SQL 的查詢指令(Select),來查詢資
料庫中的相關結構資訊。
Codd’12 Rules
E.F.Codd是關聯式資料庫理論的創始人,他從1960年代就開始提出一系列的關聯式資料庫理論文
章,其中最重要的文章是1970年的” A Relational Model of Data for Large Shared Data Bank
s”,也是Oracle資料庫的主要理論來源。 Codd在1985年發表在Computer World的兩篇文章中,
提出Codd’s 12 Rules規範所謂的關聯式資料庫應該遵守的規則。其實這Codd’s 12 Rules是由13
條規則組成,由Rule 0到Rule 12。不過由於這些規則有的實在太過於嚴格,所以目前市面上暫時
找不到完全遵守這些規則的關聯式資料庫產品,特別是在Rule 6,9,10,11,12。
Rule 0:Data Management Via Relational Capability
Rule 1:The Information Rule
Rule 2:Guaranteed Access Rule
Rule 3:Systematic Treatment of Null Values
Rule 4:Dynamic On-Line Catalog Based on the Relational Model
Rule 5:Comprehensive Data Sublanguage
Rule 6:View Updating Rule
Rule 7:High-level Insert,Update,and Delete
Rule 8:Physical Data Independence
Rule 9:Logical Data Independence
Rule 10:Integrity Independence
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
Rule 11:Distribution Independence
Rule 12:Nonsubversion Rule
資料辭典視圖(Data Dictionary View)
在建立資料庫的過程中,Oracle 執行處理會自動執行 SQL.BSQ 用來建立資料辭典。不過這些資料表格
都經過正規化(Normalization)的處理,所以如果要直接使用查詢指令存取資料辭典,需要使用大量的結合
指令(Join)才能取的有意義的資訊。此外為節省儲存空間,資料辭典中的資料大多是以數字的型式存在,
但是資料庫管理者對這些數字資料的內容轉換為文字敘述的過程,需要記憶大量的對映資訊。例如:資料
辭典中有一個表格 TAB$,每個表格都有一筆記錄在其中,可是如果要查詢某個表格有幾個欄位及欄位的
資料型態,則必須查詢 COL$才可以得到。
[oracle@ELinux ~]$ export ORACLE_SID=ora11g
[oracle@ELinux ~]$ sqlplus / as sysdba
/*以SYSDBA身分登入*/
SQL> SHOW USER
USER is "SYS"
SQL> SELECT COUNT(*) FROM sys.tab$;
COUNT(*)
--------------
1019
/*原來共有1019個表格*/
SQL> SELECT COUNT(*) FROM sys.col$;
COUNT(*)
--------------
51302
/*原來共有51302個欄位*/
SQL> CREATE TABLE testuser.testtab
2 (col1 NUMBER,
3 col2 VARCHAR2(20),
4 col3 DATE)
5 TABLEAPCE users;
/*建立一個新的表格,此表格有3個欄位*/
SQL> SELECT COUNT(*) FROM sys.tab$;
COUNT(*)
----------------
1020
/*現在多了一個表格記錄*/
SQL> SELECT COUNT(*) FROM sys.col$;
COUNT(*)
----------------
51305
/*51305=51302+3,因為新增的表格有3個欄位,所以這裡新增三筆欄位的記錄*/
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
不過如果想要查詢 TAB$或 COL$的記錄,必須先知道此表格的物件編號(OBJECT ID),這物件編號必須
從 OBJ$中才能查知。然後由 TAB$中可得知表格的相關資料,COL$中可得知欄位相關的資料,如果想
要得知這個表格放在哪個表格空間中,必須要再由 TS$中得知。
SQL> SELECT obj# FROM sys.obj$ WHERE name='TESTTAB';
OBJ#
--------
11970
SQL> SELECT obj#,ts#,cols FROM tab$ WHERE obj#=11970;
OBJ# TS# COLS
--------- ------ --------
11970 4 3
SQL> SELECT name FROM ts$ WHERE ts#=4;
NAME
----------
USERS
SQL> SELECT name,type# FROM col$ WHERE obj#=11970;
NAME TYPE#
--------- ----------
COL1 2 ß NUMBER or FLOAT
COL2 1 ß VARCHAR2 or NVARCHAR2
COL3 12 ß DATE
依照上面的程式範例來看,只不過想看一些基本的資料,就要查詢好多的資料辭典,並且要了解資料辭典
表格之間的關聯,與一些數字與其所代表的意義。所以在建立資料庫後,資料庫管理者可以執行
CATALOG.SQL 指令稿,用來建立資料辭典視圖,讓使用者可以藉由簡單的視圖存取資料辭典的資料。
例如只要查詢 DBA_TABLES 與 DBA_TAB_COLUMNS 即可取代上面的查詢指令。
SQL> SELECT table_name,tablespace_name FROM dba_tables WHERE table_name='TESTTAB';
TABLE_NAME TABLESPACE_NAME
------------------------------ ------------------------------
TESTTAB USERS
SQL> SELECT column_name,data_type FROM dba_tab_columns WHERE table_name='TESTTAB';
COLUMN_NAME DATA_TYPE
------------------------------ ----------------------------------------
COL1 NUMBER
COL2 VARCHAR2
COL3 DATE
不過為了方便使用者使用這些資料辭典視圖,Oracle 提供一個視圖 DICTIONARY,其中包含所有資料辭
典視圖的名字與註解。只要使用者知道視圖的名字或相關資訊就可以透過 DICTIONARY 查出相關視圖的
資訊。
SQL> DESCRIBE dictionary
Name Null? Type
----------------------------------------------------- ---------- ----------------------------------------
TABLE_NAME VARCHAR2(30)
COMMENTS VARCHAR2(4000)
SQL> COL table_name FORMAT a30
SQL> COL comments FORMAT a60 wrap
SQL> SELECT table_name,comments FROM dictionary WHERE table_name LIKE '%INDEX%';
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
TABLE_NAME COMMENTS
------------------------------------------------------ ------------------------------------------------------------
ALL_INDEXES Descriptions of indexes on tables accessible to the user
ALL_INDEXTYPES All indextypes available to the user
ALL_INDEXTYPE_ARRAYTYPES All array types specified by the indextype
ALL_INDEXTYPE_COMMENTS Comments for user-defined indextypes
……………………………………………..以下省略
同時 Oracle 也將這些視圖分成三種簡單的分類:USER_XXX、ALL_XXX 與 DBA_XXX,分別表示不同
範圍的內容。XXX 可能為任何長度的字串。
• USER_XXX 表示為目前此會談的使用者所擁有的相關物件,例如 USER_TABLES 表示此使用者
所擁有的所有表格所組成的資料辭典視圖。
• ALL_XXX 表示為此會談的使用者所能存取的相關物件,包含使用者自己擁有的物件以及他人授
權可以存取的物件。因此 ALL_XXX 與 USER_XXX 相比之下,多了一個欄位 OWNER,用來區
分物件的擁有者。例如 ALL_TABLES 表示此使用者所能存取的所有表格。
• DBA_XXX 表示為整個資料庫的所有相關物件,所以必須擁有 DBA 角色的人才能存取。這些視圖
也有一個欄位 OWNER,用來區分物件的擁有者。例如 DBA_TABLES 表示此資料庫的所有的
表格。
SQL> SHOW USER
USER is "SYS"
SQL> SELECT COUNT(*) FROM user_tables;
COUNT(*)
-------------
837
SQL> SELECT COUNT(*) FROM all_tables;
COUNT(*)
-------------
1010
SQL> SELECT COUNT(*) FROM dba_tables;
COUNT(*)
-------------
1010
SQL> CONNECT testuser/oracle
SQL> SHOW USER
USER is "TESTUSER"
SQL> SELECT COUNT(*) FROM user_tables;
COUNT(*)
-------------
1
SQL> SELECT COUNT(*) FROM all_tables;
COUNT(*)
-------------
24
SQL> SELECT COUNT(*) FROM dba_tables;
SELECT COUNT(*) FROM dba_tables ß 因為TESTUSER的權限不足
*
ERROR at line 1:
ORA-00942: table or view does not exist
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
6.1.2 SYSAUX 表格空間
SYSAUX 表格空間是從 Oracle10g 開始出現的必要存在表格空間,這個表格空間從名字來
看’SYSAUX=SYStem AUXiliary’就可以知道是用來輔助系統表格空間而產生的表格空間。其內容是
存放那些雖然不是資料辭典,但也是 Oracle 系統所需要的表格,如 AWR(Automatic Workload
Repository)、XML 資料庫、JVM、Oracle TEXT 等功能所需要的表格。這些表格分別屬於不同的綱要
(SCHEMA),提供不同的 Oracle 功能所使用。在 Oracle10g 之前只有 SYSTEM 表格空間是必要的,其
餘的表格空間都是可以選擇不建立。
由於這個表格空間是必要存在的,所以這個表格空間不能被刪除、更名、傳遞或唯讀,但是可以被離線。
當此表格空間被離線時,相關的 Oracle 功能就不能被使用,但是不影響整個資料庫的運行。
同時在 Oracle10g 之前,現在被放在 SYSAUX 表格空間的綱要物件,其實是分別放在不同的表格空間中,
現在只是化繁為簡地將所有的相關綱要物件統一的存放在 SYSAUX 表格空間中,以減輕資料庫管理者的
管理成本。
Option or Feature Schema Tablespace in 8, 8i or 9i
---------------------------- ------------------ ---------------------------------
OLAP CWMLITE CWMLITE
Text CTXSYS DRSYS
Ultra Search WKSYS DRSYS
Intermedia and Spatial ORDSYS SYSTEM
Workspace Manager WMSYS
Data Mining DMSYS ODM
EM Repository SYSMAN OEM_REPOSITORY
Streams SYS SYSTEM
LogMiner SYSTEM SYSTEM
Logical Standby SYSTEM SYSTEM
Statspack PERFSTAT 管理者指定
Job Scheduler SYS SYSTEM
如果資料庫管理者想要回復為 Oracle9i 的方式,必須自己將相關的綱要物件搬移到其他的表格空間中。
不過不是每個綱要物件都可以搬移到其他的表格空間,如 AUTO_TASK、EM_MONITORING_USER 等
等,最簡單的方法,就是由 V$SYSAUX_OCCUPANTS 中的 MOVE_PROCEDURE,如果沒有任何搬移
方式,則表示此綱要物件就不能搬移到其他的表格空間或是要資料庫管理者自己想辦法。
SQL> SELECT occupant_name,schema_name,NVL(move_procedure,’不能搬移’) MOVE_PROCEDURE
2 FROM v$sysaux_occupants
3 ORDER BY occupant_name;
OCCUPANT_NAME SCHEMA_NAME MOVE_PROCEDURE
------------------------------------------ ----------------------- ----------------------------------------
AO SYS DBMS_AW.MOVE_AWMETA
AUTO_TASK SYS 不能搬移
EM SYSMAN emd_maintenance.move_em_tblspc
EM_MONITORING_USER DBSNMP 不能搬移
EXPRESSION_FILTER EXFSYS 不能搬移
JOB_SCHEDULER SYS 不能搬移
LOGMNR SYSTEM SYS.DBMS_LOGMNR_D.SET_TABLESPACE
LOGSTDBY SYSTEM SYS.DBMS_LOGSTDBY.SET_TABLESPACE
ORDIM ORDSYS 不能搬移
ORDIM/PLUGINS ORDPLUGINS 不能搬移
ORDIM/SQLMM SI_INFORMT 不能搬移
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
PL/SCOPE SYS 不能搬移
SDO MDSYS MDSYS.MOVE_SDO
SM/ADVISOR SYS 不能搬移
SM/AWR SYS 不能搬移
SM/OPTSTAT SYS 不能搬移
SM/OTHER SYS 不能搬移
SMON_SCN_TIME SYS 不能搬移
SQL_MANAGEMENT_BASE SYS 不能搬移
STATSPACK PERFSTAT 使用export/import的方式
STREAMS SYS 不能搬移
TEXT CTXSYS DRI_MOVE_CTXSYS
TSM TSMSYS 不能搬移
ULTRASEARCH WKSYS MOVE_WK
ULTRASEARCH_DEMO_USER WK_TEST MOVE_WK
WM WMSYS DBMS_WM.move_proc
XDB XDB XDB.DBMS_XDB.MOVEXDB_TABLESPACE
XSAMD OLAPSYS DBMS_AMD.Move_OLAP_Catalog
XSOQHIST SYS DBMS_XSOQ.OlapiMoveProc
範例:將Log Miner所用的表格搬到LOGMNR_TS這個表格空間
SQL> EXECUTE SYS.DBMS_LOGMNR_D.SET_TABLESPACE(‘LOGMNR_TS’);
範例:將Log Miner所用的表格搬回SYSAUX Tablespace
SQL> EXECUTE SYS.DBMS_LOGMNR_D.SET_TABLESPACE(‘SYSAUX’);
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
6.1.3 預設的暫時型態表格空間(Default Temporary Tablespace)
雖然資料庫中只有 SYSTEM 與 SYSAUX 兩個表格空間為必要存在的表格空間。但是每個資料庫必須有
一個預設的暫存表格空間存在,如果當 SYSTEM 表格空間的空間管理方式為說明管理(DICTIONARY
MANAGEMENT)時,資料庫管理者可以將 SYSTEM 表格空間當作預設的暫時表格空間,不過這樣的組
態方式對資料庫的管理與效能有著不良的影響。可是若當 SYSTEM 表格空間的空間管理方式為本機管理
(LOCALLY MANAGEMENT)時,表格空間的類型為永久或還原的表格空間,不能當作資料庫預設的暫
時表格空間,所以必須建立一個暫時型態的表格空間,當作資料庫的預設暫時表格空間。
每個資料庫中的使用者帳號,都有一個設定值-暫存表格空間(TEMPORARY TABLESPACE),當做此使
用者進行磁碟排序時所使用的暫存表格空間。不過如果當建立新的使用者帳號時,沒有設定暫時表格空間
的參數,Oracle 伺服器會使用 Oracle 資料庫的預設暫時表格空間設定值當作此使用者帳號的設定值。
暫時表格空間是用來放置暫時區段(TEMPORARY SEGMENT)。當使用者執行 SQL 指令時,有時需要進
行一些排序操作,如使用到 GROUP BY、ORDER BY、GROUPING FUNCTION(AVG、MIN、MAX
etc..)、CREATE INDEX 等。這些排序操作預設是在 SERVER PROCESS 的 PGA 空間中進行,這種稱
作 MEMORY SORT(記憶體排序)。若所需要排序的資料過大,無法在 PGA 完成排序,則會將需要排序的
資料暫時寫到暫時表格空間中,然後配合 PGA 進行排序,這種排序方式稱作 DISK SORT(磁碟排序),這
種排序方式的效能比較慢,因為需排序的資料比較多外,磁碟機的存取速度比記憶體慢也是主因。
所以如果可以結果可以不要排序,就盡量不要加上會造成排序的指令。如果一定要排序,則盡量使用記憶
體排序。若發生真的不可避免發生磁碟排序,則盡量讓整體的磁碟排序成本下降,就是正確設定暫存表格
空間。
SQL> SELECT username,temporary_tablespace FROM dba_users;
USERNAME TEMPORARY_TABLESPACE
------------------------------ ------------------------------
OUTLN TEMP
SYS TEMP
SYSTEM TEMP
DBSNMP TEMP
TSMSYS TEMP
DIP TEMP
ORACLE_OCM TEMP
………
SQL> SELECT property_name,property_value FROM database_properties
2 WHERE property_name='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE
------------------------------------------------------ ----------------------------------------
DEFAULT_TEMP_TABLESPACE TEMP ß 資料庫目前的預設值
SQL> CREATE USER testuser IDENTIFIED BY oracle; ß 新增一個測試使用者
User created.
SQL> SELECT username,temporary_tablespace FROM dba_users;
USERNAME TEMPORARY_TABLESPACE
------------------------------ ------------------------------
OUTLN TEMP
SYS TEMP
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
SYSTEM TEMP
TESTUSER TEMP ß 剛新增的使用者所使用的暫時表格空間
DBSNMP TEMP
TSMSYS TEMP
DIP TEMP
ORACLE_OCM TEMP
………
如果有必要,事後也可以更改使用者的暫時表格空間,不過只能選擇暫時型態(TEMPORARY)的表格空間,
不能使用其他型態(PERMANENT、UNDO)的表格空間。
SQL> CREATE TMEPORARY TABLESPACE tempts TEMPFILE ‘/u02/oradata/ora11g/tempts01.dbf’
SIZE 100M; ß新增一個暫時表格空間
SQL> SELECT tablespace_name,contents FROM dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------ -------------------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS UNDO
TEMP TEMPORARY
USERS PERMANENT
TEMPTS TEMPORARY
SQL> ALTER USER testuser TEMPORARY TABLESPACE users;
ALTER USER testuser TEMPORARY TABLESPACE users;
*
ERROR at line 1:
ORA-12911: permanent tablespace cannot be temporary tablespace
SQL> ALTER USER testuser TEMPORARY TABLESPACE undotbs;
ALTER USER testuser TEMPORARY TABLESPACE undotbs
*
ERROR at line 1:
ORA-30034: Undo tablespace cannot be specified as temporary tablespace
SQL> ALTER USER testuser TEMPORARY TABLESPACE tempts;
User altered.
SQL> SELECT username,temporary_tablespace FROM dba_users WHERE username='TESTUSER';
USERNAME TEMPORARY_TABLESPACE
------------------------------ --------------------------------------
TESTUSER TEMPTS
同時資料庫管理者也可以變更資料庫的預設暫時表格空間,不過即使有一個以上的暫時表格空間,也只能
選擇一個為資料庫的預設值。這時候便可以利用暫時表格空間群組,將多個暫時表格空間組合在一起。如
此再將此暫時表格空間群組指派給使用者或當作資料庫預設值,這樣就可以在多人同時操作的環境中,將
磁碟排序的 I/O 操作分散在多個暫時表格空間中,如此可以減少 I/O 競爭的情況發生。
SQL> SELECT property_name,property_value FROM database_properties
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
2 WHERE property_name='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE
------------------------------------------------ --------------------------------------------------
DEFAULT_TEMP_TABLESPACE TEMP
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tempts;
SQL> SELECT property_name,property_value FROM database_properties
2 WHERE property_name='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE
------------------------------------------------ --------------------------------------------------
DEFAULT_TEMP_TABLESPACE TEMPTS
將temp加入tempgroup中,如果目前沒有tempgroup存在,則為自動建立tempgroup。
SQL> alter tablespace temp tablespace group tempgroup;
將temp由tempgroup中移除,若tempgroup沒有任何暫時表格空間,則tempgroup會自動被刪除。
SQL > ALTER TABLESPACE temp TABLESACE GROUP ‘’;
將tempts也加入tempgroup中。
SQL> ALTER TABLESPACE tempts TABLESPACE GROUP TEMPGROUP;
將tempgroup設為系統預設暫時表格空間
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tempgroup;
SQL> SELECT property_name,property_value FROM database_properties
2 WHERE property_name='DEFAULT_TEMP_TABLESPACE';
PROPERTY_NAME PROPERTY_VALUE
------------------------------------------------ --------------------------------------------------
DEFAULT_TEMP_TABLESPACE TEMPGROUP
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
6.1.4 自動管理的還原表格空間(Auto Managed UNDO Tablespace)
當資料庫管理者希望將還原區段(UNDO Segment)交由 Oracle 伺服器管理時,資料庫管理者必須先建立
一個還原型態的表格空間,然後在 Oracle 執行處理的參數檔設定:UNDO_MANAGEMENT=AUTO 及
UNDO_TABLESPACE=還原表格空間的名字即可,之後 Oracle 執行處理則會自己決定該建立多少個還
原區段,每個還原區段的大小等問題。資料庫管理者只需要決定還原表格空間的大小即可,而適合的還原
表格空間大小,可以由自動還原管理頁面得知。
還原區段的還原資訊可以用來進行交易退回(TRANSACTION ROLLBACK)、交易復原(TRANSACTION
RECOVERY)與讀取一致性(READ CONSISTENT)。這些還原資訊來自於進行資料異動操作(DML)前,儲
存在還原區段的還原資訊。
SQL> SELECT tablespace_name,contents FROM dba_tablespaces;
TABLESPACE_NAME CONTENTS
------------------------------ -------------------
SYSTEM PERMANENT
SYSAUX PERMANENT
UNDOTBS UNDO ß UNDO型態的表格空間,才能被當作自動管理的還原表格空間
TEMP TEMPORARY
USERS PERMANENT
TEMPTS TEMPORARY
………….
SQL> SHOW PARAMETER undo_management
NAME TYPE VALUE
------------------------------------------ ----------- ------------
undo_management string AUTO ßOracle Server自動管理還原區段
SQL> SHOW PARAMETER undo_tablespace
NAME TYPE VALUE
------------------------------------------ ----------- -------------
undo_tablespace string undotbs ßOracle Server將在此表格空間中建立還原區段
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
SQL> SELECT owner,segment_name,tablespace_name FROM dba_rollback_segs;
OWNER SEGMENT_NAME TABLESPACE_NAME
------------------ ----------------------------------------------- ------------------------------
SYS SYSTEM SYSTEM
PUBLIC _SYSSMU10_1207193410$ UNDOTBS ßOracle Server建立的還原區段
PUBLIC _SYSSMU9_1207193410$ UNDOTBS
PUBLIC _SYSSMU8_1207193410$ UNDOTBS
PUBLIC _SYSSMU7_1207193410$ UNDOTBS
PUBLIC _SYSSMU6_1207193410$ UNDOTBS
PUBLIC _SYSSMU5_1207193410$ UNDOTBS
PUBLIC _SYSSMU4_1207193410$ UNDOTBS
PUBLIC _SYSSMU3_1207193410$ UNDOTBS
PUBLIC _SYSSMU2_1207193410$ UNDOTBS
PUBLIC _SYSSMU1_1207193410$ UNDOTBS
還原擴充區塊的保留管理
還原區段中的擴充區塊依其的狀態可以分為下列幾種:
• 正在使用的擴充區塊(Active Extent):這些擴充區塊上,至少還有一個交易未完成。所以這些擴
充區塊並不能被重新使用。
• 未過期的擴充區塊(Unexpired Extent):這些擴充區塊上的交易都結束了,但是從最後一個交易的
結束時間到現在,並未超過 UNDO_RETENTION 所設定的期限,所以這種擴充區塊稱作未過期。
未過期的擴充區塊在某些情況下,可以被重新使用。
• 過期的擴充區塊(Expired Extent):這些擴充區塊上的交易都結束了,而且從最後一個交易的結束
時間到現在,已超過 UNDO_RETENTION 所設定的期限,所以這種擴充區塊可以立刻被重新使用。
這些還原資訊當整個擴充區塊(Extent)上的交易都結束後,其所佔有的還原區段空間便可以被新的交易使
用。如果資料庫管理者希望將那些已經結束交易的還原資料繼續,可以藉由設定參數
UNDO_RETENTION,讓還原資料保留幾秒鐘。不過還原擴充區塊保留的管理方式有一些特殊的設定(自
動管理與人為管理):
自動管理
從 Oracle10g 開始,Oracle 資料庫建議資料庫管理者可以藉由設定 UNDO_RETENTION 為零
(UNDO_RETENTION=0)或根本不要設定此參數,讓 Oracle 資料庫自行管理還原擴充區塊的管理。還原
擴充區塊的保留時間由 Oracle 資料庫依據現在的還原表格空間的大小與資料庫的交易狀況,自行調整
UNDO_RETENTION 的值。
SQL> SHOW PARAMETER undo_retention
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 0
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
人為管理
當 UNDO_RETENTION 的參數值不是零,理論上未過期的還原擴充區塊不會被重新使用。可是如果沒有
設定保證還原保留(RETENTION GUARANTEE),即是是未過期的還原擴充區塊也可能會提前被重新使用。
SQL> SHOW PARAMETER undo_retention
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 900
SQL> SELECT tablespace_name,retention FROM dba_tablespaces WHERE contents=’UNDO’;
TABLESPACE_NAME RETENTION
------------------------------------ -----------------------
UNDOTBS NOGUARANTEE
--只有還原型態的表格空間可以設定為絕對保留(RETENTION GURANTEE)
SQL> ALTER TABLESPACE undotbs RETENTION GUARANTEE;
Tablespace altered.
SQL> SELECT tablespace_name,retention FROM dba_tablespaces WHERE contents=’UNDO’;
TABLESPACE_NAME RETENTION
------------------------------------ -------------------
UNDOTBS GUARANTEE
SQL> SELECT tablespace_name,autoextensible FROM dba_data_files;
TABLESPACE_NAME AUT
------------------------------------ ---------
SYSTEM YES
SYSAUX YES
UNDOTBS NO
USERS NO
TESTTS NO
如果當還原表格空間並未設定自動增長的功能,實際的還原保留時間是由 Oracle 資料庫依據還原表格空
間的大小與 Oracle 資料庫的狀況決定,除非資料庫管理者要求絕對保留(GUARANTEE)。以下為進行中
的交易使用還原的擴充區塊的規則:
當還原表格空間不會自動增長與未設定絕對保留時
1. 使用過期的擴充區塊。
2. 使用未過期的擴充區塊。
如果以上兩種擴充區塊都用完了,但交易卻還沒有結束,這時該交易便會出現錯誤訊息”ORA-01650
unable to extend rollback segment string by string in tablespace string”,表示目前使用中的還原表
格空間的空間不夠,這個交易將會自動被退回(Rollback)。
當還原表格空間不會自動增長與已設定絕對保留時
• 僅能使用過期的擴充區塊,未過期的擴充區塊絕對不會被重新使用。如果所有過期的擴充區塊都
用完了,進行中的交易便會出現錯誤訊息”ORA-01650 unable to extend rollback segment ...
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
by ... in tablespace ...”,表示目前使用中的還原表格空間的空間不夠,這個交易將會自動被退
回(Rollback)。
當還原表格空間會自動增長與未設定絕對保留時
1. 使用過期的擴充區塊。
2. 使用未過期的擴充區塊。
3. 當以上兩種擴充區塊都用完了,但交易卻還沒有結束。此時 Oracle Server 會使用資料檔自動增長
功能,增加還原表格空間的大小。然後在將可用的擴充區塊配置給目前使用中的還原區段,讓進
行中的交易可以繼續運行。
當還原表格空間會自動增長與已設定絕對保留時
1. 使用過期的擴充區塊。
2. 因為有設定絕對保留為未過期擴充區塊,所以當過期的擴充區塊都用完了,但交易卻還沒有結束。
此時 Oracle Server 會使用資料檔自動增長功能,增加還原表格空間的大小。然後在將可用的擴充
區塊配置給目前使用中的還原區段,讓進行中的交易可以繼續運行。
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
6.2 建立額外的表格空間
一個資料庫只要有 SYSTEM 與 SYSAUX 表格空間就可以成功開啟。但是為了下列幾種原因,建議建立
一些額外的表格空間。
• 更靈活地管理資料庫:因為每個表格空間都可以設定為讀寫、唯讀、離線狀態,讓整個資料庫可
以部份表格空間與其他的表格空間不同,增加資料庫管理者的管理彈性。
• 區隔不同的型態的區段物件:資料辭典、還原區段、暫時區段、表格、索引、叢集等綱要物件,
應該依照不同的型態與使用特色,分別放在不同的表格空間存放。這樣讓資料庫的架構,更具管
理性與效能更好。
• 更細微地控制使用者對資料庫的空間使用:在 Oracle 資料庫中,每個使用者都依照所設定的空間
配額來使用資料庫空間。而空間配額是以使用者與表格空間為依據,所以越多的表格空間,資料
庫管理者有更細微的單位(表格空間)來設定相關的配額。
6.2.1 擴充區塊的管理方式(Extent Management)
因為 Oracle 資料庫中的空間配置單位是擴充區塊(Extent),而每個擴充區塊不是位於可用的狀態(Free
Extent),就是使用中的狀態(Used Extent)。也就是說每次當區段(Segment)有空間需求的情況發生時(新
增一個區段或現有區段的擴充區塊都被使用完了),Oracle 資料庫每次至少配置一個可用的擴充區塊給區
段。而表格空間的空間管理方式,可以分為兩種:說明管理(Dictionary Management)、本機管理
(Locally Management),用來表示這個表格空間中那些擴充區塊是可用的(Free Extent)或使用中的
(Used Extent)。
SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces;
TABLESPACE_NAME EXTENT_MAN
------------------------------ --------------------
SYSTEM DICTIONARY
SYSAUX LOCAL
UNDOTBS LOCAL
TEMP LOCAL
USERS LOCAL
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
說明管理(Dictionary Management):
說明管理是 Oracle8i 之前唯一的一種擴充區塊管理的方法,這種方法是利用資料辭典中的兩個表格 FET$
與 UET$,記錄每個表格空間中可用的擴充區塊(FET$)與使用中的擴充區塊(UET$)。FET$可使用
DBA_FREE_SPACE,而 UET$可以使用 DBA_EXTENTS 觀察其內容。因此當每次建立一個新的區段或
現有區段有增加空間的需求時,Oracle Server 會進行以下的步驟,尋找可用的擴充區塊。
1.Oracle 資料庫會先搜索 FET$,檢查此表格空間中是否有合適的可用擴充區塊可用。
2.如果找到合適可用的擴充區塊,Oracle 資料庫會進行刪除(DELETE)(找到一模一樣大小的可用擴充區
塊,第一優先)或異動(UPDATE)(如果找不到相同大小的可用擴充區塊,但是找到比所需要大小更大的擴
充區塊)的操作,將 FET$中相關的記錄進行修改。之後再將相關擴充區塊的記錄新增(INSERT)到 UET$。
這種 SQL 操作被稱作遞迴的 SQL(Recursive SQL),這些 SQL 指令是為了執行使用者的 SQL 指令,
Oracle 資料庫額外所衍生出的 SQL 指令。
3.如果找不到合適可用的擴充區塊,Oracle 資料庫會要求此表格空間的資料檔增加大小,以增加表格空
間的可用空間,這時資料檔必須事先設定好自動成長(AUTOEXTEND)的功能。但是如果此時資料檔沒有
事先設定自動成長的功能,則會出現 ORA-01653: unable to extend table .. in tablespace。
因為這兩個表格位在 SYSTEM 表格空間中,所以越常存取這兩個表格,也越有可能與其他的資料庫操作
資料辭典的動作發生 IO 競爭。而且這兩個表格的異動也會產生重做資訊(REDO)與還原資訊(UNDO),造
成額外的管理成本。最重要的問題是將兩個相鄰的可用的擴充區塊合併為一塊較大的可用擴充區塊,這個
工作是由 SMON 每 12 小時進行一次,這個動作會消耗一定的系統資源。
設定說明管理是在建立表格空間時,利用 EXTENT MANAGEMENT DICTIONARY 子句,將該表格空間
設定為說明管理的表格空間。或者是使用
DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL 將本機管理的表格空間變更為說明
管理。
SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces
TABLESPACE_NAME EXTENT_MAN
------------------------------ --------------------
SYSTEM DICTIONARY
SYSAUX LOCAL
UNDOTBS LOCAL
TEMP LOCAL
USERS LOCAL
SQL> CREATE TABLESPACE testdictts
2 DATAFILE '/u02/oradata/ora11g/testdictts01.dbf' SIZE 10M
3 EXTENT MANAGEMENT DICTIONARY; --這個子句用來指定將表格空間為說明管理
SQL> EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL(‘USERS’);
SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces
TABLESPACE_NAME EXTENT_MAN
------------------------------ --------------------
SYSTEM DICTIONARY
SYSAUX LOCAL
UNDOTBS LOCAL
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
TEMP LOCAL
USERS DICTIONARY
TESTDICTTS DICTIONARY
--將表格空間變更為本機管理
SQL> EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL(‘USERS’);
SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces
TABLESPACE_NAME EXTENT_MAN
------------------------------ --------------------
SYSTEM DICTIONARY
SYSAUX LOCAL
UNDOTBS LOCAL
TEMP LOCAL
USERS LOCAL
TESTDICTTS DICTIONARY
不過以上的說明都建立在一個重要的前提上,就是 SYSTEM 表格空間必須是說明管理,不然將會出現無
法建立說明管理表格空間的錯誤(ORA-12913: Cannot create dictionary managed tablespace)或者無
法將表格空間轉換為說明管理(ORA-12914: Cannot migrate tablespace to dictionary managed type)。
SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces
TABLESPACE_NAME EXTENT_MAN
------------------------------ --------------------
SYSTEM LOCAL
SYSAUX LOCAL
UNDOTBS LOCAL
TEMP LOCAL
USERS LOCAL
SQL> CREATE TABLESPACE testdictts
2 DATAFILE '/u02/oradata/ora11g/testdictts01.dbf' SIZE 10M
3 EXTENT MANAGEMENT DICTIONARY; --這個子句用來指定將表格空間為說明管理
CREATE TABLESPACE testdictts
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace --因為SYSTEM表格空間已經是本機管理
因為上述的一些缺點,Oracle 資料庫由 Oracle8i 開始介紹一種新的擴充區塊管理方式-本機管理(Locally
Management),這種管理方式可以避免說明管理所帶來的副作用。因此從 Oracle9i 開始本機管理模式成
為表格空間預設的管理方式,而說明管理只是為了提供與之前的 Oracle 版本相容而繼續存在。同時如果
採用 DBCA(資料庫組態輔助管理程式)來建立一個新的資料庫,這時 SYSTEM 表格空間將會設定為本機
管理。
本機管理(Locally Management):
本機管理的擴充區塊管理方式,是在資料檔標頭(Datafile Header)中使用一組位元映像(Bitmap),呈現相
對的擴充區塊的使用狀態。如果位元值為 0,則表示相對的擴充區塊為可用的(Free),反之如果位元值為
1,則表示擴充區塊為使用中(Used)。不過一個位元到底代表幾個資料區塊?則是依據建立表格空間當時
所作的設定,一個位元可以代表一個資料區塊或多個資料區塊。當建立表格空間所使用的參數為
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
EXTENT MANAGEMENT LOCAL AUTOALLOCATE 時,這時一個位元代表一個資料區塊。若為
EXTENT MANAGEMENT LOCAL UNIFORM SIZE nM,這時一個位元代表多個資料區塊。
使用本機管理可以避免說明管理所造成的缺點,例如:擴充區塊的配置或收回,只需要變更位元地圖即可,
不需要異動資料辭典中的 FET$與 UET$這兩個表格,因此不會有 REDO 或 UNDO 的資料產生,以及資
料辭典的競爭相對也會減少。而且不需要 SMON 定期合併可用的擴充區塊,因為位元圖中的連續的位元
值為 0,就表示有連續的可用空間可供使用。
SQL> CREATE TABLESPACE testlocalts
2 DATAFILE '/u02/oradata/ora11g/testlocalts01.dbf' SIZE 10M
3 EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
--將表格空間設定為本機管理,同時此表格空間上的每個區段,其擴充區塊的大小是由Oracle資料庫自動管
理。
--首先前16個擴充區塊的大小為64K =>16*64K=1M
--第17到79個擴充區塊的大小為1M =>63*1M=63M
--第80到199個擴充區塊的大小為8M=>200*8M=960M
--第200個擴充區塊開始皆為64M
SQL> SELECT tablespace_name,extent_management,allocation_type
2 FROM dba_tablespaces
3 WHERE tablespace_name='TESTLOCALTS';
TABLESPACE_NAME EXTENT_MAN ALLOCATIO
------------------------------ ----------------------- -----------------
TESTLOCALTS LOCAL SYSTEM
SQL> CREATE TABLESPACE testlocalts
2 DATAFILE '/u02/oradata/ora11g/testlocalts01.dbf' SIZE 10M
3 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
--將表格空間設定為本機管理,同時此表格空間上的每個區段,其中每個擴充區塊的大小皆固定為1M。
SQL> SELECT tablespace_name,extent_management,allocation_type
2 FROM dba_tablespaces
3 WHERE tablespace_name='TESTLOCALTS';
TABLESPACE_NAME EXTENT_MAN ALLOCATIO
------------------------------ ----------------------- -----------------
TESTLOCALTS LOCAL UNIFORM
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
當每次建立一個新的區段或現有區段有增加空間的需求時,Oracle Server 會進行以下的步驟,尋找可用
的擴充區塊。
1.搜索資料檔的檔頭(File Header)中的位元映像(BitMap),尋找 Bit 值為 0 的那些 Bits。
AUTOALLOCATE:須先確定這個擴充區塊的大小(64K、1M、8M、64M),接著只要找到足夠多的連
續 Bit 值為 0,因為每個 Bit 代表一個資料區塊,如此便可以將這些連續空的資料區塊組成一個自由的擴
充區塊,並將這個擴充區塊配置給需要空間的區段。
UNIFORM:只要找到一個值為 0 的 Bit 即可,因為一個 Bit 代表一組資料區塊,也代表一個擴充區塊,
如此便可以將這個擴充區塊配置給需要空間的區段。
2.如果在 Bitmap 中找不到足夠多個 Bit 值為 0 的連續資料區塊,表示此資料檔的可用空間不足,如果此
資料檔沒有設定可以自動增長大小,將會出現新增表格時的錯誤”ORA-01652: unable to extend temp
segment by n in tablespace YYY”或延伸現有表格時的錯誤”ORA-01653: unable to extend table
XXX by n in tablespace YYY”。但是如果資料檔有設定可以自動增長大小,此時資料檔將會向檔案系
統要求新增空間,這時所新增的資料檔空間將會被當作可用的擴充區塊,這些新增的可用擴充區塊可以配
置給需要的區段。
6.2.2 區段空間管理(Segment Space Management)
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
區段空間管理是用在進行新增(INSERT)資料時,決定哪個資料區塊(Data Block)可以使用,即所謂的可被
新增的資料區塊(Insertable Data Block)。Oracle11g 可以使用兩種方式來管理可被新增使用的資料區塊:
FREELIST(手動)與 Automatic Segment Space Management(ASSM 自動)。
首先先對一些名詞進行定義,以方便之後的說明:
高水位標記(High Water Mark):一樣存在於區段表頭區塊中,這個值記錄著這個區段中最後曾經使用過
的最後一個區塊的位置。也就是說如果一個區塊位於 WHM 之下,表示這個區塊曾經被使用過,可是目前
這個區塊中有幾筆記錄(ROW)則無法由此得知,必須實際讀取區塊內容才能確定。同時也表示如果一個區
塊的位置位於高水位標記之上,則表示此區塊不曾被使用過,也就是說此區塊不可能有任何記錄。
可供新增使用的資料區塊:每個區段都可以藉由設定 PCTFREE,要求此區段中的區塊,在每次被新增後,
檢查區塊中所剩餘的可用空間與區塊大小的比率,必須大於所設定的 PCTFREE 值,才可以繼續被後續
的新增操作使用。如果剩餘可用空間的比率低於 PCTFREE 的設定值 ,公式(Free Space/Block
Size)>PCTFREE,則此區塊不可以再被後續的新增操作使用,因為所剩餘的可用空間要留給現存於此區
塊中的記錄,進行異動操作(Update)時使用。所有這個參數必須根據記錄的可能異動的樣式,來決定保留
的可用空間大小,合法的設定值由 0 到 99,而預設值為 10。
可用區塊串列管理(Freelists Management)
在 Oracle Database 9i 之前只能採用可用區塊串列(Freelists)管理,可用區塊串列存在於每個區段的第一
個區塊,這個區塊被稱作區段標頭區塊(Segment Header Block),這個區塊的確切位置可由
DBA_SEGMENTS 中的 HEADER_FILE、HEADER_BLOCK 得到。而可用區塊串列是此區段位於高水位
標記(High Water Mark)下可供新增使用的區塊所排成的串列。
可用區塊串列管理的方式的基本原理如下:
1.當伺服器處理作業(Server Process)準備新增資料到某個表格之前,伺服器處理作業找到該區段的標頭
區塊(Segment Header Block),然後需要取得區段標頭區塊的鎖定(Lock),因為它必須搜索可用區塊串
列與變動其內容,確定同時間只有一個伺服器處理作業對可用區塊串列的進行相關操作。如果在可用區塊
串列中找到可新增的區塊,則將資料列儲存到該區塊。如果整個可用區塊串列中都找不到可新增的區塊,
則會要求將高水位標記向後移動 5 個區塊,如此便可在可用區塊串列中新增 5 個可用且空的區塊。
2.當找到合適的區塊後,伺服器處理作業則繼續計算新增後的新剩餘空間(Free Space)的百分比是否比
PCTFREE 來的大?如果新的剩餘空間還是足夠的,將剩餘空間的值記錄到可用區塊串列後,便釋放區段
標頭區塊的鎖定。但是如果新的剩餘空間已經比 PCTFREE 所要求的小,則伺服器處理作業會先將該區
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
塊資料由可用區塊串列中移除,此後這個區塊便不再能被新增操作使用。因為如果一個區塊不存在於可用
區塊串列,這個區塊在新增操作時被不會被伺服器處理作業搜索到,因此就不可能被新增操作使用。
3.雖然不在 Freelist 中的區塊不能再被新增使用,可是其他的操作(Update 異動/Delete 刪除),還是可以
繼續進行,因為這些操作針對的是已經存在資料。而且當異動或刪除後,剩餘空間可能會因此增加(資料
刪除或異動後的資料較異動前來得小),當然也有可能減少(異動後的資料較異動前來得大)。所以當異動或
刪除到不在 Freelist 中的區塊內容時,當操作完成後,Server Process 會計算經過操作後的剩餘空間的
百分比較 PCTUSED(預設值為 40)來得小時,這時 Server Process 會鎖定 Segment Header 區塊,並且
將此區塊資訊加進 Freelist 中,因此這個區塊又可以被新增操作使用。
Freelist 管理方式的主要缺點:區塊競爭
依據上述的操作原理,如果有多個不同的階段作業(Session)同時對同個區段進行各種操作,這時會有針
對區段標頭區塊(Segment Header Block)的競爭衝突出現,進而增加進行這些操作所需整體時間。同時
因為 Freelist 的管理方式,會盡量先將資料新增到同一個資料區塊中,直到該區塊不能在被新增為止,這
樣也會造成資料區塊的競爭。
ASSM 管理(Automatic Segment Space Management)
ASSM 是 Oracle Database 9i 的新功能,它利用所謂的點陣圖區塊(BitMap Block)來管理與呈現資料區
塊(Data Block)的空間狀態。這些 BMB 都放在 Segment Header Block 之前,共有 3 種形式的 BMB 區
塊(Level1、Level2、Level3)。
L3 BMB Block 的內容連接到 L2 BMB Blocks,不過如果這個區段不是非常的大,則 Level 3 區塊
(Block)可以存放在 Segment Header Block 中,但如果區段成長到一定的大小,則會出現單獨的 Level 3
區塊。
L2 BMB Block 的內容是連接到 L1 BMB Blocks。
L1 BMB Block 的內容是這個區段(Segment)的某個擴充區塊(Extent)中一組資料區塊(Data Block)的空
間狀態,在 L1 BMB Block 中使用位元地圖(Bitmap:4 個 bits)表示每個資料區塊的已使用空間量及相關
的狀態,空間狀態可以分為 FS1(0-25% Free)、FS2(25-50% Free)、FS3(50-75% Free)、FS4(75-
100% Free),資料區塊狀態可以分為 FULL、UNFORMATTED、FORMATTED。
0000 Unformatted 0001 logically Full
0010 (FS1) 0011 (FS2)
0100 (FS3) 0101 (FS4)
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
ASSM 操作方式簡介:
1.當伺服器處理作業準備新增資料到某個表格時,透過該區段的表頭區塊資訊得到相關的 L3 BMB 區塊
的位置。如果此表格不是特別的大,直接使用區塊標頭區塊(Segment Header Block)即可,因為它就是
一個有效的 L3 BMB 區塊。當然如果此表格很大,就會有多個 L3 BMB 區塊存在,因此就需要使用雜湊
計算(進行新增的伺服器處理作業在作業系統的 Process ID 與所屬的 Instance ID)的技巧,選擇其中的一
個 L3 BMB 區塊,以分散對 L3 BMB 區塊的競爭。
2.當讀取某個 L3 BMB 區塊後,伺服器處理作業可由其中的內容得到多個 L2 BMB 區塊的位置。此時一
樣使用雜湊計算(HASH(Instance ID,PID))的技巧,選擇一個 L2 BMB 區塊。
3.當讀取某個 L2 BMB 區塊後,伺服器處理作業可由其中的內容得到許多的 L1 BMB 區塊的位置。此時
繼續使用 HASH(Instance ID,PID)的方式,選擇一個 L1 BMB 區塊。
4.當讀取某個 L1 BMB 區塊後,伺服器處理作業使用 HASH(PID)的方式,決定要將資料新增到哪個資料
區塊。
當資料新增完成後,伺服器處理作業會檢查目前使用的資料區塊的空間狀態是否需要改變?例如由 FS2
變成 FS1,如果需要改變,則會異動所屬的 L1 BMB 區塊。不過因為是 25%才更新一次空間的狀態,所
以所消耗的資源比 Freelist 管理來的少,尤其是不會也不需要異動區段標頭區塊,可以減少對區段標頭區
塊的競爭。同時如果新增後,剩餘空間的百分比是否比 PCTFREE 來的小,則伺服器處理作業異動 L1
BMB 區塊的內容將此資料區塊狀態設為 FULL,此後這個區塊便不再能被新增操作使用。
一個 FULL 狀態的資料區塊要何時才能被新增使用?雖然不能被新增使用,可是還可以被更新與刪除,
此資料區塊的空間狀態還是會改變。所以假設此資料區塊在被設定為 FULL 時,他的空間狀態為 FS1,
這個資料區塊要等到它的空間狀態被更新為 FS2 時,才能夠重新被新增操作使用。也就是說在 FS2 時被
設定為 FULL,要等到空間狀態為 FS3。若為 FS3 被設定為 FULL,則要等到 FS4 時,才能重新被新增
操作使用。
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
6.2.3 建立新的表格空間
建立一個新的表格空間時,還需要確定一些重要的表格空間參數:表格空間內容型態、資料檔的位置與名
字、個數及大小等等。當這些參數都已經知道後,建立一個新的表格空間便成為一個相當簡單的工作。
表格空間的內容型態
可以分為永久(PERMANENT)、還原(UNDO)與暫時(TEMPORARY)三種。可以透過
DBA_TABLESPACES 這個資料辭典視圖中的 CONTENTS 欄位查知。
永久(Permanent)︰永久型態的表格空間中,可以建立如表格(TABLE)、索引(INDEX)、叢集(CLUSTER)
等永久型態的區段。這些區段的內容,必須經由明確的指令刪除,不然會永久的儲存在區段中。
還原(Undo):還原型態的表格空間中,只能由執行處理(Instance)建立還原區段,資料庫管理者無法建立
任何型態的區段在此表格空間中。這些還原區段的內容會隨著交易結束而被重複使用,因此與永久型態的
區段內容不同。同時在自動還原管理的架構下,執行處理同時間僅使用一個還原型態的表格空間。所以建
立多個還原型態的表格空間並沒有用處,除非資料庫管理者想要刪除現有的還原表格空間,才需要先建立
額外的還原型態的表格空間。
暫時(Temporary):暫時型態的表格空間中,只能由執行處理建立暫時區段,這些區段用來進行磁碟排序
使用。而且同時這些暫時區段會隨著階段作業(Session)的結束而自動被刪除。因為這些區段的內容只是
暫時存在,可能當交易結束或階段作業結束後就會自動被清除,所以這種表格空間上的異動操作不須產生
異動日誌。而且也不需要備份,因為若發生媒體錯誤時,重新建立一個新的暫時表格空間即可。不過其組
成的檔案必須是暫時檔案(Tempfile)格式。
SMALLFILE 與 BIGFILE
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
在 Oracle Database 10g 之前,每個表格空間最多可以由 2
10
-2 個資料檔(1022 個)組成,但是每個資料
檔最大只能由 2
22
個資料區塊(約 4000000 個)組成。目前一般平台上的 Oracle 資料區塊大小可由 2048
Bytes 到 32768 Bytes,因此每個資料檔大小可由 8GB 到 64GB,而每個表格空間容量可由 8TB 到
64TB。每個資料庫最多可以有 65533 個表格空間,但資料檔個數也不能超過 65533 個,所以整個資
料庫最大可以達到 8EB(假設資料區塊大小為 32K)。
註記:1M=1024K、1G=1024M、1T=1024G、1P=1024T、1E=1024P
為什麼一個表格空間要由這麼多個資料檔組成?
這要分成兩方面來說:
1.突破單一檔案大小限制(2G)。早期的檔案系統由於定址空間不足,所以單一檔案的大小,最大只能到
2G。但是表格的大小經常會超過 2G,因此使用多個資料檔組成表格空間的技巧,讓表格空間的大小可以
超過 2G 限制,進而讓表格的大小也不受限於 2G。
2.分散磁碟 I/O。因為整個 Oracle 資料庫架構中,磁碟機是最慢的一部分,如果再加上 I/O 競爭的問題,
整個資料庫系統的速度將會被拖累。所以使用多個資料檔(每個資料檔應該在不同的磁碟機上)組成一個表
格空間的方式,讓 I/O 可以分散到各個獨立的磁碟機上,增加整體的 I/O 效能。
可是資訊科技不斷的進展,以上的兩個問題都已經被科技的進步所解決。
1.目前的檔案系統已經突破之前單一檔案大小的限制,64G 已經不夠用了。所以從 Oracle Database
10g 開始,推出一種新的檔案型態:大型檔案(BIGFILE)。這種檔案型態最達可使用到 232
個資料區塊,
依不同的資料區塊大小(2K~32K),檔案大小可達 8TB 到 128TB,比 8G 到 128G 的大小來的大,所以
稱作大型檔案。而之前每個資料檔只能有 2 22
個資料區塊的檔案,就被稱做小型檔案。雖然大型檔案表格
空間的資料檔大小比較大,但是每個表格空間中最多只能由一個資料檔案組成。2
32
=2
22
(原來的資料檔案
大小)*2
10
(每個 SMALL 表格空間最多有 1023 個資料檔案,現在只需要 1 個資料檔案,所以可以將 2
10
移到資料區塊定址使用)。
2.硬體的磁碟陣列(RAID)的技術提昇與價錢下降,讓大多數的企業都樂於採用。或者是採用 Oracle
Database 10g 開始提供的自動儲存管理(Automatic Storage Management)來管理磁碟機,自動儲存管
理類似軟體磁碟陣列的機制。這時 I/O 分散的工作就交由磁碟陣列的機制處理,不需要資料庫管理人員利
用多個資料檔案與多個磁碟機的方式來達到。
註記:即便在建立表格空間時表示資料檔案的大小為無限制,其實每個資料檔還是有其限制(4 百萬個資
料區塊-小型檔案或 40 億個資料區塊-大型檔案)。
資料檔案的位置
檔案位置可以放在檔案系統(File System)、原始裝置(RAW DEVICE)與自動儲存管理(ASM)上。
資料檔案的名字
檔案名字是非常重要的一件事,因為在眾多的資料檔案中,要如何找到所需要的資料檔案。最簡單的方法
就是在命名時,採用一種公認的命名規則。其實不管採用哪種命名規則,都是希望能夠達到”顧名思義”
的境界。只要看到檔案的名字,就能知道這個檔案是屬於哪個表格空間、表格空間的型態等資訊。檔案命
名的方法,有兩種方法:人工命名與自動命名(Oracle Managed File)。
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
人工命名:在建立資料檔案時,便由資料庫管理人員直接決定。這時便要仔細思考要如何命名,可以讓往
後的資料庫管理更方便、更有效率。如果目前沒有特定的命名規則,可以採用 OFA 架構所建議的命名規
則。OFA 架構在第 4 章已經說明過,請自行參考。
SQL> CREATE TABLESPACE frankts DATAFILE '/u02/oradata/ora11g/frankts01.dbf' SIZE 10M;
SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name='FRANKTS';
FILE_NAME
--------------------------------------------------------------------------------------------------------------
/u02/oradata/ora11g/frankts01.dbf
OMF 自動命名:使用 OMF 功能時,需要下列三種參數:DB_CREATE_FILE_DEST、
DB_CREATE_ONLINE_LOG_DEST_n(1~5)與 DB_RECOVERY_FILE_DEST 來設定檔案的位置,檔案
名字則由 Oracle Server 依據規則自動產生。
SQL> show parameter db_create
NAME TYPE VALUE
------------------------------------------ ----------- ------------------------------
db_create_file_dest string /u02/oradata/omf/
db_create_online_log_dest_1 string /u02/oradata/omf/
db_create_online_log_dest_2 string /u03/oradata/omf/
db_create_online_log_dest_3 string
db_create_online_log_dest_4 string
db_create_online_log_dest_5 string
SQL> show parameter db_recovery
NAME TYPE VALUE
------------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u03/flash_recovery_area
db_recovery_file_dest_size big integer 4G
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
其中 DB_CREATE_FILE_DEST 的參數主要是給資料檔、暫時檔與資料區塊變動追蹤檔(Block Change
Tracking File)使用,不過如果當 DB_CREATE_ONLINE_LOG_DEST_n 沒有設定時,也可以給控制檔與
日誌檔使用。
DB_CREATE_ONLINE_LOG_DEST_n 是給控制檔與日誌檔使用,n 可以由 1~5,表示最多可以有五個
成員(Member)。
DB_RECOVERY_FILE_DEST 是給所有復原相關檔案使用,如使用 RMAN 所產生的備份檔案的預設目錄、
存檔日誌檔的預設位置以及回遡日誌的預設位置,在 Oracle10g 中被稱作瞬間復原區域(Flash Recovery
Area)。不過如果如果沒有設定 DB_CREATE_ONLINE_LOG_DEST_n 與 DB_CREATE_FILE_DEST 時,
瞬間復原區域也可以用來當作控制檔與日誌檔的預設位置使用。
檔案命名規則:
%t 是這個表格空間的名字,不過表格空間的名字若超過八個字,則只能出現前八個字。
%u 則是八個英數字所組成,會自動產生一個內容為獨一值的字串。
%g 為此日誌成員檔所屬的日誌群組編號。
資料檔(Datafile):Oracle 會自動在 DB_CREATE_FILE_DEST 的目錄下,再建立一個子目錄(資料庫的
名字-ora11g),之後在其下再建一個子目錄-datafile。然後依照以下的檔案名稱格式-
o1_mf_%t_%u_.dbf,將新增的資料檔建立在 datafile 的子目錄下。
註記:原本 OracLe Managed File 的縮寫應該是 ol_mf 才對,不過寫這段程式的人好像看錯了,把 l 看
成 1,所以就變成 o1_mf。
暫時檔(Tempfile):Oracle 會自動在 DB_CREATE_FILE_DEST 的目錄下,再建立一個子目錄(資料庫的
名字-ora11g),之後在其下再建一個子目錄-datafile。然後依照以下的檔案名稱格式-
o1_mf_%t_%u_.dbf,將新增的暫時檔建立在 datafile 的子目錄下。如果沒有指定暫時檔的大小,則此新
增的暫時檔大小初始為 100M,而且會自動增長檔案大小,同時沒有檔案大小的限制。
控制檔(Controlfile):Oracle 會自動在 DB_CREATE_ONLINE_LOG_DEST_n 的目錄下,再建立一個子
目錄(資料庫的名字-ora11g),之後在其下再建一個子目錄-controlfile。然後依照以下的檔案名稱格式-
o1_mf _%u_.ctl,將新增的控制檔建立在 controlfile 的子目錄下。如果設定的目錄超過一個以上,則每
個目錄下都會建立一份控制檔。
日誌檔(Logfile)︰Oracle 會自動在 DB_CREATE_ONLINE_LOG_DEST_n 的目錄下,再建立一個子目錄
(資料庫的名字-ora11g),之後在其下再建一個子目錄-logfile。然後依照以下的檔案名稱格式-o1_mf
_%g_%u_.log,將新增的日誌檔檔建立在 logfile 的子目錄下。如果設定的目錄超過一個以上,則每個目
錄下都會建立一份日誌檔。
區塊異動追蹤檔(Block Change Tracking File):Oracle 會自動在 DB_CREATE_FILE_DEST 的目錄下,
再建立一個子目錄(資料庫的名字-ora11g),之後在其下再建一個子目錄-changetracking。然後依照以下
的檔案名稱格式-o1_mf _%u_.chg,將新增的追蹤檔建立在 changetracking 的子目錄下。新增的追蹤檔
大小初始為 10M,如果空間不足,會自動增長檔案大小,一次增加 10M,同時沒有檔案大小的限制。
如何使用 OMF 機制
使用 OMF 功能的方法分為資料檔、日誌檔與區塊變動追蹤檔為一種方式,而控制檔的使用時機與其他檔
案不同。
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
資料檔(Datafile)與暫時檔(Temporary File):當建立新的表格空間或新增資料檔到現有的表格空間時,如
果指令中沒有加上資料檔的名字,這時 Oraclec 會自動參考 DB_CREATE_FILE_DEST 的設定,將資料
檔建立在相對的位置,檔案名字也自動產生。如果此執行處理(Instance)沒有設定
DB_CREATE_FILE_DEST,則 Oracle 會將新增的資料檔建在$ORACLE_HOME/dbs 的目錄下。如果沒
有指定資料檔的大小,則此新增的資料檔大小初始為 100M,而且會自動增長檔案大小,同時沒有檔案大
小的限制。
SQL> CREATE TABLESPACE frankts ;
--自動建立一個資料檔,檔案大小為100M,而且會自動增長大小,直到檔案大小的極限。
SQL> SELECT file_name,bytes,autoextensible,maxbytes FROM dba_data_files
2> WHERE tablespace_name='FRANKTS';
FILE_NAME BYTES AUT MAXBYTES
----------------------------------------------------------------------------------------- -------------- ------ ----------------
/u02/oradata/omf/ORA11G/datafile/o1_mf_frankts_473jckln_.dbf 104857600 YES 3.4360E+10
SQL> CREATE TABLESPACE frankts2 DATAFILE SIZE 10M ;
--自動建立一個資料檔,檔案大小為10M,而且不會自動增長大小 。
SQL> SELECT file_name,bytes,autoextensible,maxbytes FROM dba_data_files
2> WHERE tablespace_name='FRANKTS2';
FILE_NAME BYTES AUT MAXBYTES
----------------------------------------------------------------------------------------- -------------- ------ ----------------
/u02/oradata/omf/ORA11G/datafile/o1_mf_frankts2_4766n75o_.dbf 10485760 NO 0
SQL> CREATE TEMPORARY TABLESPACE tempfrank ;
--自動建立一個暫時檔,檔案大小為100M,而且會自動增長大小,直到檔案大小的極限。
SQL> SELECT file_name,bytes,autoextensible,maxbytes FROM dba_temp_files
2> WHERE tablespace_name='TEMPFRANK';
FILE_NAME BYTES AUT MAXBYTES
---------------------------------------------------------------------------------------- -------------- ------ ----------------
/u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp 104857600 YES 3.4360E+10
--tempfran為表格空間名字-tempfrank的前八個字。
--473mq0xr為%u的結果,可以保證即是表格空間名字的前八個字相同,資料檔的名字也不會相同。
日誌檔(Redo Logfile):建立新的日誌群組或新增日誌成員到現存的日誌群組中時,沒有指定日誌成員的
名字,這時 Oracle 會先試圖使用 DB_CREATE_ONLINE_LOG_DEST_n 的設定來建立日誌成員。如果
沒有設定 DB_CREATE_ONLINE_LOG_DEST_n 時,Oracle 會再試圖使用 DB_ㄗ
CREATE_FILE_DEST 的參數。如果還是沒有,則會再試圖使用 DB_RECOVERY_FILE_DEST 的設定值。
以上 OMF 機制下所建立的日誌檔時,沒有指定日誌檔的大小,則新增的日誌群組的日誌檔大小為 100M。
最後以上 OMF 的設定都沒有設定時,Oracle 會將日誌檔建立在$ORACLE_HOME/dbs 目錄下。
SQL> select group#,sequence#,members,bytes from v$log;
GROUP# SEQUENCE# MEMBERS BYTES
----------- ------------------- ------------------- -------------
1 171 2 52428800
2 170 2 52428800
--目前只有兩個日誌群組,每個群組有兩個成員各50M。
SQL> ALTER DATABASE ADD LOGFILE GROUP 3;
--新增的日誌群組有兩個成員,因為db_create_online_log_dest_n有兩個參數有設定值。
--每個成員大小為100M。
SQL> SELECT group#,members,bytes FROM v$log WHERE group#=3;
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
GROUP# MEMBERS BYTES
------------ --------------- ---------------
3 2 104857600
SQL> SELECT group#,member FROM v$logfile WHERE group#=3;
GROUP# MEMBER
----------- --------------------------------------------------------------------------
/u02/oradata/omf/ORA11G/onlinelog/o1_mf_3_473o6s5g_.log
/u03/oradata/omf/ORA11G/onlinelog/o1_mf_3_473o6sm5_.log
--3為日誌群組的編號,此編號是獨一不可重複的數字。
--473o6s5g為%u的結果,可以保證即是相同日誌群組中的成員,日誌檔的名字也不會相同。
SQL> ALTER DATABASE ADD LOGFILE GROUP 4 SIZE 50M;
--新增的日誌群組有兩個成員,因為db_create_online_log_dest_n有兩個參數有設定值。
--每個成員大小為50M。
SQL> SELECT group#,members,bytes FROM v$log WHERE group#=4;
GROUP# MEMBERS BYTES
------------ --------------- -------------
4 2 52428800
區塊異動追蹤檔(Block Change Tracking File):這個檔案會記錄每個資料區塊的變更時間,可以在進行
增量備份(Incremental Backup)時,減少讀取的資料區塊個數,進而加速整體備份的時間。建立追蹤檔時,
不使用”USING FILE”的方式指定追蹤檔的名字與位置,Oracle 會自動將追蹤檔建立在瞬間復原區域中,
而檔案以 OMF 的格式命名。
--使用OMF方式建立追蹤檔
SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING;
SQL> SELECT * FROM v$block_change_tracking;
STATUS FILENAME BYTES
-------------- ---------------------------------------------------------------------------------------- -------------
ENABLED /u02/oradata/omf/ORA11G/changetracking/o1_mf_4766ytpp_.chg 11599872
--使用人為指定檔案名稱方式建立追蹤檔
SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE ‘/u02/oradata/ora11g/o
ra11g_tracking.chg’;
SQL> SELECT * FROM v$block_change_tracking;
STATUS FILENAME BYTES
-------------- ---------------------------------------------------------------------------------------- -------------
ENABLED /u02/oradata/ora11g/ora11g_tracking.chg 11599872
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
控制檔(Control File):控制檔如果想要使用 OMF 格式的話,必須在建立資料庫之前,作好相關的設定,
而這些設定有相對的順序。首先確定參數檔(Parameter File)中的 CONTROL_FILES 這個參數並未設定
任何值。之後將希望的控制檔位置設定在 DB_CREATE_ONLINE_LOG_DEST_n(n=1~5)上,這樣控制
檔最多可以有五個成員。如果沒有設定 DB_CREATE_ONLINE_LOG_DEST_n 參數值,Oracle 會試圖使
用 DB_CREATE_FILE_DEST 設定值,這樣所建立出來的控制檔就只有一份。
建立控制檔後,依據參數檔的形態來決定是否要將控制檔的全路徑名稱(Full Path Name)設定到參數檔中,
如果是 SPFILE,則不須進行此操作,因為 Oracle 會自行動作。但是如果為 PFILE,資料庫管理人員必
須從警示檔(Alert Logfile)找到相對的控制檔名字,自行使用文字編輯器修改 PFILE 的內容,將
CONTROL_FILES 設定為正確的參數值,如此在下次啟動 Oracle Instance 時,才能正確地掛載資料庫。
資料檔案的大小
表格空間的大小是由組成此表格空間的資料檔的個數與大小決定。資料檔的個數跟表格空間則與表格空間
為小型檔案(Smallfile)或大型檔案(Bigfile)型態有關:
小型檔案表格空間中最多可以有 1023 個資料檔,但是每個資料檔不能超過 8G~128G(以不同的資料區
塊大小:2K~32K)。
大型檔案表格空間中只能允許一個資料檔存在,不過這個資料檔案的大小可以達到 8T~128T(以不同的資
料區塊大小:2K~32K)。
然而剛開始建立表格空間時,可以不需事先配置這麼大的空間給資料檔,也可以日後在隨需求而增加檔案
大小即可。所以一個資料檔的大小可以動態改變,當將資料檔大小增大時,只要相對的儲存空間足夠與未
超過資料檔的大小限制,這個操作是不會出現任何問題的。當在增加資料檔的大小時,可以由資料庫管理
者藉有相對的 SQL 指令,將資料檔的大小增大,當然也可以透過資料檔的自動增長功能,自動地增加其
大小。但是如果相要將資料檔縮小時,則有一個限制。例如目前資料檔大小為 20M,而實際已使用空間
為 15M。這時資料檔的大小最多只能縮小到 15M 為止,再小就會出現錯誤訊息。
資料檔自動增大(AUTOEXTEND ON)
資料庫管理者可以事先設定資料檔的自動增大功能,設定資料檔的初始大小、每次增量的大小與資料檔的
大小限制。讓資料檔的大小超過初始大小時,不會出現錯誤訊息,而會依設定的增量大小,自動增加資料
檔的大小,直到資料檔達到檔案大小的限制。因此資料庫管理者可以使用 AUTOEXTEND ON 的參數啟
動資料檔自動增大功能,或使用 AUTOEXTEND OFF 關閉自動增大功能。當使用資料檔自動增大功能時,
建議一定要設定增量大小(NEXT),不然 Oracle 資料庫將自動設定增量為 1 個資料區塊,意即一次增加資
料檔的大小 1 個資料區塊,這樣的增量設定反而帶來效能的損失。至於大小限制(MAXSIZE)若沒有設定,
則為無限制(UNLIMITED),表示該資料檔的大小為 Oracle 資料庫的限制。小型檔案的資料檔可有 4 百萬
個資料區塊,因為資料區塊可由 2K 到 32K,所以一個小型檔案根據區塊大小的不同,其大小可達 8G 到
128G 的大小。至於大型檔案的資料區塊可有 40 億個資料區塊,所以大型資料檔可達 8T 到 128T。
SQL> CREATE TABLESPACE frankts DATAFILE '/u02/oradata/ora11g/frankts01.dbf' SIZE 20M;
/*其實DATAFILE這個關鍵字後面,除了可以接著SIZE(決定此資料檔的初始大小)外,其實還有一些關鍵字:
AUTOEXTEND {OFF|ON}(決定此資料檔是否可以自行增加大小,預設為OFF,表示不能自動增長大小),如
果當AUTOEXTEND ON時,則後面建議接著NEXT(設定當資料檔需要自動增長大小時,一次增加多少的大
小),以及MAXSIZE(用來設定此資料檔的最大值,如果沒有設定,預設值為UNLIMITED)。*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='FRANKTS';
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES
---------- ------------------------------------------------ --------------- -------- ------------------------ ----------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760 NO 0 0
SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' AUTOEXTEND ON;
/*將資料檔設定為可以自動增大 */
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES
---------- ------------------------------------------------ --------------- -------- ------------------------ ----------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760 YES 1 3.4360E+10
/*可是因為沒有設定NEXT(一次增加多少空間),所以Oracle自行決定一次增加一個資料區塊(INCREMENT_B
Y=1)。至於MAXBYTES=3.4360E+10=34360000000
是因為這個表格空間為SMALLFILE格式,每個資料檔最多只能有4000000個(400百萬個)資料區塊,而此表
格空間的每個資料區塊大小為8K,換算結果即為3.4360E+10 Bytes。*/
SQL> SELECT tablespace_name,block_size,bigfile FROM dba_tablespaces WHERE tablespace_name
='FRANKTS';
TABLESPACE_NAME BLOCK_SIZE BIG
------------------------------ ------------------ -----
FRANKTS 8192 NO
/*當BIGFILE=NO時,表示這個表格空間為SMALLFILE格式。但若BIGFILE=YES時,則表示此表格空間為BI
GFILE格式,這種表格空間只能由一個資料檔組成,可是這唯一的資料檔最多可以容納4000000000個(40億
個)資料區塊。*/
SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' AUTOEXTEND ON NEXT 10
M MAXSIZE 100M;
/*將資料檔設定為可以自動增大,當目前的資料檔空間不夠時,每次增加10M,直到資料檔的最大值為100M
為止*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES
---------- ------------------------------------------------ --------------- -------- ------------------------ ----------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760 YES 1280 104857600
/*INCREMENT_BY=1280(資料區塊),每個8K,所以一次增加10M*/
重新設定資料檔大小(RESIZE DATAFILE)
除了資料檔自動增大功能外,資料庫管理者可以重新設定資料檔的大小,
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
HERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES
---------- ------------------------------------------------ --------------- -------- ------------------------ ----------------
5 /u02/oradata/ora11g/frankts01.dbf 20971520 NO 0 0
SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 30M;
/*將資料檔的大小增加為30M*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES
---------- ------------------------------------------------ --------------- -------- ------------------------ ----------------
5 /u02/oradata/ora11g/frankts01.dbf 31457280 NO 0 0
SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 10M;
/*將資料檔的大小縮小為10M*/
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
資料檔的個數
在 Oracle Database 10g 之前,每個表格空間最多可以有 1022(2
10
-2)個資料檔,但每個資料檔最多只
能有 4194304(2
22
)個資料區塊。根據資料區塊的大小不同,資料檔的大小也可以由 8G~128G 不等。同
時整個資料庫中,最多只能有 65533(2
16
-2)個資料檔,所以表格空間個數也不能超過 65533 個(每個表
格空間中至少要有一個資料檔),因此一個資料庫的最大值只能到 8P(1P=1024T=1048576G)。
但是從 Oracle Database 10g 開始,Oracle 資料庫中多了一種表格空間型態:大型檔案(BIGFILE)。這種
表格空間從名稱就可以看出端倪,大型檔案表示資料檔的大小可以很大,最大可以由 2
32
個資料區塊組成,
依據不同的資料區塊大小(2K~32K),資料檔的大小可達 8T 到 128T。不過相較於小型檔案
(SMALLFILE)型態的資料檔只能有 2
22
個資料區塊,多出的 2
10
是由那裡來的?答案是大型檔案型態的表
格空間中,僅能有一個資料檔,因為將資料檔個數的定址空間讓給資料區塊個數使用,所以一個資料檔的
資料區塊個數,才能夠達到 2
32
=2
10
*2
22
。
表格空間加密(Encryption)
資料庫安全雖然可以利用使用者身份辨識與使用者權限授與來強化,但是這些方法是防範資料庫的使用者。
但如果別有用心的人由作業系統著手,直接讀取資料庫實體結構的資料檔,不透過執行處理與 SQL 敘述
句也可以得到所要的資料。因為資料檔的內容其實都是數字,只要能夠將這些數字轉成數字、日期或文字,
便可以還原資料檔的內容。所以資料庫伺服器所在的伺服器,也必須加強管理,避免未經授權的人擅自存
取。
在 Oracle Database 10g R2 後,資料庫管理者可以使用透通資料加密(Transparent Data Encryption)
功能,將表格中重要敏感的欄位內容加密,再將加密過的資料存入資料檔中。目前 Oracle 資料庫所使用
的加密演算法為對稱式加密演算法(加、解密都是使用同一個鍵值(Key)),這些加密鍵值存放在資料辭典中。
不過在 Oracle Database 10g R2 時,只能對表格的欄位進行加密。若要對多個表格的多個欄位加密,必
須一個一個設定,雖然只需要宣告即可,但是還很麻煩。從 Oracle Database 11g 開始,資料庫管理者
可以直接對整個表格空間加密,因此只要將表格放到加密的表格空間,便自動加密,可以大幅減少加密所
帶來的管理負擔。至於加、解密的工作由 Oracle 伺服器自動進行,資料庫管理者不需要參與。但是資料
庫管理者必須負責開啟或關閉錢包,因為錢包不會自動開啟。當執行處理關閉後,錢包也隨著關閉。但執
行處理開啟後,錢包不會自動開啟,必須由資料庫管理者人為開啟。
建立錢包(Wallet)
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
使用資料庫加密功能之前,必須先建立錢包(Wallet),錢包用來儲存 Master Key。而 Master Key 用來解
密儲存在資料辭典的表格空間或表格欄位的加密鍵值,因為存放加密鍵值的表格為安全起見也被加密,所
使用的加、解密鍵值就是儲存在錢包中的 Master Key。資料庫管理者可以使用 Oracle Wallet Manager
或 SQL 敘述句建立錢包,不過要先設定錢包的位置,由 SQLNET.ORA 中
ENCRYPTION_WALLET_LOCATION 來指定錢包的位置。但錢包的名字與型態有其固定的設定,錢包
名字固定為 ewallet.p12。而錢包的型態為 Public Key Cryptography Standard No. 12(PKCS#12),並且
由一個密碼保護,這個密碼在建立錢包時指定。
所建立的錢包可以由 v$encryption_wallet 查詢得知,錢包的型態位置與是否開啟。以及可以使用
ALTER SYSTEM SET ENCRYPTION WALLET {CLOSE | OPEN IDENTIFIED BY password}將錢包
開啟或關閉,當錢包關閉時,所有被加密的表格空間或表格欄位的內容,都無法被存取。
SQL> SELECT * FROM v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
------------------- ---------------------------------------------- -------------
file /home/oracle/encryption_wallet/ OPEN
SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE;
/*關閉錢包後,所有被加密的表格空間或表格欄位的內容,將無法被存取。*/
SQL> SELECT * FROM v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
------------------- ---------------------------------------------- -------------
file /home/oracle/encryption_wallet/ CLOSED
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY oracle;
/*必須提供錢包密碼才能開啟錢包*/
SQL> SELECT * FROM v$encryption_wallet;
WRL_TYPE WRL_PARAMETER STATUS
------------------- ---------------------------------------------- -------------
file /home/oracle/encryption_wallet/ OPEN
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
錢包搜尋順序
當 Oracle 伺服器為取得 Master Key 時,必須先找到錢包。而錢包可能在下列三個位置找到:
1.SQLNET.ORA 的 ENCRYPTION_WALLET_LOCATION 所設定的位置。
2.若第一個位置找不到錢包,則繼續由 SQLNET.ORA 的 WALLET_LOCATION 所指定的位置搜尋。
3.若第二個位置也找不到錢包,則使用預設位置$ORACLE_BASE/admin/$ORACLE_SID/wallet 來尋
找錢包。
設定表格空間加密功能
一但表格空間被設定為加密表格空間後,就無法轉換為未加密表格空間,反之未加密表格空間也不能改為
加密表格空間。所以只能在建立表格空間時,設定該表格空間是否要被加密,事後不能改變。
設定表格空間加密時,可以指定加密所使用的演算法有 3DES168、AES128、AES192、AES256 四種,
預設值為 AES192。
SQL> CREATE TABLESPACE demots_encrypt
2 DATAFILE '/u02/oradata/orcl/demots_encrypt01.dbf' SIZE 10M
3 ENCRYPTION --使用預設的AES128,若想使用其他演算法,ENCRYPTION USING 演算法 即可。
4 DEFAULT STORAGE(ENCRYPT);
Tablespace created.
SQL> SELECT tablespace_name,encrypted FROM dba_tablespaces;
TABLESPACE_NAME ENC
------------------------------ ----
SYSTEM NO
SYSAUX NO
UNDOTBS1 NO
TEMP NO
USERS NO
EXAMPLE NO
DEMOTS NO
DEMOTS_ENCRYPT YES
--可以由v$encrypted_tablespaces查知加密的表格空間所使用的加密演算法為何?
SQL> SELECT tn.name,et.encryptionalg
2 FROM v$tablespace tn JOIN v$encrypted_tablespaces et ON (tn.ts#=et.ts#);
NAME ENCRYPT
------------------------------ -------------
DEMOTS AES128
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
建立表格空間的語法範例
CREATE {SMALLFILE|BIGFILE} {TEMPORARY|UNDO} TABLESPACE 表格空間名稱
DATAFILE‘檔案名稱’SIZE n {AUTOEXTEND OFF|ON NEXT n MAXSIZE m}
EXTENT MANAGEMENT {DICTIONARY|LOCAL {AUTOALLOCATE|UNIFORM SIZE n}}
SEGMENT SPACE MANAGEMENT {AUTO|MANUAL}
ENCRYPTION USING ‘encryption algorithm’ DEFAULT STORAGE(ENCRYPT)
SQL> CREATE SMALLFILE TABLESPACE demots
2> DATAFILE ‘/u02/oradata/ora11g/demots01.dbf’ SIZE 100M
3> AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED
4> EXTENT MANAGEMENT LOCAL AUTOALLOCATE
5> SEGMENT SPACE MANAGEMENT AUTO;
/*這個SQL指令建立一個表格空間叫做DEMOTS,可以由多達1023個資料檔組成(SMALLFILE),不過目前僅
有一個資料檔/u02/oradata/ora11g/demots01.dbf,檔案初始大小為100M,如果不足,則會自動每次增長10
M,直到資料檔的最大值為止(4000000個資料區塊)。此表格空間的擴充區塊由Oracle自動管理,每個擴充區
塊的大小也由Oracle自動管理(AUTOALLOCATE),區段中的資料區塊也由Oracle自動管理(SEGMENT SPA
CE MANAGEMENT AUTO)。這個表格空間可以放置任何形態的區段,因為其內容為永久型態(Permanent)
的表格空間。*/
SQL> CREATE TEMPORARY TABLESPACE tempts
2> TEMPFILE ‘/u02/oradata/ora11g/tempts01.dbf’ SIZE 100M
3> EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K;
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
/*這個SQL指令建立一個表格空間叫做TEMPTS,其內容為暫時(TEMPORARY)型態,所以只能存放暫時區
段(TEMPORARY SEGMENT)。同時因為組成的檔案為暫時檔格式,所以在此表格空間中的任何異動都不會
產生重做日誌。暫時檔的大小固定為100M,如果不夠使用,則會出現表格空間不足的錯誤。每個擴充區塊的
大小固定為256K。*/
SQL> CREATE UNDO TABLESPACE undots
2> DATAFILE ‘/u02/oradata/ora11g/undots01.dbf’ SIZE 100M
3> AUTOEXTEND ON NEXT 10M MAXSIZE 1000M;
/*這個SQL指令建立一個表格空間叫做UNDOTS,其內容為還原(UNDO)型態,所以只能放置還原型態的區
段。 檔案初始大小為100M,如果不足,則會自動每次增長10M,直到1000M為止。*/
6.3 表格空間的操作
當表格空間建立之後,資料庫管理者還是需要因應不同的情況,對現存的表格空間進行一些操作。以下針
對經常被使用的動作,進行一些說明,希望讀者可以更正確的使用及了解該操作的真正意義。
6.3.1 變更表格空間的大小
一個表格空間的大小,與組成它的資料檔大小與個數有關。所以當要變更一個表格空間的大小時,也就是
由資料檔的大小與個數著手。
新增資料檔個數(僅適用於 SMALLFILE 表格空間)
新增資料檔的操作只能用在 SMALLFILE 的表格空間,因為 BIGFILE 的表格空間只允許有一個資料檔存
在。
SQL> SELECT tablespace_name,sum(bytes) FROM dba_data_files WHERE tablespace_name='FRAN
KTS' GROUP BY tablespace_name;
TABLESPACE_NAME SUM(BYTES)
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
------------------------------- -----------------
FRANKTS 10485760
/*目前此表格空間大小為10M*/
SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES
------------- -------------------------------------------------- -------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760
/*目前此表格空間為一個資料檔所組成*/
SQL> ALTER TABLESPACE frankts ADD DATAFILE '/u02/oradata/ora11g/frankts02.dbf' SIZE 10M;
/*新增一個資料檔/u02/oradata/ora11g/frankts02.dbf到表格空間frankts之中*/
SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES
------------- -------------------------------------------------- -------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760
7 /u02/oradata/ora11g/frankts02.dbf 10485760
/*若要新增資料檔時,將資料檔設定為自動成長,只要在SIZE參數的後面,加上NEXT與MAXSIZE參數即
可。相關的範例請參考5.2的內容*/
SQL> SELECT tablespace_name,sum(bytes) FROM dba_data_files WHERE tablespace_name='FRAN
KTS' GROUP BY tablespace_name;
TABLESPACE_NAME SUM(BYTES)
------------------------------- -----------------
FRANKTS 20971520
/*經過新增資料檔後,表格空間frankts變成擁有20M的空間*/
減少資料檔的個數(僅適用於某種特殊狀況)
只有當資料檔的內容是空的,才可以被刪除,這裡所謂的”空”,是表示這個資料檔上沒有任何擴充區塊
存在(用過(Used)或可用(Free))。而且每個表格空間至少要存在一個資料檔存在,除非是暫時表格空間。
SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES
------------- -------------------------------------------------- ------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760
7 /u02/oradata/ora11g/frankts02.dbf 10485760
/*目前表格空間frankts由兩個資料檔組成*/
SQL> ALTER TABLESPACE frankts DROP DATAFILE '/u02/oradata/ora11g/frankts02.dbf';
/*刪除資料檔/u02/oradata/ora11g/frankts02.dbf’*/
SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES
------------- -------------------------------------------------- -------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760
/*資料檔/u02/oradata/ora11g/frankts02.dbf’成功地被刪除*/
SQL> ALTER TABLESPACE frankts ADD DATAFILE '/u02/oradata/ora11g/frankts02.dbf' SIZE 10M;
/*新增資料檔/u02/oradata/ora11g/frankts02.dbf’到表格空間frankts中*/
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES
------------- -------------------------------------------------- ------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760
7 /u02/oradata/ora11g/frankts02.dbf 10485760
SQL> CREATE TABLE system.t1 TABLESPACE frankts AS SELECT * FROM dba_objects;
/*建立一個表格system.t1放在frankts這個表格空間中*/
SQL> SELECT file_id,owner,segment_name,segment_type,count(*) FROM dba_extents WHERE table
space_name='FRANKTS' GROUP BY file_id,owner,segment_name,segment_type;
FILE_ID OWNER SEGMENT_NAME SEGMENT_TY COUNT(*)
------------- --------------- ------------------------------ --------------------- --------------
5 SYSTEM T1 TABLE 1
7 SYSTEM T1 TABLE 16
/*system.t1的擴充區塊有1個放在/u02/oradata/ora11g/frankts01.dbf上,其餘的16個都放在/u02/oradata/ora
11g/frankts02.dbf’上*/
SQL> ALTER TABLESPACE frankts DROP DATAFILE '/u02/oradata/ora11g/frankts02.dbf';
ALTER TABLESPACE frankts DROP DATAFILE '/u02/oradata/ora11g/frankts02.dbf'
*
ERROR at line 1:
ORA-03262: the file is non-empty
/*即便是將區段system.t1刪除,還是無法刪除此資料檔*/
例外:暫時表格空間可以連一個暫時檔都不需要存在,只是當進行磁碟排序時,會出現錯誤訊息
SQL> SELECT tablespace_name FROM dba_tablespaces WHERE contents='TEMPORARY';
TABLESPACE_NAME
------------------------------
TEMPTS1
TEMPFRANK
SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files;
TABLESPACE_NAME FILE_ID FILE_NAME
------------------------------ ---------- --------------------------------------------------
TEMPTS1 1 /u02/oradata/ora11g/temp01.dbf
TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp
SQL> ALTER DATABASE TEMPFILE '/u02/oradata/ora11g/temp01.dbf' DROP INCLUDING DATAFILE
S;
/*刪除此暫時檔/u02/oradata/ora11g/temp01.dbf*/
SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files;
TABLESPACE_NAME FILE_ID FILE_NAME
------------------------------ ----------- ----------------------------------------------------------------------------------------
TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp
SQL> SELECT tablespace_name FROM dba_tablespaces WHERE contents='TEMPORARY';
TABLESPACE_NAME
------------------------------
TEMPTS1
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
TEMPFRANK
變更資料檔的大小(Datafile Resize)
變更資料檔的大小,可以由資料庫管理者或 Oracle 自動操作達到。不過 Oracle 自動操作只能增加資料檔
的大小,資料庫管理者確可以增加或減少資料檔大小。
SQL> CREATE TABLESPACE frankts DATAFILE '/u02/oradata/ora11g/frankts01.dbf' SIZE 10M AUTO
EXTEND ON NEXT 10M MAXSIZE 100M;
/*建立一個表格空間frankts,由一個資料檔組成。一開始這個資料檔為10M,如果沒有剩餘空間可供使用,將
會一次增加10M,一直到資料檔為100M為止。*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespac_name='FRANKTS';
FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES
------------ -------------------------------------------------- ------------ ------ ----------------------- ----------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760 YES 1280 104857600
SQL> SELECT file#,name,bytes,create_bytes,block_size FROM v$datafile WHERE file#=5;
FILE# NAME BYTES CREATE_BYTES BLOCK_SIZE
------------ -------------------------------------------------- ------------- ----------------------- -----------------
5 /u02/oradata/ora11g/frankts01.dbf 10485760 10485760 8192
/*v$datafile的create_bytes是這個資料檔的初始大小,bytes為目前的大小。*/
SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 20M;
/*將資料檔的大小增加為20M*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES
------------ -------------------------------------------------- ------------- ------ ----------------------- -----------------
5 /u02/oradata/ora11g/frankts01.dbf 20971520 YES 1280 104857600
SQL> SELECT file#,name,bytes,create_bytes,block_size FROM v$datafile WHERE file#=5;
FILE# NAME BYTES CREATE_BYTES BLOCK_SIZE
------------ -------------------------------------------------- ------------- ----------------------- -----------------
5 /u02/oradata/ora11g/frankts01.dbf 20971520 10485760 8192
SQL> CREATE TABLE system.t1 TABLESPACE frankts AS SELECT * FROM dba_objects;
/*建立一個表格system.t1放在表格空間frankts中*/
SQL> SELECT SUM(bytes) FROM dba_extents WHERE tablespace_name='FRANKTS';
SUM(BYTES)
-----------------
2097152
/*目前表格空間frankts已經被使用的空間大約為2M*/
SQL> INSERT INTO system.t1 SELECT * FROM dba_objects;
SQL> INSERT INTO system.t1 SELECT * FROM dba_objects;
SQL> commit;
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
SQL> SELECT SUM(bytes) FROM dba_extents WHERE tablespace_name='FRANKTS';
SUM(BYTES)
-----------------
6291456
/*經過一些DML後,目前此表格空間已經被使用的空間,已經達到6M左右。*/
SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 10M;
/*將資料檔縮小為10M*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='FRANKTS';
FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES
------------ -------------------------------------------------- ------------- ------ ----------------------- -----------------
5 /u02/oradata/ora11g/frankts01.dbf 20971520 YES 1280 104857600
SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 5M;
ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 5M
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
/*想要更進一步地,將資料檔縮小到5M,但卻失敗了,因為目前已使用的空間已經大於5M。*/
SQL> CREATE BIGFILE TABLESPACE bigts DATAFILE '/u02/oradata/ora11g/bigts01.dbf' SIZE 10M;
/*建立一個BIGFILE型態的表格空間bigts,資料檔大小為10M,但是不會自動增加大小。*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='BIGTS';
FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES
---------- -------------------------------------------------- ------------- ------ ----------------------- -----------------
7 /u02/oradata/ora11g/bigts01.dbf 10485760 NO 0 0
SQL> ALTER TABLESPACE bigts AUTOEXTEND ON ;
/*將資料檔設定為自動增加大小。不過因為是BIGFILE型態的表格空間,所以可以使用表格空間的名字取代資
料檔的名字,因為一個BIGFILE表格空間中只能有一個資料檔。*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='BIGTS';
FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES
---------- -------------------------------------------------- ------------- ------ ----------------------- -----------------
7 /u02/oradata/ora11g/bigts01.dbf 10485760 YES 1 3.5184E+13
SQL> ALTER TABLESPACE bigts RESIZE 20M;
/*因為bigts表格空間為BIGFILE格式。*/
SQL> ALTER TABLESPACE bigts AUTOEXTEND OFF;
/*因為bigts表格空間為BIGFILE格式。*/
SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
HERE tablespace_name='BIGTS';
FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES
---------- -------------------------------------------------- ------------- ------ ----------------------- -----------------
7 /u02/oradata/ora11g/bigts01.dbf 20971520 NO 0 0
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
縮小暫時表格空間(Shrink Space)
暫時表格空間的主要用途為存放進行磁碟排序時,所產生的暫時資料。這些暫時資料在排序完成後就不再
被需要,其所佔的空間可以被重複使用,以避免暫時表格空間的大小成長。但是如果同時間有大量的磁碟
排序需求,可能造成暫時表格空間的空間成長,但是事後卻沒有如此多的空間需求,導致暫時表格空間過
大。自 Oracle11g 後,資料庫管理者可以縮小暫時表格空間的大小,而不需要重建暫時表格空間。
SQL> SELECT tablespace_name FROM dba_tablespaces WHERE contents='TEMPORARY';
TABLESPACE_NAME
------------------------------
TEMPTS1
TEMPFRANK
SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files;
TABLESPACE_NAME FILE_ID FILE_NAME
------------------------------ ----------- ----------------------------------------------------------------------------------------
TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp
SQL> ALTER TABLESPACE tempts1 ADD TEMPFILE '/u02/oradata/ora11g/temp01.dbf' SIZE 100M;
/*加一個暫時檔到表格空間tempts1,此暫時檔大小為100M*/
SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files;
TABLESPACE_NAME FILE_ID FILE_NAME
------------------------------ ----------- ----------------------------------------------------------------------------------------
TEMPTS1 1 /u02/oradata/ora11g/temp01.dbf
TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp
SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1';
SUM(BYTES)
------------------
104857600
SQL> ALTER TABLESPACE tempts1 SHRINK SPACE KEEP 20M;
/*將暫時表格空間縮小到20M,但不會影響到正在進行的磁碟排序。*/
SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1';
SUM(BYTES)
------------------
22020096
SQL> ALTER TABLESPACE tempts1 SHRINK SPACE ;
/*儘可能將暫時表格空間縮到最小。*/
SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1';
SUM(BYTES)
------------------
1114112
/*暫時檔被縮小到1M*/
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
SQL> ALTER DATABASE TEMPFILE '/u02/oradata/ora11g/temp01.dbf' RESIZE 100M;
/*將暫時檔設定為100M*/
SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1';
SUM(BYTES)
------------------
104857600
6.3.2 變更表格空間的狀態
一個表格空間的狀態可以分成:ONLINE(線上) 、OFFLINE(離線)、Read Only(唯讀)等三種。
線上(ONLINE)
表示這個表格空間中的區段(SEGMENT)的資料可以被讀/寫(Read/Write),或進行任何區段定義的操作,
如建立、刪除、修改等操作 ,這種狀態是表格空間的預設狀態。
SQL> SELECT tablespace_name,status FROM dba_tablespaces WHERE tablespace_name='BIGTS';
TABLESPACE_NAME STATUS
------------------------------ ------------
BIGTS ONLINE
SQL> CREATE TABLE system.t2 TABLESPACE bigts AS SELECT * FROM dba_objects;
/*建立一個測試表格在bigts表格空間中。*/
SQL> SELECT COUNT(*) FROM system.t2;
COUNT(*)
--------------
15714
SQL> DELETE system.t2 WHERE object_id<=10;
SQL> COMMIT;
/*system.t這個表格目前可以被DML。*/
SQL> SELECT COUNT(*) FROM system.t2;
COUNT(*)
----------
15705
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
SQL> ALTER TABLE system.t2 DROP COLUMN namespace;
/*system.t2這個表格目前可以被DDL。*/
SQL> DROP TABLE system.t2;
/*system.t2這個表格可以被刪除。*/
唯讀(READ ONLY)
表示這個表格空間只允許查詢(Query)操作,不能夠進行區段的資料異動(DML)或建立區段的操作。但是
可以刪除或修改區段的定義(因為區段的定義是存放在 SYSTEM 表格空間中,只有區段的資料才是存放在
一般的表格空間中,所以可以進行那些不需要異動區段所在表格空間內容的操作)。
資料庫管理者進行唯讀某個表格空間的操作時,這個操作可能不會立刻完成。因為 Oracle 資料庫必須等
到所有已經對這個表格空間中的資料進行異動的交易都結束(交易確認或退回)後,才會完成將表格空間設
定為唯讀狀態的操作,這種狀態稱作 Transitional Read Only。之後 DBWR 會將所有屬於此表格空間的
DIRTY BUFFERs 都寫回相對的資料檔,CKPT 將相對的檢查點資訊(Checkpoint Information)記錄到所
有的控制檔與該表格空間中所有的資料檔檔頭。最後 Oracle 資料庫便會將資料檔的檔頭與資料檔都設定
為唯讀,之後任何的異動都不允許發生。
為什麼要將表格空間狀態設為唯讀?因為有時候需要將表格空間的內容開放查詢,但卻又不希望表格空間
內容被改變,這時將表格空間狀態設定為唯讀便是一個好的選擇。當然也可以用在需要將磁碟空間讓給需
要異動的表格空間,所以要將某些表格空間搬移到唯讀裝置(WROM)。
註記:SYSTEM、SYSAUX 與所有還原(UNDO)或暫時(TEMPORARY)型態的表格空間都不能設定唯讀
狀態。
SQL> SELECT tablespace_name,status FROM dba_tablespaces WHERE tablespace_name='BIGTS';
TABLESPACE_NAME STATUS
------------------------------- ------------
BIGTS ONLINE
SQL> CREATE TABLE system.t3 TABLESPACE bigts AS SELECT * FROM dba_objects;
/*建立一個測試表格在bigts表格空間。*/
SQL> ALTER TABLESPACE bigts READ ONLY;
/*將bigts表格空間的狀態設定為唯讀。*/
SQL> SELECT tablespace_name,status FROM dba_tablespaces WHERE tablespace_name='BIGTS';
TABLESPACE_NAME STATUS
------------------------------ ------------------
BIGTS READ ONLY
SQL> DELETE system.t3 WHERE object_id<=10;
DELETE system.t3 WHERE object_id<=10
*
ERROR at line 1:
ORA-00372: file 7 cannot be modified at this time
ORA-01110: data file 7: '/u02/oradata/ora11g/bigts01.dbf'
/*目前此表格空間內的任何區段都不能被異動。*/
SQL> ALTER TABLE system.t3 DROP COLUMN secondary;
ALTER TABLE system.t3 DROP COLUMN secondary
*
Chapter	6	Tablespace	
Oracle	Database	11g	資料庫管理入門	
ERROR at line 1:
ORA-12985: tablespace 'BIGTS' is read only, cannot drop column
/*當表格空間狀態為唯讀時,只能進行不會影響到此表格空間中區段的DDL指令,如DROP TABLE。但是如
果是DROP COLUMN會出現錯誤訊息,因為除了異動資料辭典外,也會異動表格內容。*/
SQL> alter table system.t3 add (testcol2 varchar2(10) default 'TestCol2');
alter table system.t3 add (testcol2 varchar2(10) default 'TestCol2')
*
ERROR at line 1:
ORA-00372: file 7 cannot be modified at this time
ORA-01110: data file 7: '/u02/oradata/ora11g/bigts01.dbf'
SQL> ALTER TABLE system.t3 ADD (testcol VARCHAR2(10));
/*這個ADD COLUMN可以成功執行,因為所加入的欄位並沒有預設值,所以只有異動到資料辭典(SYSTEM
表格空間),並未異動到bigts表格空間上的區段。*/
SQL> DROP TABLE system.t3;
/*這個指令只影響到資料辭典內容(Dictionary Managed Tablespace)或資料辭典內容與資料檔檔頭(Locally
Managed Tablespace)。*/
SQL> CREATE TABLE system.t4 TABLESPACE bigts AS SELECT * FROM dba_objects;
CREATE TABLE system.t4 TABLESPACE bigts AS SELECT * FROM dba_objects
*
ERROR at line 1:
ORA-01647: tablespace 'BIGTS' is read only, cannot allocate space in it
SQL> ALTER TABLESPACE bigts READ WRITE;
/*將表格空間狀態設定為可讀寫即線上。*/
Oracle Tablespace介紹
Oracle Tablespace介紹
Oracle Tablespace介紹
Oracle Tablespace介紹
Oracle Tablespace介紹
Oracle Tablespace介紹
Oracle Tablespace介紹
Oracle Tablespace介紹

More Related Content

What's hot

Oracle Database Management Basic 1
Oracle Database Management Basic 1Oracle Database Management Basic 1
Oracle Database Management Basic 1Chien Chung Shen
 
Oracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryOracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryChien Chung Shen
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptChien Chung Shen
 
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングしばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングオラクルエンジニア通信
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptChien Chung Shen
 
How to Use Oracle RAC in a Cloud? - A Support Question
How to Use Oracle RAC in a Cloud? - A Support QuestionHow to Use Oracle RAC in a Cloud? - A Support Question
How to Use Oracle RAC in a Cloud? - A Support QuestionMarkus Michalewicz
 
Sga internals
Sga internalsSga internals
Sga internalssergkosko
 
シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析Yohei Azekatsu
 
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~Shinnosuke Akita
 
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -歩 柴田
 
Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)オラクルエンジニア通信
 
Ms sql server architecture
Ms sql server architectureMs sql server architecture
Ms sql server architectureAjeet Singh
 
Troubleshooting Tips and Tricks for Database 19c - EMEA Tour Oct 2019
Troubleshooting Tips and Tricks for Database 19c - EMEA Tour  Oct 2019Troubleshooting Tips and Tricks for Database 19c - EMEA Tour  Oct 2019
Troubleshooting Tips and Tricks for Database 19c - EMEA Tour Oct 2019Sandesh Rao
 
とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...
とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...
とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...オラクルエンジニア通信
 
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...オラクルエンジニア通信
 
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -歩 柴田
 
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2Tanel Poder
 

What's hot (20)

Oracle Database Management Basic 1
Oracle Database Management Basic 1Oracle Database Management Basic 1
Oracle Database Management Basic 1
 
Oracle 資料庫建立
Oracle 資料庫建立Oracle 資料庫建立
Oracle 資料庫建立
 
Oracle Database Management - Backup/Recovery
Oracle Database Management - Backup/RecoveryOracle Database Management - Backup/Recovery
Oracle Database Management - Backup/Recovery
 
Oracle Database SQL Tuning Concept
Oracle Database SQL Tuning ConceptOracle Database SQL Tuning Concept
Oracle Database SQL Tuning Concept
 
Understanding index
Understanding indexUnderstanding index
Understanding index
 
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニングしばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
しばちょう先生による特別講義! RMANバックアップの運用と高速化チューニング
 
Oracle Database Performance Tuning Concept
Oracle Database Performance Tuning ConceptOracle Database Performance Tuning Concept
Oracle Database Performance Tuning Concept
 
How to Use Oracle RAC in a Cloud? - A Support Question
How to Use Oracle RAC in a Cloud? - A Support QuestionHow to Use Oracle RAC in a Cloud? - A Support Question
How to Use Oracle RAC in a Cloud? - A Support Question
 
Sga internals
Sga internalsSga internals
Sga internals
 
シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析シンプルでシステマチックな Oracle Database, Exadata 性能分析
シンプルでシステマチックな Oracle Database, Exadata 性能分析
 
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~
 
Oracle ASM Training
Oracle ASM TrainingOracle ASM Training
Oracle ASM Training
 
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
まだ統計固定で消耗してるの? - Bind Peek をもっと使おうぜ! 2015 Edition -
 
Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)Oracle WebLogic Server製品紹介資料(2020年/3月版)
Oracle WebLogic Server製品紹介資料(2020年/3月版)
 
Ms sql server architecture
Ms sql server architectureMs sql server architecture
Ms sql server architecture
 
Troubleshooting Tips and Tricks for Database 19c - EMEA Tour Oct 2019
Troubleshooting Tips and Tricks for Database 19c - EMEA Tour  Oct 2019Troubleshooting Tips and Tricks for Database 19c - EMEA Tour  Oct 2019
Troubleshooting Tips and Tricks for Database 19c - EMEA Tour Oct 2019
 
とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...
とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...
とっておきの方法! Oracle Databaseの自動アップグレードのお勧め手法 省力・最新化 概要編 (Oracle Cloudウェビナーシリーズ: ...
 
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
[Oracle DBA & Developer Day 2016] しばちょう先生の特別講義!!ストレージ管理のベストプラクティス ~ASMからExada...
 
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
Bind Peek をもっと使おうぜ!(柴田 歩) - JPOUG Advent Calendar 2014(Day 5) -
 
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
Tanel Poder - Troubleshooting Complex Oracle Performance Issues - Part 2
 

Similar to Oracle Tablespace介紹

A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步WASecurity
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storageted-xu
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题WASecurity
 
【Ask maclean技术分享】oracle dba技能列表 z
【Ask maclean技术分享】oracle dba技能列表 z【Ask maclean技术分享】oracle dba技能列表 z
【Ask maclean技术分享】oracle dba技能列表 zmaclean liu
 
了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinition了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinitionmaclean liu
 
资身Dba经验谈
资身Dba经验谈资身Dba经验谈
资身Dba经验谈yiditushe
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashbackted-xu
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获maclean liu
 
分区表基础知识培训
分区表基础知识培训分区表基础知识培训
分区表基础知识培训maclean liu
 
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程Oracle北大青鸟完全教程
Oracle北大青鸟完全教程yiditushe
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)yiditushe
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recoveryted-xu
 
Sql语句编写优化和基本原理总结
Sql语句编写优化和基本原理总结Sql语句编写优化和基本原理总结
Sql语句编写优化和基本原理总结wangchongan
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuningted-xu
 
11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert systemted-xu
 
第4章 数据库管理
第4章 数据库管理第4章 数据库管理
第4章 数据库管理zhang shuren
 
Essential oracle security internal for dba
Essential oracle security internal for dbaEssential oracle security internal for dba
Essential oracle security internal for dbamaclean liu
 
Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期yiditushe
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器Leyi (Kamus) Zhang
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance managementted-xu
 

Similar to Oracle Tablespace介紹 (20)

A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步A.oracle 数据字典与脚本初步
A.oracle 数据字典与脚本初步
 
5, OCP - oracle storage
5, OCP - oracle storage5, OCP - oracle storage
5, OCP - oracle storage
 
A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题A.oracle 查询结果的缓存问题
A.oracle 查询结果的缓存问题
 
【Ask maclean技术分享】oracle dba技能列表 z
【Ask maclean技术分享】oracle dba技能列表 z【Ask maclean技术分享】oracle dba技能列表 z
【Ask maclean技术分享】oracle dba技能列表 z
 
了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinition了解Oracle在线重定义online redefinition
了解Oracle在线重定义online redefinition
 
资身Dba经验谈
资身Dba经验谈资身Dba经验谈
资身Dba经验谈
 
10, OCP - flashback
10, OCP - flashback10, OCP - flashback
10, OCP - flashback
 
11g新特性streams同步捕获
11g新特性streams同步捕获11g新特性streams同步捕获
11g新特性streams同步捕获
 
分区表基础知识培训
分区表基础知识培训分区表基础知识培训
分区表基础知识培训
 
Oracle北大青鸟完全教程
Oracle北大青鸟完全教程Oracle北大青鸟完全教程
Oracle北大青鸟完全教程
 
Itpub电子杂志(第五期)
Itpub电子杂志(第五期)Itpub电子杂志(第五期)
Itpub电子杂志(第五期)
 
7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery7, OCP - configure database for backup and recovery
7, OCP - configure database for backup and recovery
 
Sql语句编写优化和基本原理总结
Sql语句编写优化和基本原理总结Sql语句编写优化和基本原理总结
Sql语句编写优化和基本原理总结
 
12, OCP - performance tuning
12, OCP - performance tuning12, OCP - performance tuning
12, OCP - performance tuning
 
11, OCP - awr & alert system
11, OCP - awr & alert system11, OCP - awr & alert system
11, OCP - awr & alert system
 
第4章 数据库管理
第4章 数据库管理第4章 数据库管理
第4章 数据库管理
 
Essential oracle security internal for dba
Essential oracle security internal for dbaEssential oracle security internal for dba
Essential oracle security internal for dba
 
Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期Csdn Emag(Oracle)第二期
Csdn Emag(Oracle)第二期
 
数据库性能诊断的七种武器
数据库性能诊断的七种武器数据库性能诊断的七种武器
数据库性能诊断的七种武器
 
3, OCP - instance management
3, OCP - instance management3, OCP - instance management
3, OCP - instance management
 

More from Chien Chung Shen

Oracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column StoreOracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column StoreChien Chung Shen
 
Oracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation ConceptOracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation ConceptChien Chung Shen
 
Hadoop Essential for Oracle Professionals
Hadoop Essential for Oracle ProfessionalsHadoop Essential for Oracle Professionals
Hadoop Essential for Oracle ProfessionalsChien Chung Shen
 

More from Chien Chung Shen (7)

Databases on AWS
Databases on AWSDatabases on AWS
Databases on AWS
 
Awsomeday ntc
Awsomeday ntcAwsomeday ntc
Awsomeday ntc
 
MySQL SQL Tutorial
MySQL SQL TutorialMySQL SQL Tutorial
MySQL SQL Tutorial
 
Oracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column StoreOracle 12cR1 In-Memory Column Store
Oracle 12cR1 In-Memory Column Store
 
Mssql to oracle
Mssql to oracleMssql to oracle
Mssql to oracle
 
Oracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation ConceptOracle Database Undo Segment Operation Concept
Oracle Database Undo Segment Operation Concept
 
Hadoop Essential for Oracle Professionals
Hadoop Essential for Oracle ProfessionalsHadoop Essential for Oracle Professionals
Hadoop Essential for Oracle Professionals
 

Oracle Tablespace介紹

  • 1. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 第六章 表格空間 前言 當一個資料庫建立完成後,除了基本的表格空間外,資料庫管理者還可以建立一些額外的表格空間,這些 的表格空間可以讓資料庫的整體架構在管理面、效能面上,有著更佳的效能表現。而且整個資料庫中,表 格空間佔據整體空間中最大部分,充分地了解表格空間的真正內涵,是每個資料庫管理者的重要課題之一。 6.1 基本的表格空間 每個資料庫建立後,一定會有一些基本且必要的表格空間如:SYSTEM 與 SYSAUX 表格空間。在正常 的資料庫架構下,還會有一個還原(UNDO)型態的表格空間與一個暫時(TEMPORARY)型態的表格空間存 在。現在就開始對這些基本的表格空間進行基礎的說明。 6.1.1 系統表格空間-SYSTEM TABLESPACE 每個資料庫中ㄧ定會有一個而且只有一個系統表格空間。這個表格空間主要是用來存放所謂的資料辭典 (Data Dictionary),這些資料辭典表格是由 SYS 這個使用者擁有,其中的資料用來描述資料庫中的相關 結構,例如:資料庫的邏輯結構、表格的結構、索引的結構等等。所以 Oracle 執行處理可以透過資料辭 典了解整個資料庫的結構。正因為此表格空間的特殊性值,因此不建議放任何非資料辭典的物件在此表格 空間中。同時系統表格空間中還有一個還原區段:SYSTEM ROLLBACK SEGMENT(系統還原區段),這 個還原區段專門用來存放在系統表格空間中的區段上所產生的還原資訊。這個表格空間的非常重要,所以 一定要存在而且不能改名、離線或唯讀。 資料辭典 因為 Oracle 資料庫是依循關連式資料庫理論所誕生的第一個資料庫,所以它遵守著關連式資料庫的重要 準則:Codd’s 12 Rules。其中的第四條規則為”資料庫必須有ㄧ個線上目錄(Online Catalog),其中存 有此資料庫的描述資料,讓有存取權限的管理者,可以透過查詢語言查詢資料庫的結構”。這個要求在 Oracle 資料庫中是以資料辭典來提供此功能。所以使用者可以透過 SQL 的查詢指令(Select),來查詢資 料庫中的相關結構資訊。 Codd’12 Rules E.F.Codd是關聯式資料庫理論的創始人,他從1960年代就開始提出一系列的關聯式資料庫理論文 章,其中最重要的文章是1970年的” A Relational Model of Data for Large Shared Data Bank s”,也是Oracle資料庫的主要理論來源。 Codd在1985年發表在Computer World的兩篇文章中, 提出Codd’s 12 Rules規範所謂的關聯式資料庫應該遵守的規則。其實這Codd’s 12 Rules是由13 條規則組成,由Rule 0到Rule 12。不過由於這些規則有的實在太過於嚴格,所以目前市面上暫時 找不到完全遵守這些規則的關聯式資料庫產品,特別是在Rule 6,9,10,11,12。 Rule 0:Data Management Via Relational Capability Rule 1:The Information Rule Rule 2:Guaranteed Access Rule Rule 3:Systematic Treatment of Null Values Rule 4:Dynamic On-Line Catalog Based on the Relational Model Rule 5:Comprehensive Data Sublanguage Rule 6:View Updating Rule Rule 7:High-level Insert,Update,and Delete Rule 8:Physical Data Independence Rule 9:Logical Data Independence Rule 10:Integrity Independence
  • 2. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 Rule 11:Distribution Independence Rule 12:Nonsubversion Rule 資料辭典視圖(Data Dictionary View) 在建立資料庫的過程中,Oracle 執行處理會自動執行 SQL.BSQ 用來建立資料辭典。不過這些資料表格 都經過正規化(Normalization)的處理,所以如果要直接使用查詢指令存取資料辭典,需要使用大量的結合 指令(Join)才能取的有意義的資訊。此外為節省儲存空間,資料辭典中的資料大多是以數字的型式存在, 但是資料庫管理者對這些數字資料的內容轉換為文字敘述的過程,需要記憶大量的對映資訊。例如:資料 辭典中有一個表格 TAB$,每個表格都有一筆記錄在其中,可是如果要查詢某個表格有幾個欄位及欄位的 資料型態,則必須查詢 COL$才可以得到。 [oracle@ELinux ~]$ export ORACLE_SID=ora11g [oracle@ELinux ~]$ sqlplus / as sysdba /*以SYSDBA身分登入*/ SQL> SHOW USER USER is "SYS" SQL> SELECT COUNT(*) FROM sys.tab$; COUNT(*) -------------- 1019 /*原來共有1019個表格*/ SQL> SELECT COUNT(*) FROM sys.col$; COUNT(*) -------------- 51302 /*原來共有51302個欄位*/ SQL> CREATE TABLE testuser.testtab 2 (col1 NUMBER, 3 col2 VARCHAR2(20), 4 col3 DATE) 5 TABLEAPCE users; /*建立一個新的表格,此表格有3個欄位*/ SQL> SELECT COUNT(*) FROM sys.tab$; COUNT(*) ---------------- 1020 /*現在多了一個表格記錄*/ SQL> SELECT COUNT(*) FROM sys.col$; COUNT(*) ---------------- 51305 /*51305=51302+3,因為新增的表格有3個欄位,所以這裡新增三筆欄位的記錄*/
  • 3. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 不過如果想要查詢 TAB$或 COL$的記錄,必須先知道此表格的物件編號(OBJECT ID),這物件編號必須 從 OBJ$中才能查知。然後由 TAB$中可得知表格的相關資料,COL$中可得知欄位相關的資料,如果想 要得知這個表格放在哪個表格空間中,必須要再由 TS$中得知。 SQL> SELECT obj# FROM sys.obj$ WHERE name='TESTTAB'; OBJ# -------- 11970 SQL> SELECT obj#,ts#,cols FROM tab$ WHERE obj#=11970; OBJ# TS# COLS --------- ------ -------- 11970 4 3 SQL> SELECT name FROM ts$ WHERE ts#=4; NAME ---------- USERS SQL> SELECT name,type# FROM col$ WHERE obj#=11970; NAME TYPE# --------- ---------- COL1 2 ß NUMBER or FLOAT COL2 1 ß VARCHAR2 or NVARCHAR2 COL3 12 ß DATE 依照上面的程式範例來看,只不過想看一些基本的資料,就要查詢好多的資料辭典,並且要了解資料辭典 表格之間的關聯,與一些數字與其所代表的意義。所以在建立資料庫後,資料庫管理者可以執行 CATALOG.SQL 指令稿,用來建立資料辭典視圖,讓使用者可以藉由簡單的視圖存取資料辭典的資料。 例如只要查詢 DBA_TABLES 與 DBA_TAB_COLUMNS 即可取代上面的查詢指令。 SQL> SELECT table_name,tablespace_name FROM dba_tables WHERE table_name='TESTTAB'; TABLE_NAME TABLESPACE_NAME ------------------------------ ------------------------------ TESTTAB USERS SQL> SELECT column_name,data_type FROM dba_tab_columns WHERE table_name='TESTTAB'; COLUMN_NAME DATA_TYPE ------------------------------ ---------------------------------------- COL1 NUMBER COL2 VARCHAR2 COL3 DATE 不過為了方便使用者使用這些資料辭典視圖,Oracle 提供一個視圖 DICTIONARY,其中包含所有資料辭 典視圖的名字與註解。只要使用者知道視圖的名字或相關資訊就可以透過 DICTIONARY 查出相關視圖的 資訊。 SQL> DESCRIBE dictionary Name Null? Type ----------------------------------------------------- ---------- ---------------------------------------- TABLE_NAME VARCHAR2(30) COMMENTS VARCHAR2(4000) SQL> COL table_name FORMAT a30 SQL> COL comments FORMAT a60 wrap SQL> SELECT table_name,comments FROM dictionary WHERE table_name LIKE '%INDEX%';
  • 4. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 TABLE_NAME COMMENTS ------------------------------------------------------ ------------------------------------------------------------ ALL_INDEXES Descriptions of indexes on tables accessible to the user ALL_INDEXTYPES All indextypes available to the user ALL_INDEXTYPE_ARRAYTYPES All array types specified by the indextype ALL_INDEXTYPE_COMMENTS Comments for user-defined indextypes ……………………………………………..以下省略 同時 Oracle 也將這些視圖分成三種簡單的分類:USER_XXX、ALL_XXX 與 DBA_XXX,分別表示不同 範圍的內容。XXX 可能為任何長度的字串。 • USER_XXX 表示為目前此會談的使用者所擁有的相關物件,例如 USER_TABLES 表示此使用者 所擁有的所有表格所組成的資料辭典視圖。 • ALL_XXX 表示為此會談的使用者所能存取的相關物件,包含使用者自己擁有的物件以及他人授 權可以存取的物件。因此 ALL_XXX 與 USER_XXX 相比之下,多了一個欄位 OWNER,用來區 分物件的擁有者。例如 ALL_TABLES 表示此使用者所能存取的所有表格。 • DBA_XXX 表示為整個資料庫的所有相關物件,所以必須擁有 DBA 角色的人才能存取。這些視圖 也有一個欄位 OWNER,用來區分物件的擁有者。例如 DBA_TABLES 表示此資料庫的所有的 表格。 SQL> SHOW USER USER is "SYS" SQL> SELECT COUNT(*) FROM user_tables; COUNT(*) ------------- 837 SQL> SELECT COUNT(*) FROM all_tables; COUNT(*) ------------- 1010 SQL> SELECT COUNT(*) FROM dba_tables; COUNT(*) ------------- 1010 SQL> CONNECT testuser/oracle SQL> SHOW USER USER is "TESTUSER" SQL> SELECT COUNT(*) FROM user_tables; COUNT(*) ------------- 1 SQL> SELECT COUNT(*) FROM all_tables; COUNT(*) ------------- 24 SQL> SELECT COUNT(*) FROM dba_tables; SELECT COUNT(*) FROM dba_tables ß 因為TESTUSER的權限不足 * ERROR at line 1: ORA-00942: table or view does not exist
  • 5. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 6.1.2 SYSAUX 表格空間 SYSAUX 表格空間是從 Oracle10g 開始出現的必要存在表格空間,這個表格空間從名字來 看’SYSAUX=SYStem AUXiliary’就可以知道是用來輔助系統表格空間而產生的表格空間。其內容是 存放那些雖然不是資料辭典,但也是 Oracle 系統所需要的表格,如 AWR(Automatic Workload Repository)、XML 資料庫、JVM、Oracle TEXT 等功能所需要的表格。這些表格分別屬於不同的綱要 (SCHEMA),提供不同的 Oracle 功能所使用。在 Oracle10g 之前只有 SYSTEM 表格空間是必要的,其 餘的表格空間都是可以選擇不建立。 由於這個表格空間是必要存在的,所以這個表格空間不能被刪除、更名、傳遞或唯讀,但是可以被離線。 當此表格空間被離線時,相關的 Oracle 功能就不能被使用,但是不影響整個資料庫的運行。 同時在 Oracle10g 之前,現在被放在 SYSAUX 表格空間的綱要物件,其實是分別放在不同的表格空間中, 現在只是化繁為簡地將所有的相關綱要物件統一的存放在 SYSAUX 表格空間中,以減輕資料庫管理者的 管理成本。 Option or Feature Schema Tablespace in 8, 8i or 9i ---------------------------- ------------------ --------------------------------- OLAP CWMLITE CWMLITE Text CTXSYS DRSYS Ultra Search WKSYS DRSYS Intermedia and Spatial ORDSYS SYSTEM Workspace Manager WMSYS Data Mining DMSYS ODM EM Repository SYSMAN OEM_REPOSITORY Streams SYS SYSTEM LogMiner SYSTEM SYSTEM Logical Standby SYSTEM SYSTEM Statspack PERFSTAT 管理者指定 Job Scheduler SYS SYSTEM 如果資料庫管理者想要回復為 Oracle9i 的方式,必須自己將相關的綱要物件搬移到其他的表格空間中。 不過不是每個綱要物件都可以搬移到其他的表格空間,如 AUTO_TASK、EM_MONITORING_USER 等 等,最簡單的方法,就是由 V$SYSAUX_OCCUPANTS 中的 MOVE_PROCEDURE,如果沒有任何搬移 方式,則表示此綱要物件就不能搬移到其他的表格空間或是要資料庫管理者自己想辦法。 SQL> SELECT occupant_name,schema_name,NVL(move_procedure,’不能搬移’) MOVE_PROCEDURE 2 FROM v$sysaux_occupants 3 ORDER BY occupant_name; OCCUPANT_NAME SCHEMA_NAME MOVE_PROCEDURE ------------------------------------------ ----------------------- ---------------------------------------- AO SYS DBMS_AW.MOVE_AWMETA AUTO_TASK SYS 不能搬移 EM SYSMAN emd_maintenance.move_em_tblspc EM_MONITORING_USER DBSNMP 不能搬移 EXPRESSION_FILTER EXFSYS 不能搬移 JOB_SCHEDULER SYS 不能搬移 LOGMNR SYSTEM SYS.DBMS_LOGMNR_D.SET_TABLESPACE LOGSTDBY SYSTEM SYS.DBMS_LOGSTDBY.SET_TABLESPACE ORDIM ORDSYS 不能搬移 ORDIM/PLUGINS ORDPLUGINS 不能搬移 ORDIM/SQLMM SI_INFORMT 不能搬移
  • 6. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 PL/SCOPE SYS 不能搬移 SDO MDSYS MDSYS.MOVE_SDO SM/ADVISOR SYS 不能搬移 SM/AWR SYS 不能搬移 SM/OPTSTAT SYS 不能搬移 SM/OTHER SYS 不能搬移 SMON_SCN_TIME SYS 不能搬移 SQL_MANAGEMENT_BASE SYS 不能搬移 STATSPACK PERFSTAT 使用export/import的方式 STREAMS SYS 不能搬移 TEXT CTXSYS DRI_MOVE_CTXSYS TSM TSMSYS 不能搬移 ULTRASEARCH WKSYS MOVE_WK ULTRASEARCH_DEMO_USER WK_TEST MOVE_WK WM WMSYS DBMS_WM.move_proc XDB XDB XDB.DBMS_XDB.MOVEXDB_TABLESPACE XSAMD OLAPSYS DBMS_AMD.Move_OLAP_Catalog XSOQHIST SYS DBMS_XSOQ.OlapiMoveProc 範例:將Log Miner所用的表格搬到LOGMNR_TS這個表格空間 SQL> EXECUTE SYS.DBMS_LOGMNR_D.SET_TABLESPACE(‘LOGMNR_TS’); 範例:將Log Miner所用的表格搬回SYSAUX Tablespace SQL> EXECUTE SYS.DBMS_LOGMNR_D.SET_TABLESPACE(‘SYSAUX’);
  • 7. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 6.1.3 預設的暫時型態表格空間(Default Temporary Tablespace) 雖然資料庫中只有 SYSTEM 與 SYSAUX 兩個表格空間為必要存在的表格空間。但是每個資料庫必須有 一個預設的暫存表格空間存在,如果當 SYSTEM 表格空間的空間管理方式為說明管理(DICTIONARY MANAGEMENT)時,資料庫管理者可以將 SYSTEM 表格空間當作預設的暫時表格空間,不過這樣的組 態方式對資料庫的管理與效能有著不良的影響。可是若當 SYSTEM 表格空間的空間管理方式為本機管理 (LOCALLY MANAGEMENT)時,表格空間的類型為永久或還原的表格空間,不能當作資料庫預設的暫 時表格空間,所以必須建立一個暫時型態的表格空間,當作資料庫的預設暫時表格空間。 每個資料庫中的使用者帳號,都有一個設定值-暫存表格空間(TEMPORARY TABLESPACE),當做此使 用者進行磁碟排序時所使用的暫存表格空間。不過如果當建立新的使用者帳號時,沒有設定暫時表格空間 的參數,Oracle 伺服器會使用 Oracle 資料庫的預設暫時表格空間設定值當作此使用者帳號的設定值。 暫時表格空間是用來放置暫時區段(TEMPORARY SEGMENT)。當使用者執行 SQL 指令時,有時需要進 行一些排序操作,如使用到 GROUP BY、ORDER BY、GROUPING FUNCTION(AVG、MIN、MAX etc..)、CREATE INDEX 等。這些排序操作預設是在 SERVER PROCESS 的 PGA 空間中進行,這種稱 作 MEMORY SORT(記憶體排序)。若所需要排序的資料過大,無法在 PGA 完成排序,則會將需要排序的 資料暫時寫到暫時表格空間中,然後配合 PGA 進行排序,這種排序方式稱作 DISK SORT(磁碟排序),這 種排序方式的效能比較慢,因為需排序的資料比較多外,磁碟機的存取速度比記憶體慢也是主因。 所以如果可以結果可以不要排序,就盡量不要加上會造成排序的指令。如果一定要排序,則盡量使用記憶 體排序。若發生真的不可避免發生磁碟排序,則盡量讓整體的磁碟排序成本下降,就是正確設定暫存表格 空間。 SQL> SELECT username,temporary_tablespace FROM dba_users; USERNAME TEMPORARY_TABLESPACE ------------------------------ ------------------------------ OUTLN TEMP SYS TEMP SYSTEM TEMP DBSNMP TEMP TSMSYS TEMP DIP TEMP ORACLE_OCM TEMP ……… SQL> SELECT property_name,property_value FROM database_properties 2 WHERE property_name='DEFAULT_TEMP_TABLESPACE'; PROPERTY_NAME PROPERTY_VALUE ------------------------------------------------------ ---------------------------------------- DEFAULT_TEMP_TABLESPACE TEMP ß 資料庫目前的預設值 SQL> CREATE USER testuser IDENTIFIED BY oracle; ß 新增一個測試使用者 User created. SQL> SELECT username,temporary_tablespace FROM dba_users; USERNAME TEMPORARY_TABLESPACE ------------------------------ ------------------------------ OUTLN TEMP SYS TEMP
  • 8. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 SYSTEM TEMP TESTUSER TEMP ß 剛新增的使用者所使用的暫時表格空間 DBSNMP TEMP TSMSYS TEMP DIP TEMP ORACLE_OCM TEMP ……… 如果有必要,事後也可以更改使用者的暫時表格空間,不過只能選擇暫時型態(TEMPORARY)的表格空間, 不能使用其他型態(PERMANENT、UNDO)的表格空間。 SQL> CREATE TMEPORARY TABLESPACE tempts TEMPFILE ‘/u02/oradata/ora11g/tempts01.dbf’ SIZE 100M; ß新增一個暫時表格空間 SQL> SELECT tablespace_name,contents FROM dba_tablespaces; TABLESPACE_NAME CONTENTS ------------------------------ ------------------- SYSTEM PERMANENT SYSAUX PERMANENT UNDOTBS UNDO TEMP TEMPORARY USERS PERMANENT TEMPTS TEMPORARY SQL> ALTER USER testuser TEMPORARY TABLESPACE users; ALTER USER testuser TEMPORARY TABLESPACE users; * ERROR at line 1: ORA-12911: permanent tablespace cannot be temporary tablespace SQL> ALTER USER testuser TEMPORARY TABLESPACE undotbs; ALTER USER testuser TEMPORARY TABLESPACE undotbs * ERROR at line 1: ORA-30034: Undo tablespace cannot be specified as temporary tablespace SQL> ALTER USER testuser TEMPORARY TABLESPACE tempts; User altered. SQL> SELECT username,temporary_tablespace FROM dba_users WHERE username='TESTUSER'; USERNAME TEMPORARY_TABLESPACE ------------------------------ -------------------------------------- TESTUSER TEMPTS 同時資料庫管理者也可以變更資料庫的預設暫時表格空間,不過即使有一個以上的暫時表格空間,也只能 選擇一個為資料庫的預設值。這時候便可以利用暫時表格空間群組,將多個暫時表格空間組合在一起。如 此再將此暫時表格空間群組指派給使用者或當作資料庫預設值,這樣就可以在多人同時操作的環境中,將 磁碟排序的 I/O 操作分散在多個暫時表格空間中,如此可以減少 I/O 競爭的情況發生。 SQL> SELECT property_name,property_value FROM database_properties
  • 9. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 2 WHERE property_name='DEFAULT_TEMP_TABLESPACE'; PROPERTY_NAME PROPERTY_VALUE ------------------------------------------------ -------------------------------------------------- DEFAULT_TEMP_TABLESPACE TEMP SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tempts; SQL> SELECT property_name,property_value FROM database_properties 2 WHERE property_name='DEFAULT_TEMP_TABLESPACE'; PROPERTY_NAME PROPERTY_VALUE ------------------------------------------------ -------------------------------------------------- DEFAULT_TEMP_TABLESPACE TEMPTS 將temp加入tempgroup中,如果目前沒有tempgroup存在,則為自動建立tempgroup。 SQL> alter tablespace temp tablespace group tempgroup; 將temp由tempgroup中移除,若tempgroup沒有任何暫時表格空間,則tempgroup會自動被刪除。 SQL > ALTER TABLESPACE temp TABLESACE GROUP ‘’; 將tempts也加入tempgroup中。 SQL> ALTER TABLESPACE tempts TABLESPACE GROUP TEMPGROUP; 將tempgroup設為系統預設暫時表格空間 SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tempgroup; SQL> SELECT property_name,property_value FROM database_properties 2 WHERE property_name='DEFAULT_TEMP_TABLESPACE'; PROPERTY_NAME PROPERTY_VALUE ------------------------------------------------ -------------------------------------------------- DEFAULT_TEMP_TABLESPACE TEMPGROUP
  • 10. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 6.1.4 自動管理的還原表格空間(Auto Managed UNDO Tablespace) 當資料庫管理者希望將還原區段(UNDO Segment)交由 Oracle 伺服器管理時,資料庫管理者必須先建立 一個還原型態的表格空間,然後在 Oracle 執行處理的參數檔設定:UNDO_MANAGEMENT=AUTO 及 UNDO_TABLESPACE=還原表格空間的名字即可,之後 Oracle 執行處理則會自己決定該建立多少個還 原區段,每個還原區段的大小等問題。資料庫管理者只需要決定還原表格空間的大小即可,而適合的還原 表格空間大小,可以由自動還原管理頁面得知。 還原區段的還原資訊可以用來進行交易退回(TRANSACTION ROLLBACK)、交易復原(TRANSACTION RECOVERY)與讀取一致性(READ CONSISTENT)。這些還原資訊來自於進行資料異動操作(DML)前,儲 存在還原區段的還原資訊。 SQL> SELECT tablespace_name,contents FROM dba_tablespaces; TABLESPACE_NAME CONTENTS ------------------------------ ------------------- SYSTEM PERMANENT SYSAUX PERMANENT UNDOTBS UNDO ß UNDO型態的表格空間,才能被當作自動管理的還原表格空間 TEMP TEMPORARY USERS PERMANENT TEMPTS TEMPORARY …………. SQL> SHOW PARAMETER undo_management NAME TYPE VALUE ------------------------------------------ ----------- ------------ undo_management string AUTO ßOracle Server自動管理還原區段 SQL> SHOW PARAMETER undo_tablespace NAME TYPE VALUE ------------------------------------------ ----------- ------------- undo_tablespace string undotbs ßOracle Server將在此表格空間中建立還原區段
  • 11. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 SQL> SELECT owner,segment_name,tablespace_name FROM dba_rollback_segs; OWNER SEGMENT_NAME TABLESPACE_NAME ------------------ ----------------------------------------------- ------------------------------ SYS SYSTEM SYSTEM PUBLIC _SYSSMU10_1207193410$ UNDOTBS ßOracle Server建立的還原區段 PUBLIC _SYSSMU9_1207193410$ UNDOTBS PUBLIC _SYSSMU8_1207193410$ UNDOTBS PUBLIC _SYSSMU7_1207193410$ UNDOTBS PUBLIC _SYSSMU6_1207193410$ UNDOTBS PUBLIC _SYSSMU5_1207193410$ UNDOTBS PUBLIC _SYSSMU4_1207193410$ UNDOTBS PUBLIC _SYSSMU3_1207193410$ UNDOTBS PUBLIC _SYSSMU2_1207193410$ UNDOTBS PUBLIC _SYSSMU1_1207193410$ UNDOTBS 還原擴充區塊的保留管理 還原區段中的擴充區塊依其的狀態可以分為下列幾種: • 正在使用的擴充區塊(Active Extent):這些擴充區塊上,至少還有一個交易未完成。所以這些擴 充區塊並不能被重新使用。 • 未過期的擴充區塊(Unexpired Extent):這些擴充區塊上的交易都結束了,但是從最後一個交易的 結束時間到現在,並未超過 UNDO_RETENTION 所設定的期限,所以這種擴充區塊稱作未過期。 未過期的擴充區塊在某些情況下,可以被重新使用。 • 過期的擴充區塊(Expired Extent):這些擴充區塊上的交易都結束了,而且從最後一個交易的結束 時間到現在,已超過 UNDO_RETENTION 所設定的期限,所以這種擴充區塊可以立刻被重新使用。 這些還原資訊當整個擴充區塊(Extent)上的交易都結束後,其所佔有的還原區段空間便可以被新的交易使 用。如果資料庫管理者希望將那些已經結束交易的還原資料繼續,可以藉由設定參數 UNDO_RETENTION,讓還原資料保留幾秒鐘。不過還原擴充區塊保留的管理方式有一些特殊的設定(自 動管理與人為管理): 自動管理 從 Oracle10g 開始,Oracle 資料庫建議資料庫管理者可以藉由設定 UNDO_RETENTION 為零 (UNDO_RETENTION=0)或根本不要設定此參數,讓 Oracle 資料庫自行管理還原擴充區塊的管理。還原 擴充區塊的保留時間由 Oracle 資料庫依據現在的還原表格空間的大小與資料庫的交易狀況,自行調整 UNDO_RETENTION 的值。 SQL> SHOW PARAMETER undo_retention NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_retention integer 0
  • 12. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 人為管理 當 UNDO_RETENTION 的參數值不是零,理論上未過期的還原擴充區塊不會被重新使用。可是如果沒有 設定保證還原保留(RETENTION GUARANTEE),即是是未過期的還原擴充區塊也可能會提前被重新使用。 SQL> SHOW PARAMETER undo_retention NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ undo_retention integer 900 SQL> SELECT tablespace_name,retention FROM dba_tablespaces WHERE contents=’UNDO’; TABLESPACE_NAME RETENTION ------------------------------------ ----------------------- UNDOTBS NOGUARANTEE --只有還原型態的表格空間可以設定為絕對保留(RETENTION GURANTEE) SQL> ALTER TABLESPACE undotbs RETENTION GUARANTEE; Tablespace altered. SQL> SELECT tablespace_name,retention FROM dba_tablespaces WHERE contents=’UNDO’; TABLESPACE_NAME RETENTION ------------------------------------ ------------------- UNDOTBS GUARANTEE SQL> SELECT tablespace_name,autoextensible FROM dba_data_files; TABLESPACE_NAME AUT ------------------------------------ --------- SYSTEM YES SYSAUX YES UNDOTBS NO USERS NO TESTTS NO 如果當還原表格空間並未設定自動增長的功能,實際的還原保留時間是由 Oracle 資料庫依據還原表格空 間的大小與 Oracle 資料庫的狀況決定,除非資料庫管理者要求絕對保留(GUARANTEE)。以下為進行中 的交易使用還原的擴充區塊的規則: 當還原表格空間不會自動增長與未設定絕對保留時 1. 使用過期的擴充區塊。 2. 使用未過期的擴充區塊。 如果以上兩種擴充區塊都用完了,但交易卻還沒有結束,這時該交易便會出現錯誤訊息”ORA-01650 unable to extend rollback segment string by string in tablespace string”,表示目前使用中的還原表 格空間的空間不夠,這個交易將會自動被退回(Rollback)。 當還原表格空間不會自動增長與已設定絕對保留時 • 僅能使用過期的擴充區塊,未過期的擴充區塊絕對不會被重新使用。如果所有過期的擴充區塊都 用完了,進行中的交易便會出現錯誤訊息”ORA-01650 unable to extend rollback segment ...
  • 13. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 by ... in tablespace ...”,表示目前使用中的還原表格空間的空間不夠,這個交易將會自動被退 回(Rollback)。 當還原表格空間會自動增長與未設定絕對保留時 1. 使用過期的擴充區塊。 2. 使用未過期的擴充區塊。 3. 當以上兩種擴充區塊都用完了,但交易卻還沒有結束。此時 Oracle Server 會使用資料檔自動增長 功能,增加還原表格空間的大小。然後在將可用的擴充區塊配置給目前使用中的還原區段,讓進 行中的交易可以繼續運行。 當還原表格空間會自動增長與已設定絕對保留時 1. 使用過期的擴充區塊。 2. 因為有設定絕對保留為未過期擴充區塊,所以當過期的擴充區塊都用完了,但交易卻還沒有結束。 此時 Oracle Server 會使用資料檔自動增長功能,增加還原表格空間的大小。然後在將可用的擴充 區塊配置給目前使用中的還原區段,讓進行中的交易可以繼續運行。
  • 14. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 6.2 建立額外的表格空間 一個資料庫只要有 SYSTEM 與 SYSAUX 表格空間就可以成功開啟。但是為了下列幾種原因,建議建立 一些額外的表格空間。 • 更靈活地管理資料庫:因為每個表格空間都可以設定為讀寫、唯讀、離線狀態,讓整個資料庫可 以部份表格空間與其他的表格空間不同,增加資料庫管理者的管理彈性。 • 區隔不同的型態的區段物件:資料辭典、還原區段、暫時區段、表格、索引、叢集等綱要物件, 應該依照不同的型態與使用特色,分別放在不同的表格空間存放。這樣讓資料庫的架構,更具管 理性與效能更好。 • 更細微地控制使用者對資料庫的空間使用:在 Oracle 資料庫中,每個使用者都依照所設定的空間 配額來使用資料庫空間。而空間配額是以使用者與表格空間為依據,所以越多的表格空間,資料 庫管理者有更細微的單位(表格空間)來設定相關的配額。 6.2.1 擴充區塊的管理方式(Extent Management) 因為 Oracle 資料庫中的空間配置單位是擴充區塊(Extent),而每個擴充區塊不是位於可用的狀態(Free Extent),就是使用中的狀態(Used Extent)。也就是說每次當區段(Segment)有空間需求的情況發生時(新 增一個區段或現有區段的擴充區塊都被使用完了),Oracle 資料庫每次至少配置一個可用的擴充區塊給區 段。而表格空間的空間管理方式,可以分為兩種:說明管理(Dictionary Management)、本機管理 (Locally Management),用來表示這個表格空間中那些擴充區塊是可用的(Free Extent)或使用中的 (Used Extent)。 SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces; TABLESPACE_NAME EXTENT_MAN ------------------------------ -------------------- SYSTEM DICTIONARY SYSAUX LOCAL UNDOTBS LOCAL TEMP LOCAL USERS LOCAL
  • 15. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 說明管理(Dictionary Management): 說明管理是 Oracle8i 之前唯一的一種擴充區塊管理的方法,這種方法是利用資料辭典中的兩個表格 FET$ 與 UET$,記錄每個表格空間中可用的擴充區塊(FET$)與使用中的擴充區塊(UET$)。FET$可使用 DBA_FREE_SPACE,而 UET$可以使用 DBA_EXTENTS 觀察其內容。因此當每次建立一個新的區段或 現有區段有增加空間的需求時,Oracle Server 會進行以下的步驟,尋找可用的擴充區塊。 1.Oracle 資料庫會先搜索 FET$,檢查此表格空間中是否有合適的可用擴充區塊可用。 2.如果找到合適可用的擴充區塊,Oracle 資料庫會進行刪除(DELETE)(找到一模一樣大小的可用擴充區 塊,第一優先)或異動(UPDATE)(如果找不到相同大小的可用擴充區塊,但是找到比所需要大小更大的擴 充區塊)的操作,將 FET$中相關的記錄進行修改。之後再將相關擴充區塊的記錄新增(INSERT)到 UET$。 這種 SQL 操作被稱作遞迴的 SQL(Recursive SQL),這些 SQL 指令是為了執行使用者的 SQL 指令, Oracle 資料庫額外所衍生出的 SQL 指令。 3.如果找不到合適可用的擴充區塊,Oracle 資料庫會要求此表格空間的資料檔增加大小,以增加表格空 間的可用空間,這時資料檔必須事先設定好自動成長(AUTOEXTEND)的功能。但是如果此時資料檔沒有 事先設定自動成長的功能,則會出現 ORA-01653: unable to extend table .. in tablespace。 因為這兩個表格位在 SYSTEM 表格空間中,所以越常存取這兩個表格,也越有可能與其他的資料庫操作 資料辭典的動作發生 IO 競爭。而且這兩個表格的異動也會產生重做資訊(REDO)與還原資訊(UNDO),造 成額外的管理成本。最重要的問題是將兩個相鄰的可用的擴充區塊合併為一塊較大的可用擴充區塊,這個 工作是由 SMON 每 12 小時進行一次,這個動作會消耗一定的系統資源。 設定說明管理是在建立表格空間時,利用 EXTENT MANAGEMENT DICTIONARY 子句,將該表格空間 設定為說明管理的表格空間。或者是使用 DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL 將本機管理的表格空間變更為說明 管理。 SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces TABLESPACE_NAME EXTENT_MAN ------------------------------ -------------------- SYSTEM DICTIONARY SYSAUX LOCAL UNDOTBS LOCAL TEMP LOCAL USERS LOCAL SQL> CREATE TABLESPACE testdictts 2 DATAFILE '/u02/oradata/ora11g/testdictts01.dbf' SIZE 10M 3 EXTENT MANAGEMENT DICTIONARY; --這個子句用來指定將表格空間為說明管理 SQL> EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL(‘USERS’); SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces TABLESPACE_NAME EXTENT_MAN ------------------------------ -------------------- SYSTEM DICTIONARY SYSAUX LOCAL UNDOTBS LOCAL
  • 16. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 TEMP LOCAL USERS DICTIONARY TESTDICTTS DICTIONARY --將表格空間變更為本機管理 SQL> EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL(‘USERS’); SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces TABLESPACE_NAME EXTENT_MAN ------------------------------ -------------------- SYSTEM DICTIONARY SYSAUX LOCAL UNDOTBS LOCAL TEMP LOCAL USERS LOCAL TESTDICTTS DICTIONARY 不過以上的說明都建立在一個重要的前提上,就是 SYSTEM 表格空間必須是說明管理,不然將會出現無 法建立說明管理表格空間的錯誤(ORA-12913: Cannot create dictionary managed tablespace)或者無 法將表格空間轉換為說明管理(ORA-12914: Cannot migrate tablespace to dictionary managed type)。 SQL> SELECT tablespace_name,extent_management FROM dba_tablespaces TABLESPACE_NAME EXTENT_MAN ------------------------------ -------------------- SYSTEM LOCAL SYSAUX LOCAL UNDOTBS LOCAL TEMP LOCAL USERS LOCAL SQL> CREATE TABLESPACE testdictts 2 DATAFILE '/u02/oradata/ora11g/testdictts01.dbf' SIZE 10M 3 EXTENT MANAGEMENT DICTIONARY; --這個子句用來指定將表格空間為說明管理 CREATE TABLESPACE testdictts * ERROR at line 1: ORA-12913: Cannot create dictionary managed tablespace --因為SYSTEM表格空間已經是本機管理 因為上述的一些缺點,Oracle 資料庫由 Oracle8i 開始介紹一種新的擴充區塊管理方式-本機管理(Locally Management),這種管理方式可以避免說明管理所帶來的副作用。因此從 Oracle9i 開始本機管理模式成 為表格空間預設的管理方式,而說明管理只是為了提供與之前的 Oracle 版本相容而繼續存在。同時如果 採用 DBCA(資料庫組態輔助管理程式)來建立一個新的資料庫,這時 SYSTEM 表格空間將會設定為本機 管理。 本機管理(Locally Management): 本機管理的擴充區塊管理方式,是在資料檔標頭(Datafile Header)中使用一組位元映像(Bitmap),呈現相 對的擴充區塊的使用狀態。如果位元值為 0,則表示相對的擴充區塊為可用的(Free),反之如果位元值為 1,則表示擴充區塊為使用中(Used)。不過一個位元到底代表幾個資料區塊?則是依據建立表格空間當時 所作的設定,一個位元可以代表一個資料區塊或多個資料區塊。當建立表格空間所使用的參數為
  • 17. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 EXTENT MANAGEMENT LOCAL AUTOALLOCATE 時,這時一個位元代表一個資料區塊。若為 EXTENT MANAGEMENT LOCAL UNIFORM SIZE nM,這時一個位元代表多個資料區塊。 使用本機管理可以避免說明管理所造成的缺點,例如:擴充區塊的配置或收回,只需要變更位元地圖即可, 不需要異動資料辭典中的 FET$與 UET$這兩個表格,因此不會有 REDO 或 UNDO 的資料產生,以及資 料辭典的競爭相對也會減少。而且不需要 SMON 定期合併可用的擴充區塊,因為位元圖中的連續的位元 值為 0,就表示有連續的可用空間可供使用。 SQL> CREATE TABLESPACE testlocalts 2 DATAFILE '/u02/oradata/ora11g/testlocalts01.dbf' SIZE 10M 3 EXTENT MANAGEMENT LOCAL AUTOALLOCATE; --將表格空間設定為本機管理,同時此表格空間上的每個區段,其擴充區塊的大小是由Oracle資料庫自動管 理。 --首先前16個擴充區塊的大小為64K =>16*64K=1M --第17到79個擴充區塊的大小為1M =>63*1M=63M --第80到199個擴充區塊的大小為8M=>200*8M=960M --第200個擴充區塊開始皆為64M SQL> SELECT tablespace_name,extent_management,allocation_type 2 FROM dba_tablespaces 3 WHERE tablespace_name='TESTLOCALTS'; TABLESPACE_NAME EXTENT_MAN ALLOCATIO ------------------------------ ----------------------- ----------------- TESTLOCALTS LOCAL SYSTEM SQL> CREATE TABLESPACE testlocalts 2 DATAFILE '/u02/oradata/ora11g/testlocalts01.dbf' SIZE 10M 3 EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M; --將表格空間設定為本機管理,同時此表格空間上的每個區段,其中每個擴充區塊的大小皆固定為1M。 SQL> SELECT tablespace_name,extent_management,allocation_type 2 FROM dba_tablespaces 3 WHERE tablespace_name='TESTLOCALTS'; TABLESPACE_NAME EXTENT_MAN ALLOCATIO ------------------------------ ----------------------- ----------------- TESTLOCALTS LOCAL UNIFORM
  • 18. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 當每次建立一個新的區段或現有區段有增加空間的需求時,Oracle Server 會進行以下的步驟,尋找可用 的擴充區塊。 1.搜索資料檔的檔頭(File Header)中的位元映像(BitMap),尋找 Bit 值為 0 的那些 Bits。 AUTOALLOCATE:須先確定這個擴充區塊的大小(64K、1M、8M、64M),接著只要找到足夠多的連 續 Bit 值為 0,因為每個 Bit 代表一個資料區塊,如此便可以將這些連續空的資料區塊組成一個自由的擴 充區塊,並將這個擴充區塊配置給需要空間的區段。 UNIFORM:只要找到一個值為 0 的 Bit 即可,因為一個 Bit 代表一組資料區塊,也代表一個擴充區塊, 如此便可以將這個擴充區塊配置給需要空間的區段。 2.如果在 Bitmap 中找不到足夠多個 Bit 值為 0 的連續資料區塊,表示此資料檔的可用空間不足,如果此 資料檔沒有設定可以自動增長大小,將會出現新增表格時的錯誤”ORA-01652: unable to extend temp segment by n in tablespace YYY”或延伸現有表格時的錯誤”ORA-01653: unable to extend table XXX by n in tablespace YYY”。但是如果資料檔有設定可以自動增長大小,此時資料檔將會向檔案系 統要求新增空間,這時所新增的資料檔空間將會被當作可用的擴充區塊,這些新增的可用擴充區塊可以配 置給需要的區段。 6.2.2 區段空間管理(Segment Space Management)
  • 19. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 區段空間管理是用在進行新增(INSERT)資料時,決定哪個資料區塊(Data Block)可以使用,即所謂的可被 新增的資料區塊(Insertable Data Block)。Oracle11g 可以使用兩種方式來管理可被新增使用的資料區塊: FREELIST(手動)與 Automatic Segment Space Management(ASSM 自動)。 首先先對一些名詞進行定義,以方便之後的說明: 高水位標記(High Water Mark):一樣存在於區段表頭區塊中,這個值記錄著這個區段中最後曾經使用過 的最後一個區塊的位置。也就是說如果一個區塊位於 WHM 之下,表示這個區塊曾經被使用過,可是目前 這個區塊中有幾筆記錄(ROW)則無法由此得知,必須實際讀取區塊內容才能確定。同時也表示如果一個區 塊的位置位於高水位標記之上,則表示此區塊不曾被使用過,也就是說此區塊不可能有任何記錄。 可供新增使用的資料區塊:每個區段都可以藉由設定 PCTFREE,要求此區段中的區塊,在每次被新增後, 檢查區塊中所剩餘的可用空間與區塊大小的比率,必須大於所設定的 PCTFREE 值,才可以繼續被後續 的新增操作使用。如果剩餘可用空間的比率低於 PCTFREE 的設定值 ,公式(Free Space/Block Size)>PCTFREE,則此區塊不可以再被後續的新增操作使用,因為所剩餘的可用空間要留給現存於此區 塊中的記錄,進行異動操作(Update)時使用。所有這個參數必須根據記錄的可能異動的樣式,來決定保留 的可用空間大小,合法的設定值由 0 到 99,而預設值為 10。 可用區塊串列管理(Freelists Management) 在 Oracle Database 9i 之前只能採用可用區塊串列(Freelists)管理,可用區塊串列存在於每個區段的第一 個區塊,這個區塊被稱作區段標頭區塊(Segment Header Block),這個區塊的確切位置可由 DBA_SEGMENTS 中的 HEADER_FILE、HEADER_BLOCK 得到。而可用區塊串列是此區段位於高水位 標記(High Water Mark)下可供新增使用的區塊所排成的串列。 可用區塊串列管理的方式的基本原理如下: 1.當伺服器處理作業(Server Process)準備新增資料到某個表格之前,伺服器處理作業找到該區段的標頭 區塊(Segment Header Block),然後需要取得區段標頭區塊的鎖定(Lock),因為它必須搜索可用區塊串 列與變動其內容,確定同時間只有一個伺服器處理作業對可用區塊串列的進行相關操作。如果在可用區塊 串列中找到可新增的區塊,則將資料列儲存到該區塊。如果整個可用區塊串列中都找不到可新增的區塊, 則會要求將高水位標記向後移動 5 個區塊,如此便可在可用區塊串列中新增 5 個可用且空的區塊。 2.當找到合適的區塊後,伺服器處理作業則繼續計算新增後的新剩餘空間(Free Space)的百分比是否比 PCTFREE 來的大?如果新的剩餘空間還是足夠的,將剩餘空間的值記錄到可用區塊串列後,便釋放區段 標頭區塊的鎖定。但是如果新的剩餘空間已經比 PCTFREE 所要求的小,則伺服器處理作業會先將該區
  • 20. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 塊資料由可用區塊串列中移除,此後這個區塊便不再能被新增操作使用。因為如果一個區塊不存在於可用 區塊串列,這個區塊在新增操作時被不會被伺服器處理作業搜索到,因此就不可能被新增操作使用。 3.雖然不在 Freelist 中的區塊不能再被新增使用,可是其他的操作(Update 異動/Delete 刪除),還是可以 繼續進行,因為這些操作針對的是已經存在資料。而且當異動或刪除後,剩餘空間可能會因此增加(資料 刪除或異動後的資料較異動前來得小),當然也有可能減少(異動後的資料較異動前來得大)。所以當異動或 刪除到不在 Freelist 中的區塊內容時,當操作完成後,Server Process 會計算經過操作後的剩餘空間的 百分比較 PCTUSED(預設值為 40)來得小時,這時 Server Process 會鎖定 Segment Header 區塊,並且 將此區塊資訊加進 Freelist 中,因此這個區塊又可以被新增操作使用。 Freelist 管理方式的主要缺點:區塊競爭 依據上述的操作原理,如果有多個不同的階段作業(Session)同時對同個區段進行各種操作,這時會有針 對區段標頭區塊(Segment Header Block)的競爭衝突出現,進而增加進行這些操作所需整體時間。同時 因為 Freelist 的管理方式,會盡量先將資料新增到同一個資料區塊中,直到該區塊不能在被新增為止,這 樣也會造成資料區塊的競爭。 ASSM 管理(Automatic Segment Space Management) ASSM 是 Oracle Database 9i 的新功能,它利用所謂的點陣圖區塊(BitMap Block)來管理與呈現資料區 塊(Data Block)的空間狀態。這些 BMB 都放在 Segment Header Block 之前,共有 3 種形式的 BMB 區 塊(Level1、Level2、Level3)。 L3 BMB Block 的內容連接到 L2 BMB Blocks,不過如果這個區段不是非常的大,則 Level 3 區塊 (Block)可以存放在 Segment Header Block 中,但如果區段成長到一定的大小,則會出現單獨的 Level 3 區塊。 L2 BMB Block 的內容是連接到 L1 BMB Blocks。 L1 BMB Block 的內容是這個區段(Segment)的某個擴充區塊(Extent)中一組資料區塊(Data Block)的空 間狀態,在 L1 BMB Block 中使用位元地圖(Bitmap:4 個 bits)表示每個資料區塊的已使用空間量及相關 的狀態,空間狀態可以分為 FS1(0-25% Free)、FS2(25-50% Free)、FS3(50-75% Free)、FS4(75- 100% Free),資料區塊狀態可以分為 FULL、UNFORMATTED、FORMATTED。 0000 Unformatted 0001 logically Full 0010 (FS1) 0011 (FS2) 0100 (FS3) 0101 (FS4)
  • 21. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 ASSM 操作方式簡介: 1.當伺服器處理作業準備新增資料到某個表格時,透過該區段的表頭區塊資訊得到相關的 L3 BMB 區塊 的位置。如果此表格不是特別的大,直接使用區塊標頭區塊(Segment Header Block)即可,因為它就是 一個有效的 L3 BMB 區塊。當然如果此表格很大,就會有多個 L3 BMB 區塊存在,因此就需要使用雜湊 計算(進行新增的伺服器處理作業在作業系統的 Process ID 與所屬的 Instance ID)的技巧,選擇其中的一 個 L3 BMB 區塊,以分散對 L3 BMB 區塊的競爭。 2.當讀取某個 L3 BMB 區塊後,伺服器處理作業可由其中的內容得到多個 L2 BMB 區塊的位置。此時一 樣使用雜湊計算(HASH(Instance ID,PID))的技巧,選擇一個 L2 BMB 區塊。 3.當讀取某個 L2 BMB 區塊後,伺服器處理作業可由其中的內容得到許多的 L1 BMB 區塊的位置。此時 繼續使用 HASH(Instance ID,PID)的方式,選擇一個 L1 BMB 區塊。 4.當讀取某個 L1 BMB 區塊後,伺服器處理作業使用 HASH(PID)的方式,決定要將資料新增到哪個資料 區塊。 當資料新增完成後,伺服器處理作業會檢查目前使用的資料區塊的空間狀態是否需要改變?例如由 FS2 變成 FS1,如果需要改變,則會異動所屬的 L1 BMB 區塊。不過因為是 25%才更新一次空間的狀態,所 以所消耗的資源比 Freelist 管理來的少,尤其是不會也不需要異動區段標頭區塊,可以減少對區段標頭區 塊的競爭。同時如果新增後,剩餘空間的百分比是否比 PCTFREE 來的小,則伺服器處理作業異動 L1 BMB 區塊的內容將此資料區塊狀態設為 FULL,此後這個區塊便不再能被新增操作使用。 一個 FULL 狀態的資料區塊要何時才能被新增使用?雖然不能被新增使用,可是還可以被更新與刪除, 此資料區塊的空間狀態還是會改變。所以假設此資料區塊在被設定為 FULL 時,他的空間狀態為 FS1, 這個資料區塊要等到它的空間狀態被更新為 FS2 時,才能夠重新被新增操作使用。也就是說在 FS2 時被 設定為 FULL,要等到空間狀態為 FS3。若為 FS3 被設定為 FULL,則要等到 FS4 時,才能重新被新增 操作使用。
  • 22. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 6.2.3 建立新的表格空間 建立一個新的表格空間時,還需要確定一些重要的表格空間參數:表格空間內容型態、資料檔的位置與名 字、個數及大小等等。當這些參數都已經知道後,建立一個新的表格空間便成為一個相當簡單的工作。 表格空間的內容型態 可以分為永久(PERMANENT)、還原(UNDO)與暫時(TEMPORARY)三種。可以透過 DBA_TABLESPACES 這個資料辭典視圖中的 CONTENTS 欄位查知。 永久(Permanent)︰永久型態的表格空間中,可以建立如表格(TABLE)、索引(INDEX)、叢集(CLUSTER) 等永久型態的區段。這些區段的內容,必須經由明確的指令刪除,不然會永久的儲存在區段中。 還原(Undo):還原型態的表格空間中,只能由執行處理(Instance)建立還原區段,資料庫管理者無法建立 任何型態的區段在此表格空間中。這些還原區段的內容會隨著交易結束而被重複使用,因此與永久型態的 區段內容不同。同時在自動還原管理的架構下,執行處理同時間僅使用一個還原型態的表格空間。所以建 立多個還原型態的表格空間並沒有用處,除非資料庫管理者想要刪除現有的還原表格空間,才需要先建立 額外的還原型態的表格空間。 暫時(Temporary):暫時型態的表格空間中,只能由執行處理建立暫時區段,這些區段用來進行磁碟排序 使用。而且同時這些暫時區段會隨著階段作業(Session)的結束而自動被刪除。因為這些區段的內容只是 暫時存在,可能當交易結束或階段作業結束後就會自動被清除,所以這種表格空間上的異動操作不須產生 異動日誌。而且也不需要備份,因為若發生媒體錯誤時,重新建立一個新的暫時表格空間即可。不過其組 成的檔案必須是暫時檔案(Tempfile)格式。 SMALLFILE 與 BIGFILE
  • 23. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 在 Oracle Database 10g 之前,每個表格空間最多可以由 2 10 -2 個資料檔(1022 個)組成,但是每個資料 檔最大只能由 2 22 個資料區塊(約 4000000 個)組成。目前一般平台上的 Oracle 資料區塊大小可由 2048 Bytes 到 32768 Bytes,因此每個資料檔大小可由 8GB 到 64GB,而每個表格空間容量可由 8TB 到 64TB。每個資料庫最多可以有 65533 個表格空間,但資料檔個數也不能超過 65533 個,所以整個資 料庫最大可以達到 8EB(假設資料區塊大小為 32K)。 註記:1M=1024K、1G=1024M、1T=1024G、1P=1024T、1E=1024P 為什麼一個表格空間要由這麼多個資料檔組成? 這要分成兩方面來說: 1.突破單一檔案大小限制(2G)。早期的檔案系統由於定址空間不足,所以單一檔案的大小,最大只能到 2G。但是表格的大小經常會超過 2G,因此使用多個資料檔組成表格空間的技巧,讓表格空間的大小可以 超過 2G 限制,進而讓表格的大小也不受限於 2G。 2.分散磁碟 I/O。因為整個 Oracle 資料庫架構中,磁碟機是最慢的一部分,如果再加上 I/O 競爭的問題, 整個資料庫系統的速度將會被拖累。所以使用多個資料檔(每個資料檔應該在不同的磁碟機上)組成一個表 格空間的方式,讓 I/O 可以分散到各個獨立的磁碟機上,增加整體的 I/O 效能。 可是資訊科技不斷的進展,以上的兩個問題都已經被科技的進步所解決。 1.目前的檔案系統已經突破之前單一檔案大小的限制,64G 已經不夠用了。所以從 Oracle Database 10g 開始,推出一種新的檔案型態:大型檔案(BIGFILE)。這種檔案型態最達可使用到 232 個資料區塊, 依不同的資料區塊大小(2K~32K),檔案大小可達 8TB 到 128TB,比 8G 到 128G 的大小來的大,所以 稱作大型檔案。而之前每個資料檔只能有 2 22 個資料區塊的檔案,就被稱做小型檔案。雖然大型檔案表格 空間的資料檔大小比較大,但是每個表格空間中最多只能由一個資料檔案組成。2 32 =2 22 (原來的資料檔案 大小)*2 10 (每個 SMALL 表格空間最多有 1023 個資料檔案,現在只需要 1 個資料檔案,所以可以將 2 10 移到資料區塊定址使用)。 2.硬體的磁碟陣列(RAID)的技術提昇與價錢下降,讓大多數的企業都樂於採用。或者是採用 Oracle Database 10g 開始提供的自動儲存管理(Automatic Storage Management)來管理磁碟機,自動儲存管 理類似軟體磁碟陣列的機制。這時 I/O 分散的工作就交由磁碟陣列的機制處理,不需要資料庫管理人員利 用多個資料檔案與多個磁碟機的方式來達到。 註記:即便在建立表格空間時表示資料檔案的大小為無限制,其實每個資料檔還是有其限制(4 百萬個資 料區塊-小型檔案或 40 億個資料區塊-大型檔案)。 資料檔案的位置 檔案位置可以放在檔案系統(File System)、原始裝置(RAW DEVICE)與自動儲存管理(ASM)上。 資料檔案的名字 檔案名字是非常重要的一件事,因為在眾多的資料檔案中,要如何找到所需要的資料檔案。最簡單的方法 就是在命名時,採用一種公認的命名規則。其實不管採用哪種命名規則,都是希望能夠達到”顧名思義” 的境界。只要看到檔案的名字,就能知道這個檔案是屬於哪個表格空間、表格空間的型態等資訊。檔案命 名的方法,有兩種方法:人工命名與自動命名(Oracle Managed File)。
  • 24. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 人工命名:在建立資料檔案時,便由資料庫管理人員直接決定。這時便要仔細思考要如何命名,可以讓往 後的資料庫管理更方便、更有效率。如果目前沒有特定的命名規則,可以採用 OFA 架構所建議的命名規 則。OFA 架構在第 4 章已經說明過,請自行參考。 SQL> CREATE TABLESPACE frankts DATAFILE '/u02/oradata/ora11g/frankts01.dbf' SIZE 10M; SQL> SELECT file_name FROM dba_data_files WHERE tablespace_name='FRANKTS'; FILE_NAME -------------------------------------------------------------------------------------------------------------- /u02/oradata/ora11g/frankts01.dbf OMF 自動命名:使用 OMF 功能時,需要下列三種參數:DB_CREATE_FILE_DEST、 DB_CREATE_ONLINE_LOG_DEST_n(1~5)與 DB_RECOVERY_FILE_DEST 來設定檔案的位置,檔案 名字則由 Oracle Server 依據規則自動產生。 SQL> show parameter db_create NAME TYPE VALUE ------------------------------------------ ----------- ------------------------------ db_create_file_dest string /u02/oradata/omf/ db_create_online_log_dest_1 string /u02/oradata/omf/ db_create_online_log_dest_2 string /u03/oradata/omf/ db_create_online_log_dest_3 string db_create_online_log_dest_4 string db_create_online_log_dest_5 string SQL> show parameter db_recovery NAME TYPE VALUE ------------------------------------------ ----------- ------------------------------ db_recovery_file_dest string /u03/flash_recovery_area db_recovery_file_dest_size big integer 4G
  • 25. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 其中 DB_CREATE_FILE_DEST 的參數主要是給資料檔、暫時檔與資料區塊變動追蹤檔(Block Change Tracking File)使用,不過如果當 DB_CREATE_ONLINE_LOG_DEST_n 沒有設定時,也可以給控制檔與 日誌檔使用。 DB_CREATE_ONLINE_LOG_DEST_n 是給控制檔與日誌檔使用,n 可以由 1~5,表示最多可以有五個 成員(Member)。 DB_RECOVERY_FILE_DEST 是給所有復原相關檔案使用,如使用 RMAN 所產生的備份檔案的預設目錄、 存檔日誌檔的預設位置以及回遡日誌的預設位置,在 Oracle10g 中被稱作瞬間復原區域(Flash Recovery Area)。不過如果如果沒有設定 DB_CREATE_ONLINE_LOG_DEST_n 與 DB_CREATE_FILE_DEST 時, 瞬間復原區域也可以用來當作控制檔與日誌檔的預設位置使用。 檔案命名規則: %t 是這個表格空間的名字,不過表格空間的名字若超過八個字,則只能出現前八個字。 %u 則是八個英數字所組成,會自動產生一個內容為獨一值的字串。 %g 為此日誌成員檔所屬的日誌群組編號。 資料檔(Datafile):Oracle 會自動在 DB_CREATE_FILE_DEST 的目錄下,再建立一個子目錄(資料庫的 名字-ora11g),之後在其下再建一個子目錄-datafile。然後依照以下的檔案名稱格式- o1_mf_%t_%u_.dbf,將新增的資料檔建立在 datafile 的子目錄下。 註記:原本 OracLe Managed File 的縮寫應該是 ol_mf 才對,不過寫這段程式的人好像看錯了,把 l 看 成 1,所以就變成 o1_mf。 暫時檔(Tempfile):Oracle 會自動在 DB_CREATE_FILE_DEST 的目錄下,再建立一個子目錄(資料庫的 名字-ora11g),之後在其下再建一個子目錄-datafile。然後依照以下的檔案名稱格式- o1_mf_%t_%u_.dbf,將新增的暫時檔建立在 datafile 的子目錄下。如果沒有指定暫時檔的大小,則此新 增的暫時檔大小初始為 100M,而且會自動增長檔案大小,同時沒有檔案大小的限制。 控制檔(Controlfile):Oracle 會自動在 DB_CREATE_ONLINE_LOG_DEST_n 的目錄下,再建立一個子 目錄(資料庫的名字-ora11g),之後在其下再建一個子目錄-controlfile。然後依照以下的檔案名稱格式- o1_mf _%u_.ctl,將新增的控制檔建立在 controlfile 的子目錄下。如果設定的目錄超過一個以上,則每 個目錄下都會建立一份控制檔。 日誌檔(Logfile)︰Oracle 會自動在 DB_CREATE_ONLINE_LOG_DEST_n 的目錄下,再建立一個子目錄 (資料庫的名字-ora11g),之後在其下再建一個子目錄-logfile。然後依照以下的檔案名稱格式-o1_mf _%g_%u_.log,將新增的日誌檔檔建立在 logfile 的子目錄下。如果設定的目錄超過一個以上,則每個目 錄下都會建立一份日誌檔。 區塊異動追蹤檔(Block Change Tracking File):Oracle 會自動在 DB_CREATE_FILE_DEST 的目錄下, 再建立一個子目錄(資料庫的名字-ora11g),之後在其下再建一個子目錄-changetracking。然後依照以下 的檔案名稱格式-o1_mf _%u_.chg,將新增的追蹤檔建立在 changetracking 的子目錄下。新增的追蹤檔 大小初始為 10M,如果空間不足,會自動增長檔案大小,一次增加 10M,同時沒有檔案大小的限制。 如何使用 OMF 機制 使用 OMF 功能的方法分為資料檔、日誌檔與區塊變動追蹤檔為一種方式,而控制檔的使用時機與其他檔 案不同。
  • 26. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 資料檔(Datafile)與暫時檔(Temporary File):當建立新的表格空間或新增資料檔到現有的表格空間時,如 果指令中沒有加上資料檔的名字,這時 Oraclec 會自動參考 DB_CREATE_FILE_DEST 的設定,將資料 檔建立在相對的位置,檔案名字也自動產生。如果此執行處理(Instance)沒有設定 DB_CREATE_FILE_DEST,則 Oracle 會將新增的資料檔建在$ORACLE_HOME/dbs 的目錄下。如果沒 有指定資料檔的大小,則此新增的資料檔大小初始為 100M,而且會自動增長檔案大小,同時沒有檔案大 小的限制。 SQL> CREATE TABLESPACE frankts ; --自動建立一個資料檔,檔案大小為100M,而且會自動增長大小,直到檔案大小的極限。 SQL> SELECT file_name,bytes,autoextensible,maxbytes FROM dba_data_files 2> WHERE tablespace_name='FRANKTS'; FILE_NAME BYTES AUT MAXBYTES ----------------------------------------------------------------------------------------- -------------- ------ ---------------- /u02/oradata/omf/ORA11G/datafile/o1_mf_frankts_473jckln_.dbf 104857600 YES 3.4360E+10 SQL> CREATE TABLESPACE frankts2 DATAFILE SIZE 10M ; --自動建立一個資料檔,檔案大小為10M,而且不會自動增長大小 。 SQL> SELECT file_name,bytes,autoextensible,maxbytes FROM dba_data_files 2> WHERE tablespace_name='FRANKTS2'; FILE_NAME BYTES AUT MAXBYTES ----------------------------------------------------------------------------------------- -------------- ------ ---------------- /u02/oradata/omf/ORA11G/datafile/o1_mf_frankts2_4766n75o_.dbf 10485760 NO 0 SQL> CREATE TEMPORARY TABLESPACE tempfrank ; --自動建立一個暫時檔,檔案大小為100M,而且會自動增長大小,直到檔案大小的極限。 SQL> SELECT file_name,bytes,autoextensible,maxbytes FROM dba_temp_files 2> WHERE tablespace_name='TEMPFRANK'; FILE_NAME BYTES AUT MAXBYTES ---------------------------------------------------------------------------------------- -------------- ------ ---------------- /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp 104857600 YES 3.4360E+10 --tempfran為表格空間名字-tempfrank的前八個字。 --473mq0xr為%u的結果,可以保證即是表格空間名字的前八個字相同,資料檔的名字也不會相同。 日誌檔(Redo Logfile):建立新的日誌群組或新增日誌成員到現存的日誌群組中時,沒有指定日誌成員的 名字,這時 Oracle 會先試圖使用 DB_CREATE_ONLINE_LOG_DEST_n 的設定來建立日誌成員。如果 沒有設定 DB_CREATE_ONLINE_LOG_DEST_n 時,Oracle 會再試圖使用 DB_ㄗ CREATE_FILE_DEST 的參數。如果還是沒有,則會再試圖使用 DB_RECOVERY_FILE_DEST 的設定值。 以上 OMF 機制下所建立的日誌檔時,沒有指定日誌檔的大小,則新增的日誌群組的日誌檔大小為 100M。 最後以上 OMF 的設定都沒有設定時,Oracle 會將日誌檔建立在$ORACLE_HOME/dbs 目錄下。 SQL> select group#,sequence#,members,bytes from v$log; GROUP# SEQUENCE# MEMBERS BYTES ----------- ------------------- ------------------- ------------- 1 171 2 52428800 2 170 2 52428800 --目前只有兩個日誌群組,每個群組有兩個成員各50M。 SQL> ALTER DATABASE ADD LOGFILE GROUP 3; --新增的日誌群組有兩個成員,因為db_create_online_log_dest_n有兩個參數有設定值。 --每個成員大小為100M。 SQL> SELECT group#,members,bytes FROM v$log WHERE group#=3;
  • 27. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 GROUP# MEMBERS BYTES ------------ --------------- --------------- 3 2 104857600 SQL> SELECT group#,member FROM v$logfile WHERE group#=3; GROUP# MEMBER ----------- -------------------------------------------------------------------------- /u02/oradata/omf/ORA11G/onlinelog/o1_mf_3_473o6s5g_.log /u03/oradata/omf/ORA11G/onlinelog/o1_mf_3_473o6sm5_.log --3為日誌群組的編號,此編號是獨一不可重複的數字。 --473o6s5g為%u的結果,可以保證即是相同日誌群組中的成員,日誌檔的名字也不會相同。 SQL> ALTER DATABASE ADD LOGFILE GROUP 4 SIZE 50M; --新增的日誌群組有兩個成員,因為db_create_online_log_dest_n有兩個參數有設定值。 --每個成員大小為50M。 SQL> SELECT group#,members,bytes FROM v$log WHERE group#=4; GROUP# MEMBERS BYTES ------------ --------------- ------------- 4 2 52428800 區塊異動追蹤檔(Block Change Tracking File):這個檔案會記錄每個資料區塊的變更時間,可以在進行 增量備份(Incremental Backup)時,減少讀取的資料區塊個數,進而加速整體備份的時間。建立追蹤檔時, 不使用”USING FILE”的方式指定追蹤檔的名字與位置,Oracle 會自動將追蹤檔建立在瞬間復原區域中, 而檔案以 OMF 的格式命名。 --使用OMF方式建立追蹤檔 SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING; SQL> SELECT * FROM v$block_change_tracking; STATUS FILENAME BYTES -------------- ---------------------------------------------------------------------------------------- ------------- ENABLED /u02/oradata/omf/ORA11G/changetracking/o1_mf_4766ytpp_.chg 11599872 --使用人為指定檔案名稱方式建立追蹤檔 SQL> ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE ‘/u02/oradata/ora11g/o ra11g_tracking.chg’; SQL> SELECT * FROM v$block_change_tracking; STATUS FILENAME BYTES -------------- ---------------------------------------------------------------------------------------- ------------- ENABLED /u02/oradata/ora11g/ora11g_tracking.chg 11599872
  • 28. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 控制檔(Control File):控制檔如果想要使用 OMF 格式的話,必須在建立資料庫之前,作好相關的設定, 而這些設定有相對的順序。首先確定參數檔(Parameter File)中的 CONTROL_FILES 這個參數並未設定 任何值。之後將希望的控制檔位置設定在 DB_CREATE_ONLINE_LOG_DEST_n(n=1~5)上,這樣控制 檔最多可以有五個成員。如果沒有設定 DB_CREATE_ONLINE_LOG_DEST_n 參數值,Oracle 會試圖使 用 DB_CREATE_FILE_DEST 設定值,這樣所建立出來的控制檔就只有一份。 建立控制檔後,依據參數檔的形態來決定是否要將控制檔的全路徑名稱(Full Path Name)設定到參數檔中, 如果是 SPFILE,則不須進行此操作,因為 Oracle 會自行動作。但是如果為 PFILE,資料庫管理人員必 須從警示檔(Alert Logfile)找到相對的控制檔名字,自行使用文字編輯器修改 PFILE 的內容,將 CONTROL_FILES 設定為正確的參數值,如此在下次啟動 Oracle Instance 時,才能正確地掛載資料庫。 資料檔案的大小 表格空間的大小是由組成此表格空間的資料檔的個數與大小決定。資料檔的個數跟表格空間則與表格空間 為小型檔案(Smallfile)或大型檔案(Bigfile)型態有關: 小型檔案表格空間中最多可以有 1023 個資料檔,但是每個資料檔不能超過 8G~128G(以不同的資料區 塊大小:2K~32K)。 大型檔案表格空間中只能允許一個資料檔存在,不過這個資料檔案的大小可以達到 8T~128T(以不同的資 料區塊大小:2K~32K)。 然而剛開始建立表格空間時,可以不需事先配置這麼大的空間給資料檔,也可以日後在隨需求而增加檔案 大小即可。所以一個資料檔的大小可以動態改變,當將資料檔大小增大時,只要相對的儲存空間足夠與未 超過資料檔的大小限制,這個操作是不會出現任何問題的。當在增加資料檔的大小時,可以由資料庫管理 者藉有相對的 SQL 指令,將資料檔的大小增大,當然也可以透過資料檔的自動增長功能,自動地增加其 大小。但是如果相要將資料檔縮小時,則有一個限制。例如目前資料檔大小為 20M,而實際已使用空間 為 15M。這時資料檔的大小最多只能縮小到 15M 為止,再小就會出現錯誤訊息。 資料檔自動增大(AUTOEXTEND ON) 資料庫管理者可以事先設定資料檔的自動增大功能,設定資料檔的初始大小、每次增量的大小與資料檔的 大小限制。讓資料檔的大小超過初始大小時,不會出現錯誤訊息,而會依設定的增量大小,自動增加資料 檔的大小,直到資料檔達到檔案大小的限制。因此資料庫管理者可以使用 AUTOEXTEND ON 的參數啟 動資料檔自動增大功能,或使用 AUTOEXTEND OFF 關閉自動增大功能。當使用資料檔自動增大功能時, 建議一定要設定增量大小(NEXT),不然 Oracle 資料庫將自動設定增量為 1 個資料區塊,意即一次增加資 料檔的大小 1 個資料區塊,這樣的增量設定反而帶來效能的損失。至於大小限制(MAXSIZE)若沒有設定, 則為無限制(UNLIMITED),表示該資料檔的大小為 Oracle 資料庫的限制。小型檔案的資料檔可有 4 百萬 個資料區塊,因為資料區塊可由 2K 到 32K,所以一個小型檔案根據區塊大小的不同,其大小可達 8G 到 128G 的大小。至於大型檔案的資料區塊可有 40 億個資料區塊,所以大型資料檔可達 8T 到 128T。 SQL> CREATE TABLESPACE frankts DATAFILE '/u02/oradata/ora11g/frankts01.dbf' SIZE 20M; /*其實DATAFILE這個關鍵字後面,除了可以接著SIZE(決定此資料檔的初始大小)外,其實還有一些關鍵字: AUTOEXTEND {OFF|ON}(決定此資料檔是否可以自行增加大小,預設為OFF,表示不能自動增長大小),如 果當AUTOEXTEND ON時,則後面建議接著NEXT(設定當資料檔需要自動增長大小時,一次增加多少的大 小),以及MAXSIZE(用來設定此資料檔的最大值,如果沒有設定,預設值為UNLIMITED)。*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='FRANKTS';
  • 29. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES ---------- ------------------------------------------------ --------------- -------- ------------------------ ---------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 NO 0 0 SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' AUTOEXTEND ON; /*將資料檔設定為可以自動增大 */ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES ---------- ------------------------------------------------ --------------- -------- ------------------------ ---------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 YES 1 3.4360E+10 /*可是因為沒有設定NEXT(一次增加多少空間),所以Oracle自行決定一次增加一個資料區塊(INCREMENT_B Y=1)。至於MAXBYTES=3.4360E+10=34360000000 是因為這個表格空間為SMALLFILE格式,每個資料檔最多只能有4000000個(400百萬個)資料區塊,而此表 格空間的每個資料區塊大小為8K,換算結果即為3.4360E+10 Bytes。*/ SQL> SELECT tablespace_name,block_size,bigfile FROM dba_tablespaces WHERE tablespace_name ='FRANKTS'; TABLESPACE_NAME BLOCK_SIZE BIG ------------------------------ ------------------ ----- FRANKTS 8192 NO /*當BIGFILE=NO時,表示這個表格空間為SMALLFILE格式。但若BIGFILE=YES時,則表示此表格空間為BI GFILE格式,這種表格空間只能由一個資料檔組成,可是這唯一的資料檔最多可以容納4000000000個(40億 個)資料區塊。*/ SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' AUTOEXTEND ON NEXT 10 M MAXSIZE 100M; /*將資料檔設定為可以自動增大,當目前的資料檔空間不夠時,每次增加10M,直到資料檔的最大值為100M 為止*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES ---------- ------------------------------------------------ --------------- -------- ------------------------ ---------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 YES 1280 104857600 /*INCREMENT_BY=1280(資料區塊),每個8K,所以一次增加10M*/ 重新設定資料檔大小(RESIZE DATAFILE) 除了資料檔自動增大功能外,資料庫管理者可以重新設定資料檔的大小, SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W
  • 30. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 HERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES ---------- ------------------------------------------------ --------------- -------- ------------------------ ---------------- 5 /u02/oradata/ora11g/frankts01.dbf 20971520 NO 0 0 SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 30M; /*將資料檔的大小增加為30M*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES AUTO INCREMENT_BY MAXBYTES ---------- ------------------------------------------------ --------------- -------- ------------------------ ---------------- 5 /u02/oradata/ora11g/frankts01.dbf 31457280 NO 0 0 SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 10M; /*將資料檔的大小縮小為10M*/
  • 31. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 資料檔的個數 在 Oracle Database 10g 之前,每個表格空間最多可以有 1022(2 10 -2)個資料檔,但每個資料檔最多只 能有 4194304(2 22 )個資料區塊。根據資料區塊的大小不同,資料檔的大小也可以由 8G~128G 不等。同 時整個資料庫中,最多只能有 65533(2 16 -2)個資料檔,所以表格空間個數也不能超過 65533 個(每個表 格空間中至少要有一個資料檔),因此一個資料庫的最大值只能到 8P(1P=1024T=1048576G)。 但是從 Oracle Database 10g 開始,Oracle 資料庫中多了一種表格空間型態:大型檔案(BIGFILE)。這種 表格空間從名稱就可以看出端倪,大型檔案表示資料檔的大小可以很大,最大可以由 2 32 個資料區塊組成, 依據不同的資料區塊大小(2K~32K),資料檔的大小可達 8T 到 128T。不過相較於小型檔案 (SMALLFILE)型態的資料檔只能有 2 22 個資料區塊,多出的 2 10 是由那裡來的?答案是大型檔案型態的表 格空間中,僅能有一個資料檔,因為將資料檔個數的定址空間讓給資料區塊個數使用,所以一個資料檔的 資料區塊個數,才能夠達到 2 32 =2 10 *2 22 。 表格空間加密(Encryption) 資料庫安全雖然可以利用使用者身份辨識與使用者權限授與來強化,但是這些方法是防範資料庫的使用者。 但如果別有用心的人由作業系統著手,直接讀取資料庫實體結構的資料檔,不透過執行處理與 SQL 敘述 句也可以得到所要的資料。因為資料檔的內容其實都是數字,只要能夠將這些數字轉成數字、日期或文字, 便可以還原資料檔的內容。所以資料庫伺服器所在的伺服器,也必須加強管理,避免未經授權的人擅自存 取。 在 Oracle Database 10g R2 後,資料庫管理者可以使用透通資料加密(Transparent Data Encryption) 功能,將表格中重要敏感的欄位內容加密,再將加密過的資料存入資料檔中。目前 Oracle 資料庫所使用 的加密演算法為對稱式加密演算法(加、解密都是使用同一個鍵值(Key)),這些加密鍵值存放在資料辭典中。 不過在 Oracle Database 10g R2 時,只能對表格的欄位進行加密。若要對多個表格的多個欄位加密,必 須一個一個設定,雖然只需要宣告即可,但是還很麻煩。從 Oracle Database 11g 開始,資料庫管理者 可以直接對整個表格空間加密,因此只要將表格放到加密的表格空間,便自動加密,可以大幅減少加密所 帶來的管理負擔。至於加、解密的工作由 Oracle 伺服器自動進行,資料庫管理者不需要參與。但是資料 庫管理者必須負責開啟或關閉錢包,因為錢包不會自動開啟。當執行處理關閉後,錢包也隨著關閉。但執 行處理開啟後,錢包不會自動開啟,必須由資料庫管理者人為開啟。 建立錢包(Wallet)
  • 32. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 使用資料庫加密功能之前,必須先建立錢包(Wallet),錢包用來儲存 Master Key。而 Master Key 用來解 密儲存在資料辭典的表格空間或表格欄位的加密鍵值,因為存放加密鍵值的表格為安全起見也被加密,所 使用的加、解密鍵值就是儲存在錢包中的 Master Key。資料庫管理者可以使用 Oracle Wallet Manager 或 SQL 敘述句建立錢包,不過要先設定錢包的位置,由 SQLNET.ORA 中 ENCRYPTION_WALLET_LOCATION 來指定錢包的位置。但錢包的名字與型態有其固定的設定,錢包 名字固定為 ewallet.p12。而錢包的型態為 Public Key Cryptography Standard No. 12(PKCS#12),並且 由一個密碼保護,這個密碼在建立錢包時指定。 所建立的錢包可以由 v$encryption_wallet 查詢得知,錢包的型態位置與是否開啟。以及可以使用 ALTER SYSTEM SET ENCRYPTION WALLET {CLOSE | OPEN IDENTIFIED BY password}將錢包 開啟或關閉,當錢包關閉時,所有被加密的表格空間或表格欄位的內容,都無法被存取。 SQL> SELECT * FROM v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS ------------------- ---------------------------------------------- ------------- file /home/oracle/encryption_wallet/ OPEN SQL> ALTER SYSTEM SET ENCRYPTION WALLET CLOSE; /*關閉錢包後,所有被加密的表格空間或表格欄位的內容,將無法被存取。*/ SQL> SELECT * FROM v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS ------------------- ---------------------------------------------- ------------- file /home/oracle/encryption_wallet/ CLOSED SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY oracle; /*必須提供錢包密碼才能開啟錢包*/ SQL> SELECT * FROM v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS ------------------- ---------------------------------------------- ------------- file /home/oracle/encryption_wallet/ OPEN
  • 33. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 錢包搜尋順序 當 Oracle 伺服器為取得 Master Key 時,必須先找到錢包。而錢包可能在下列三個位置找到: 1.SQLNET.ORA 的 ENCRYPTION_WALLET_LOCATION 所設定的位置。 2.若第一個位置找不到錢包,則繼續由 SQLNET.ORA 的 WALLET_LOCATION 所指定的位置搜尋。 3.若第二個位置也找不到錢包,則使用預設位置$ORACLE_BASE/admin/$ORACLE_SID/wallet 來尋 找錢包。 設定表格空間加密功能 一但表格空間被設定為加密表格空間後,就無法轉換為未加密表格空間,反之未加密表格空間也不能改為 加密表格空間。所以只能在建立表格空間時,設定該表格空間是否要被加密,事後不能改變。 設定表格空間加密時,可以指定加密所使用的演算法有 3DES168、AES128、AES192、AES256 四種, 預設值為 AES192。 SQL> CREATE TABLESPACE demots_encrypt 2 DATAFILE '/u02/oradata/orcl/demots_encrypt01.dbf' SIZE 10M 3 ENCRYPTION --使用預設的AES128,若想使用其他演算法,ENCRYPTION USING 演算法 即可。 4 DEFAULT STORAGE(ENCRYPT); Tablespace created. SQL> SELECT tablespace_name,encrypted FROM dba_tablespaces; TABLESPACE_NAME ENC ------------------------------ ---- SYSTEM NO SYSAUX NO UNDOTBS1 NO TEMP NO USERS NO EXAMPLE NO DEMOTS NO DEMOTS_ENCRYPT YES --可以由v$encrypted_tablespaces查知加密的表格空間所使用的加密演算法為何? SQL> SELECT tn.name,et.encryptionalg 2 FROM v$tablespace tn JOIN v$encrypted_tablespaces et ON (tn.ts#=et.ts#); NAME ENCRYPT ------------------------------ ------------- DEMOTS AES128
  • 34. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 建立表格空間的語法範例 CREATE {SMALLFILE|BIGFILE} {TEMPORARY|UNDO} TABLESPACE 表格空間名稱 DATAFILE‘檔案名稱’SIZE n {AUTOEXTEND OFF|ON NEXT n MAXSIZE m} EXTENT MANAGEMENT {DICTIONARY|LOCAL {AUTOALLOCATE|UNIFORM SIZE n}} SEGMENT SPACE MANAGEMENT {AUTO|MANUAL} ENCRYPTION USING ‘encryption algorithm’ DEFAULT STORAGE(ENCRYPT) SQL> CREATE SMALLFILE TABLESPACE demots 2> DATAFILE ‘/u02/oradata/ora11g/demots01.dbf’ SIZE 100M 3> AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED 4> EXTENT MANAGEMENT LOCAL AUTOALLOCATE 5> SEGMENT SPACE MANAGEMENT AUTO; /*這個SQL指令建立一個表格空間叫做DEMOTS,可以由多達1023個資料檔組成(SMALLFILE),不過目前僅 有一個資料檔/u02/oradata/ora11g/demots01.dbf,檔案初始大小為100M,如果不足,則會自動每次增長10 M,直到資料檔的最大值為止(4000000個資料區塊)。此表格空間的擴充區塊由Oracle自動管理,每個擴充區 塊的大小也由Oracle自動管理(AUTOALLOCATE),區段中的資料區塊也由Oracle自動管理(SEGMENT SPA CE MANAGEMENT AUTO)。這個表格空間可以放置任何形態的區段,因為其內容為永久型態(Permanent) 的表格空間。*/ SQL> CREATE TEMPORARY TABLESPACE tempts 2> TEMPFILE ‘/u02/oradata/ora11g/tempts01.dbf’ SIZE 100M 3> EXTENT MANAGEMENT LOCAL UNIFORM SIZE 256K;
  • 35. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 /*這個SQL指令建立一個表格空間叫做TEMPTS,其內容為暫時(TEMPORARY)型態,所以只能存放暫時區 段(TEMPORARY SEGMENT)。同時因為組成的檔案為暫時檔格式,所以在此表格空間中的任何異動都不會 產生重做日誌。暫時檔的大小固定為100M,如果不夠使用,則會出現表格空間不足的錯誤。每個擴充區塊的 大小固定為256K。*/ SQL> CREATE UNDO TABLESPACE undots 2> DATAFILE ‘/u02/oradata/ora11g/undots01.dbf’ SIZE 100M 3> AUTOEXTEND ON NEXT 10M MAXSIZE 1000M; /*這個SQL指令建立一個表格空間叫做UNDOTS,其內容為還原(UNDO)型態,所以只能放置還原型態的區 段。 檔案初始大小為100M,如果不足,則會自動每次增長10M,直到1000M為止。*/ 6.3 表格空間的操作 當表格空間建立之後,資料庫管理者還是需要因應不同的情況,對現存的表格空間進行一些操作。以下針 對經常被使用的動作,進行一些說明,希望讀者可以更正確的使用及了解該操作的真正意義。 6.3.1 變更表格空間的大小 一個表格空間的大小,與組成它的資料檔大小與個數有關。所以當要變更一個表格空間的大小時,也就是 由資料檔的大小與個數著手。 新增資料檔個數(僅適用於 SMALLFILE 表格空間) 新增資料檔的操作只能用在 SMALLFILE 的表格空間,因為 BIGFILE 的表格空間只允許有一個資料檔存 在。 SQL> SELECT tablespace_name,sum(bytes) FROM dba_data_files WHERE tablespace_name='FRAN KTS' GROUP BY tablespace_name; TABLESPACE_NAME SUM(BYTES)
  • 36. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 ------------------------------- ----------------- FRANKTS 10485760 /*目前此表格空間大小為10M*/ SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES ------------- -------------------------------------------------- ------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 /*目前此表格空間為一個資料檔所組成*/ SQL> ALTER TABLESPACE frankts ADD DATAFILE '/u02/oradata/ora11g/frankts02.dbf' SIZE 10M; /*新增一個資料檔/u02/oradata/ora11g/frankts02.dbf到表格空間frankts之中*/ SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES ------------- -------------------------------------------------- ------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 7 /u02/oradata/ora11g/frankts02.dbf 10485760 /*若要新增資料檔時,將資料檔設定為自動成長,只要在SIZE參數的後面,加上NEXT與MAXSIZE參數即 可。相關的範例請參考5.2的內容*/ SQL> SELECT tablespace_name,sum(bytes) FROM dba_data_files WHERE tablespace_name='FRAN KTS' GROUP BY tablespace_name; TABLESPACE_NAME SUM(BYTES) ------------------------------- ----------------- FRANKTS 20971520 /*經過新增資料檔後,表格空間frankts變成擁有20M的空間*/ 減少資料檔的個數(僅適用於某種特殊狀況) 只有當資料檔的內容是空的,才可以被刪除,這裡所謂的”空”,是表示這個資料檔上沒有任何擴充區塊 存在(用過(Used)或可用(Free))。而且每個表格空間至少要存在一個資料檔存在,除非是暫時表格空間。 SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES ------------- -------------------------------------------------- ------------ 5 /u02/oradata/ora11g/frankts01.dbf 10485760 7 /u02/oradata/ora11g/frankts02.dbf 10485760 /*目前表格空間frankts由兩個資料檔組成*/ SQL> ALTER TABLESPACE frankts DROP DATAFILE '/u02/oradata/ora11g/frankts02.dbf'; /*刪除資料檔/u02/oradata/ora11g/frankts02.dbf’*/ SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES ------------- -------------------------------------------------- ------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 /*資料檔/u02/oradata/ora11g/frankts02.dbf’成功地被刪除*/ SQL> ALTER TABLESPACE frankts ADD DATAFILE '/u02/oradata/ora11g/frankts02.dbf' SIZE 10M; /*新增資料檔/u02/oradata/ora11g/frankts02.dbf’到表格空間frankts中*/
  • 37. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 SQL> SELECT file_id,file_name,bytes FROM dba_data_files WHERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES ------------- -------------------------------------------------- ------------ 5 /u02/oradata/ora11g/frankts01.dbf 10485760 7 /u02/oradata/ora11g/frankts02.dbf 10485760 SQL> CREATE TABLE system.t1 TABLESPACE frankts AS SELECT * FROM dba_objects; /*建立一個表格system.t1放在frankts這個表格空間中*/ SQL> SELECT file_id,owner,segment_name,segment_type,count(*) FROM dba_extents WHERE table space_name='FRANKTS' GROUP BY file_id,owner,segment_name,segment_type; FILE_ID OWNER SEGMENT_NAME SEGMENT_TY COUNT(*) ------------- --------------- ------------------------------ --------------------- -------------- 5 SYSTEM T1 TABLE 1 7 SYSTEM T1 TABLE 16 /*system.t1的擴充區塊有1個放在/u02/oradata/ora11g/frankts01.dbf上,其餘的16個都放在/u02/oradata/ora 11g/frankts02.dbf’上*/ SQL> ALTER TABLESPACE frankts DROP DATAFILE '/u02/oradata/ora11g/frankts02.dbf'; ALTER TABLESPACE frankts DROP DATAFILE '/u02/oradata/ora11g/frankts02.dbf' * ERROR at line 1: ORA-03262: the file is non-empty /*即便是將區段system.t1刪除,還是無法刪除此資料檔*/ 例外:暫時表格空間可以連一個暫時檔都不需要存在,只是當進行磁碟排序時,會出現錯誤訊息 SQL> SELECT tablespace_name FROM dba_tablespaces WHERE contents='TEMPORARY'; TABLESPACE_NAME ------------------------------ TEMPTS1 TEMPFRANK SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files; TABLESPACE_NAME FILE_ID FILE_NAME ------------------------------ ---------- -------------------------------------------------- TEMPTS1 1 /u02/oradata/ora11g/temp01.dbf TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp SQL> ALTER DATABASE TEMPFILE '/u02/oradata/ora11g/temp01.dbf' DROP INCLUDING DATAFILE S; /*刪除此暫時檔/u02/oradata/ora11g/temp01.dbf*/ SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files; TABLESPACE_NAME FILE_ID FILE_NAME ------------------------------ ----------- ---------------------------------------------------------------------------------------- TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp SQL> SELECT tablespace_name FROM dba_tablespaces WHERE contents='TEMPORARY'; TABLESPACE_NAME ------------------------------ TEMPTS1
  • 38. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 TEMPFRANK 變更資料檔的大小(Datafile Resize) 變更資料檔的大小,可以由資料庫管理者或 Oracle 自動操作達到。不過 Oracle 自動操作只能增加資料檔 的大小,資料庫管理者確可以增加或減少資料檔大小。 SQL> CREATE TABLESPACE frankts DATAFILE '/u02/oradata/ora11g/frankts01.dbf' SIZE 10M AUTO EXTEND ON NEXT 10M MAXSIZE 100M; /*建立一個表格空間frankts,由一個資料檔組成。一開始這個資料檔為10M,如果沒有剩餘空間可供使用,將 會一次增加10M,一直到資料檔為100M為止。*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespac_name='FRANKTS'; FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES ------------ -------------------------------------------------- ------------ ------ ----------------------- ---------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 YES 1280 104857600 SQL> SELECT file#,name,bytes,create_bytes,block_size FROM v$datafile WHERE file#=5; FILE# NAME BYTES CREATE_BYTES BLOCK_SIZE ------------ -------------------------------------------------- ------------- ----------------------- ----------------- 5 /u02/oradata/ora11g/frankts01.dbf 10485760 10485760 8192 /*v$datafile的create_bytes是這個資料檔的初始大小,bytes為目前的大小。*/ SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 20M; /*將資料檔的大小增加為20M*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES ------------ -------------------------------------------------- ------------- ------ ----------------------- ----------------- 5 /u02/oradata/ora11g/frankts01.dbf 20971520 YES 1280 104857600 SQL> SELECT file#,name,bytes,create_bytes,block_size FROM v$datafile WHERE file#=5; FILE# NAME BYTES CREATE_BYTES BLOCK_SIZE ------------ -------------------------------------------------- ------------- ----------------------- ----------------- 5 /u02/oradata/ora11g/frankts01.dbf 20971520 10485760 8192 SQL> CREATE TABLE system.t1 TABLESPACE frankts AS SELECT * FROM dba_objects; /*建立一個表格system.t1放在表格空間frankts中*/ SQL> SELECT SUM(bytes) FROM dba_extents WHERE tablespace_name='FRANKTS'; SUM(BYTES) ----------------- 2097152 /*目前表格空間frankts已經被使用的空間大約為2M*/ SQL> INSERT INTO system.t1 SELECT * FROM dba_objects; SQL> INSERT INTO system.t1 SELECT * FROM dba_objects; SQL> commit;
  • 39. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 SQL> SELECT SUM(bytes) FROM dba_extents WHERE tablespace_name='FRANKTS'; SUM(BYTES) ----------------- 6291456 /*經過一些DML後,目前此表格空間已經被使用的空間,已經達到6M左右。*/ SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 10M; /*將資料檔縮小為10M*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='FRANKTS'; FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES ------------ -------------------------------------------------- ------------- ------ ----------------------- ----------------- 5 /u02/oradata/ora11g/frankts01.dbf 20971520 YES 1280 104857600 SQL> ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 5M; ALTER DATABASE DATAFILE '/u02/oradata/ora11g/frankts01.dbf' RESIZE 5M * ERROR at line 1: ORA-03297: file contains used data beyond requested RESIZE value /*想要更進一步地,將資料檔縮小到5M,但卻失敗了,因為目前已使用的空間已經大於5M。*/ SQL> CREATE BIGFILE TABLESPACE bigts DATAFILE '/u02/oradata/ora11g/bigts01.dbf' SIZE 10M; /*建立一個BIGFILE型態的表格空間bigts,資料檔大小為10M,但是不會自動增加大小。*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='BIGTS'; FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES ---------- -------------------------------------------------- ------------- ------ ----------------------- ----------------- 7 /u02/oradata/ora11g/bigts01.dbf 10485760 NO 0 0 SQL> ALTER TABLESPACE bigts AUTOEXTEND ON ; /*將資料檔設定為自動增加大小。不過因為是BIGFILE型態的表格空間,所以可以使用表格空間的名字取代資 料檔的名字,因為一個BIGFILE表格空間中只能有一個資料檔。*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='BIGTS'; FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES ---------- -------------------------------------------------- ------------- ------ ----------------------- ----------------- 7 /u02/oradata/ora11g/bigts01.dbf 10485760 YES 1 3.5184E+13 SQL> ALTER TABLESPACE bigts RESIZE 20M; /*因為bigts表格空間為BIGFILE格式。*/ SQL> ALTER TABLESPACE bigts AUTOEXTEND OFF; /*因為bigts表格空間為BIGFILE格式。*/ SQL> SELECT file_id,file_name,bytes,autoextensible,increment_by,maxbytes FROM dba_data_files W HERE tablespace_name='BIGTS'; FILE_ID FILE_NAME BYTES AUT INCREMENT_BY MAXBYTES ---------- -------------------------------------------------- ------------- ------ ----------------------- ----------------- 7 /u02/oradata/ora11g/bigts01.dbf 20971520 NO 0 0
  • 40. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 縮小暫時表格空間(Shrink Space) 暫時表格空間的主要用途為存放進行磁碟排序時,所產生的暫時資料。這些暫時資料在排序完成後就不再 被需要,其所佔的空間可以被重複使用,以避免暫時表格空間的大小成長。但是如果同時間有大量的磁碟 排序需求,可能造成暫時表格空間的空間成長,但是事後卻沒有如此多的空間需求,導致暫時表格空間過 大。自 Oracle11g 後,資料庫管理者可以縮小暫時表格空間的大小,而不需要重建暫時表格空間。 SQL> SELECT tablespace_name FROM dba_tablespaces WHERE contents='TEMPORARY'; TABLESPACE_NAME ------------------------------ TEMPTS1 TEMPFRANK SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files; TABLESPACE_NAME FILE_ID FILE_NAME ------------------------------ ----------- ---------------------------------------------------------------------------------------- TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp SQL> ALTER TABLESPACE tempts1 ADD TEMPFILE '/u02/oradata/ora11g/temp01.dbf' SIZE 100M; /*加一個暫時檔到表格空間tempts1,此暫時檔大小為100M*/ SQL> SELECT tablespace_name,file_id,file_name FROM dba_temp_files; TABLESPACE_NAME FILE_ID FILE_NAME ------------------------------ ----------- ---------------------------------------------------------------------------------------- TEMPTS1 1 /u02/oradata/ora11g/temp01.dbf TEMPFRANK 2 /u02/oradata/omf/ORA11G/datafile/o1_mf_tempfran_473mq0xr_.tmp SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1'; SUM(BYTES) ------------------ 104857600 SQL> ALTER TABLESPACE tempts1 SHRINK SPACE KEEP 20M; /*將暫時表格空間縮小到20M,但不會影響到正在進行的磁碟排序。*/ SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1'; SUM(BYTES) ------------------ 22020096 SQL> ALTER TABLESPACE tempts1 SHRINK SPACE ; /*儘可能將暫時表格空間縮到最小。*/ SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1'; SUM(BYTES) ------------------ 1114112 /*暫時檔被縮小到1M*/
  • 41. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 SQL> ALTER DATABASE TEMPFILE '/u02/oradata/ora11g/temp01.dbf' RESIZE 100M; /*將暫時檔設定為100M*/ SQL> SELECT SUM(bytes) FROM dba_temp_files WHERE tablespace_name='TEMPTS1'; SUM(BYTES) ------------------ 104857600 6.3.2 變更表格空間的狀態 一個表格空間的狀態可以分成:ONLINE(線上) 、OFFLINE(離線)、Read Only(唯讀)等三種。 線上(ONLINE) 表示這個表格空間中的區段(SEGMENT)的資料可以被讀/寫(Read/Write),或進行任何區段定義的操作, 如建立、刪除、修改等操作 ,這種狀態是表格空間的預設狀態。 SQL> SELECT tablespace_name,status FROM dba_tablespaces WHERE tablespace_name='BIGTS'; TABLESPACE_NAME STATUS ------------------------------ ------------ BIGTS ONLINE SQL> CREATE TABLE system.t2 TABLESPACE bigts AS SELECT * FROM dba_objects; /*建立一個測試表格在bigts表格空間中。*/ SQL> SELECT COUNT(*) FROM system.t2; COUNT(*) -------------- 15714 SQL> DELETE system.t2 WHERE object_id<=10; SQL> COMMIT; /*system.t這個表格目前可以被DML。*/ SQL> SELECT COUNT(*) FROM system.t2; COUNT(*) ---------- 15705
  • 42. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 SQL> ALTER TABLE system.t2 DROP COLUMN namespace; /*system.t2這個表格目前可以被DDL。*/ SQL> DROP TABLE system.t2; /*system.t2這個表格可以被刪除。*/ 唯讀(READ ONLY) 表示這個表格空間只允許查詢(Query)操作,不能夠進行區段的資料異動(DML)或建立區段的操作。但是 可以刪除或修改區段的定義(因為區段的定義是存放在 SYSTEM 表格空間中,只有區段的資料才是存放在 一般的表格空間中,所以可以進行那些不需要異動區段所在表格空間內容的操作)。 資料庫管理者進行唯讀某個表格空間的操作時,這個操作可能不會立刻完成。因為 Oracle 資料庫必須等 到所有已經對這個表格空間中的資料進行異動的交易都結束(交易確認或退回)後,才會完成將表格空間設 定為唯讀狀態的操作,這種狀態稱作 Transitional Read Only。之後 DBWR 會將所有屬於此表格空間的 DIRTY BUFFERs 都寫回相對的資料檔,CKPT 將相對的檢查點資訊(Checkpoint Information)記錄到所 有的控制檔與該表格空間中所有的資料檔檔頭。最後 Oracle 資料庫便會將資料檔的檔頭與資料檔都設定 為唯讀,之後任何的異動都不允許發生。 為什麼要將表格空間狀態設為唯讀?因為有時候需要將表格空間的內容開放查詢,但卻又不希望表格空間 內容被改變,這時將表格空間狀態設定為唯讀便是一個好的選擇。當然也可以用在需要將磁碟空間讓給需 要異動的表格空間,所以要將某些表格空間搬移到唯讀裝置(WROM)。 註記:SYSTEM、SYSAUX 與所有還原(UNDO)或暫時(TEMPORARY)型態的表格空間都不能設定唯讀 狀態。 SQL> SELECT tablespace_name,status FROM dba_tablespaces WHERE tablespace_name='BIGTS'; TABLESPACE_NAME STATUS ------------------------------- ------------ BIGTS ONLINE SQL> CREATE TABLE system.t3 TABLESPACE bigts AS SELECT * FROM dba_objects; /*建立一個測試表格在bigts表格空間。*/ SQL> ALTER TABLESPACE bigts READ ONLY; /*將bigts表格空間的狀態設定為唯讀。*/ SQL> SELECT tablespace_name,status FROM dba_tablespaces WHERE tablespace_name='BIGTS'; TABLESPACE_NAME STATUS ------------------------------ ------------------ BIGTS READ ONLY SQL> DELETE system.t3 WHERE object_id<=10; DELETE system.t3 WHERE object_id<=10 * ERROR at line 1: ORA-00372: file 7 cannot be modified at this time ORA-01110: data file 7: '/u02/oradata/ora11g/bigts01.dbf' /*目前此表格空間內的任何區段都不能被異動。*/ SQL> ALTER TABLE system.t3 DROP COLUMN secondary; ALTER TABLE system.t3 DROP COLUMN secondary *
  • 43. Chapter 6 Tablespace Oracle Database 11g 資料庫管理入門 ERROR at line 1: ORA-12985: tablespace 'BIGTS' is read only, cannot drop column /*當表格空間狀態為唯讀時,只能進行不會影響到此表格空間中區段的DDL指令,如DROP TABLE。但是如 果是DROP COLUMN會出現錯誤訊息,因為除了異動資料辭典外,也會異動表格內容。*/ SQL> alter table system.t3 add (testcol2 varchar2(10) default 'TestCol2'); alter table system.t3 add (testcol2 varchar2(10) default 'TestCol2') * ERROR at line 1: ORA-00372: file 7 cannot be modified at this time ORA-01110: data file 7: '/u02/oradata/ora11g/bigts01.dbf' SQL> ALTER TABLE system.t3 ADD (testcol VARCHAR2(10)); /*這個ADD COLUMN可以成功執行,因為所加入的欄位並沒有預設值,所以只有異動到資料辭典(SYSTEM 表格空間),並未異動到bigts表格空間上的區段。*/ SQL> DROP TABLE system.t3; /*這個指令只影響到資料辭典內容(Dictionary Managed Tablespace)或資料辭典內容與資料檔檔頭(Locally Managed Tablespace)。*/ SQL> CREATE TABLE system.t4 TABLESPACE bigts AS SELECT * FROM dba_objects; CREATE TABLE system.t4 TABLESPACE bigts AS SELECT * FROM dba_objects * ERROR at line 1: ORA-01647: tablespace 'BIGTS' is read only, cannot allocate space in it SQL> ALTER TABLESPACE bigts READ WRITE; /*將表格空間狀態設定為可讀寫即線上。*/