Oracle 數據庫邏輯結構


注:本文來源於 <騰科OCP培訓課堂>。非准許商業活動。


                        Oracle 數據庫邏輯結構



          

一、存儲關系


            Oracle 數據庫邏輯上是由一個或多個表空間組成的,表空間物理上是由一個或多個數據 文件組成的;而在邏輯上表空間又是由一個或多個段組成的。在Oracle 數據庫中,通過為 每種不同的數據對象分配不同的段,來保存數據。例如EMP 表的所有數據會存放在EMP 段中。在Oracle 數據庫中,段是由一個或多個區組成的,而區又是由連續存儲的數據塊所 組成的。塊則是數據庫的I/O 最小的單位。

(一)、存儲結構

image.

           數據庫可划分為被稱為表空間的邏輯存儲單元。每一個表空間可以包含很多的Oracle 邏輯數據塊。DB_BLOCK_SIZE 參數指定了邏輯塊的大小。邏輯塊的大小范圍為2 KB 至 32 KB,默認大小為8 KB。特定數目的相鄰邏輯塊構成了一個區。為特定邏輯結構分配 的一組區構成了一個段。Oracle 數據塊是邏輯I/O 的最小單位。


(二)、如何存儲表數據


          創建表時,就會創建段來保存表數據。表空間包含一組段。從邏輯上講,表包含由列值 組成的行。行最終將以行片段的形式存儲在數據庫塊中。之所以稱為行片段,是因為某些情 況下,不可以在一個位置存儲一整行。當插入行由於太長而不適合單個塊時,或者由於更 新而導致現有行大小超出了行的當前空間時,就會發生這種情況。

image


二、表空間和數據文件


        Oracle 數據庫(tablespace)是由若干個表空間構成的。任何數據庫對象在存儲時都必 須存儲在某個表空間中。表空間對應於若干個磁盤文件,即表空間是由一個或多個磁盤文件 構成的。表空間相當於操作系統中的文件夾,也是數據庫邏輯結構與物理文件之間的一個映 射。每個數據庫至少有一個表空間,表空間的大小等於所有從屬於它的數據文件大小的總和。

(一)、常用表空間


      在Oracle 10g 中有以下幾種比較特殊的表空間:

(1)系統表空間


       系統表空間(system tablespace)是每個Oracle 數據庫都必須具備的。其功能是在系 統表空間中存放諸如表空間名稱、表空間所含數據文件等數據庫管理所需的信息。系統表空 間的名稱是不可更改的。系統表空間必須在任何時候都可以用,也是數據庫運行的必要條件。 因此,系統表空間是不能脫機的。 系統表空間包括數據字典、存儲過程、觸發器和系統回滾段。為避免系統表空間產生存 儲碎片以及爭用系統資源的問題,應創建一個獨立的表空間用來單獨存儲用戶數據。

(2)SYSAUX 表空間


       SYSAUX 表空間是隨着數據庫的創建而創建的,它充當SYSTEM 的輔助表空間,主要 存儲除數據字典以外的其他對象。SYSAUX 也是許多Oracle 數據庫的默認表空間,它減少 了由數據庫和DBA 管理的表空間數量,降低了SYSTEM 表空間的負荷。

(3)臨時表空間


        相對於其他表空間而言,臨時表空間(temp tablespace)主要用於存儲Oracle 數據庫 運行期間所產生的臨時數據。數據庫可以建立多個臨時表空間。當數據庫關閉后,臨時表空 間中所有數據將全部被清除。除臨時表空間外,其他表空間都屬於永久性表空間。

(4)撤銷表空間


             用於保存Oracle 數據庫撤銷信息,即保存用戶回滾段的表空間稱之為回滾表空間(或 簡稱為撤銷表空間(undo tablespace))。在Oracle8i 中是rollback tablespace,從Oracle9i 開始改為undo tablespace。在Oracle 10g 中初始創建的只有6個表空間sysaux、system、 temp、undotbs1、example 和users。其中temp 是臨時表空間,ndotbs1是undo 撤銷表 空間。

使用多個表空間有以下好處:


  • • 不同類型的數據存入到不同的表空間中,可以更靈活地管理數據庫。
    • 將還原段、臨時段、應用程序數據段和應用程序索引段分開存儲到不同表空間中。
    • 根據備份要求將數據分開存儲。
    • 將動態數據和靜態數據分別存儲在不同的表空間中,以利於備份和恢復。
    • 通過分配給用戶表空間上的配額,避免分某個用戶占用表空間太多的存儲空間。
    數據庫至少包含以下幾個表空間:SYSTEM 表空間,臨時表空間(TEMPORARY)用 於存放臨時數據,UNDO 表空間用於存入數據修改后的舊值。


  1 --【實例8-1】查詢數據庫包含的表空間信息
  2 --1)以管理員身份登錄
  3 SQL> CONN /AS SYSDBA
  4 --2)查詢表空間
  5 SQL> SELECT name FROM V$TABLESPACE;
  6 NAME
  7 ------------------------------
  8 CWMLITE
  9 DRSYS
 10 EXAMPLE
 11 INDX
 12 ODM
 13 SYSTEM
 14 TOOLS
 15 UNDOTBS1
 16 USERS
 17 XDB
 18 TEMP
 19 --已選擇11 行。
 20 --其中SYSTEM 是系統表空間、UNDOTBS1 是UNDO 表空間、TEMP 是臨時表空間。

(二)、表空間和數據文件的關系


數據庫、表空間和數據文件是緊密相關的,但它們之間又有着重要 區別,關系如圖8-1 所示:

  image


  • • Oracle 數據庫由一個或多個稱為表空間的邏輯存儲單元組成, 表空間作為一個整體存儲數據庫中的所有數據,並且一個表空 間只能屬於一個數據庫。數據庫的大小是該數   據庫中所表空間 大小總和。
    • 從物理講,Oracle 數據庫內的每個表空間由一個或多數據文件 組成,並且一個數據文件只能屬於一個表空間。表空間大是所有數據文件大小的總 和。這些數據文件與Oracle 運行所在的操作系統的文件有一樣的物理結構。
    • 數據庫的所有數據都存儲在數據文件中,數據庫的每個表空間都由這些數據文件組 成。例如,最簡單的Oracle 數據庫只有一個表空間和一個數據文件。
  1 --【實例8-2】查詢表空間及數據文件的信息
  2 --1)以管理員身份登錄
  3 SQL> CONN /AS SYSDBA
  4 --已連接。
  5 --2)查詢數據文件
  6 SQL> SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES;
  7 FILE_NAME TABLESPACE_NAME
  8 ---------------------------------------------------------
  9 D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF SYSTEM
 10 D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF UNDOTBS1
 11 D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF CWMLITE
 12 D:\ORACLE\ORADATA\DB01\DRSYS01.DBF DRSYS
 13 D:\ORACLE\ORADATA\DB01\EXAMPLE01.DBF EXAMPLE
 14 D:\ORACLE\ORADATA\DB01\INDX01.DBF INDX
 15 D:\ORACLE\ORADATA\DB01\ODM01.DBF ODM
 16 D:\ORACLE\ORADATA\DB01\TOOLS01.DBF TOOLS
 17 D:\ORACLE\ORADATA\DB01\USERS01.DBF USERS
 18 D:\ORACLE\ORADATA\DB01\XDB01.DBF XDB
 19 --已選擇10 行。
 20 --在查詢結果中,FILE_NAME 列為數據文件的位置和名稱,TABLESPACE_NAME 列為對應的表空間名稱。

(三)、數據字典管理和本地管理方式


在表空間中區是最小的空間分配單位,對表空間的管理是以區為單位進行的。根據管理 方式的不同,表空間分為本地管理表空間和字典管理表空間:


  • • 本地管理方式的表空間:在表空間內通過位圖管理區。在本地管理的表空間中,每 個數據文件內都維護一個位圖,以了解該數據文件內塊的空閑或使用狀態。位圖中 的每個位對應於一個塊或一組塊。其特點是分配了的某個區或釋放的某個區可被重 新使用時,Oracle 服務器更改位圖值以顯示塊的新狀態。因為表空間的存儲管理 信息保存在表空間的數據文件的頭部,而不是保存在表空間外部的數據字典中,所 以被稱為“本地管理方式”。從Oracle9i 開始,在本地管理已成為缺省設置。
    • 字典管理的表空間:由數據字典管理區。數據字典的信息存儲在system 表空間中, Oracle 服務器將在分配或回收區時更新數據字典中對應的表。字典管理的表空間 內的段可具有自定義的存儲設置,因此每個段都可以有不同的存儲子句, 但是需要 手動合並空閑區。這比本地管理的表空間更靈活,但效率要低得多。


由於本地管理表空間是采用位圖對區進行管理的,相對於字典管理有如下優點:


  • 本地管理可以避免循環空間管理操作。在字典管理表空間上分配和釋放區會導致訪 問回滾段和數據字典基表,而在本地管理表空間上的分配和釋放區只需要修改其數 據文件對應的位圖值。
    • 由於本地管理的表空間在數據字典表中不記錄空閑空間,從而減少了對數據字典的 爭用。
    • 區的本地管理可自動跟蹤並合並鄰近的空閑空間,因而無須合並空閑區,而字典管 理表空間則可能需要手工合並空間碎片。
    • 本地管理的區大小可由系統自動確定。
    • 對區的位圖進行更改不會生成UNDO 信息,因為它們不更新數據字典中的表(表 空間限額信息等特殊情況除外)。

(四)、創建表空間


1. 創建表空間要考慮的因素


         在創建數據庫完畢后,通常可以立即創建所需的非SYSTEM 表空間,在創建表空間時, 除考慮到空間數量、對應的數據文件的大小等基本因素外,還要考慮表空間存儲管理方式、 默認存儲參數設置、塊大小等問題。
      Oracle 本身並不能限制表空間的數目,但是受到數據庫所能擁有的數據文件數目的限 制,只能創建有限數時的表空間。即所有表空間的數據文件的總和不能超過創建數據庫時指 定的MAXDATAFILES 參數的限制。創建的表空間在默認情況具有標准的塊大小,但是也 可以創建具有非標准塊大小的表空間。

  1 CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace name
  2 DATAFILE datafile spec | TEMPFILE tempfile spec
  3 [MINIMUM EXTENT minimum extent size]
  4 [BLOCKSIZE blocksize]
  5 [[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)]
  6 [LOGGING|NOLOGGING]
  7 [FORCE LOGGING]
  8 [ONLINE|OFFLINE]
  9 [EXTENT MANAGEMENT DICTIONARY |
 10 LOCAL [AUTOALLOCATE|UNIFORM SIZE size]]
 11 [SEGMENT SPACE MANAGEMENT MANUAL|AUTO]
 12 [FLASHBACK ON|OFF]
 13 --參數說明如下:
 14 --• DATAFILE:用於指定表空間所對應的數據文件。
 15 --• SIZE:用於指定數據文件的尺寸。
 16 --• EXTENT MANAGEMENT DICTIONARY:表空間中區的管理方式為字典管理方式。
 17 --• DEFAULT STORAGE:用於指定默認存儲參數設置。當不設置默認存儲參數時,系統會自動使用SYSTEM 表空間的存儲參數設置。
 18 --• INITIAL:用於指定為數據庫對象所分配的第一個區的大小。
 19 --• NEXT:用於指定為數據庫對象所分配的第二個區的大小。
 20 --• MINEXTENTS:用於指定為數據庫對象所分配的最少區個數。
 21 --• MAXEXTENTS:用於指定為數據庫對象所分配的最多區個數。
 22 --• PCTINCREASE:用於指定從第三個區開始,每個區比前一個區所增長的百分比,並且區尺寸的計算公式如下:
 23 --• Size=NEXT *(1+PCIINCREASE/100)(n-2)
 24 --• 其中,n 表示第n 個區,除了第一個區和第二個區以外,其他區尺寸會自動轉變為DB_BLOCK_SIZE 的整數倍。

2. 本地管理的表空間中的段空間管理


          用戶使用CREATE TABLESPACE 語句創建一個本地管理的表空間(locally managed tablespace)時,可以使用SEGMENT SPACE MANAGEMENT 子句來設定段(segment)內 的可用/已用空間如何管理。可選的方式有:

1.AUTO


       在這種設置下,Oracle 使用位圖(bitmap)管理段內的可用空間。[注意此處的位圖 與本地管理的表空間使用的位圖不一樣]此處的位圖用於描述段內每個數據塊(data block) 是否有足夠的可用空間來插入(insert)新數據。隨着一個數據塊中可用空間的變化,她的 狀態也被及時地反映到位圖中。Oracle 使用位圖可以更自動化地管理段內的可用空間。這種 空間管理形式被稱為自動段空間管理(automatic segment-space management)。 一個本地管理的(locally managed),且使用自動段空間管理的表空間,既可以被創 建為小文件表空間(傳統的)(smallfile tablespace),也可以被創建為大文件表空間(bigfiletablespaces)。在創建本地管理的表空間時,自動段空間管理是默認值。

2.MANUAL


在這種設置下,Oracle 使用可用塊列表(free list)來管理段內的可用空間。可用塊列 表記錄了所有可以被用於插入新數據的數據塊。


(五)、其他表空間操作


1. 調整表空間大小


         如果登錄到Oracle 數據庫,並給某表插人數據時,發現在插人數據時總是顯示錯誤信 息,但是可以查詢該表數據,可以考慮查看表空間大小,如果數據已占滿了表空間,表空間 不能分配新的區時用戶不能插入數據記錄。理想情況下,在建立表空間時就應該規划好其尺 寸,以避免出現以上問題。但是如果表空間不足以存放更多數據,那么DBA 可以改變表空 間的尺寸。但是如果DBA 等表空間不足時才去擴展表空間的容量,會影響Oracle 的性能, 因此,DBA 需要知道現在的對象多大,對象的增長速度有多快,有規律的檢查數據塊對象 的大小,把注意力集中在快速增長的表上,經常查看表空間中的自由空間,然后主動增加表 空間的容量,提高系統的性能。
       表空間物理上表現為一個或多個數據文件,表空間的尺寸即表空間所有數據文件尺寸的 總和。因此表空間的大小由數據文件的個數和數據文件的大小來決定,可通過以下方法進行 調整:


  • • 重置數據文件的大小:ALTER DATABASE DATAFILE '...' | FileNo RESIZE XX
    • 更改數據文件的大小:可以使用數據文件AUTOEXTEND(自動擴展)屬性自動調整數據文件的大小,也可以使用ALTER TABLESPACE 手動調整。
    • 使用ALTER TABLESPACE 命令給表空間添加新的數據文件


1.數據文件的自動擴展屬性(AUTOEXTEND)


         當激活了數據文件的自動擴展選項之后,如果數據占滿了數據文件所有空間,並且該數 據文件不能容納新數據時, 系統會自動擴展該數據文件。可以指定數據文件的
AUTOEXTEND 子句啟用或禁用數據文件的自動擴展。文件將按指定的增量增加直到達到 指定的最大值。使用AUTOEXTEND 子句的優點如下:

  •  
    • 當表空間的空間用盡時無需過多的直接干預。
    • 確保應用程序不會由於未能分配區而暫停。


        創建數據文件后,可使用下列SQL 命令啟用數據文件的自動擴展:

  •             
    • CREATE TABLESPACE
    • ALTER TABLESPACE
  1 --【實例8-9】創建表空間mytbs8 並設置數據文件為自動擴展。
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2)創建表空間
  5 SQL> CREATE TABLESPACE mytbs8
  6 DATAFILE 'd:\oracle\oradata\db01\mytbs08.dbf' SIZE 5M
  7 AUTOEXTEND ON NEXT 1M MAXSIZE 50M;
  8 --表空間已創建。
  9 --3)查詢DBA_DATA_FILES 視圖以確定是否啟用AUTOEXTEND
 10 SQL> SELECT FILE_NAME,AUTOEXTENSIBLE
 11 FROM DBA_DATA_FILES
 12 WHERE TABLESPACE_NAME='MYTBS8';
 13 FILE_NAME AUT
 14 ---------------------------------------------
 15 D:\ORACLE\ORADATA\DB01\MYTBS08.DBF YES
 16 --說明:可以在創建數據庫時指定數據文件的自動擴展屬性,命令格式如下:
 17 CREATE TABLESPACE tablespace
 18 DATAFILE filespec [autoextend_clause]
 19 autoextend_clause:== [AUTOEXTEND {OFF|ON[NEXT integer[K|M]]
 20 [MAXSIZE UNLIMITED | integer[K|M]] } ]
 21 --其中:
 22 --AUTOEXTEND OFF:禁用數據文件的自動擴展
 23 --AUTOEXTEND ON:啟用數據文件的自動擴展
 24 --NEXT:自動擴展時每次分配給數據文件的磁盤空間
 25 --MAXSIZE:指定允許分配給該數據文件的最大磁盤空間
 26 --UNLIMITED:將分配給數據文件的磁盤空間設為不受限
 27 --可以為現有數據文件指定AUTOEXTEND,格式如下
 28 ALTER DATABASE [database]
 29 DATAFILE 'filename'[, 'filename']... autoextend_clause
 30 --【實例8-10】修改表空間mytbs7 的數據文件為自動擴展。
 31 --1)以管理員身份登錄
 32 SQL>CONNECT / AS SYSDBA
 33 --專業專注超越Oracle 體系結構篇之對象空間管理
 34 2)修改表空間
 35 SQL> ALTER DATABASE
 36 DATAFILE 'd:\oracle\oradata\db01\mytbs7.ora' AUTOEXTEND ON
 37 NEXT 1M MAXSIZE UNLIMITED;
 38 --數據庫已更改。
 39 --3)查詢DBA_DATA_FILES 視圖以確定是否啟用AUTOEXTEND。
 40 SQL> SELECT FILE_NAME,AUTOEXTENSIBLE
 41 FROM DBA_DATA_FILES
 42 WHERE TABLESPACE_NAME='MYTBS7';
 43 --結果略
 44 --如果想禁用文件的自動擴展屬性,只要將on 改變off 就可以了。默認情況下,表空間不不允許自動擴展的。
 45 --如:
 46 SQL> ALTER DATABASE
 47 DATAFILE 'd:\oracle\oradata\db01\mytbs7.ora' AUTOEXTEND OFF
2.為表空間增加數據文件


可以通過ALTER TABLESPACE ADD DATAFILE 命令,向表空間添加數據文件以增加 分配給表空間的磁盤空間總量。命令格式如下:

  1 ALTER TABLESPACE tablespace  ADD DATAFILE filespec [autoextend_clause]
  1 --【實例8-11】為mytbs3 表空間增加一個數據文件,大小為5MB.
  2 --1)以管理員身份登錄
  3 SQL>CONNECT / AS SYSDBA
  4 --2)增加數據文件
  5 SQL>ALTER TABLESPACE mytbs3  ADD DATAFILE 'd:\oracle\oradata\db01\mytbs3c.dbf' SIZE 5M;
  6 --表空間已更改。
  7 --3)查詢DBA_DATA_FILES 確認是否增加了數據文件
  8 SQL> SELECT FILE_NAME   FROM DBA_DATA_FILES  WHERE TABLESPACE_NAME='MYTBS3';
  9 FILE_NAME
 10 --------------------------------------
 11 D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF
 12 D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF
 13 D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF
 14 --專業專注超越Oracle 體系結構篇之對象空間管理 通過查詢結果可以看到,數據文件由原來的2 個增加為3 個


3.手工修改數據文件大小


         盡管指定自動擴展選項可以使得數據文件在數據寫滿的情況下自動擴展,但自動擴展導 致遞歸空間操作,從而降低系統性能。例如,當使用SQL*Loader 給表EMP 裝載大批量數 據時,在數據寫滿數據文件之后需要先擴展數據文件,然后才能裝載數據,因而會導致系統 性能的降低。因此,在執行批量數據裝載操作之前,你應該首先確定數據文件是否能夠容納 足夠數據。如果不足以容納數據的話,應該首先擴展該數據文件,然后裝載數據。DBA 可 以使用ALTER DATABASE 命令手動增加或減少數據文件的大小,而不必通過添加數據文 件或更改自動擴展屬性更改表空間的大小。命令格式如下:

  1 ALTER DATABASE [database] DATAFILE ‘filename’[, ‘filename’]... RESIZE integer[K|M]
其中:
Integer:以字節為單位表示的結果數據文件的絕對大小  ; 如果更改數據文件的大小比實際存儲的數據庫對象要小,那么數據文件大小只能減少到 數據文件內最后一個對象的最后一個塊為止,也就是縮減尺寸后表空間必須能容納已存在的 數據對象,否則會提示出錯信息。
  1 --【實例8-12】將mytbs5 表空間中數據文件的大小改為10M.
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2)創建表空間
  5 SQL> ALTER DATABASE  DATAFILE 'd:\oracle\oradata\db01\mytbs05.dbf' RESIZE 10M;
  6 --數據庫已更改。
  7 --3)查詢以確認更改
  8 SQL> SELECT BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='MYTBS5';
  9 BYTES
 10 ----------
 11 10485760
 12 --【練習8-3】重新更改mytbs5 表空間大小為5M。

2. 修改表空間讀寫屬性


          當表空間用於存放靜態數據時,因為不會對這些數據進行修改操作,所以可以將這些數 據存放到只讀設備上,例如存放到光盤上。為了將表空間放到只讀設備上,必須將其轉變為 只讀狀態。下面的命令將表空間改為只讀模式:

  1 ALTER TABLESPACE [tablespace] READ ONLY;  
        執行這條命令時,與該表空間相關的所有事務會自動回滾,過渡狀態期間不允許再對該 表空間進行任何寫入操作。當所有事務處理提交或者回退后,只讀命令完成,該表空間置於 只讀模式。
  1 --【實例8-13】在表空間mytbs3 中創建表test,將mytbs3 表空間更改為只讀狀態,驗證能否插入數據,能否刪除表。
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2)創建表
  5 SQL> CREATE TABLE test (name varchar(20)) TABLESPACE mytbs3;
  6 --表已創建。
  7 --3)將表空改為只讀狀態
  8 SQL> ALTER TABLESPACE mytbs3 READ ONLY;
  9 --表空間已更改。
 10 --4)向表中插入一條數據,能否成功,為什么?
 11 SQL> INSERT INTO test VALUES ('SHEN');
 12     INSERT INTO test VALUES ('SHEN')
 13 *
 14 --ERROR 位於第1 行:
 15 --ORA-00372: 此時無法修改文件16
 16 --ORA-01110: 數據文件16: 'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF'
 17 --表空間只讀后不能執行DML 操作.
 18 --5)刪除表,查看能否成功,為什么?
 19 SQL> DROP TABLE test;
 20 --表已丟棄。


        由上例可以看出執行了上述命令之后,會將表空間mytbs3 轉變為只讀狀態。此時,用 戶將只能在該表空間的對象上執行查詢操作(SELECT),而不能執行DML 或DDL 操作。但 專業專注超越Oracle 體系結構篇之對象空間管理 大家要注意,有一種DDL 操作例外,可以執行DROP TABLE 或DROP INDEX 刪除該表空 間上的表或索引,因為這些命令只影響數據字典(數據字典位於SYSTEM 表空間)。之所以 可以這樣操作,是因為DROP 命令只更新數據字典,而不更新只讀表空間上的物理文件

        對於本地管理的表空間,刪除的段將改為臨時段以避免更新位圖。將表空間設為只讀狀態之 前,將會引發對表空間的數據文件執行檢查點操作。將表空間設為只讀可防止對表空間中的 數據文件進行任何寫操作,因此,數據文件可駐留在只讀介質上,如CD-ROM 或一次性寫入 (WORM) 驅動器。使用只讀表空間的好處是可以免去對數據庫大量的靜態數據執行備份。 要在只讀表空間上執行DML 操作,必須將表空間改為可寫狀態,可以使用

 ALTER TABLESPACE [tablespace] READ WRITE
命令,但是表空間內的所有數據文件都必須聯機。
  1 --【實例8-14】將mytbs3 表空間更改為可讀寫狀態,驗證是否能夠創建表。
  2 --1)以管理員身份登錄
  3 SQL>CONNECT / AS SYSDBA
  4 --2)改為可讀可寫狀態
  5 SQL> ALTER TABLESPACE mytbs3 READ WRITE;
  6 --表空間已更改。
  7 --3)創建表test 驗證表空間的狀態
  8 SQL> CREATE TABLE test (name varchar(20))  TABLESPACE mytbs3;
  9 --表已創建。
 10 

在這里建表操作成功,也說明上一實例在只讀狀態下對表的刪除是成功的。

3. 修改表空間的ONLINE/OFFLINE 屬性


          通過將一個表空間置於聯機或脫機狀態來控制表空間的可用性。當表空間處於聯機狀態 時,用戶可以訪問其中的數據。當某一表空間處於脫機狀態時,用戶無法訪問它的數據,但 是允許正常訪問數據庫的其余處於聯機的表空間。以下幾種情況下數據庫管理員可以讓表空 間脫機:


  • • 使數據庫的一部分表空間不可用,但允許正常訪問數據庫的其余表空間
    • 執行脫機表空間備份(盡管表空間可以在聯機使用時備份)
    • 在數據庫打開時恢復表空間或數據文件
    • 在數據庫打開時移動數據文件


   可以使用如下命令對表空間進行脫機和聯機操作:

  1 ALTER TABLESPACE tablespace

專業專注超越Oracle 體系結構篇之對象空間管理

  1 {ONLINE |OFFLINE [NORMAL|TEMPORARY|IMMEDIATE|FOR RECOVER]}

其中:
NORMAL
將該表空間中所有數據文件內的所有塊從SGA 中寫入數據文件並將數 據文件關閉。這是缺省設置。在使該表空間重新聯機之前,無須對其執行介質恢復。盡可能 使用NORMAL 子句。
TEMPORARY對表空間內的所有聯機數據文件執行檢查點操作,但是在執行檢查 點時並不檢查數據文件的狀態,即使某些文件無法寫入檢查點,Oracle 也會忽略這些錯誤。 在使用此種表空間重新聯機之前,所有脫機文件可能都需要進行介質恢復。
IMMEDIATE:不保證表空間文件可用,而且不執行檢查點操作。在使表空間重新聯 機前,必須對其執行介質恢復操作。
FOR RECOVER:使表空間脫機以進行表空間時間點恢復。


只要數據庫打開,數據庫管理員就可以使任意一個表空間脫機(SYSTEM 表空間和任 何具有活動還原段或臨時段的表空間除外)。當一個表空間脫機后,Oracle 服務器將使與之
相關聯的所有數據文件脫機。

  1 --【實例8-15】將mytbs3 表空間改為脫機狀態,並向test 表中插入一條數據進行驗證。
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2)改為脫機狀態
  5 SQL> ALTER TABLESPACE mytbs3 OFFLINE NORMAL;
  6 --表空間已更改。
  7 --3)查詢數據
  8 SQL> SELECT * FROM test;
  9 SELECT * FROM test
 10 --*
 11 --ERROR 位於第1 行:
 12 --ORA-00376: 此時無法讀取文件16
 13 --ORA-01110: 數據文件16: 'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF'

        說明:執行查詢操作時用戶將收到一條錯誤消息,因為當表空間脫機后,Oracle 不允 許有任何SQL 語句引用該表空間含有的對象,即用戶不能訪問該表空間。
         當表空間脫機或者重新聯機后,該事件記錄在數據字典和控制文件內。如果關閉數據庫 時表空間仍然脫機,則當隨后數據庫裝載並重新打開時,該表空間仍保持脫機狀態且不會被 檢查。如果遇到某些錯誤(例如,當數據庫寫入程序進程DBWn 幾次試圖向某表空間的數 據文件寫入都失敗時),Oracle 實例(Instance)自動將表空間從聯機狀態切換為脫機狀態。

         不能設為脫機的表空間:SYSTEM 表空間,具有活動的還原段的表空間,缺省臨時表空 間。 當希望訪問表空間中的數據如表、索引等對象時,表空間必須處於聯機狀態。

  1 --【實例8-16】將mytbs3 表空間改為聯機狀態,並向test 表中插入一條數據進行驗證。
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2)改為聯機狀態
  5 SQL> ALTER TABLESPACE mytbs3 ONLINE;
  6 --表空間已更改。
  7 -3)插入數據
  8 SQL> INSERT INTO test VALUES('SHEN');
  9 --已創建1 行。
 10 ---說明:插入數據成功,因為表空間處於聯機狀態。

4. 數據文件的脫機與聯機


         與表空間類似,聯機的數據文件也可以被設置為脫機狀態。脫機的數據文件對於數據庫 來說是不可用的,直到它們被恢復為聯機狀態為止。如果數據文件發生損壞時,Oracle 會自 動將這個數據文件設置為脫機狀態,並且記錄在警告文件中。如果損壞的文件恢復后,需要 以手工方式重新將數據文件恢復為聯機狀態。 將數據文件設置為脫機狀態,不會影響表空間的狀態,但是反過來,將表空間設置為脫 機狀態后,屬於該表空間的數據文件同時會進入脫機狀態。如果想改變數據文件的狀態,可 以使用ALTER ATABASE 命令。


  1 --【實例8-17】將數據文件D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF 改為脫機狀態,然后再改為聯機狀態。
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2)改為脫機狀態
  5 SQL> ALTER DATABASE DATAFILE   'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF' OFFLINE;
  6 --數據庫已更改。
  7 --3)改為聯機狀態
  8 SQL> ALTER DATABASE DATAFILE  'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF' ONLINE;
  9 
 10 -- 數據庫已更改。

5. 數據文件的移動


         為了防止數據丟失和減少I/O 沖突,提高I/O 性能,應該將數據文件盡可能分布到不同 磁盤上,並且盡可能均衡不同磁盤之間的I/O 操作。移動數據文件一方面是出於性能方面 的考慮,另一方面出於安全考慮。因此在實際數據庫應用中可能會移動數據文件。移動數據 文件有兩種方法,一種方法是使用ALTER TABLESPACE 命令,另一種方法是使用ALTER DATABASE 命令,具體采用哪種方法取決於表空間類型。

1.使用ALTER TABLESPACE 命令


  1 --使用ALTER TABLESPACE 命令格式如下:
  2 ALTER TABESPACE tablespace   RENAME DATAFILE 'filename'[, 'filename']... TO 'filename'[, 'filename']...
  3 --它僅適用於不含活動還原段或臨時段的非SYSTEM 表空間中的數據文件的移動。源文 件名必須與存儲在控制文件--內的名稱匹配,表空間必須脫機,並且TO 子句后的目標數據文 件必須存在。


      ALTER TABLESPACE 命令重命名數據文件的步驟:


  • • 使表空間脫機。
    • 使用操作系統命令移動或復制文件。
    • 執行ALTER TABLESPACE RENAME DATAFILE 命令。
    • 使表空間聯機。
    • 必要時使用操作系統命令刪除原來的數據文件。
  1 --【實例8-18】將mytbs3 表空間的第三個數據文件由D:盤移動到E:盤。
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2)使表空間脫機
  5 SQL> ALTER TABLESPACE mytbs3 OFFLINE;
  6 --表空間已更改
  7 --3) 使用操作系統命令移動或復制文件
  8 --復制mytbs3 表空間的第三個數據文件到E:盤相同目錄下(需要先創建目錄)。如果不能確定mytbs3 表空間包含的數據文件,請查詢dba_data_files。
  9 --4)執行ALTER TABLESPACE RENAME DATAFILE 命令
 10 SQL> ALTER TABLESPACE mytbs3  RENAME DATAFILE 'd:\oracle\oradata\db01\mytbs3c.dbf' TO 'e:\oracle\oradata\db01\mytbs3c.dbf';
 11 --表空間已更改
 12 --5) 使表空間聯機
 13 SQL> ALTER TABLESPACE mytbs3 ONLINE;
 14 --表空間已更改
 15 --6) 查詢表空間的數據文件
 16 SQL> SELECT FILE_NAME FROM DBA_DATA_FILES  WHERE TABLESPACE_NAME='MYTBS3';
 17 FILE_NAME
 18 -----------------------------------------------------------------
 19 D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF
 20 D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF
 21 E:\ORACLE\ORADATA\DB01\MYTBS3C.DBF
 22 --可見第三個數據文件已經由D:盤移動到了E:盤。
 23 --說明:必要時使用操作系統命令刪除原來的數據文件。
2.使用ALTER DATABASE 命令


    ALTER DATABASE 命令可用來移動任意類型的數據文件,但是數據庫必須處於已裝載 狀態,且目標數據文件必須存在。步驟如下:


  • • 關閉數據庫。
    • 使用操作系統命令移動文件。
    • 裝載數據庫。
    • 執行ALTER DATABASE RENAME FILE 命令。
    • 打開數據庫。


  1 --【實例8-19】將system 表空間由D:盤移動到E:盤。
  2 --1)以管理員身份登錄
  3 SQL>CONNECT / AS SYSDBA
  4 --2) 關閉數據庫
  5 SQL> SHUTDOWN NORMAL;
  6 --數據庫已經關閉。
  7 --已經卸載數據庫。
  8 --ORACLE 例程已經關閉。
  9 --3)使用操作系統命令將system 表空間對應的數據文件移到E:盤相同目錄下。
 10 --4)將數據啟動至裝載狀態
 11 SQL> STARTUP MOUNT;
 12 --ORACLE 例程已經啟動。
 13 --Total System Global Area 34675092 bytes
 14 --Fixed Size 453012 bytes
 15 --Variable Size 29360128 bytes
 16 --Database Buffers 4194304 bytes
 17 --Redo Buffers 667648 bytes
 18 --數據庫裝載完畢。
 19 --5)執行ALTER DATABASE RENAME FILE 命令
 20 SQL>ALTER DATABASE RENAME  FILE 'd:\oracle\oradata\db01\system01.dbf' TO 'e:\oracle\oradata\db01\system01.dbf';
 21 --數據庫已更改
 22 --6) 打開數據庫
 23 SQL> ALTER DATABASE OPEN;
 24 --數據庫已更改。;
 25 --因為SYSTEM 表空間無法脫機,必須使用該方法移動SYSTEM 表空間內的數據文件。使用此命令重命名無法脫機的表空間內的文件。

(六)、刪除表空間


當不再需要表空間及其內容時,可以通過下面的DROP TABLESPACE 命令從數據庫中 刪除表空間,格式如下:

  1 DROP TABLESPACE tablespace  [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]
  2 --其中:
  3 --tablespace:指定要刪除的表空間的名稱
  4 --INCLUDING CONTENTS:刪除表空間內的所有段
  5 --AND DATAFILES:刪除關聯的操作系統文件
  6 --CASCADE CONSTRAINTS:如果要刪除的表空間之外的表引用了該表空間內表的主 鍵和唯一鍵,則刪除這種引用完整性約束。
  1 --【實例8-21】刪除表空間mytbs3, system,查看出現什么現象。
  2 --1)以管理員身份登錄
  3 SQL>CONNECT / AS SYSDBA
  4 --2) 刪除表空間mytbs3
  5 SQL> DROP TABLESPACE mytbs3;
  6 --DROP TABLESPACE mytbs3
  7 --*
  8 --ERROR 位於第1 行:
  9 --ORA-01549: 表空間非空,請使用INCLUDING CONTENTS 選項
 10 --3) 刪除表空間mytbs3,增加選項
 11 SQL> DROP TABLESPACE mytbs3 INCLUDING CONTENTS AND DATAFILES;
 12 --表空間已丟棄。
 13 --4) 刪除表空間system
 14 SQL> DROP TABLESPACE system INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;
 15 --DROP TABLESPACE system
 16 --*
 17 --ERROR 位於第1 行:
 18 --ORA-01550: 無法刪除系統表空間
 19 --說明:表空間mytbs3 中包含一個表段,因此必須帶INCLUDING CONTENTS 子句,即刪除表空間的同時刪除表空間中的對象,加上AND DATAFILES 子句可以刪除表空間的數據文件。SYSTEM 表空間中包含了多種段且可能引用其它表空間中的主鍵,因此加了CASCADE CONSTRAINTS 子句,但是SYSTEM 表空間是不能刪除的。

    使用DROP TABLESPACE 命令須遵守如下原則:


  • • 如果表空間中包含數據段,必須使用INCLUDING CONTENTS 選項。當表空間包 含許多對象時,該選項可能會生成許多Undo 數據。
    • 刪除表空間后,其數據將不再包含在數據庫內。
    在刪除表空間時,只刪除關聯數據庫控制文件內的文件指針。操作系統文件仍然存 在,如果未使用AND DATAFILES 子句或數據文件是OMF,則必須使用適當的操 作系統命令明確刪除這些文件。
    即使將表空間切換到只讀狀態,仍可以刪除該表空間以及其中的段
  • 刪除表空間之前,建議將表空間脫機,以確保沒有事務處理訪問該表空間內的任何 段
    不能刪除下列表空間:SYSTEM 表空間和具有活動段的表空間

(七)、獲取表空間的相關信息


可以使用下列數據字典視圖和動態性能視圖獲取表空間和數據文件的相關信息。


  • 與表空間相關:DBA_TABLESPACE,V$TABLESPACE
    與數據文件相關:DBA_DATA_FILES,V$DATAFILE
    與臨時數據文件相關:DBA_TEMP_FILES,V$TEMPFILE

  1 --【實例8-26】查詢數據文件的基本信息。
  2 --1)以管理員身份登錄
  3 SQL> CONNECT / AS SYSDBA
  4 --2) 查詢
  5 SQL> SELECT name,file#,status,bytes,checkpoint_change# last_scn FROM v$datafile;
  6 NAME                                 FILE#     STATUS     BYTES      LAST_SCN
  7 -----------                       ----------   -------  ---------- ----------
  8 D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF    1       SYSTEM   419430400    5083126
  9 D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF   2       ONLINE   209715200    5083126
 10 D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF   3       ONLINE   20971520     5083126
 11 --字段的含義如下:
 12 --Name:數據文件的名稱和位置;
 13 --File#:數據文件的絕對編號;
 14 --Status:數據文件的狀態,可以有三種:聯機、脫機或者屬於SYSTEM 表空間;
 15 --Bytes:數據文件的大小;
 16 --Last_scn:數據文件中最后一次寫入事務的SCN。
 17 --【實例8-27】查詢表空間users 的大小。
 18 --1)以管理員身份登錄
 19 SQL> CONNECT / AS SYSDBA
 20 --2) 查詢
 21 SQL> SELECT sum(bytes) FROM dba_data_files WHERE tablespace_name='SYSTEM';
 22 SUM(BYTES)
 23 ----------
 24 419430400

(八)、大表空間


         在Oracle 中用戶可以創建大文件表空間(bigfile tablespace)。這樣Oracle 數據庫使用的 表空間(tablespace)可以由一個單一的大文件構成,而不是若干個小數據文件。這使Oracle 可以發揮64 位系統的能力,創建、管理超大的文件。在64 位系統中,Oracle 數據庫的存儲 能力被擴展到了8 EB(1EB = 1024PB,1PB = 1024TB,TB=1024GB)。 只有本地管理的(locally managed),且段空間自動管理(automatic segment-space management)的表空間(tablespace)才能使用大文件表空間(bigfile tablespace)。但是有兩 個例外:本地管理的撤銷表空間(undo tablespace)和臨時表空間(temporary tablespace), 即使其段(segment)為手工管理(manually managed),也可以使用大文件表空間。


  •     使用大文件表空間(bigfile tablespace)可以顯著地增強Oracle 數據庫的存儲能力。 一個小文件表空間(smallfile tablespace)最多可以包含1024 個數據文件(datafile), 而一個大文件表空間中只包含一個文件,這個數據文件的最大容量是小數據文件的 1024 倍。這樣看來,大文件表空間和小文件表空間的最大容量是相同的。但是由 於每個數據庫最多使用64K 個數據文件,因此使用大文件表空間時數據庫中表空 間的極限個數是使用小文件表空間時的1024 倍,使用大文件表空間時的總數據庫
    容量比使用小文件表空間時高出三個數量級。換言之,當一個Oracle 數據庫使用 大文件表空間,且使用最大的數據塊容量時(32K),其總容量可以達到8EB。
     在超大型數據庫中使用大文件表空間減少了數據文件的數量,因此也簡化了對數據 文件的管理工作。由於數據文件的減少,SGA 中關於數據文件的信息,以及控制
    文件(control file)的容量也得以減小。
     由於數據文件對用戶透明,由此簡化了數據庫管理工作。


(九)、小結


         Oracle 數據庫在邏輯上由一個或多個表空間組成,每個表空間由一個或多數據文件組 成,並且一個數據文件只能屬於一個表空間。表空間根據管理方式可以分為本地管理表空間 和字典管理表空間兩種,前者是Oracle 9i 默認的管理方式。表空間的大小是構成表空間的 數據文件大小的總和,可以通過修改數據文件的大小、增減數據文件或將數據文件設置為自 動增長來調整表空間的大小。通過移動數據文件,可以將數據文件分布到不同的磁盤驅動器 可以減少I/O 沖突和防止數據損失。

(十)、練習


1.哪一個表空間不能切換為脫機狀態


  • A.臨時表空間temp B.用戶表空間user
    C.索引表空間index D.系統表空間system


2.假如一個表空間只具有一個大小為100MB 的數據文件,現需將該數據文件的大小 修改為10MB,哪種方法是正確的?


  • A.刪除數據文件然后重建
    B.使用帶有RESIZE 子句的ALTER DATABASE DATAFILE 語句
    C.使用帶有RESIZE 子句的ALTER TABLESPACE DATAFILE 語句
    D.將數據文件的自動擴展屬性設為ON,這樣數據文件會自動縮小


3.關於脫機表空間的說法哪一個是正確的?


  • A.任何表空間都可以脫機
    B.可以使用ALTER DATABASE 語句將脫機的表空改為聯機
    C.在表空間脫機時,屬於這個表空間的數據文件仍然聯機
    D.如果將表空間設置為脫機狀態,下次啟動數據庫時,不會對該表空間的數據文件 進行可用性檢查。


4.DBA 在執行下列語句時返回了錯誤,DROP TABLESPACE USRES;可能的原因是下 列哪個?


  • A.該表空間處於聯機狀態
    B.該表空間處於脫機狀態
    C.該表空間處於只讀狀態
    D.該表空間為非空,包含數據庫對象。


5、如果標准塊的尺寸為8KB,若想創建一個數據塊為16KB 的表空間,需要指定哪個 初始化參數?


  • A.DB_8k_CACHE_SIZE
    B.DB_16k_CACHE_SIZE
    C.UNDO_MANAGEMENT
    D.DB_CREATE_FILE_DEST



三、段


          在數據庫中包含了, 每個表空間物理上對應着磁盤上的一個或多個數據文件 (DATAFILE),一個數據文件只能屬於一個表空間。每個表空間又有多個段(SEGMENT) 組成。

(一)、段類型


        當建立數據對象(表、索引、簇等)時,Oracle 會自動給這些數據對象分配相應的存儲 空間,以存放它們的數據信息,這些為數據對象所分配的存儲空間被稱為段一個段只能存 放在一個表空間上,但是可分布在屬於這個表空間中的多個數據文件中。段是由一個或多個 區組成的,段的大小是該段所有區大小總和在Oracle 數據庫中,每個段只屬於一個特定 的數據庫對象(表、索引等),在這個段中至少包含一個區(初始區)。每種數據對象都具有 相應的段,Oracle 提供了以下一些段類型:

1)表段(Table):


         表是在數據庫內存儲數據的最常用方法。表段用於存儲常規表(非集簇且未分區)的中 的數據。表段中的所有數據都必須存儲在一個表空間內。例如,當在USERS_DATA 表空間 上建立表S_EMP 時,Oracle 會建立名稱為S_EMP 的表段,並且將該表的所有數據存放在 USERS_DATA 表空間上。如果表中有LOB 列或VARRAY 列,那么該表不會將這些數據列 存儲在同一個段。

2)表分區段(Table Partition):


        表分區主要用於數據倉庫應用。當表中包含大量數據且表的並發使用率很高時,可以把 一張大表數據划分成幾個小的分區,其中每個分區對應於一個段,這種段類型被稱為表分區 段,並且每個表分區段可以存放到不同表空間上。使用表分區可以降低I/O 次數,提高I /O 性能。表分區后,每個分區都是一個段,可以指定存儲參數單獨對它們進行控制。假定 一張銷售表年數據總量達到10GB,每個季度平均2.5GB,如果使用普通表存儲數據,那么 10GB 數據會存放到一個表段中,那么在統計一季度銷售數據時需要掃描10GB 數據;而如 果使用表分區段,那么可以將一、二、三、四季度數據分別存放到不同表分區段中,此時統 計一季度銷售數據只需要掃描2.5GB 數據。顯然,使用表分區段可以大大降低I/O 次數, 並提高I/O 性能。
注意:使用這種類型的段需要在Oracle9i 企業版內選擇分區(Partitioning) 組件。

3)簇段(Cluster):


           簇與表一樣,是一種數據段類型。簇內的行是基於鍵值存儲的,一個簇可以包含一個或 多個表,一個簇內所有的表屬於同一個段,並且區和塊的存儲管理方式也完全相同。例如, 如果經常要執行主從表之間的連接查詢,那么可以將這兩張表的數據組織到簇中。簇段的名 稱與簇名完全相同。注意,當將表放到簇中時,表的數據存放在簇段中,而不會為該表建立 專門的表段。假定在USERS 表空間上建立簇ORD_ITEM_CLU,並且將表ORD 和ITEM 組 織到該簇中,此時只會建立簇段ORD_ITEM_CLU,而不會建立表段ORD 和ITEM。

4)索引段(Index):


       索引是用於加快查詢速度的數據庫對象。當建立索引時,Oracle 會為該索引建立相應的 索引段,索引段的名稱與索引名完全相同,並且一個索引段只能存放在一個表空間中。如果 一個表有三個索引,則使用三個索引段。使用索引段的目的是根據指定的關鍵字來查找行在 表內的位置。例如,當在EMP 表的EMPNO 列上建立索引PK_EMP 時,Oracle 會自動建立 索引段PK_EMP。

5)按索引組織的表段(Index-organized table):


         一般情況下,表與索引數據分別存放在表段和索引段中。例如,表EMP 及其索引 PK_EMP 的數據分別存放在表段EMP 和索引段PK_EMP 中。但是,如果經常要通過主鍵列
檢索數據,那么Oracle 建議將這種表建立為索引組織表。當建立索引組織表時,表和其主 鍵索引的數據會存放到同一個段中,該段被稱為索引組織表段。在按索引組織的表內,數據 基於主鍵鍵值存儲在索引內。按索引組織的表無需在表中進行查找,因為所有數據都可以直 接從索引樹中檢索到。


6)索引分區段(Index Partition):


        索引分區類似於表分區,而且只能在分區表上建立索引分區。通過對索引進行分區,可 以將一個大的索引划分成幾個小的分區,並且每個分區對應一個段,這種段被稱為索引分區 段。分區索引的主要用途在於,通過分散索引輸入/輸出(I/O) 來最大限度地降低對系統資源 的爭用。使用這種類型的段需要在Oracle9i 企業版內選擇分區(Partitioning) 組件。


7)還原段(Undo):


        還原段由正在對數據庫進行更改的事務處理使用,還原段用於存放事務所修改數據的舊 值。在修改表或索引數據時,Oracle 會將修改前的數據存放到還原段中,以使得用戶可以取 消錯誤操作。例如,當執行"UPDATE emp SET sal=1000 WHERE empno=7788"語句時,假 定雇員7788 原有工資為800,那么800 將會存放到還原段中,而新數據1000 將會存放到 EMP 段中。

8)臨時段(Temporary Segment):


        當用戶執行CREATE INDEX、SELECT DISTINCT 和SELECT GROUP BY 等命令時, Oracle 服務器就會在內存中(排序區中,大小由初始化參數SORT_AREA_SIZE 確定)執行排
序。如果排序所需空間大於內存中的可用空間,則將中間結果寫入到磁盤上。臨時段用來存 儲這些中間結果。假定某表的數據為7788,7235,8769,2020,8986,那當使用ORDER BY 子句 進行排序時,會返回數據2020,7235,7788,8769,8986。這些返回的數據被稱為臨時數 據,這些數據存放到臨時段中。


當執行以下操作時會產生臨時數據:


  1CREATE INDEX
  2SELECT...ORDERBY
  3SELECT DISTINCT...
  4SELECT...GROUPBY
  5SELECT...UNION
  6SELECT...INTERSECT
  7SELECT...MINUS
  8 • ANALYZE 命令

9)LOB 段:


         當表中的數據包含文本文檔、圖像或者視頻時,使用普通數據類型如VARCHAR 等可 能無法存儲,必須使用CLOB 或BLOB 數據類型存儲大型對象(LOB)。如果LOB 列數據 長度大於4000B,Oracle 服務器將把這些值存儲在獨立的段(稱為“LOB 段”)中。而在 基表(Base Table)中只包含一個定位器或者指針,指向對應的LOB 數據所在的位置。
      除了上述9 種段類型外,還有LOB 索引段,嵌套表段,引導程序段(也稱為高速緩存 段)等多種段類型,在此不做介紹。

  1 --【實例10-1】查詢scott 用戶擁有的段類型和個數。
  2 --1)以sys 用戶登錄
  3 CONN / AS SYSDBA
  4 --已連接
  5 --2) 查詢
  6 SQL> SELECT SEGMENT_TYPE,COUNT(*) SEG_COUNT FROM dba_segments WHERE owner='SCOTT' GROUP BY SEGMENT_TYPE;
  7 SEGMENT_TYPE SEG_COUNT
  8 ------------------ ----------
  9 INDEX 3
 10 TABLE 9;
 11 --SCOTT 模式有3 個索引段和9 個數據段。

(二)、存儲從句的優先關系

image


        在創建段時,可以為它指定pctfree、pctused 等參數,來控制其中塊存儲空間管理方式, 也可以為它指定initial、next、pctincrease 等存儲參數,以指定其中區的分配方式。這些參數 設置可以是數據庫級別的,即使用數據庫默認的區分配和管理方式,也可以在表空間級別的, 即通過EXTENT MANAGEMENT 子句及DEFAULT STORAGE 子句指定區的分配和管理方 式,也可以在段級別,即指定存儲子句(DEFAULT STORAGE 子句),以控制如何向段分配 區。那么存儲子句的優先關系如何呢,Oracle 服務器按以下的方式進行區的管理(如圖10-2 所示):


  • • 除了MINIMUM EXTENTUNIFORM SIZE 表空間參數外,在段級別指定的任 何存儲參數優先級最高,覆蓋在表空間級別設置的相應選項。
    • 如果沒有在段級別明確設置存儲參數,那么存儲參數缺省值為在表空間級別所設置 的值。
    • 如果沒有在表空間級別明確設置存儲參數,那么將使用Oracle 服務器系統的缺省 設置。


還要注意,某些參數無法在表空間級別指定,而只能在段級別指定。如果存儲參數改變, 參數的改變只影響新分配區,而對已分配的區不產生影響。如果指定了表空間的最小區大小, 分配給該表空間內的段的最小區個數是固定的。


四、區的分配和撤銷


          數據擴展(extent)是由一組連續的數據塊(data block)構成的數據庫邏輯存儲分配單 位。而段(segment)則是由一個或多個數據擴展構成。當一個段中已有空間已經用完,Oracle 為這個段分配新的數據擴展。

(一)、數據擴展何時被分配


         當用戶創建數據表時,Oracle 為此表的數據段(data segment)分配一個包含若干數據 塊(data block)的初始數據擴展(initial extent)。雖然此時數據表中還沒有數據,但是在此 初始數據擴展中的數據塊已經為插入新數據做好了准備。
         如果一個段(segment)的初始數據擴展(initial extent)中的數據塊(data block)都已 裝滿,且有新數據插入需要空間時,Oracle 自動為這個段分配一個增量數據擴展(incremental extent)。增量數據擴展是一個段中繼已有數據擴展之后分配的后續數據擴展,她的容量大於 或等於之前的數據擴展。 為了管理的需要,每個段(segment)的段頭(header block)中包含一個記錄此段所有 數據擴展(extent)的目錄。

(二)、如何決定數據擴展分配時的數量與容量


         每個段(segment)的定義中都包含了數據擴展(extent)的存儲參數(storage parameter)。 存儲參數適用於各種類型的段。這個參數控制着Oracle 如何為段分配可用空間。例如,用 戶可以在CREATE TABLE 語句中使用STORAGE 子句設定存儲參數,決定創建表時為其 數據段(data segment)分配多少初始空間,或限定一個表最多可以包含多少數據擴展。如 果用戶沒有為表設定存儲參數,那么表在創建時使用所在表空間(tablespace)的默認存儲 參數。
        用戶既可以使用數據字典管理的表空間(dictionary managed tablespace)(依賴數據字典 表監控空間的利用情況),也可以使用本地管理的表空間(locally managed tablespace)(使用 位圖(bitmap)來標記可用與已用空間)。由於本地管理的表空間性能較好且易於管理,當用戶沒有顯式地設定數據擴展(extent)管理參數時,除了SYSTEM 之外的所有永久表空 間(permanent tablespace)默認使用本地管理方式。

         在一個本地管理的表空間中,其中所分配的數據擴展(extent)的容量既可以是用戶設 定的固定值,也可以是由系統自動決定的可變值。當用戶創建表空間(tablespace)時可以 使用UNIFORM (用戶指定)或AUTOALLOCATE (由系統管理)子句設定數據擴展的 分配方式。
        對於固定容量(UNIFORM)的數據擴展,用戶可以為數據擴展設定容量或使用默認大 小(1 MB)。用戶須確保每個數據擴展的容量至少能包含5 個數據塊(database block)。本 地管理(locally managed)的臨時表空間(temporary tablespace)在分配數據擴展時只能使 用此種方式。
        對於由系統管理(AUTOALLOCATE)的數據擴展,由Oracle 決定新增數據擴展的最 佳容量,其最小容量為64 KB。如果創建表空間時使用了“segment space management auto” 子句,且數據塊容量大於等於16 KB,Oracle 擴展一個段時(segment)所創建的數據擴展 的最小容量為1 MB。對於永久表空間(permanent tablespace)上述參數均為默認值。 在本地管理的表空間(locally managed tablespace)中,INITIAL,NEXT,PCTINCREASE, 和MINEXTENTS 這四個存儲參數可以作用於段(segment),但不能作用於表空間。 INITIAL,NEXT,PCTINCREASE,和MINEXTENTS 相結合可以用於計算段的初始容量。 當段容量確定后,Oracle 使用內部算法確定其中每個初始數據擴展(extent)的容量。

(三)、數據擴展如何被分配


         依據表空間管理方式的不同(本地管理(locally managed)或數據字典管理(dictionary managed)),選擇不同的算法分配數據擴展(extent)。 對於本地管理的表空間(locally managed tablespace),Oracle 在為新的數據擴展(extent) 尋找可用空間時,首先選擇一個屬於此表空間的數據文件(datafile),再搜索此數據文件的 位圖(bitmap)查找連續的數據塊(free block)。如果此數據塊中沒有足夠的連續可用空間, Oracle 將查詢其他數據文件。 舉例說明,當創建表段時,Oracle 將為段分配一個“初始區”(Initial Extent),這 時,由於表不存在任何數據,初始區中的每個塊每是未使用的。隨着不斷向表插入數據,初 始區的塊不斷寫滿,當初始區中的塊都被寫滿后,數據段會向Oracle 申請新的存儲空間, 這時Oracle 為表段再分配一個“后繼區”,后繼區寫滿后再分配新區。這些區被標記為“已 用區”通常分配給段的區將一直保留在段中,不論區中是否存有數據.當刪除數據庫對象時, 組成對象段的所有區全部回收,即變為“空閑區”。 專業專注超越Oracle 體系結構篇之對象空間管理

五、數據塊


          塊是Oracle 數據庫執行輸入/輸出(I/O) 的最小單位,相應地,操作系統執行輸入/輸 出(I/O) 的最小單位為一個操作系統塊的大小。假定某用戶執行“SELECT* FROM emp WHERE empno=7788”只會返回100Byte 的數據,而數據塊尺寸為2KB,那么Oracle 會在數據文件 上讀取多少數據到數據高速緩存呢?因為Oracle 數據庫輸入/輸出的最小單位是塊,所以一 次讀取的數據是一個數據塊,即讀取是2 KB 的數據。 在Oracle9i 之前,同一個數據庫的所有表空間必須具有相同的數據塊尺寸;而從 Oracle9i 開始,不同表空間可以具有不同的數據塊尺寸。

(一)、多重數據塊支持


     Oracle9i 支持創建具有多種塊大小的數據庫。此功能在下列情況下非常有用:


  • • 將表空間從聯機事務處理(OLTP) 數據庫傳送到企業數據倉庫時。使用Oracle9i, 可方便地在具有不同塊大小的數據庫之間傳送數據。
    • 要求能夠在具有相應塊大小的表空間中定位對象以最大限度地提高I/O 性能時。 使用Oracle9i,除了標准的塊大小外,還可以指定最多四種非標准的塊大小,如果想 使用非標准大小的塊,必須在初始化參數文件中,為每個非標准塊大小配置子高速緩存。也 可以在實例運行過程中配置子高速緩存,可以創建具有其中任意塊大小的表空間。如果創建 的表空間是非標准塊大小,那么在建立表空間時使用BLOCKSIZE 選項定義表空間所使用的非 標准塊尺寸。


(二)、標准塊與非標准塊大小


1.標准塊大小


         在SYSTEM 表空間以及任何臨時表空間中使用的塊大小為標准塊大小,除非進行指定, 表空間的缺省塊大小為標准塊。數據塊尺寸是由初始化參數DB_BLOCK_SIZE 指明,其尺寸應 該設置為操作系統(OS)塊尺寸的整數倍,所以一個數據塊由一個或多個操作系統塊組,並 且該參數的取值一般為2KB、4KB、8KB、16KB、32KB 等。
        通常,將DB_BLOCK_SIZE 設置為4 KB 或8 KB。如果沒有指定,則使用缺省數據塊大 小,缺省數據塊大小取決於所用的操作系統,在創建數據庫后將不能更改標准塊大小,如果 想更改標准塊大小,只能重新創建數據庫。使用DB_CACHE_SIZE 參數指定標准塊大小緩沖 區的高速緩存大小。DB_CACHE_SIZE 最小值為一個粒組(granule),默認為48MB.粒組大小 由SGA 來決定,如果SGA<128MB,一個granule 則是4MB,如果SGA>128MB,一個granule 則 是16MB。

2.非標准塊大小


         從Oracle 9i 開始,除可以使用標准塊大小外,還可以使用非標准塊大小,取值范圍是 2KB、4KB、8KB、16KB、32KB。如果希望使用非標准塊,必須在數據庫緩沖區為數據庫使用 的各種塊大小指定高速緩存大小。即如果要在數據庫中使用多種塊大小,則必須設置 DB_CACHE_SIZE 和至少一個DB_nK_CACHE_SIZE 參數。每個參數為相應的塊大小指定了緩沖 區高速緩存大小。

    如下所示:


  • DB_2K_CACHE_SIZE 為2KB 的塊指定數據庫高速緩存大小
    DB_4K_CACHE_SIZE 為4KB 的塊指定數據庫高速緩存大小
    DB_8K_CACHE_SIZE 為8KB 的塊指定數據庫高速緩存大小
    DB_16K_CACHE_SIZE 為16KB 的塊指定數據庫高速緩存大小
    DB_32K_CACHE_SIZE 為32KB 的塊指定數據庫高速緩存大小


     如果nK 是標准塊大小,則不能指定的大小,DB_nK_CACHE_SIZE 參數的缺省值為零。
    如果存在塊大小為nKB 的聯機表空間,則不要將此參數設置為零。最小可以設一個granule。

(三)、創建非標准塊表空間


      可創建標准塊大小的表空間,也可以創建非標准塊大小表空間,使用BLOCKSIZE 子句 為表空間指定非標准塊大小,要指定該子句,必須設置DB_CACHE_SIZE 和至少一個
DB_nK_CACHE_SIZE 參數,在該子句中指定的整數必須與某個DB_nK_CACHE_SIZE 參數中的n 對應。

  1 --【實例10-2】創建一個2K 塊大小的表空間mytbs2k,並驗證。
  2 --1)以sys 用戶登錄
  3 CONN / AS SYSDBA
  4 --已連接
  5 --2)設置初始化參數DB_2K_CACHE_SIZE, 重新啟動使參數設置生效
  6 SQL> ALTER SYSTEM SET DB_2k_CACHE_SIZE=16M SCOPE=SPFILE;
  7 --系統已更改。
  8 SQL> SHUTDOWN
  9 --數據庫已經關閉。
 10 --已經卸載數據庫。
 11 --ORACLE 例程已經關閉。
 12 SQL> STARTUP
 13 --ORACLE 例程已經啟動。
 14 --Total System Global Area 47258064 bytes
 15 --Fixed Size 453072 bytes
 16 --Variable Size 29360128 bytes
 17 --Database Buffers 16777216 bytes
 18 --Redo Buffers 667648 bytes
 19 --數據庫裝載完畢。
 20 --數據庫已經打開。
 21 --3)創建表空間
 22 CREATE TABLESPACE mytbs2k  DATAFILE 'd:\oracle\oradata\db01\mytbs2k_1.dbf' SIZE 10M BLOCKSIZE 2K;
 23 --表空間已創建。
 24 --4)驗證
 25 SQL> SELECT tablespace_name,block_size  FROM dba_tablespaces  WHERE tablespace_name='MYTBS2K';
 26 TABLESPACE_NAME     BLOCK_SIZE
 27 ------------------------------ ----------
 28 MYTBS2K              2048
 29 ---執行上述命令后,創建名為mytbs2k 的表空間,表空間中塊的大小為2KB,查詢DBA_TABLESPACES 數據字典視圖,可以看新建表空間的塊大小為2K。

      多種塊大小使用要注意:


  • • 分區對象的所有分區必須位於具有相同塊大小的表空間中。
    • 所有臨時表空間必須采用標准塊大小,包括用作缺省臨時表空間的永久表空間。
    • 按索引組織的表溢出和外部LOB 段可以存儲在塊大小與基表不同的表空間中。


(四)、數據塊的存儲參數


         當建立數據對象(表、索引、簇)時,通過指定合理的塊空間使用參數可以提高塊訪問性 能和並發性,使用參數可用來控制對數據段和索引段空間的使用。參數分為:控制並性的參 數和控制空間使用的參數兩類。

1.控制並發性的參數


           INITRANS 和MAXTRANS:指定初始的和最大的事務槽(Transaction slot)數,這些事 務槽在索引塊或者數據塊內創建。事務槽用來存儲在某一時間點對塊進行更改的事務處理的 有關信息。一個事務只占用一個事務槽。

   image



          INITRANS:保證最低級別的並發性。對於數據段和索引段,INITRANS 的缺省值分別 為1 和2,以保證最低級別的並發性。例如,設置INITRANS 的值為3,那么初始階段可以 有3 個事務同時訪問一個數據塊。如果需要,也可以從塊空閑空間內分配更多事務槽,以允 許更多的事務處理並發修改塊內的行。
          MAXTRANS:缺省值為255,它用於設置可更改數據塊或者索引塊的並發事務處理數 的限制。例如MAXTRANS 的值設為10 時,訪問同一數據塊的事務數超過3 之后,需要為 新事務分配新的事務槽,並且最大並發事務個數為10。

2.控制數據空間使用的參數


         PCTFREE:對於數據段而言,此參數用於指定每個數據塊中保留空間所占的百分比, 當更新塊內的行需要更多空間,就會使用保留空間。PCTFREE 的缺省值為10%。
         PCTUSED:對於數據段而言,此參數表示Oracle 服務器為表內每個數據塊所保留的已 用空間的最低百分比。如果一個塊的已用空間低於PCTUSED,則將該塊放回到空閑列表中。 加入段的空閑列表的塊可以用於重新插入數據。缺省情況下,每個段在創建時都有一個空閑 列表。通過設置存儲子句的FREELISTS 參數,可以創建有更多空閑列表的段。PCTUSED 的 缺省值為40%。 PCTFREE 和PCTUSED 都按可用數據空間百分比來計算,可用數據空間是從整個塊大 小減去塊頭空間后剩余的塊空間。


六、段空間的管理


     可以使用兩種方法來管理數據塊:


  • • 自動段空間管理
    • 手動管理


(一)、手動數據塊管理


         在以前的Oracle 版本中,這是唯一可用的方法。而且默認的塊管理方式為手動管理。 手動數據塊管理允許手動配置數據塊使用參數,例如:PCTFREE 參數,PCTUSED 參數, FREELIST 參數。
       下面過程介紹對於PCTFREE=20 且PCTUSED=40 的數據段如何管理塊內的空間(如 圖10-5 所示):
        當向塊中插入行時,塊的空閑空間在減少,直到塊內的空閑空間等於或者小於20%, 此時行所占用的塊內可用數據空間達到80% (100 – PCTFREE) 或者更多后,此后則無法在 該塊內插入數據 剩余的20% 可在行大小增長時使用。例如,更新初始為NULL 的列並分配一個值。這 樣,更新后的塊使用率可能超過80%。
       如果由於更新,刪除了塊內的行或者行大小減少,塊使用率可能跌至80% 以下。但是, 仍然無法向塊中插入,直到塊使用率跌至PCTUSED(在本例中為40%) 以下,則該塊可 用於重新插入.

image




(二)、段空間自動管理


     段空間管理方式可以采用自動段空間管理的方式,它是一種在數據庫段內管理空閑空間 的方法。自動段空間管理使用位圖完成對段內空閑和已用空間的跟蹤(與使用空閑列表相 對)。位圖段包含一個位圖,它描述了與段中的可用空間相關的每個塊的狀態。該位圖包含 在單獨的一組塊中,這些塊稱為“位圖塊”,插入新行時,服務器就會在該位圖中搜索是否 具有足夠空間的塊,有則插入數據。當塊中的可用空間數量發生變化時,位圖中就會反映出 它的新狀態。使用自動段空間管理更方便、空間使用率更高,並且改進了並發INSERT 操 作性能。但是不能用於包含LOB 的表空間。管理方便表現在PCTUSED、FREELISTS、 FREELIST GROUPS 均是自動管理的。所有對象都可以更有效地使用空間,尤其是行大小 變化很大的對象。


但要注意:


  • • 自動段空間管理僅能在表空間級別啟用,用於在本地管理的表空間。
    • 創建表空間后,這些配置將應用於在該表空間中創建的所有段。


自動段空間管理是通過CREATE TABLESPACE 命令的SEGMENT SPACE MANGEMENT AUTO 子句指定的,此后不能更改這些段。如果定義了PCTUSED、FREELIST 和FREELISTGROUPS,則將其全部忽略。 因為自動段空間管理僅能在表空間級別啟用,且只用於在本地管理的表空間,所以只需 要創建本地管理的表空間進行指定即可。以下例子創建了一個自動段空間管理表空間。

  1 --【實例10-3】設置自動段空間管理
  2 --1)管理員方式登錄
  3 CONN /AS SYSDBA
  4 --2)創建表空間並設置自動段空間管理
  5 SQL> CREATE TABLESPACE mytbs10 DATAFILE 'D:/oracle/oradata/db01/mytbs10.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K SEGMENT SPACE MANAGEMENT AUTO;
  6 --只要是創建在mytbs10 表空間中所有段都是采用自動段空間管理。可以用位圖管理的段為:表、索引、按索引組織的表(IOT) 以及LOB。


(三)、查詢存儲信息


可以通過以下視圖查詢表空間、數據文件、段和空閑區與已用區之間的關系等信息:
DBA_EXTENTS
DBA_SEGMENTS
DBA_TABLESPACES
DBA_DATA_FILES
DBA_FREE_SPACE


  1 --【實例10-4】通過DBA_SEGMENTS 視圖,查看段的區和塊的數目。
  2 --1)以管理員方式登錄
  3 CONN / AS SYSDBA
  4 --已連接。
  5 --2)查詢分配給EMP 段的區和塊的數目。
  6 SQL> SELECT segment_name,extents,blocks,bytes FROM dba_segments  WHERE owner = 'SCOTT' AND segment_name='EMP';
  7 SEGMENT_NAME EXTENTS BLOCKS BYTES
  8 --------------------------------------------
  9 EMP 1 8 65536
 10 --以上查詢結果可以看出,SCOTT 模式中EMP 段,包含了一個區,總大小是8 個數據塊(65536Byte)。
 11 --【實例10-5】使用DBA_EXTENTS 視圖。
 12 --1)以管理員方式登錄
 13 CONN / AS SYSDBA
 14 
 15 --2)檢查給定段的區的信息
 16 SQL> SELECT extent_id,file_id,block_id,blocks FROM dba_extents WHERE owner = 'SCOTT' AND  segment_name='EMP';
 17 EXTENT_ID FILE_ID BLOCK_ID BLOCKS
 18 ---------- ---------- ---------- ----------
 19 0 1 50465 8
 20 --該實例查詢出EMP 段包含的區號,文件號,塊號和塊數。
 21 --【實例10-6】使用DBA_FREE_SPACE 視圖。
 22 --1)以管理員方式登錄
 23 CONN / AS SYSDBA
 24 --2)查詢所有表空間的自由空間
 25 SQL> SELECT tablespace_name, count(*),max(blocks), sum(blocks) FROM dba_free_space GROUP BY tablespace_name;
 26 TABLESPACE_NAME COUNT(*) MAX(BLOCKS) SUM(BLOCKS)
 27 ------------------------------ ---------- ----------- -----------
 28 CWMLITE 2 1328 1360
 29 DRSYS 1 1320 1320
 30 EXAMPLE 1 64 64
 31 INDX 1 3192 3192
 32 MYTBS10 1 632 632
 33 ODM 1 1360 1360
 34 SYSTEM 1 176 176
 35 TOOLS 1 504 504
 36 UNDOTBS1 5 24552 25128
 37 USERS 1 3192 3192
 38 XDB 1 24 24
 39 --可見,SYSTEM 表空間的可用空閑空間為176 個數據塊。

七、小結


        Oracle 為數據對象所分配的存儲空間被稱為段,段有多種類型,常見的是表段、還原段、 索引段和臨時段。存儲空間的分配是以區為單位進行的,區由連續的數據塊組成。通過指定 pctfree、pctused 等參數,來控制其中塊存儲空間管理方式;通過指定initial、next、pctincrease 等存儲參數,以指定其中區的分配方式。可以創建非標志塊表空間,以滿足不同的存儲空間 需求。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM