Oracle表空間

Oracle表空間

SQL Server資料庫與Oracle資料庫之間最大的區別要屬表空間設計。Oracle資料庫開創性地提出了表空間的設計理念,這為Oracle資料庫的高性能做出了不可磨滅的貢獻。可以這么說,Oracle中很多最佳化都是基於表空間的設計理念而實現的。

基本概述

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表空間 Oracle表空間

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) 重建表空間和回滾段

相關詞條

相關搜尋

熱門詞條

聯絡我們