表空間的管理和創建

一、表空間的管理方式
首先闡述一下,oracle通過表空間爲數據庫提供數據存儲的使用空間。由於區段(extent)是oracle創建對象時的最小分配單位,所以表空間的管理實際上是針對區間的管理。
表空間的磁盤管理方式共分爲兩種。一種是數據字典管理方式(DMT),另一種是本地管理方式(LMT)。oracle 9i以後默認的管理方式是本地管理方式
管理方式 記錄方式 優點 缺點
數據字典 1、將每一個數據字典管理的表空間的使用情況記錄在system表空間的數據字典表中。需要使用兩個字典來記錄Extents的使用情況:SYS.FET$記錄空閒的Extents,SYS.UET$記錄使用的Extents。2、當爲表空間分配和釋放區段時,都要修改這兩個字典。屬於DML操作,存在競爭,每個動作都是一個事務,會產生UNDO記錄。需要週期性進行合併操作。效率低下。 1、能通過調整數據字典內容調整區段的初始大小、最大區段數量等 使用數據字典管理存儲空間的分配, 當表空間分配新的區, 或者回收已分配的區時, ORACLE會對數據字典對應的表進行查詢、更新, 且使用單線程, 速度慢, 並且產生回退和重做信息。
本地管理 1、每個表空間的數據文件頭部記錄該表空間的空間分佈、使用信息,典型的分佈式管理。2、利用位圖記錄的管理方式,記錄一個數據塊或一組數據塊的使用情況,表空間分配的最小單位爲區段,一個區段包含一個或多個數據塊。3、當表空間分配新的區段,或者回收已分配的區段時。oracle會對文件中的位圖進行更新,不屬於DML操作。不產生undo信息。4、並且可以自動跟蹤連續表空間中的空閒塊,不需要進行週期性合併操作,不會產生磁盤碎片。 1、提高存儲管理的速度和併發性。2、不產生磁盤碎片。3、不產生遞歸管理。4、變更數據沒有系統回滾。5、表空間區段的大小可以由oracle自動分配或者手動分配 本地管理的表空間創建後,不能隨意變更默認的存儲參數,如初始區段的大小、最大區段數等
相較於之前的數據字典管理方式,本地管理的優勢明顯大於劣勢
二、表空間數據字典管理和本地管理之間的遷移
oracle 9i以後默認爲本地管理方式,並且如果選擇system表空間爲數據字典管理情況下,纔可以創建數據字典管理方式的表空間,並且可以進行兩者之間的轉換。
管理方式轉換SQL語句
數據字典管理轉換爲本地管理
SQL> exec dbms_space_admin.Tablespace_Migrate_TO_Local('表空間名');
本地管理轉換爲數據字典管理
SQL> execdbms_space_admin.Tablespace_Migrate_FROM_Local('表空間名');
三、Oracle段空間的管理
oracle段管理方式共分爲兩種:手動管理和自動管理
手動段空間管理(Manual Segment Space Management)
手動設置FressLists(新的列表)、FreeList Groups(自由列表組)、PctUsed(數據塊剩餘百分比的閾值表)。Oracle使用自由列表(Free List)管理段中的塊,自由列表列出允許進行插入操作的數據塊。  
Oracle通過PCT_FREE(空餘)和PCT_USED(已使用)兩個參數來控制一個數據塊是否允許插入數據。其它參數來控制如何分配、使用、重用段空間。 許多版本都支持MSSM
使用MSSM時, 這兩個參數設置控制着塊何時放入freelist中, 以及何時從freelist中取出。 如果使用默認值,PctFree爲10, PctUsed爲40, 那麼在塊到達90%之前(有10%以上的自由空間), 這個塊會一直在freelist上。 一旦到達90%, 就會從freelist中取出, 而且直到塊上的自由空間超過了塊的60%, 纔會重新回到freelist上, 在此之前, 這個塊一直不在freelist上。
自動段空間管理(Automatic Segment Space Management)
只需要控制與空間使用相關的PctFree, 其它參數被忽略。 ASSM只有在9i版本後才被引入, 用於減少MSSM中的太多參數的管理。通過使用位圖freelist取代傳統單向的鏈接列表freelist,將freelist的管理自動化,並取消爲獨立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存儲參數的能力。它是一個二進制的數組,能夠迅速有效地管理存儲擴展和剩餘區塊(free block),因此能夠改善分段存儲本質,ASSM表空間上創建的段還有另外一個稱呼叫Bitmap Managed Segments(BMB段)。
帶有ASSM的本地管理tablespace會略掉任何爲PCTUSED、NEXT和FREELISTS所指定的值。
當表或索引被分配到這個tablespace以後,用於獨立對象的PCTUSED的值會被忽略,對於在LMT的tablespace內部創建的表和索引而言,由本地管理的tablespace會管理它們。但是,INITIAL_EXTENT(最初區段的大小)參數仍然是需要的,因爲Oracle不可能提前知道初始表加載的大小。對於ASSM而言,INITIAL_EXTENT最小的值是三個塊。
但是它不會控制一個塊是否在freelist上, 因爲ASSM根本不使用freelist。在ASSM中, PCTUSED參數將被忽略。
ASSM管理方式爲每個段的前兩個數據塊用來管理freeblock(空閒塊)其中第一個數據塊記錄first level bit map block(第一級位圖塊),第二個數據塊記錄second level bit map block(第二級位圖塊),第三塊開始纔是段的第一個可用數據塊。 ASSM管理機制是用位圖來跟蹤或管理每個分配到對象的塊,每個塊有多少剩餘空間根據位圖的狀態來確定,如>75%,50%-75%,25%-50%和<25%,也就是說位圖其實採用了四個狀態位來代替以前的pctused。一張表在進行inset、update的時候數據插入到哪個數據塊中PctFree會限制,什麼時候利用該數據塊則由設定的pctfree來確定。同時也帶來一個問題,該條數據的插入、變更是否會產生行遷移,也同樣由oracle自己判斷。如果發生行遷移,可以通過重建該數據塊解決。
同樣使用ASSM的一個巨大優勢是,用位圖來管理能夠減輕緩衝區忙等待(buffer busy wait)的負擔,這個問題在Oracle9i以前的版本里曾是一個嚴重的問題。
有了ASSM之後,Oracle宣稱顯著地提高了DML併發操作的性能,因爲(同一個)位圖的不同部分可以被同時使用,這樣就消除了尋找剩餘空間的串行化。根據Oracle的測試結果,使用位圖freelist會消除所有分段頭部(對資源)的爭奪,還能獲得超快的併發插入操作
儘管ASSM能夠簡化Oracle DBA的工作,但是位圖分段管理還是有一些侷限性的: 
1、一旦DBA被分配之後,它就無法控制tablespace內部的獨立表和索引的存儲行爲。 
2、大型對象不能夠使用ASSM,而且必須爲包含有LOB(增長)數據類型的表格創建分離的tablespace。 
3、你不能夠使用ASSM創建臨時的tablespace。這是由排序時臨時分段的短暫特性所決定的。
4.只有本地管理的tablespace才能夠使用位圖分段管理。
5.使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的時候可能會出現性能上的問題。
什麼是緩衝區忙等待?
在oracle 9i以前,在沒有多個freelist(自由列表)的時候,每個區段的第一個數據塊,用來管理對象所使用的剩餘數據塊,爲insert、update數據行提供數據塊。當數據緩衝內的數據塊由於被另一個DML事務處理鎖定而無法使用的時候,緩衝區忙等待就會發生。當你需要將多個行插入到同一個表裏的時候,這些任務就被強制等待,而同時Oracle會在同時分派剩餘的區塊,一次一個。
四、創建表空間語法參數解釋
CREATE [UNDO]  TABLESPACE tablespace_name          
[DATAFILE datefile_spec1 [,datefile_spec2] ......   
[{MININUM EXTENT integer [k|m]   
|BLOCKSIZE integer [k]   
|logging clause | FORCE LOGGING   
|DEFAULT {data_segment_compression} storage_clause   
|[online|offline]   
|[PERMANENT|TEMPORARY]   
|extent_manager_clause   
|segment_manager_clause}]
 1、undo   
說明將創建一個undo表空間。數據庫管理員可以不必管理回滾段,只要建立了undo表空間,系統就會自動管理回滾段的分配,回收的工作。   
當然,也可以創建一般的表空間,在上面創建回滾段.不過對於用戶來說,系統管理比自己管理要好很多.   
如果需要自己管理,請參見回滾段管理的命令詳解.   
當沒有爲系統指定回滾表空間時,系統將使用system系統回滾段來進行事務管理。     
2、tablespace_name  
指出表空間的名稱。    
3、datafile  datefile_spec1
datefile_spec是指創建表空間的參數:[ 'filename' ] 、[SIZE integer [ K | M ]]、 [REUSE] 、[autoextend_clause]  
[autoextend_clause]是指表空間的拓展方式:AUTOEXTEND { OFF | ON [ NEXT integer [ K | M ] ] [maxsize_clause] }  
filename:數據文件的路徑名,可以是相對路徑,也可以是絕對路徑。   
size:文件的大小 
REUSE:表示文件是否被重用.   
AUTOEXTEND:表明是否自動擴展.   
OFF | ON  :表示自動擴展是否被關閉.   
NEXT :表示數據文件滿了以後,擴展的大小.   
maxsize_clause:表示數據文件的最大大小,MAXSIZE { UNLIMITED | integer [ K | M ] }.   
UNLIMITED :表示無限的表空間.,直至表空間所在的磁盤全部佔用   
integer:表示設定該數據文件的最大大小.     
4、MININUM EXTENT integer [k|m]   
指出在表空間中區段的最小值。這個參數可以減小空間碎片,保證在表空間的範圍是這個數值的整數倍。
5、BLOCKSIZE integer [k]   
這個參數可以設定一個不標準的塊的大小。如果要設置這個參數,必須設置db_block_size,db_nk_block_size這兩個參數,並且這兩個參數的值必須與blocksize的值相同。但是使用默認標準塊時,參數db_nk_cache_size的值爲0。
注意:在臨時表空間不能設置這個參數。    
6、logging clause   
表空間中包括表,索引,分區,物化視圖,物化視圖上的索引,分區。是否需要日誌保護 [ logging | nologging ](默認是logging)臨時表空間爲nologging,   
7、FORCE LOGGING   
使用這個子句指出表空間進入強制日誌模式。此時,系統將記錄表空間上對象的所有改變,除了臨時段的改變。
這個參數高於對象的nologging選項。   
注意:設置這個參數數據庫不能open並且處於讀寫模式。而且,在臨時表空間和回滾表空間中不能使用這個選項。   
8、DEFAULT storage_clause   
該語句定義表空間的一些參數,如初始段的尺寸、最小區段尺寸,最大區段數量等。
9、online|offline   
改變表空間的狀態。online使表空間創建後立即有效.這是缺省值.   
offline使表空間創建後無效。這個值,可以從dba_tablespace中得到。   
10、PERMANENT|TEMPORARY   
指出表空間的屬性,是永久表空間還是臨時表空間。   
永久表空間存放的是永久對象,臨時表空間存放的是session生命期中存在的臨時對象。   
這個參數生成的臨時表空間創建後一直都是字典管理,不能使用extent management local選項。   
如果要創建本地管理表空間,必須使用create temporary tablespace   
注意,聲明瞭這個參數後,不能聲明block size   
11、extent_management_clause   
這是最重要的子句,說明了表空間如何管理範圍。一旦你聲明瞭這個子句,只能通過移植的方式改變這些參數。
如果希望表空間本地管理的話,聲明local選項。本地管理表空間是通過位圖管理的。   
autoallocate說明表空間自動分配範圍,用戶不能指定範圍的大小。只有9i以上的版本具有這個功能。   
uniform說明表空間的區段的固定大小,缺省是1m。   
不能將本地管理的數據庫的system表空間設置成字典管理。   
oracle公司推薦使用本地管理表空間。   
如果沒有設置extent_management_clause,oracle會給他設置一個默認值。   
如果初始化參數compatible小於9.0.0,那麼系統創建字典管理表空間。   
如果大於9.0.0,那麼按照如下設置:   
如果沒有指定 default  storage_clause,oracle創建一個自動分配的本地管理表空間。   
否則,   
如果指定了mininum extent,那麼oracle判斷mininum extent 、initial、next是否相等,以及pctincrease是否=0.   
如果滿足以上的條件,oracle創建一個本地管理表空間,extent size是initial.   
如果不滿足以上條件,那麼oracle將創建一個自動分配的本地管理表空間。   
如果沒有指定mininum extent。initial、那麼oracle判斷next是否相等,以及pctincrease是否=0。   
如果滿足oracle創建一個本地管理表空間並指定uniform。否則oracle將創建一個自動分配的本地管理表空間。   
注意:本地管理表空間只能存儲永久對象。   
如果你聲明瞭local,將不能聲明 default  storage_clause,mininum extent、temporary.   
EXTENT MANAGEMENT LOCAL   
12、segment_management_clause   
段空間管理的方式,自動或者手動:   
SEGMENT SPACE MANAGEMENT {AUTO|MANUAL}
13、retention guarantee
undo表空間參數,指定commit之後未達到undo_retention參數保留時間的數據塊絕對不能被覆蓋
五、創建表空間測試
1、創建數據字典管理方式表空間(表空間包含三個數據文件個100M,初始區段200K,每次區段增長200K,最大區段數500)
SQL> create tablespace yunnan_data
2 datafile '/u01/app/oracle/oradata/dg1/yunnan01.dbf' size 100m,
3 '/u01/app/oracle/oradata/dg1/yunnan02.dbf' size 100m,
4 '/u01/app/oracle/oradata/dg1/yunnan03.dbf' size 100m
5 minimum extent 200k
6 extent management dictionary
7 default storage(initial 200k next 200k maxextents 500 pctincrease 0);
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace(由於測試主機system爲LOCAL本地管理方式,所以報錯不允許創建字典管理表空間)
2、創建本地管理表空間(包含一個數據文件,大小固定爲100M,區段管理方式爲本地管理,區段大小統一爲1M,默認生成logging)
SQL> create tablespace beijing_data
2 datafile '/u01/app/oracle/oradata/dg1/beijing01.dbf' size 100m
3 extent management local
4 uniform size 1m;
3、創建本地管理表空間(包含一個數據文件,大小爲100m,自動拓展模式,空間不足時每次拓展10M,最大1024M,區段管理爲本地管理)
SQL> create tablespace sichuan logging
2 datafile'/u01/app/oracle/oradata/dg1/sichuan01.dbf'
3 size 100m
4 autoextend on
5 next 10m maxsize 1024m
6 extent management local;
4、創建undo表空間,undo表空間創建時,只能使用datafile和extent management子句
SQL> create undo tablespace test_undo
2 datafile '/u01/app/oracle/oradata/dg1/test_undo.dbf'
3 size 100m;
查詢創建情況
SQL> select tablespace_name,status,contents,extent_management
2 from dba_tablespaces;
SQL> select file_name,file_id,tablespace_name,status
2 from dba_data_files
3 where tablespace_name='TEST_UNDO';
5、創建臨時表空間(本地管理,區段統一尺寸1M)
SQL> create temporary tablespace test_temp
2 tempfile '/u01/app/oracle/oradata/dg1/test_temp.dbf' size 50m
3 extent management local
4 uniform size 1m;
查詢表空間狀態
SQL> select tablespace_name,status,contents,logging
2 from dba_tablespaces;
SQL> select file#,status,enabled,bytes,block_size,name
2 from v$tempfile;
臨時表空間存儲臨時數據文件的特點
1、永遠處於NOLOGGING狀態,因爲臨時數據不需要日誌保護
2、不能設置爲只讀模式(read_only)
3、不能重命名
4、不能通過alter database 創建
5、臨時文件用於只讀數據庫
6、介質恢復時不恢復臨時文件
7、使用backup controlfile(備份控制文件) 不產生任何臨時文件信息
8、使用create controlfile(創建控制文件)不能設置任何與臨時文件有關的信息
9、不能把使用中的默認臨時表空間刪除、脫機,修改爲PERMANENT(永久)表空間
初始化參數文件時,爲了優化排序區。最好將uniform size參數設置爲 sort_area_size(排序區大小)的整倍數
6、創建大文件表空間
一、原理概述:oracle由10g開始提供大文件表空間的功能,大文件表空間是由一個大文件組成,不是傳統有多個小文件組成。由於大文件表空間與大文件一 一對應,才使得oracle有能力去管理大文件,表空間成爲磁盤空間管理、備份、恢復的操作對象。
使用限制:11g中只有本地管理且段空間爲自動管理的表空間纔可以使用大文件表空間(big file tablespace),簡稱BFT ,對於本地管理的undo表空間和臨時表空間,不要求段空間管理類型,可以使用BFT。oracle 11g concept 文檔建議,大文件表空間與自動存儲管理和邏輯卷管理工具結合使用,這些工具能夠支持動態擴展邏輯卷,也支持條帶化或支持RIAD。
使用大文件表空間在數據庫開啓時對於DBWR進程的性能有顯著提高,但該表空間的大文件會增加該表空間和整個數據庫的備份、恢復時間。
二、大文件表空間的優勢:只需要創建一個數據文件,大大減少了數據文件的數量,簡化了數據文件的管理難度。數據文件的減少相應控制文件不需要記錄大量數據文件的位置信息,控制文件的容量相應減少。
大文件表空間的容量比普通表空間大得多,所以存儲能力也有顯著提高。一個普通表空間最多可以管理1024個數據文件,而一個大文件表空間包含一個數據文件,但該文件的容量上限是普通數據文件的1024倍,所以大文件表空間和普通表空間的容量是一樣的。但由於每個數據庫最多可以使用64K個表空間,所以使用大文件表空間的數據庫總容量比使用普通表空間的數據庫要大得多。根據塊的大小,大文件表空間的容量可以爲138,如果使用最大數據塊 32K塊,數據庫最大容量爲8EB。
三、大文件創建測試:創建大文件表空間有3種方法,依次測試
1、:創建數據庫時,定義大文件表空間爲默認創建表空間類型。一旦定義,以後創建表空間默認爲大文件表空間,需要創建普通表空間需要手動修改。
以下語句爲創建數據庫時創建名爲test_big大文件表空間的語句,以後大文件表空間會作爲默認創建類型
SQL> create database
2 set default bigfile tablespace test_big
3 datafile '/u01/app/oracle/oradata/dg1/test_big.dbf' size 1G;
2、數據庫創建後,使用 create bigfile tablespace創建大文件表空間
SQL> create bigfile tablespace test_big
2 datafile '/u01/app/oracle/oradata/dg1/test_big.dbf' size 1G;
驗證創建是否成功
SQL> select tablespace_name,file_name,bytes/(1024*1024*1024) G
2 from dba_data_files;
查詢段空間的管理方式和區段的管理方式
SQL> select tablespace_name,initial_extent,contents,extent_management,segment_space_management
2 from dba_tablespaces
3 where tablespace_name like 'TEST_BIG';
TABLESPACE_NAME INITIAL_EXTENT CONTENTS EXTENT_MAN SEGMEN
---------------------------- ------------------- ----------------- ------------------ -----------
TEST_BIG 65536 PERMANENT LOCAL AUTO
(INITIAL_EXTENT)初始段大小 64K
(CONTENTS)表空間類型 永久表空間(PERMANENT)
(EXTENT_MAN)區段管理方式 本地管理(LOCAL)
(SEGMENT_SPACE_MANAGEMENT)段空間管理方式 自動(AUTO)
3、通過改變默認表空間類型爲大文件表空間類型,使得之後創建的表空間都爲大文件表空間類型
alter tablespace set default bigfile tablespace
四、參數修改
一、修改已經創建的大文件表空間容量的大小,有兩種方法可以修改。
第一種、在alter tablespace 指令中使用resize(重建)子句
alter tablespace test_big resize 2G;
查詢修改情況
SQL> select tablespace_name,file_name,bytes/(1024*1024*1024) G,autoextensible
2 from dba_data_files
3 where tablespace_name like 'TEST_BIG';
TABLESPACE_NAME FILE_NAME G AUTOEXTENSIBLE
-------------------------------------- ---------------------------------------------- ---------- -------------------------------------
TEST_BIG /u01/app/oracle/oradata/dg1/test_big.dbf 2 NO
此種修改方式,發現AUTOEXTENSIBLE(自動拓展)爲NO,證明該表空間不能自動拓展
第二種、在alter tablespace 指令中使用AUTOEXTEND ON子句,將表空間修改爲自動拓展
SQL> alter tablespace test_big autoextend on next 1G;
修改結果爲空間不足時自動拓展1G,直至整個磁盤空間被佔滿。
查詢修改情況
SQL> select tablespace_name,file_name,bytes/(1024*1024*1024) G,autoextensible
2 from dba_data_files
3 where tablespace_name like 'TEST_BIG';

TABLESPACE_NAME FILE_NAME G AUTOEXTENSIBLE
-------------------------------------- ---------------------------------------------- ---------- -------------------------------------
TEST_BIG /u01/app/oracle/oradata/dg1/test_big.dbf 4 YES
此時自動拓展已修改爲自動模式
六、表空間的管理
表空間的管理分爲聯機管理、脫機管理和只讀管理。表空間處於脫機狀態時,用戶或應用程序無法訪問表空間,此時可以完成如脫機備份等工作。處於只讀狀態時,用戶或應用程序可以訪問該表空間,但不能更改表空間中的數據,使該表空間中的數據處於靜止狀態。
一、數據文件、表空間脫機狀態管理
數據文件脫機的目的:正常情況數據文件都是在聯機狀態下,當需要對數據文件冷備份、恢復、空間遷移或出現數據文件所在磁盤損壞等情況時需要將數據文件進行脫機。
1、數據文件OFFLINE
數據文件添加到表空間之後不能夠被刪除的,沒有語法支持這麼做,如果想不使用該數據文件,唯一辦法是將數據文件設置爲OFFLINE狀態。
數據文件脫機後,數據文件相關的數據字典信息、原數據信息都依然存在,當表空間被刪除後,相關數據文件的信息纔會被清除。DROP TABLESPACE只是清空Oracle數據字典信息,即使數據文件不存在都可以正常的DROP表空間。對於數據文件的脫機,在設置該數據文件ONLINE的時候都對該數據文件執行介質恢復。
執行以下步驟將數據文件設置爲OFFLINE狀態:
1)         如果是歸檔模式可以執行如下SQL設置數據文件的狀態爲OFFLINE
ALTER DATABASE DATAFILE 'datafile_name' OFFLINE;
2)         如果是非歸檔模式執行以下SQL將數據文件狀態設置爲OFFLINE
ALTER DATABASE DATAFILE 'datafile_name' OFFLINE DROP;
1、歸檔模式下,脫機的數據文件內數據的變更可以通過LGWR進程記錄在log file日誌文件中,再次聯機後通過日誌記錄內容進行數據變更的更新。
2、如果在非歸檔模式下使用OFFLINE DROP使數據文件脫機,這就意味着該數據文件可能無法再恢復到ONLINE狀態,原因就在於在非歸檔模式可能沒有足夠的日誌執行ONLINE的介質恢復。如果日誌未發生切換,還依然存在的話,依然可以執行介質恢復後使數據文件ONLINE,但如果執行alter system switch logfile強制切換日誌文件組或日誌文件組正常切換覆蓋那麼此時由於沒有日誌文件記錄數據文件信息該數據文件將永遠處於recover狀態,永遠不能再次聯機。
執行以下步驟將數據文件設置爲ONLINE狀態:
1)         如果是歸檔模式可以執行如下SQL設置數據文件的狀態爲ONLINE

ALTER DATABASE DATAFILE 'datafile_name' ONLINE;
2)         如果是非歸檔模式執行以下SQL將數據文件狀態設置爲ONLINE
RECOVER DATAFILE 'datafile_name' ;
ALTER DATABASE DATAFILE 'datafile_name' OFFLINE;
在實際的生產環境中,防止數據的丟失。儘量在歸檔模式下做脫機數據文件操作


2、表空間OFFLINE
表空間脫機的目的:表空間通常處於聯機狀態,以便數據庫用戶訪問其中的數據。但是DBA需要對錶空間進行維護,備份或恢復操作時,則需要將表空間脫機。
對數據庫的脫機包括數據文件的脫機和對錶空間的脫機,表空間脫機實際就是表空間對應的所有數據文件脫機。
表空間脫機的限制:數據庫open狀態下,不是所有表空間都可以變更狀態爲脫機狀態,不能變更爲脫機狀態的表空間包括system表空間(需要使用其中的數據字典)、有活躍undo段的UNDO表空間和當前數據庫默認的臨時表空間。需要將這幾種表空間進行脫機時,需要將數據庫置於NOMOUNT狀態
Oracle表空間脫機應對機制
當一個表空間脫機後,Oracle不允許任何SQL語句繼續引用此表空間內的對象(schema object)。如果一個活動事務(active transaction)中的 SQL 語句正好在使用被置爲脫機狀態的表空間內的對象,其事務性也不會被破壞。Oracle使用 SYSTEM 表空間內的延遲迴滾段(deferred rollback segment)爲此事務中已完成的 SQL 語句保存回滾信息(rollback data)。當脫機表空間被重新置位聯機(online)狀態後,Oracle會在需要時應用這些回滾信息。
表空間聯機或脫機時,SYSTEM 表空間內的數據字典(data dictionary)會進行記錄。如果用戶關閉一個數據庫時某個表空間處於脫機狀態,那麼這個表空間在數據庫下次被裝載、打開後依舊保持脫機狀態。
用戶只能將一個表空間聯機到創建她的數據庫中,因爲只有這個數據庫的 SYSTEM 表空間中才保存着與此表空間相關的必要的數據字典(data dictionary)信息。一個脫機的表空間不能被Oracle之外的工具打開或編輯。因此脫機表空間不能被移動到其他數據庫中。
當某些錯誤發生時,Oracle會自動地將相關的聯機表空間切換到脫機狀態。例如,當數據庫寫入進程(database writerprocess,DBWn)多次嘗試向表空間的數據文件(datafile)寫入失敗後,Oracle就會將此表空間切換到脫機狀態。此時嘗試訪問脫機表空間內數據表的用戶將會得到錯誤信息。如果是介質故障(media failure)導致此次磁盤 I/O 失敗,用戶必須在處理故障後恢復(recover)受影響的表空間。
脫機表空間對數據庫的影響
用戶可以將不同類型的數據分開存儲在不同的表空間中。當用戶因爲某些任務而令某個表空間脫機後,其餘表空間仍保持聯機狀態,其中的數據對用戶依然可用。但是表空間脫機後也會導致特殊情況發生。例如,有兩個表空間分別用於存儲表及此表對應的索引,脫機後將出現以下問題:
1、如果包含索引的表空間脫機,那麼查詢依舊可以訪問表數據,因爲對錶數據的訪問並不一定需要索引數據。
2、如果包含表的表空間脫機,那麼查詢將無法訪問表數據,因爲脫機表空間內的對象無法被引用。
Oracle對於表空間中數據獲取的方法
如果Oracle能夠從聯機表空間中獲得執行一個SQL語句完整的信息,那麼語句就將被執行。如果相關信息必須從脫機的表空間中獲得,那麼語句將失敗。

以下幾種情況需要手動或自動將聯機狀態的表空間變更爲脫機狀態。
1、允許用戶訪問數據庫的一部分數據,某些表空間不予許用戶訪問
2、執行脫機的表空間備份
3、在數據庫open狀態下,恢復表空間或表空間中的數據文件
4、在數據庫open狀態下,移動表空間中的數據文件
5、在下面這種情況oracle實例會自動將表空間變更爲脫機狀態,當DBWR寫進程嘗試向一個表空間中的數據文件進行寫入操作,但該表空間中的數據文件由於移動、丟失、磁盤故障等情況無法完成寫入操作,則實例會自動將該表空間進行脫機狀態操作。
當表空間處於脫機狀態時,不予許執行任何SQL語句,用戶訪問該表空間中的對象會報錯。表空間的脫機狀態會記錄在數據字典和控制文件中。在數據庫關閉時,如該表空間處於脫機狀態,再次打開數據庫該表空間依然會處於脫機狀態。

表空間脫機的方法
分爲正常脫機、臨時脫機和立即脫機共三種方法
1)         OFFLINE NORMAL
這是默認的選項,正常情況表空間的脫機,當重新執行ONLINE時,Oracle會用相應的SCN來更新表空間數據文件頭SCN即可正常的ONLINE表空間,不需要執行介質恢復。
ALTER TABLESPACE tablespace_name OFFLINE | NORMAL |;
2)         OFFLINE TEMPORARY
如果指定TEMPORARY,Oracle數據庫爲表空間中所有在線數據文件執行一個檢查點,但是不能確保所有文件能被同步。當執行這個語句數據文件已經脫機,那麼在使表空間重新ONLINE之前需要執行介質恢復。
ALTER TABLESPACE tablespace_name OFFLINE TEMPORARY;
3)         OFFLINE IMMEDIATE
執行這個操作表示立即使表空間脫機,在下次使表空間ONLINE的時候必須執行介質恢復,介質恢復成功才能使表空間ONLINE:
ALTER TABLESPACE tablespace_name OFFLINE IMMEDIATE;
對於數據文件的脫機來說,在下次ONLINE的時候一定要執行介質恢復過程,如果介質恢復成功,那麼就可以成功ONLINE。對於正常的表空間脫機,下次使表空間ONLINE的時候不需要執行介質恢復。對於OFFLINE TEMPORARY的表空間,如果脫機前已經有數據文件是脫機的,那麼在表空間上線前也需要執行部分數據文件的介質恢復。對於IMMEDIATE OFFLINE的表空間,在表空間上線前需要對錶空間的所有數據文件執行介質恢復。脫機後的數據文件和表空間,在實例重啓的時候都不會對數據文件的SCN號進行驗證。

對於表空間脫機的不同需求
NORMAL
如果表空間所有數據文件都沒有錯誤,表空間可以正常脫機。寫入錯誤導致表空間所有數據文件都不能脫機。當指定OFFLINE NORMAL時,Oracle對所有數據文件一邊進行檢查一邊將他們脫機。
TEMPORARY
表空間能臨時脫機,即使表空間的一個或多個數據文件有錯誤。當指定OFFLINE TEMPORARY選項時,Oracle將還沒脫機的數據文件脫機,同時對他們進行檢查。如果沒有數據文件脫機,然後用臨時選項脫機,當聯機表空間時不需要介質恢復。但是,如果有表空間的文件因寫入錯誤脫機,然後將表空間臨時脫機,在將表空間聯機之前需要介質恢復。
IMMEDIATE
表空間能立即脫機,不等Oracle對任何數據文件做檢查。在指定OFFLINE IMMEDIATE的情況下,當聯機表空間時需要介質恢復。如果數據庫運行在NOARCHIVELOG模式下,表空間不能立即脫機。
FOR RECOVER(前三種的附加參數)
將在恢復集中的數據庫表空間脫機,以便進行時間點恢復。
Oracle的建議
如果必須脫機表空間,儘量用NORMAL選項(默認)。這將保證表空間聯機時不需要恢復。儘管部分恢復後用ALTER DATABASE OPEN RESETLOGS語句重置了重做日誌序列,依然不需要恢復。只有當不能正常脫機表空間的時候才指定TEMPORARY選項。這種情況下,只有因錯誤被脫機的文件在表空間聯機時才需要恢復。只有當指定NORMAL和TEMPORARY都不行的情況下才用IMMEDIATE選項。
脫機表空間前需要的考慮:
  • 驗證表空間不含有活動的回滾段,存在活動回滾段的表空間不能脫機。
  • 脫機永久、臨時表空間前,需要用戶將等待脫機的表空間設置爲不是默認的表空間,因爲當脫機時,他們即不能訪問該表空間(永久)中的任何對象,也不能使用該表空間(臨時)進行排序。
脫機後聯機表空間
只要數據庫打開,Oracle數據庫的表空間都能恢復聯機。如果要聯機的表空間不是“乾淨”脫機(即用NORMAL選項的ALTER TABLESPACE OFFLINE語句),在聯機之前必須先對錶空間進行介質恢復。否則,Oracle返回錯誤並保持表空間脫機。

二、只讀狀態的管理

只讀表空間 
使用只讀表空間(read-only tablespace)的主要目的是爲了避免對靜態、且容量大的數據庫內容進行備份和恢復操作。Oracle不會更新只讀表空間內的數據,因此這類表空間的數據文件(datafile)可以放置在 CD-ROM 或 WORM之類的只讀介質(read-only media)上。
因爲Oracle只能將一個表空間聯機到創建它的數據庫,只讀狀態的表空間,不能進行insert、update和使用delete、truncate刪除表空間內的數據,數據處於相對靜止狀態。不被redo日誌保護,減少日誌的大小。
如果想更新一個只讀表空間,首先要使表空間可讀寫。在更新後,還可以將表空間恢復到只讀狀態。
因爲只讀表空間不能被修改,只要沒有將只讀表空間置於可讀寫狀態,就無需對其進行重複的備份操作。當用戶需要恢復數據庫時,也沒必要恢復只讀表空間,原因同前所述。

進行此操作必須具有ALTER TABLESPACE 或 MANAGE TABLESPACE 系統權限或具有系統權限的角色。
GRANT ALTER TABLESPACE TO user_name
GRANT MANAGE TABLESPACE TO user_name
變更表空間爲只讀狀態
SQL> alter tablespace tablespace_name read only;
變更表空間爲讀寫狀態
SQL> alter tablespace tablespace_name read write;

只讀表(Oracle 11g新特性)
Oracle更細粒度的改變
變更表爲只讀狀態
SQL> alter tablespace table_name read only;
變更表爲讀寫狀態
SQL> alter tablespace table_name read write;

七、表空間和數據文件的管理
表空間的管理涉及修改表空間的大小、刪除表空間以及修改表空間的存儲參數。數據文件邏輯存放在表空間中,管理數據文件涉及修改數據文件大小、刪除表空間中的數據文件、遷移數據文件以及改變表空間的存儲路徑。
一、表空間的管理
1、修改表空間大小
修改表空間大小有四種方法:
第一種、創建表空間時,使用AUTOEXTEND ON子句,使表空間空間不足時自動按設定條件增長
第二種、在創建表空間後,使用ALTER DATABASE DATAFILE 數據文件名 AUTOEXTEND ON修改不能自動擴展的數據文件爲自動擴展
第三種、在已經創建的表空間中,添加數據文件
第四種、修改表空間內數據文件大小、通過resize重建某個數據文件的大小
下面分別測試
第一種:創建一個表空間,其中包含一個支持自動拓展空間的數據文件
SQL> create tablespace test_2017_9_6
2 datafile '/u01/app/oracle/oradata/dg1/test_20170906.dbf'
3 size 100m
4 autoextend on;

Tablespace created.
查看該表空間內的數據文件是否可用和是否支持自動拓展

SQL> select file_name,tablespace_name,blocks,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME BLOCKS STATUS AUTOEXTENSIBLE
----------------------------------------------------------------------- ---------------------------- ------------- ------------- ---------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 12800 AVAILABLE YES

AVAILABLE 表示該數據文件可用
AUTOEXTENSIBLE 表示是否支持自動拓展
第二種:修改一個不能自動拓展的數據文件
首先將TEST_2017_9_6表空間變更爲不自動拓展模式
SQL> alter database datafile '/u01/app/oracle/oradata/dg1/test_20170906.dbf' autoextend off;
或者重新創建一個不自動拓展的表空間
SQL> create tablespace test_2017_9_6_1
2 datafile '/u01/app/oracle/oradata/dg1/test_20170906_1.dbf'
3 size 50m
4 uniform size 1m;

Tablespace created.
查詢是否支持自動拓展
SQL> select tablespace_name,file_name,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6_1';

TABLESPACE_NAME FILE_NAME AUTOEXTENSIBLE
------------------------------ ----------------------------------------------------------------- ----------------------------------
TEST_2017_9_6_1 /u01/app/oracle/oradata/dg1/test_20170906_1.dbf NO
修改表空間爲自動拓展模式(每次拓展10M)
SQL> alter database datafile
2 '/u01/app/oracle/oradata/dg1/test_20170906_1.dbf' autoextend on
3 next 10M;

Database altered.
第三種:向TEST_2017_9_6表空間中添加一個數據文件,使空間的容量得到增加
首先查詢該表空間拓展狀態和包含的數據文件數量、大小
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
-------------------------------------------------------- ---------------------------------- ---------- -------------- -----------------------------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
可以看出共包含1個100MB的數據文件,並且不支持拓展

現在添加一個50MB的不可拓展數據文件
SQL> alter tablespace test_2017_9_6
2 add datafile '/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf'
3 size 50M;

再次查詢可以看出包含兩個數據文件分別爲100MB和50MB
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
-------------------------------------------------------- ---------------------------------- ---------- -------------- -----------------------------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf TEST_2017_9_6 50 AVAILABLE NO

第四種:通過重建TEST_2017_9_6表空間中數據文件來增加表空間的容量
將test_20170906_add01.dbf數據文件重建爲100MB
SQL> alter database
2 datafile '/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf' resize 100M;

Database altered.
查詢該表空間中test_20170906_add01.dbf 數據文件已經重建爲100MB,該表空間容量也提高到200MB
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
-------------------------------------------------------- ---------------------------------- ---------- -------------- -----------------------------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf TEST_2017_9_6 100 AVAILABLE NO

2、修改表空間存儲參數(只針對數據字典管理模式)
修改表空間的存儲參數只針對數據字典管理的表空間,在11g中默認創建的表空間爲本地管理,所以只進行命令演示。
修改表空間tianjin的存儲參數MINMUM EXTENT(最小區段),將EXTENT的尺寸由1MB修改爲2MB,通過修改這一參數將表空間的整體容量提升一倍。
SQL> alter tablespace tianjin
2 minimum extent 2M;
修改表空間的默認存儲語句
SQL> alter tablespace tianjin default storage (initial 2M next 2M maxextents 50);
修改結果爲,初始段爲2M,每次增長2M,最多包含有50個區段(即100MB)
在dba_tablespaces字典表內可以查詢修改結果
3、刪除表空間
當不需要一個表空間時,可以刪除該表空間釋放磁盤空間。
刪除語法
DROP TABLTSPACE tablespace_name [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]
參數含義
tablespace_name 表空間名
INCLUDING CONTENTS 刪除表空間內的所有EXTENT(區段)
AND DATAFILES 刪除表空間同時刪除數據文件
CASCADE CONSTRAINTS 刪除與該表空間關聯的完整性約束(如主外鍵約束),如外部表會引用該表空間中表的唯一鍵等作爲外部表的引用。

測試刪除名爲test_2017_9_6_1的表空間,並且刪除所有extent,以及包括數據文件和與之關聯的約束一併刪除
SQL> drop tablespace test_2017_9_6_1 including contents and datafiles cascade constraints;

Tablespace dropped.

4、遷移數據文件
遷移數據文件是指把當前表空間內的數據文件遷移到其他磁盤空間。在生產環境中,當一個表空間所在的磁盤空間容量達到上限無法再繼續拓展數據文件時,爲了使數據庫系統正常運行,就需要將其中的數據文件遷移到其他空閒磁盤空間中。
遷移主要分爲兩種,遷移系統表空間中的數據文件和遷移非系統表空間中的數據文件,下面分別測試
1、遷移系統表空間中的數據文件
首先查看系統表空間中數據文件信息
SQL> select tablespace_name,file_name,bytes/(1024*1024) M,status
2 from dba_data_files
3 where tablespace_name='SYSTEM';

TABLESPACE_NAME FILE_NAME M STATUS
--------------------------- -------------------------------------------------- ---------- -----------
SYSTEM /u01/app/oracle/oradata/dg1/system01.dbf 325 AVAILABLE
記錄數據文件位置,關閉數據庫。將數據文件複製到新的路徑
SQL> shutdown immediate;
cp /u01/app/oracle/oradata/dg1/system01.dbf /u01/app/oracle/oradata/system01.dbf
將數據庫啓動至mount狀態,此時只由參數文件將instance啓動
startup mount;
通過ALTER DATABASE告訴數據庫system表空間的數據文件位置已經變更(前面爲原路徑,to後面爲新路徑)
SQL> alter database
2 rename file '/u01/app/oracle/oradata/dg1/system01.dbf'
3 to '/u01/app/oracle/oradata/system01.dbf';

Database altered.
將數據庫啓動至open狀態
SQL> alter database open;

Database altered.

此時再次查看系統表空間中數據文件信息,已經遷移成功。最後把原數據文件刪除
TABLESPACE_NAME FILE_NAME M STATUS
-------------------------- ------------------------------------------------------ ---------- -----------
SYSTEM /u01/app/oracle/oradata/system01.dbf 325 AVAILABLE
2、遷移非系統表空間中的數據文件
限制:需要遷移數據文件的表空間內,不能包含活躍的undo段、臨時段、排序段,這樣才能進行數據文件的遷移。
首先查看需要遷移表空間中數據文件的信息
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
--------------------------------------------------------------- --------------------------- --------------- ---------------- ---------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf TEST_2017_9_6 100 AVAILABLE NO
共包含兩個100MB的數據文件
把該表空間進行脫機狀態變更
SQL> alter tablespace test_2017_9_6 offline;

Tablespace altered.
查看錶空間狀態是否已脫機
SQL> select tablespace_name,status from dba_tablespaces
2 where tablespace_name='TEST_2017_9_6';

TABLESPACE_NAME STATUS
---------------------------- -----------
TEST_2017_9_6 OFFLINE
複製數據文件到新路徑
[oracle@dg1 dg1]$ cp test_20170906.dbf /u01/app/oracle/oradata/test_20170906.dbf
[oracle@dg1 dg1]$ cp test_20170906_add01.dbf /u01/app/oracle/oradata/test_20170906_add01.dbf
利用ALTER TABLESPACE語句將表空間路徑進行更新
SQL> alter tablespace test_2017_9_6
2 rename datafile '/u01/app/oracle/oradata/dg1/test_20170906.dbf','/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf'
3 to '/u01/app/oracle/oradata/test_20170906.dbf','/u01/app/oracle/oradata/test_20170906_add01.dbf';

Tablespace altered.
將表空間進行聯機狀態變更
SQL> alter tablespace test_2017_9_6 online;

Tablespace altered.
再次查詢表空間數據文件路徑,完成數據文件的遷移。最後將原數據文件刪除
FILE_NAME T ABLESPACE_NAME M STATUS AUTOEXTENSIBLE
----------------------------------------------------------- ---------------------------- ----------- ------------------ -------------------
/u01/app/oracle/oradata/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/test_20170906_add01.dbf TEST_2017_9_6 100 AVAILABLE NO

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章