1. 程式人生 > >Oracle 表空間詳解

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表示沒有配額限制