02.26 一文讀懂oracle表空間

概述

oracle表空間這個概念大家應該都很熟悉了, 這是一個邏輯概念,可以理解為在數據庫中開闢的空間用來存儲數據庫對象。

一文讀懂oracle表空間


表空間相關

1、表空間和數據文件的關係:

表空間由一個或多個數據文件組成;數據文件的大小和位置可以自己定義;

2、表空間的分類:

永久表空間:數據庫中要永久化存儲的一些對象,如:表、視圖、存儲過程

臨時表空間:數據庫操作當中中間執行的過程,執行結束後,存放的內容會被自動釋放

UNDO表空間:用於保存事務所修改數據的舊值,可以進行數據的回滾

篇幅有限,下面主要對系統表空間、輔助表空間和臨時表空間做個介紹。


一、系統表空間

SYSTEM 表空間是 Oracle 數據庫最重要的一個表空間,存放了一些 DDL 語言產生的 信息以及 PL/SQL 包、視圖、函數、過程等,稱之為數據字典,因此該表空間也具有其特殊性。

Oracle服務器使用SYSTEM表空間管理整個數據庫。這個表空間包含系統的數據字典和關於數據庫的管理信息,這些信息均包含在SYS方案中,只有SYS用戶或者擁有所需權限的其它管理用戶才可訪問這些信息。SYSTEM表空間用於核心功能(例如數據字典表)。

1、建議不存放用戶數據

//為數據庫設定默認表空間

SQL>ALTER DATABASE DEFAULTTABLESPACE tablespace_name;

//查詢默認表空間

SQL> select property_name,property_value from database_properties where property_name like 'DEFAULT%';

一文讀懂oracle表空間

2、SYSTEM表空間特性

• 不能脫機 offline

• 不能置為只讀 read only

• 不能重命名

• 不能刪除

3、空間管理

這裡一定要保證空間可用,一般存放單個數據文件,如果 SYSTEM 表空間數據文件很大,可以考慮使用 bigfile。


二、輔助表空間

SYSAUX 表空間在 Oracle Database 10g 中引入,作為 SYSTEM 表空間的輔助表空間.

以前一些使用獨立表空間或系統表空間的數據庫組件現在在 SYSAUX 表空間中創建. 通過分離這些組件和功能,SYSTEM 表空間的負荷得以減輕.反覆創建一些相關對象及組件 引起 SYSTEM 表空間的碎片問題得以避免。

SYSTEM和SYSAUX表空間是在創建數據庫時創建的必須存在的表空間。這些表空間必須聯機。在OPEN狀態下,SYSAUX表空間可以脫機以執行表空間恢復,而SYSTEM表空間則不能,這兩種表空間都不能設置為只讀狀態。在MOUNT狀態下,任何表空間都可以脫機。

SYSTEM表空間的大小一般變化不大,而SYSAUX表空間在默認條件下如果不做任何配置,那麼隨著時間的推移,會越來越大。所以,如果SYSAUX表空間過大,那麼應該及時診斷清理該表空間。

對於SYSTEM表空間而言,如果佔用過大,那麼一般情況下是由於審計表(SYS.AUD$)過大引起的。需要將審計表移動到其它表空間中,然後再清理審計表(TRUNCATE TABLE SYS.AUD$)即可。需要注意的是,如果審計表過大,那麼應該分部去清理審計表。

對於SYSAUX表空間而言,如果佔用過大,那麼一般情況下是由於AWR信息或對象統計信息沒有及時清理引起的,具體原因可以通過如下的SQL語句查詢:

SELECT OCCUPANT_NAME "Item", SPACE_USAGE_KBYTES / 1048576 "Space Used (GB)", SCHEMA_NAME "Schema", MOVE_PROCEDURE "Move Procedure"
FROM V$SYSAUX_OCCUPANTS WHERE SPACE_USAGE_KBYTES > 1048576
ORDER BY "Space Used (GB)" DESC;

如果OCCUPANT_NAME列為SM/AWR(Server Manageability - Automatic Workload Repository),那麼表示AWR信息佔用過大;如果該列為SM/OPTSTAT(Server Manageability - Optimizer Statistics History),那麼表示優化器統計信息佔用過大。

也可以直接查詢DBA_SEGMENTS視圖獲取信息:

SELECT D.SEGMENT_NAME, D.SEGMENT_TYPE,SUM(BYTES)/1024/1024 SIZE_M
FROM DBA_SEGMENTS D

WHERE D.TABLESPACE_NAME = 'SYSAUX'
GROUP BY D.SEGMENT_NAME, D.SEGMENT_TYPE
ORDER BY SIZE_M DESC;

然後查詢佔用空間較大的表,即可得到佔用空間較大的原因

一文讀懂oracle表空間

結論: 這是一個管理及規劃上的改進,進一步獨立 SYSTEM 表空間,保證其存儲及性能. 我們在做數據庫規劃時大可借鑑 Oracle 這個改進,分離重要數據及次要數據,分離穩定結構及頻繁變化結構,儘量減少對重要數據及結構的影響。


三、臨時表空間

1、 臨時表空間作用

Oracle 臨時表空間主要用來做查詢和存放一些緩衝區數據。臨時表空間消耗的主要原因是需要對查詢的中間結果進行排序。 重啟數據庫可以釋放臨時表空間,如果不能重啟實例,而一直保持問題 sql 語句的執行, temp 表空間會一直增長。直到耗盡硬盤空間。

有人猜測在磁盤空間的分配上,oracle 使用的是貪心算法,如果上次磁盤空間消耗達到 1GB,那麼臨時表空間就是 1GB。

也就是說當前臨時表空間文件的大小是歷史上使用臨時表空間最大的大小。

臨時表空間的主要作用:

 索引 create 或 rebuild;

 Order by 或 group by;

 Distinct 操作;

 Union 或 intersect 或 minus;

 Sort-merge joins;

 analyze。

2、使用原理

在 Oracle 數據庫中進行排序、分組彙總、索引等到作時,會產生很多的臨時數據。對於這些臨時數據,Oracle 數據庫是如何處理的呢?

通常情況下,Oracle 數據庫會先將這些臨時數據存放到內存的 PGA(程序全局區)內。

在這個程序全局區中有一個叫做排序區的地方,專門用來存放這些因為排序操作而產生的臨

時數據。但是這個分區的容量是有限的。當這個分區的大小不足以容納排序後所產生的記錄

時,數據庫系統就會將臨時數據存放到臨時表空間中。這就是臨時表空間的來歷。

看起來好像這個臨時表空間是個臨時工,對於數據庫的影響不會有多大。其實大家這是

誤解這個臨時表空間了。

在用戶進行數據庫操作時,排序、分組彙總、索引這些作業是少不了,其會產生大量的臨時數據。為此基本上每個數據庫都需要用到臨時表空間。而如果這個臨時表空間設置不當的話,則會給數據庫性能帶來很大的負面影響。

為此管理員在維護這個臨時表空間的時候,不能夠掉以輕心。要避免因為臨時表空間設置不當影響數據庫的性能。


oracle中的表就是一張存儲數據的表。表空間是邏輯上的劃分。方便管理的。前面已經介紹了怎麼去看錶空間大小和擴展的一些命令,這裡就不說明了。後面會分享更多關於DBA方面內容,感興趣的朋友可以關注下!!

一文讀懂oracle表空間


分享到:


相關文章: