基本概述
Oracle表空間之基本概念
ORACLE資料庫被劃分成稱作為表空間 的邏輯區域——形成ORACLE資料庫的邏輯結構。一個ORACLE資料庫能夠有一個或多個表空間,而一個表空間則對應著一個或多個物理的資料庫檔案。表空間是ORACLE資料庫恢復的最小單位,容納著許多資料庫實體,如表、視圖、索引、聚簇、回退段和臨時段等。
每個ORACLE資料庫均有SYSTEM表空間,這是資料庫創建時自動創建的。SYSTEM表空間必須總要保持在線上,因為其包含著資料庫運行所要求的基本信息(關於整個資料庫的數據字典、在線上求助機制、所有回退段、臨時段和自舉段、所有的用戶資料庫實體、其它ORACLE軟體產品要求的表)。
一個小型套用的ORACLE資料庫通常僅包括SYSTEM表空間,然而一個稍大型套用的ORACLE資料庫採用多個表空間會對資料庫的使用帶來更大的方便。
例如:便於理解,把oracle資料庫看作一個實在房間,表空間可以看作這個房間的空間,是可以自由分配,在這空間裡面可以堆放多個箱子(箱子可以看作資料庫檔案),箱子裡面再裝物件(物件看作表)。用戶指定表空間也就是你希望把屬於這個用戶的表放在那個房間(表空間)裡面。
表空間是一個虛擬的概念可以無限大,但是需要由數據檔案作為載體。
Segment(段)
段是指占用數據檔案空間的通稱,或資料庫對象使用的空間的集合;段可以有表段、索引段、回滾段、臨時段和高速快取段等。
Extent(區間)
分配給對象(如表)的任何連續塊叫區間;區間也叫擴展,因為當它用完已經分配的區間後,再有新的記錄插入就必須在分配新的區間(即擴展一些塊);一旦區間分配給某個對象(表、索引及簇),則該區間就不能再分配給其它的對象.
查看錶空間:
SQL> select * from v$tablespace;
TS# NAME INCLUD BIGFIL FLASHB ENCRYP
------------------------------------------------------------------------------
SYSTEM YES NO YES
UNDOTBS1 YES NO YES
SYSAUX YES NO YES
USERS YES NO YES
TEMP NO NO YES
查看每個表空間有哪些數據檔案:
SQL> desc dba_data_files;
Name Null? Type
-----------------------------------------------------------------------------
FILE_NAME VARCHAR2(513)
FILE_ID NUMBER
TABLESPACE_NAME VARCHAR2(30)
BYTES NUMBER
BLOCKS NUMBER
STATUS VARCHAR2(9)
RELATIVE_FNO NUMBER
AUTOEXTENSIBLE VARCHAR2(3)
MAXBYTES NUMBER
MAXBLOCKS NUMBER
INCREMENT_BY NUMBER
USER_BYTES NUMBER
USER_BLOCKS NUMBER
ONLINE_STATUS VARCHAR2(7)
查看詳細數據檔案:
SQL> select file_name,tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
----------------------------------------------------------------------------------------------------------------
/ora10/product/oradata/ora10/users01.dbf USERS
/ora10/product/oradata/ora10/sysaux01.dbf SYSAUX
/ora10/product/oradata/ora10/undotbs01.dbf UNDOTBS1
/ora10/product/oradata/ora10/system01.dbf SYSTEM
創建一個表空間:
SQL> create tablespace paul datafile '/ora10/product/oradata/ora10/paul01.dbf' size
20m;
Tablespace created.
查看我們創建的表空間:
[ora10@localhost ora10]$ pwd
/ora10/product/oradata/ora10
[ora10@localhost ora10]$ ls
control01.ctl control03.ctl redo01.log redo03.log system01.dbf undotbs01.dbf
control02.ctl paul01.dbf redo02.log sysaux01.dbf temp01.dbf users01.dbf
Oracle表空間之作用
表空間 的作用能幫助DBA用戶完成以下工作:
1.決定資料庫實體的空間分配;
2.設定資料庫用戶的空間份額;
3.控制資料庫部分數據的可用性;
4.分布數據於不同的設備之間以改善性能;
5.備份和恢複數據。
用戶創建其資料庫實體時,必須給予表空間中具有相應的權力,所以對一個用戶來說,其要操縱一個ORACLE資料庫中的數據,應該:
1.被授予關於一個或多個表空間中的RESOURCE特權;
2.被指定預設表空間;
3.被分配指定表空間的存儲空間使用份額;
4.被指定預設臨時段表空間,建立不同的表空間,設定最大的存儲容量。
控制空間
在一些大型的資料庫套用中,我們需要控制某個用戶或者某一組用戶其所占用的磁碟空間。這就好像在檔案伺服器中,需要為每個用戶設定磁碟配額一樣,以防止硬碟空間耗竭。所以,在資料庫中,我們也需要限制用戶所可以使用的磁碟空間大小。為了達到這個目的,我們就可以通過表空間來實現。
我們可以在Oracle資料庫中,建立不同的表空間,為其設定最大的存儲容量,然後把用戶歸屬於這個表空間。如此的話,這個用戶的存儲容量,就受到這個表空間大小的限制。當然,表空間的優勢還不僅僅這些,企業對於資料庫的性能要求越高,或者資料庫容量越大,則表空間的優勢就會越大。
下面,我們就具體來看看Oracle資料庫中表空間的處理方式,看其在性能與安全性方面是否有足夠的優勢與SQL Server資料庫抗衡。
Oracle空間
在資料庫設計的時候,我們建議資料庫管理員按如下順序設定表空間。
第一步:建立Oracle用戶表空間。
在設計資料庫的時候,首先需要設計表空間。我們需要考慮,是只建立一個表空間呢,還是需要建立多個表空間,以及各個表空間的存放位置、磁碟限額等等。
到底設計多少個表空間 合理,沒有統一的說法,這主要根據企業的實際需求去判斷。如企業需要對用戶進行磁碟限額控制的,則就需要根據用戶的數量來設定表空間。當企業的數據容量比較大,而且又對資料庫的性能有比較高的要求時,就需要根據不同類型的數據,設定不同的表空間,以提高其輸入輸出性能。
第二步:建立Oracle用戶,並指定用戶的默認表空間。
在建立用戶的時候,我們建議資料庫管理員要指定用戶的默認表空間。因為我們在利用CREATE語句創建資料庫對象,如資料庫表的時候,其默認是存儲在資料庫的當前默認空間。若不指定用戶默認表空間的話,則用戶每次創建資料庫對象的時候,都會存儲在資料庫默認表空間中,如果想存儲在自己建的表空間中,最好自己指定自己建的表空間為默認表空間。
另外要注意,不同的表空間有不同的許可權控制。用戶對於表空間A具有完全控制許可權,可能對於表空間B就只有查詢許可權,甚至連連線的許可權的都沒有。所以,合理為用戶配置表空間的訪問許可權,也是提高資料庫安全性的一個方法。
空間恢複方案
用戶表空間
ORACLE表空間錯誤現象:
在啟動資料庫時出現ORA-01157,ORA-01110或作業系統級錯
誤例如ORA-07360,在關閉資料庫(使用shutdown normal或shutdown immediate) 時將導致錯誤ORA-01116,ORA-01110以及作業系統級錯誤ORA-07368
解決:
以下有兩種解決方案:
方案一、用戶的表空間可以被輕易地重建
導出的對象是可用的或表空間中的對象可以被輕易地重建等。在這種情況下,最簡單的方法是offline並刪除該數據檔案,刪除表空間並重建表空間以及所有的對象。
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空間及所有對象。
方案二、用戶的表空間不能夠被輕易地重建
在大多數情況下,重建表空間是不可能及太辛苦的工作.方法是倒備份及做介質恢復.如果您的系統運行在NOARCHIVELOG模式下,則只有丟失的數據,在online redo log中方可被恢復。
步驟如下:
1)Restore the lost datafile from a backup
2)svrmgrl> startup mount
3)svrmgrl> select v1.group#,member,sequence#,first_change# from v$log v1,v$logfile v2 where v1.group#=v2.group#;
4)如果資料庫運行在NOARCHIVELOG模式下則:svrmgrl> select file#,change# from v$recover_file;
如果 CHANGE# 大於最小的FIRST_CHANGE#則數據檔案可以被恢復。
如果 CHANGE# 小於最小的FIRST_CHANGE#則數據檔案不可恢復。恢復最近一次的全備份或採用方案一。
5)svrmgrl> recover datafile filename;
6)確認恢復成功
7)svrmgrl> alter database open resetlogs;
唯讀表空間無需做介質恢復,只要將備份恢復即可。唯一的例外是:
表空間在最後一次備份後被改為read-write 模式
表空間在最後一次備份後被改為read-only 模式
在這種情況下,均需進行介質恢復。
臨時表空間
臨時表空間 並不包含真正的數據,恢復的方法是刪除臨時表空間並重建即可。
系統表空間
如果備份不可用,則只能採用重建資料庫的方法
回滾表空間
有三種種情況:
1、資料庫已經完全關閉(使用shutdown immediate或shutdown命令)
1) 確認資料庫完全關閉
2) 修改init.ora檔案,注釋"rollback-segment"
3) svrmgrl> startup restrict mount
4) svrmgrl> alter database datafile filename offline drop;
5) svrmgrl> alter database open;
基於出現的結果:"statement PRocessed" 轉(7);"ORA-00604,ORA-00376,ORA-01110"轉(6)
6) svrmgrl> shutdown immediate
修改init.ora檔案,增加如下一行:_corrupted_rollback_segments = (<roll1>,...<rolln>)
svrmgrl> startup restrict
7) svrmgrl> drop tablespace tablespace_name including contents;
8) 重建表空間 及回滾段
9) svrmgrl> alter system disable restricted session;
10) 修改init.ora檔案
2、資料庫未完全關閉(資料庫崩潰或使用shutdown abort命令關閉資料庫)
1) 恢復備份
2) svrmgrl> startup mount
3) svrmgrl> select file#,name,status from v$datafile;
svrmgrl> alter database datafile filename online;
4) svrmgrl> select v1.group#,member,sequence#,first_change# from v$log v1,v$logfile v2 where v1.group#=v2.group#;
5) svrmgrl> select file#,change# from v$recover_file; #參見方案2-4
6) svrmgrl> recover datafile filename;
7) svrmgrl> alter database open;
3、資料庫處於打開狀態
1) 刪除回滾段和表空間
2) 重建表空間和回滾段