天天看點

我的Oracle 9i學習日志(12)-- 表空間和資料檔案

<b>表空間和資料檔案</b>

 •表空間:

– 某一時刻隻能屬于一個資料庫

– 由一個或多個資料檔案組成

– 可進一步劃分為邏輯存儲單元

•資料檔案:

– 隻能屬于一個表空間和一個資料庫

– 是方案對象資料的資料檔案庫

<b>表空間類型:</b>

<b>SYSTEM </b>表空間:

• 随資料庫建立

• 所有資料庫均需要

• 包括資料字典(内含存儲程式單元)

• 包含SYSTEM 還原段

• 應不包括使用者資料,盡管允許這樣做

非SYSTEM 表空間(包括永久表空間,還原表空間,臨時表空間):

• 支援更靈活地管理資料庫

• 将還原段、臨時段、應用程式資料段和應用程式索引段分開

• 根據備份要求将資料分開

• 分開動态和靜态資料

• 控制配置設定給使用者對象的空間量

建立表空間

<a target="_blank" href="http://blog.51cto.com/attachment/201003/202824322.png"></a>

Tablespace:是要建立的表空間的名稱

DATAFILE:指定組成表空間的一個或多個資料檔案

MINIMUM EXTENT:確定表空間内每個占用區的大小是整數(integer) 的倍數。使用K 或M以千位元組或兆位元組為機關指定該大小。

BLOCKSIZE:BLOCKSIZE 指定表空間的非标準塊大小。要指定該子句,必須具有DB_CACHE_SIZE,并至少設定一個DB_nK_CACHE_SIZE 參數,在該子句中指定的整數(integer) 必須與一個DB_nK_CACHE_SIZE 參數設定相對應。

LOGGING:指定在預設情況下,表空間内的所有表、索引和分區的所有更改都寫入重做日志檔案。LOGGING 為預設設定。

NOLOGGING:指定在預設情況下,表空間内的所有表、索引和分區的所有更改都不寫入重做日志檔案。NOLOGGING 隻影響某些DML 和DDL 指令,如直接加載。

DEFAULT:DEFAULT 指定表空間内建立的所有對象的預設存儲參數。

OFFLINE:指定表空間從建立後就不可用。

PERMANENT:指定表空間可用于保留永久對象。

TEMPORARY:指定表空間僅用于保留臨時對象,如:由ORDER BY 子句引起的隐式排序所使用的段。不能指定EXTENT MANAGEMENT LOCAL 或BLOCKSIZE 子句。

extent_management_clause:該子句指定如何管理表空間内的區。

segment_management_clause:這隻與永久的、且在本地管理的表空間相關。通過它可指定Oracle 是否應使用空閑清單或位圖來跟蹤表空間段中的已占用空間和空閑空間。

datafile_clause:== filename [SIZE integer[K|M] [REUSE]

[ autoextend_clause ]

filename:是表空間中的資料檔案的名稱。

SIZE:指定檔案大小。使用K 或M 以千位元組或兆位元組為機關指定大小。

REUSE:允許Oracle 伺服器重新使用現有檔案。

autoextend_clause:該子句啟用或禁用資料檔案的自動擴充。

NEXT:以位元組為機關指定在需要更多區時自動配置設定的磁盤空間下一增量的大小。

MAXSIZE:指定資料檔案可以自動擴充到的最大磁盤空間。

UNLIMITED:指定可配置設定給資料檔案或Tempfile 的磁盤空間是不受限制的。

檢視已有表空間:

SQL&gt; select * from v$tablespace;

       TS# NAME           INC

---------- ------------------------------ ---

    3 CWMLITE        YES

    4 DRSYS       YES

    5 EXAMPLE        YES

    6 INDX         YES

    7 ODM            YES

    0 SYSTEM         YES

    8 TOOLS       YES

    1 UNDOTBS1       YES

    9 USERS       YES

   10 XDB            YES

    2 TEMP         YES

檢視表空間對應的資料檔案:

SQL&gt; select file_name, tablespace_name from dba_data_files;

FILE_NAME            TABLESPACE_NAME

----------------------------------- ------------------------------

/u01/oradata/lty/system01.dbf     SYSTEM

/u01/oradata/lty/undotbs01.dbf     UNDOTBS1

/u01/oradata/lty/cwmlite01.dbf     CWMLITE

/u01/oradata/lty/drsys01.dbf       DRSYS

/u01/oradata/lty/example01.dbf     EXAMPLE

/u01/oradata/lty/indx01.dbf     INDX

/u01/oradata/lty/odm01.dbf     ODM

/u01/oradata/lty/tools01.dbf       TOOLS

/u01/oradata/lty/users01.dbf       USERS

/u01/oradata/lty/xdb01.dbf     XDB

表空間的空間管理

本地管理表空間 (Locally managed tablespace):在表空間内通過位圖管理區。位圖中的每個位對應于一個塊或一組塊。配置設定了某個區或釋放了某個區可重新使用時,Oracle 伺服器更改位圖值以顯示塊的新狀态。從Oracle9i 開始,在本地管理已成為預設設定。

CREATE TABLESPACE userdata DATAFILE '/u01/oradata/userdata01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

EXTENT MANAGEMENT 子句的LOCAL 選項指定表空間在本地管理。預設情況下,表空間在本地管理。

extent_management_clause:

[ EXTENT MANAGEMENT [ DICTIONARY | LOCAL

[ AUTOALLOCATE | UNIFORM [SIZE integer[K|M]] ] ] ]

其中:

DICTIONARY:指定使用字典表來管理表空間。

LOCAL:指定在本地通過位圖管理表空間。如果指定了LOCAL,則不能再指定DEFAULT storage_clause、MINIMUM EXTENT 或TEMPORARY。

AUTOALLOCATE:指定表空間由系統管理。使用者無法指定區大小。這是預設設定。

UNIFORM:指定按照大小統一為SIZE 位元組數的各個區來管理表空間。使用K 或M 以千位元組或兆位元組來指定區大小。預設大小為1 MB。

EXTENT MANAGEMENT 子句可用于各種CREATE 指令中:

• 對于非SYSTEM 的永久表空間,可以在CREATE TABLESPACE 指令中指定EXTENT MANAGEMENT LOCAL。

• 對于臨時表空間,您可以在CREATE TEMPORARY TABLESPACE 指令中指定EXTENT MANGEMENT LOCAL。

在本地管理表空間的優點:

本地管理的表空間相對于字典管理的表空間有如下優點:

• 本地管理可以避免循環空間管理操作,但是這種操作在字典管理的表空間中卻有可能發生。一旦消耗或釋放某個區的空間會産生另一個消耗或釋放操作(消耗或釋放還原段或資料字典表内的空間)時,它就會發生。

• 由于本地管理的表空間在資料字典表中不記錄空閑空間,進而減少了對這些表的争用。

• 區的本地管理可自動跟蹤鄰近的空閑空間,因而無須合并空閑區。

• 本地管理的區大小可由系統自動确定。

• 對區的位圖進行更改不會生成還原資訊,因為它們不更新資料字典中的表(表空間限額資訊等特殊情況除外)。

字典管理表空間(Dictionary-managed tablespace):由資料字典管理區。Oracle 伺服器将在配置設定或回收區時更新資料字典中對應的表。

字典管理的表空間内的段可具有自定義的存儲設定。這比本地管理的表空間更靈活(存儲在表空間中的每個段都可以有不同的存儲子句),但效率要低得多。

CREATE TABLESPACE userdata DATAFILE '/u01/oradata/userdata01.dbf' SIZE 500M EXTENT MANAGEMENT DICTIONARY DEFAULT STORAGE (initial 1M NEXT 1M PCTINCREASE 0);

注意:從Oracle9i開始,如果system表空間是本地管理方式,那麼其他的表空間管理方式一定是本地管理方式,而且以資料字典管理方式的表空間也無法建立。

還原表空間

•用于存儲還原段

•不能包含任何其它對象

•其中的區要在本地管理

•隻能使用DATAFILE 和EXTENT MANAGEMENT 子句

CREATE UNDO TABLESPACE undo1 DATAFILE '/u01/oradata/undo01.dbf' SIZE 40M;

臨時表空間

•用于排序操作

•不能包含任何永久對象

•建議在本地管理區

本地管理的臨時表空間具有臨時資料檔案(Tempfile),它與普通資料檔案很相似,隻有以下幾點不同:

• Tempfile 始終設為NOLOGGING 模式。

• 無法将Tempfile 設定為隻讀。

• 無法重命名Tempfile。

• 無法通過ALTER DATABASE 指令建立Tempfile。

• Tempfile 對于隻讀資料庫是必需的。

• 媒體恢複不恢複Tempfile。

若要優化臨時表空間内的排序性能,可将UNIFORM SIZE 設定為SORT_AREA_SIZE

參數的整數倍。

CREATE TEMPORARY TABLESPACE temp

TEMPFILE '/u01/oradata/temp01.dbf' SIZE 500M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 4M;

預設臨時表空間

可使用以下指令進行建立:

1、     在建立資料庫時:

CREATE DATABASE

……

DEFAULT TEMPORARY TABLESPACE temp

TEMPFILE '/$HOME/ORADATA/u03/temp01.dbf' SIZE 4M

2、資料庫建立完成後:

檢視目前預設臨時表空間:

SQL&gt; select property_name, property_value from database_properties;

PROPERTY_NAME           PROPERTY_VALUE

------------------------------ ------------------------------

DEFAULT_TEMP_TABLESPACE        TEMP

檢視表空間類型:

SQL&gt; select tablespace_name,contents,extent_management from dba_tablespaces;

TABLESPACE_NAME        CONTENTS EXTENT_MAN

------------------------------ --------- ----------

SYSTEM               PERMANENT LOCAL

UNDOTBS1          UNDO LOCAL

TEMP              TEMPORARY LOCAL

CWMLITE           PERMANENT LOCAL

DRSYS             PERMANENT LOCAL

EXAMPLE           PERMANENT LOCAL

INDX              PERMANENT LOCAL

ODM               PERMANENT LOCAL

TOOLS             PERMANENT LOCAL

USERS             PERMANENT LOCAL

XDB                  PERMANENT LOCAL

建立臨時表空間:

SQL&gt; create temporary tablespace mytemp

 2 tempfile '/u01/oradata/temp01.dbf' size 20m

 3 extent management local uniform size 2m;

改變目前預設表空間為mytemp:

SQL&gt; alter database default temporary tablespace mytemp;

驗證:

SQL&gt; select * from database_properties;

PROPERTY_NAME           PROPERTY_VALUE

------------------------------ ------------------------------

DEFAULT_TEMP_TABLESPACE        MYTEMP

注意:如果不指定預設臨時表空間,那麼system表空間将充當臨時表空間。

預設臨時表空間的限制

不能對預設臨時表空間執行下列操作:

• 将其删除,除非已經有新的預設臨時表空間

• 使其脫機

• 更改為永久表空間

表空間的隻讀模式

ALTER TABLESPACE [tablespace]READ ONLY 指令将表空間置于過渡隻讀模式。除了以前修改過該表空間中的塊的已有事務處理回退,這種過渡狀态不允許再對該表空間進行任何寫入操作。當已有的所有事務處理送出或者回退後(如果有未完成的事務,則會等待事務送出或復原。完成這些後checkpoint),隻讀指令完成,該表空間置于隻讀模式。您可以删除隻讀表空間内的表和索引等項,因為這些指令隻影響資料字典。之是以可以這樣操作,是因為DROP 指令隻更新資料字典,而不更新構成表空間的實體檔案。對于本地管理的表空間,删除的段将改為臨時段以避免更新位圖。要使隻讀表空間可寫,表空間内的所有資料檔案都必須聯機。将表空間設為隻讀将導緻對表空間的資料檔案執行檢查點操作。将表空間設為隻讀可防止對表空間中的資料檔案進行任何寫操作。為此,資料檔案可駐留在隻讀媒體上,如CD-ROM 或一次性寫入(WORM) 驅動器。隻讀表空間可以免去對資料庫大量的靜态配置設定執行備份。

建立表空間luo:

SQL&gt; create tablespace luo

 2 datafile '/u01/oradata/lty/luo/luo01.dbf' size 20m

 3 extent management local uniform size 128k;

建立使用者,使用者的預設表空間為luo:

SQL&gt; create user luo identified by luo default tablespace

 2 luo;

User created.

SQL&gt; grant connect, resource to luo;

Grant succeeded.

以luo使用者登入并建立表:

$ sqlplus luo/luo

SQL&gt; create table test (num integer, name char(10));

Table created.

SQL&gt; insert into test values(0, 'aaa');

1 row created.

SQL&gt; commit ;

Commit complete.

SQL&gt; insert into test values(1,'bbb');

1 row created.                           #這裡不送出。

切換到sys使用者,将tablespace置為read-only:

SQL&gt; alter tablespace luo read only;

#這時會發現指令處于等待狀态,當luo使用者執行commit後才會完成指令。

切換到luo使用者:

SQL&gt; truncate table test;

truncate table test

               *

ERROR at line 1:

ORA-00372: file 11 cannot be modified at this time

ORA-01110: data file 11: '/u01/oradata/lty/luo.dbf'

SQL&gt; drop table test;

Table dropped.

查詢表空間裡有哪些表:dba_tables

使表空間脫機

表空間一般是聯機的,這樣可友善資料庫使用者使用其中包含的資料。但是,資料庫管理者可以讓表空間脫機以便:

• 使資料庫的一部分不可用,但允許正常通路資料庫的其餘部分

• 執行脫機表空間備份(盡管表空間可以在聯機使用時備份)

• 在資料庫打開時恢複表空間或資料檔案

• 在資料庫打開時移動資料檔案

當表空間脫機後,Oracle 不允許随後有任何SQL 語句引用該表空間含有的對象。試圖對脫機表空間内的對象進行通路的使用者将收到一條錯誤消息。當表空間脫機或者重新聯機後,該事件記錄在資料字典和控制檔案内。如果關閉資料庫時表空間仍然脫機,則當随後資料庫裝載并重新打開時,該表空間仍保持脫機且不會被檢查。

如果遇到某些錯誤(例如,當資料庫寫入程式程序DBWn 幾次試圖向某表空間的資料檔案寫入都失敗時),Oracle 例程自動将表空間從聯機切換為脫機。

隻要資料庫打開,資料庫管理者就可以使任何表空間脫機(SYSTEM表空間,預設臨時表空間和任何具有活動還原段或臨時段的表空間除外)。當一個表空間脫機後,Oracle 伺服器将使與之相關聯的所有資料檔案脫機

ALTER TABLESPACE tablespace{ONLINE |OFFLINE [NORMAL|TEMPORARY|IMMEDIATE|FOR RECOVER]}

其中:

NORMAL:将該表空間中所有資料檔案内的所有塊從SGA 中清空。這是預設設定。在使該表空間重新聯機之前,您無須對其執行媒體恢複。盡可能使用NORMAL 子句。

TEMPORARY:對表空間内的所有聯機資料檔案執行檢查點操作,即使某些檔案無法寫入。所有脫機檔案可能都需要進行媒體恢複。

IMMEDIATE:不保證表空間檔案可用,而且不執行檢查點操作。在使表空間重新聯機前,您必須對其執行媒體恢複操作。

FOR RECOVER:使表空間脫機以進行表空間時間點恢複。此選項在11g中已廢除。

SQL&gt; alter tablespace luo offline;

Tablespace altered.

SQL&gt; select tablespace_name, status from dba_tablespaces;

TABLESPACE_NAME        STATUS

------------------------------ ---------

LUO               OFFLINE

SQL&gt; alter tablespace luo online;

Tablespace altered.

更改存儲設定

•使用ALTER TABLESPACE 指令更改存儲設定

ALTER TABLESPACE userdata MINIMUM EXTENT 2M;

ALTER TABLESPACE userdata DEFAULT STORAGE (INITIAL 2M NEXT 2M MAXEXTENTS 999);

•不能更改在本地管理的表空間的存儲設定

調整表空間大小

啟用資料檔案自動擴充:

1、     create database

2、     添加一個自動擴充檔案:

新表空間:

SQL&gt; create tablespace test datafile 

 2 '/u01/oradata/lty/test.dbf' size 20m

 3 autoextend on next 10m maxsize 50m;

原有表空間:

SQL&gt; alter tablespace luo add datafile

  2 '/u01/oradata/lty/luo01.dbf' size 10m

 3 autoextend on next 10m maxsize 30m;

3、修改原有資料檔案:

SQL&gt; alter database datafile '/u01/oradata/lty/luo.dbf'

2    autoextend on next 10m maxsize 50m;

驗證:

SQL&gt; select file_name, autoextensible from dba_data_files;

FILE_NAME                           AUT

----------------------------------- ---

/u01/oradata/lty/system01.dbf       YES

/u01/oradata/lty/undotbs01.dbf      YES

/u01/oradata/lty/cwmlite01.dbf      YES

/u01/oradata/lty/drsys01.dbf        YES

/u01/oradata/lty/example01.dbf      YES

/u01/oradata/lty/indx01.dbf         YES

/u01/oradata/lty/odm01.dbf          YES

/u01/oradata/lty/tools01.dbf        YES

/u01/oradata/lty/users01.dbf        YES

/u01/oradata/lty/xdb01.dbf          YES

/u01/oradata/lty/luo.dbf            YES

FILE_NAME                           AUT

----------------------------------- ---

/u01/oradata/lty/test.dbf           YES

/u01/oradata/lty/luo01.dbf          YES

手動調整資料檔案大小:

查詢表空間使用情況:

select a.TABLESPACE_NAME,

        a.BYTES bytes_used,

        b.BYTES bytes_free,

        b.largest,

        round(((a.BYTES-b.BYTES)/a.BYTES)*100,2) percent_used

from    

        (

               select TABLESPACE_NAME,

                       sum(BYTES) BYTES

               from    dba_data_files

               group   by TABLESPACE_NAME

        )

        a,

        (

               select TABLESPACE_NAME,

                       sum(BYTES) BYTES ,

                       max(BYTES) largest

               from    dba_free_space

               group   by TABLESPACE_NAME

        )

        b

where   a.TABLESPACE_NAME=b.TABLESPACE_NAME

order   by ((a.BYTES-b.BYTES)/a.BYTES) desc

注:在oracle10g中提供了一個新的視圖,可以直接獲得表空間的空間使用情況:SQL&gt; select * from dba_tablespace_usage_metrics;

改變資料檔案大小:

SQL&gt; alter database datafile '/u01/oradata/lty/test.dbf'

 2 resize 10m;

移動資料檔案

• 重命名資料檔案的步驟:

– 使表空間脫機。

– 使用作業系統指令移動或複制檔案。

– 執行ALTER TABLESPACE RENAME DATAFILE 指令。

– 使表空間聯機。

– 必要時使用作業系統指令删除該檔案

SQL&gt; alter tablespace test online;

$ mv test.dbf ./ts/

SQL&gt; alter tablespace test rename datafile

 2 '/u01/oradata/lty/test.dbf' to

 3 '/u01/oradata/lty/ts/test.dbf';

Tablespace altered.

SQL&gt; alter tablespace test online;

驗證:

SQL&gt; select file_name, tablespace_name from dba_data_files;

FILE_NAME            TABLESPACE_NAME

----------------------------------- ------------------------------

/u01/oradata/lty/ts/test.dbf       TEST

移動system表空間的方法:

1. 關閉資料庫(因為system表空間無法offline)

2. 使用作業系統指令移動檔案。

3. 裝載資料庫(mount狀态)。

4. 執行ALTER DATABASE RENAME FILE 指令。

5. 打開資料庫。

删除表空間

不能删除下清單空間:

– SYSTEM 表空間

–具有活動段的表空間

DROP TABLESPACE tablespace

[INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]

其中:

tablespace:指定要删除的表空間的名稱

INCLUDING CONTENTS:删除表空間内的所有段

AND DATAFILES:删除關聯的作業系統檔案

CASCADE CONSTRAINTS:如果要删除的表空間之外的表引用了該表空間内表的主鍵和唯一鍵,則删除這種引用完整性限制

原則:

• 不使用INCLUDING CONTENTS 選項,将無法删除仍包含資料的表空間。當表空間包含許多對象時,該選項可能會生成許多還原資料。

• 删除表空間後,其資料将不再包含在資料庫内。

• 在删除表空間時,隻删除關聯資料庫控制檔案内的檔案指針。作業系統檔案仍然存在,如果未使用AND DATAFILES 子句或資料檔案是OMF,則必須使用适當的作業系統指令明确删除這些檔案。

• 即使将表空間切換到隻讀狀态,仍可以删除該表空間以及其中的段。

• 删除表空間之前,建議您将表空間脫機,以確定沒有事務處理通路該表空間内的任何段。

獲得關于表空間的資訊:

-DBA_TABLESPACES

- V$TABLESPACE

- V$DATAFILE

練習:

1 Create permanent tablespaces with the following names and storage:

a Tablespace name: DATA01

Data file name: data01.dbf

Size: 2M

Extent Management: dictionary

Location: u04

b Tablespace name: DATA02

Data file name: data02.dbf

Size: 1M

Extent management: local uniform size 100K

Location: u03

c Tablespace name: INDEX01

Data file name: index01.dbf

Size: 1M

Extent management: local uniform size 4K

Location: u02

Enable automatic extension of 500 KB when more extents are required with a maximum size of 2 MB.

d Tablespace name: RONLY

Data file name: ronly01.dbf

Size: 1M

Location: u01

Default storage. DO NOT make the tablespace read-only at this time.

e Display the information from the data dictionary.

Hint: Information about tablespaces can be viewed using any of the following queries.

- DBA_TABLESPACES

- V$TABLESPACE

- V$DATAFILE

2 Allocate 500K more disk space to tablespace DATA02. Verify the result.

3 Relocate tablespace INDEX01 to subdirectory u06. Verify relocation and status of

INDEX01.

Hints

- Take the INDEX01 tablespace offline.

- Use V$DATAFILE to verify status.

- Use operating system move command to move the tablespace to u06.

- Use ALTER TABLESPACE to relocate the tablespace.

- Place the INDEX01 tablespace online.

- Use V$DATAFILE to verify status.

4 a Connect as user SYSTEM and create a table in tablespace RONLY. Make tablespace

read-only. Run a query to verify it.

b Attempt to create an additional table called TABLE2. Drop the first created table,

TABLE1. What happens?

5 Drop tablespace RONLY and the associated data file. Verify it.

Hints

- Use the INCLUDING CONTENTS AND DATAFILES clause

- View V$TABLESPACE to verify the tablespace was dropped.

- Use the ! from the SQL prompt to see a list of the data files in u01.

本文轉自 d185740815 51CTO部落格,原文連結:http://blog.51cto.com/luotaoyang/288361,如需轉載請自行聯系原作者