Oracle 表空間詳解
目錄
表空間概述
Oracle的表空間屬於Oracle中的儲存結構,是一種用於儲存資料庫物件(如:資料檔案)的邏輯空間,是Oracle中資訊儲存的最大邏輯單元,其下還包含有段、區、資料塊等邏輯資料型別。表空間是在資料庫中開闢的一個空間,用於存放資料庫的物件,一個數據庫可以由多個表空間組成。可以通過表空間來實現對Oracle的調優。(Oracle資料庫獨特的高階應用)
表空間的分類
- 永久表空間:儲存資料庫中需要永久化儲存的物件,比如二維表、檢視、儲存過程、索引。
- 臨時表空間:儲存資料庫的中間執行過程,如:儲存order by資料庫排序,分組時產生的臨時資料。操作完成後儲存的內容會被自動釋放。臨時表空間是通用的,所的使用者都使用TEMP作為臨時表空間。一般只有tmp一個臨時表空間,如果還需要別的臨時表空間時,可以自己建立。
- UNDO表空間:儲存資料修改前的副本。儲存事務所修改的舊址,即被修改之前的資料。當我們對一張表中的資料進行修改的同時會對修改之前的資訊進行儲存,為了對資料執行回滾、恢復、撤銷的操作。
檢視system使用者的預設表空間和臨時表空間:
SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where username='SYSTEM';
DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ------------------------------
SYSTEM TEM
預設表空間
使用者在登陸後建立資料庫物件時,如果沒有指定表空間,那麼這些資料就會儲存到預設表空間。
檢視預設的永久表空間
注意:如果建立使用者時,不指定其永久表空間,則會使用預設的表空間。
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
2 FROM DATABASE_PROPERTIES;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS
檢視預設的TEMP表空間
系統管理員:
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
2 FROM DATABASE_PROPERTIES
3 WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE'
4 ;
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ----------------------------
DEFAULT_TEMP_TABLESPACE TEMP
普通使用者
SELECT USERNAME, TEMPORARY_TABLESPACE FROM DBA_USERS
檢視預設的表空間型別
注意:如果不指定表空間型別,就會預設使用DEFAULT_TBS_TYPE
引數指定的表空間型別。
SQL> SELECT PROPERTY_NAME, PROPERTY_VALUE
2 FROM DATABASE_PROPERTIES
3 WHERE PROPERTY_NAME='DEFAULT_TBS_TYPE';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ ------------------
DEFAULT_TBS_TYPE SMALLFILE
邏輯結構到物理結構的對映
表空間與資料檔案:表空間實際上是由若干個資料檔案來構成的,資料檔案的位置和大小可以由我們自己來決定。資料被存放在表空間中的資料檔案中。
注意:表空間是一種邏輯資料結構,其下最小的資料塊會對映到物理結構的磁碟塊中,一個數據塊由若干個磁碟塊組成。
或者由下圖來理解:表空間邏輯上有若干個段組成,物理上由多個數據檔案組成。
對錶空間的操作
表空間的操作方式:
- 字典管理:Oracle中的資料字典可以儲存所有的表空間分配資訊,但是如果資料庫中所有的空間分配都放在資料字典中。容易引起字典爭用,而導致效能問題,這是Oracle調優的方向之一。
- 本地管理:表空間分配不放在資料字典,而在每個資料檔案頭部的第3到第8個塊的點陣圖塊,來管理空間分配。
查看錶空間使用情況
SELECT A.TABLESPACE_NAME AS TABLESPACE_NAME,
ROUND(A.BYTES/(1024*1024*1024),2) AS "TOTAL(G)" ,
ROUND(B.BYTES/(1024*1024*1024),2) AS "USED(G)" ,
ROUND(C.BYTES/(1024*1024*1024),2) AS "FREE(G)" ,
ROUND((B.BYTES * 100) / A.BYTES,2) AS "% USED" ,
ROUND((C.BYTES * 100) / A.BYTES,2) AS "% FREE"
FROM SYS.SM$TS_AVAIL A, SYS.SM$TS_USED B, SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME
AND A.TABLESPACE_NAME = C.TABLESPACE_NAME;
計算表空間使用情況(考慮了資料檔案自動增長情況):
SELECT UPPER(F.TABLESPACE_NAME) AS "表空間名稱",
ROUND(D.AVAILB_BYTES ,2) AS "表空間大小(G)",
ROUND(D.MAX_BYTES,2) AS "最終表空間大小(G)",
ROUND((D.AVAILB_BYTES - F.USED_BYTES),2) AS "已使用空間(G)",
TO_CHAR(ROUND((D.AVAILB_BYTES - F.USED_BYTES) / D.AVAILB_BYTES * 100,
2), '999.99') AS "使用比",
ROUND(F.USED_BYTES, 6) AS "空閒空間(G)",
F.MAX_BYTES AS "最大塊(M)"
FROM (
SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024 * 1024), 6) USED_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024 * 1024), 6) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024 * 1024), 6) AVAILB_BYTES,
ROUND(SUM(DECODE(DD.MAXBYTES, 0, DD.BYTES, DD.MAXBYTES))/(1024*1024*1024),6) MAX_BYTES
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC
檢視資料庫擁有的表空間
可以通過下面幾個系統檢視來查看錶空間的基本資訊:
#1.包含資料庫中所有表空間的描述資訊
SELECT * FROM DBA_TABLESPACES;
#2.包含當前使用者的表空間的描敘資訊
SELECT * FROM USER_TABLESPACES;
#3.包含從控制檔案中獲取的表空間名稱和編號資訊
SELECT * FROM V$TABLESPACE;
查看錶空間中的資料檔案
#1.包含資料檔案以及所屬的表空間的描述資訊(永久表空間/UNDO表空間)
SELECT * FROM DBA_DATA_FILES;
#2.包含臨時資料檔案以及所屬的表空間的描述資訊
SELECT * FROM DBA_TEMP_FILES;
SELECT * FROM V$TEMPFILE;
#3.包含從控制檔案中獲取的資料檔案的基本資訊,包括它所屬的表空間名稱、編號等
SELECT * FROM V$DATAFILE;
#4.包含所有臨時資料檔案的基本資訊
SELECT * FROM V$TEMPFILE;
檢視使用者擁有的表空間
不同的使用者會使用不同的表空間:
- 系統管理員使用者使用
dba_tablespaces
資料字典來檢視。
SQL> desc dba_tablespaces #Oracle管理員級別的資料字典中記錄了管理員級別使用者所使用的表空間名稱、預設表空間和臨時表空間。 TABLESPACE_NAME
Name Null? Type
----------------------------------------- -------- ----------------------------
TABLESPACE_NAME NOT NULL VARCHAR2(30)
BLOCK_SIZE NOT NULL NUMBER
INITIAL_EXTENT NUMBER
NEXT_EXTENT NUMBER
MIN_EXTENTS NOT NULL NUMBER
MAX_EXTENTS NUMBER
PCT_INCREASE NUMBER
MIN_EXTLEN NUMBER
STATUS VARCHAR2(9)
CONTENTS VARCHAR2(9)
LOGGING VARCHAR2(9)
FORCE_LOGGING VARCHAR2(3)
EXTENT_MANAGEMENT VARCHAR2(10)
ALLOCATION_TYPE VARCHAR2(9)
PLUGGED_IN VARCHAR2(3)
SEGMENT_SPACE_MANAGEMENT VARCHAR2(6)
DEF_TAB_COMPRESSION VARCHAR2(8)
RETENTION VARCHAR2(11)
BIGFILE VARCHAR2(3)
SQL> select tablespace_name from dba_tablespaces; #檢視管理員使用者使用的表空間名稱列表
TABLESPACE_NAME
------------------------------
SYSTEM #系統表空間,是永久系統表空間,用於儲存SYS使用者的表、檢視、儲存過程物件。
UNDOTBS1 #儲存撤銷資訊的undo表空間
SYSAUX #作為EXAMPLE的輔助表空間
TEMP #臨時表空間,使用者儲存SQL語句處理的表示索引資訊
USERS #永久表空間,儲存資料庫使用者建立的資料庫物件
EXAMPLE #安裝Oracle資料庫示例的表空間
- 普通使用者使用
user_tablespaces
資料字典來檢視。
SQL> desc user_tablespaces
Name Null? Type
----------------------------------------- -------- ----------------------------
TABLESPACE_NAME NOT NULL VARCHAR2(30)
BLOCK_SIZE NOT NULL NUMBER
INITIAL_EXTENT NUMBER
NEXT_EXTENT NUMBER
MIN_EXTENTS NOT NULL NUMBER
MAX_EXTENTS NUMBER
PCT_INCREASE NUMBER
MIN_EXTLEN NUMBER
STATUS VARCHAR2(9)
CONTENTS VARCHAR2(9)
LOGGING VARCHAR2(9)
FORCE_LOGGING VARCHAR2(3)
EXTENT_MANAGEMENT VARCHAR2(10)
ALLOCATION_TYPE VARCHAR2(9)
SEGMENT_SPACE_MANAGEMENT VARCHAR2(6)
DEF_TAB_COMPRESSION VARCHAR2(8)
RETENTION VARCHAR2(11)
BIGFILE VARCHAR2(3)
SQL> connect scott/tiger #連線到SCOTT使用者
Connected.
SQL> show user;
USER is "SCOTT"
SQL> select tablespace_name from dba_tablespaces;
select tablespace_name from dba_tablespaces
*
ERROR at line 1:
ORA-00942: table or view does not exist #SCOTT使用者沒有許可權去檢視系統表空間dba_tablespaces
SQL> select tablespace_name from user_tablespaces; #但是SCOTT使用者可以檢視使用者表空間user_tablespaces
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
USERS
EXAMPLE
6 rows selected.
建立表空間
基本語法:
Create [TEMPORARY] TABLESPACE tablespace_name TEMPFILE|DATAFILE 'fileName.dbf' size xx
#TEMPFILE|DATAFILE 指的是我們儲存的資料檔案的型別和名字。
#size 表示資料檔案的大小
#[TEMPORARY] 如果我們建立的是臨時表空間,那麼需要在create關鍵字後加上TEMPORARY的關鍵字,而且使用TEMPFILE關鍵字。
注意:如果沒有指定資料檔案存放的路徑,預設會將資料檔案存放到Oracle的安裝目錄下
Example:
SQL> show user;
USER is "SYSTEM"
SQL> create tablespace test1_tablespace datafile 'test1file.dbf' size 10m;
Tablespace created.
SQL> create temporary tablespace temptest1_tablespace tempfile 'tempfile.dbf' size 10m;
Tablespace created.
查看錶空間資料檔案的存放路徑:表空間資料檔案都存放在永久性表空間中
SQL> desc dba_data_files; #資料字典dba_data_file用於存放資料檔案的屬性。
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 from dba_data_files where tablespace_name='TEST1_TABLESPACE';
FILE_NAME
--------------------------------------------------------------------------------
/u01/oracle/dbs/test1file.dbf
修改表空間
修改使用者的預設和臨時表空間
為了方便以後資料的備份和恢復,僅僅將有價值的資料做備份可以提高效率和節省空間。
基本語法:
ALTER USER username defalut|temporary TABLESPACE tablespace_name;
注意:普通使用者沒有修改預設表空間的許可權,但是可以通過授權來實現普通使用者也能夠修改預設表空間。
Example:
SQL> show user;
USER is "SYSTEM"
SQL> select DEFAULT_TABLESPACE,TEMPORARY_TABLESPACE from dba_users where username='SYSTEM';
DEFAULT_TABLESPACE TEMPORARY_TABLESPACE
------------------------------ ------------------------------
USERS TEMP
修改表空間的狀態
- 設定表空間的聯機或離線狀態:表空間的預設狀態是聯機狀態,如果表空間是離線狀態,那麼我們就不能夠使用這個表空間了。
基本語法:
ALTER TABLESPACE tablespace_name ONLINE|OFFLINE;
Example:
SQL> alter tablespace test1_tablespace offline;
Tablespace altered.
SQL> select STATUS from dba_tablespaces where tablespace_name='TEST1_TABLESPACE'; // tablespace_name需要使用大些字母
STATUS
---------
OFFLINE
- 設定表空間的只讀|可讀寫狀態:表空間預設為可讀寫狀態
注意:如果表空間狀態中擁有可read,那麼表空間就必須是聯機狀態的。
基本語法:
ALTER TABLESPACE tablespace_name [read only][read write];
Example:
SQL> alter tablespace test1_tablespace read only;
Tablespace altered.
SQL> select STATUS from dba_tablespaces where tablespace_name='TEST1_TABLESPACE';
STATUS
---------
READ ONLY
修改表空間的資料檔案
- 增加表空間中的資料檔案
基本語法:
ALTER TABLESPACE tablespace_name ADD DATAFILE'xx.dbf' SIZE xx;
Example:
SQL> alter tablespace test1_tablespace add datafile 'test2_file.dbf' size 10m;
Tablespace altered.
SQL> select file_name from dba_data_fileS where tablespace_name='TEST1_TABLESPACE';
FILE_NAME
--------------------------------------------------------------------------------
/u01/oracle/dbs/test1file.dbf
/u01/oracle/dbs/test2_file.dbf
注意:如果發現某個表空間儲存空間不足時,可以為表空間新增新的資料檔案,擴充套件表空間大小
SQL> ALTER TABLESPACE TBS_TR_IND ADD DATAFILE '/oradata/rTBS_TR_IND_002.dbf' SIZE 32G AUTOEXTEND OFF
SQL> ALTER TABLESPACE TBS_EDS_DAT
2 ADD DATAFILE 'G:\datafile\TBS_EDS_DAT01.DBF'
3 SIZE 100M
4 AUTOEXTEND ON
5 NEXT 10M
6 MAXSIZE 20480M;
SQL> ALTER TABLESPACE temp01
2 ADD TMPFILE 'D:\ORACLEDATA\temp01_02.dbf' SIZE 10M REUSE;
注意:在新增新的資料檔案時,如果同名的作業系統已經存在,ALTER TABLESPACE語句將失敗。如果要覆蓋同名的作業系統檔案時,則必須在後面顯示的指定REUSE子句。
- 調整資料檔案的大小
ALTER DATABASE DATAFILE '/database/oracle/oradata/gsp/tbs_dm_data_002.dbf' RESIZE 500M;
- 刪除資料檔案
注意:不能夠刪除表空間中的第一個資料檔案,如果將第一個資料檔案刪除的話,相當於刪除了整個表空間。
基本語法:
ALTER TABLESPACE tablespace_name DROP DATAFILE'filename.dbf';
Example:
SQL> alter tablespace test1_tablespace drop datafile 'test2_file.dbf';
Tablespace altered.
SQL> select file_name from dba_data_fileS where tablespace_name='TEST1_TABLESPACE';
FILE_NAME
--------------------------------------------------------------------------------
/u01/oracle/dbs/test1file.dbf
刪除表空間
基本語法:
DROP TABLESPAC tablespace_name [INCLUDING CONTENTS];
注意:如果你希望在刪除表空間的同時將表空間中的資料檔案一同刪除時,需要加上[INCLUDING CONTENTS]
Example:
SQL> drop tablespace test1_tablespace including contents;
Tablespace dropped.
SQL> select file_name from dba_data_fileS where tablespace_name='TEST1_TABLESPACE';
no rows selected
使用者表空間限額
表空間儲存限制是使用者在某一個表空間中可以使用的儲存空間總數。
在建立或修改使用者時,可以由引數quota
指出。若使用者在向表空間儲存資料時,超出了此限額,則會產生錯誤。
錯誤資訊:ORA-01536:space quota exceeded for tablespace tablespacename..’。
可以通過查詢字典dba_ts_quotas
查看錶空間限額資訊。
檢視使用者的表空間配額
#檢視所有使用者表空間的配額情況
SELECT * FROM DBA_TS_QUOTAS
#檢視當前使用者表空間的配額情況
SELECT * FROM USER_TS_QUOTAS
SQL> DESC DBA_TS_QUOTAS
Name Type Nullable Default Comments
--------------- ------------ -------- ------- ------------------------------------------------
TABLESPACE_NAME VARCHAR2(30) Tablespace name
USERNAME VARCHAR2(30) User with resource rights on the tablespace
BYTES NUMBER Y Number of bytes charged to the user
MAX_BYTES NUMBER Y User's quota in bytes. NULL if no limit
BLOCKS NUMBER Y Number of ORACLE blocks charged to the user
MAX_BLOCKS NUMBER Y User's quota in ORACLE blocks. NULL if no limit
DROPPED VARCHAR2(3) Y Whether the tablespace has been dropped
注意:若MAX_BYTES=-1
表示沒有配額限制