Oracle資料檔案和臨時檔案的管理

Davis_itpub發表於2018-06-27
一、資料檔案概述
在Oracle資料庫中,SYSTEM和SYSAUX表空間至少需要包含一個資料檔案,此外還將包含多個其他表空間及與其相關的資料檔案和臨時檔案。Oracle的資料檔案和臨時檔案是作業系統檔案,屬於資料庫物理結構範疇,用於儲存資料庫中的邏輯結構的資料。在建立表空間時,必須明確的為每個表空間指定資料檔案。

Oracle透過兩種方式為檔案分配編號:絕對檔案號,用於唯一標識資料庫中的資料檔案,絕對檔案號可以透過v$datafile或v$tempfile檢視的FILE#列查詢,也可以透過DBA_DATA_FILES或DBA_TEMP_FILES檢視的FILE_ID列查詢;相對檔案號,用於唯一標識表空間內的資料檔案。大多數情況下,絕對檔案編號和相對檔案編號都是相等的,但當資料庫中的資料檔案數量超出了一個閾值(比如1023),那麼他們就不再相等了。大檔案表空間資料檔案的相對檔案號總為1024。

查詢資料檔案的絕對檔案號和相對檔案號:
select t.name tablespace_name,d.file#,d.rfile#,d.name file_name from v$tablespace t,v$datafile d where t.ts#=d.ts#;
TABLESPACE_NAME           FILE#     RFILE# FILE_NAME
-------------------- ---------- ---------- --------------------------------------------------
SYSTEM                        1          1 /u01/app/oracle/oradata/stdb/system01.dbf
UNDOTBS1                      2          2 /u01/app/oracle/oradata/stdb/undotbs01.dbf
SYSAUX                        3          3 /u01/app/oracle/oradata/stdb/sysaux01.dbf
USERS                         4          4 /u01/app/oracle/oradata/stdb/users01.dbf
USERS                         8          8 /u01/app/oracle/oradata/stdb/user02.dbf
EXAMPLE                       5          5 /u01/app/oracle/oradata/stdb/example01.dbf
TEST                          7          7 /u01/app/oracle/oradata/stdb/test02.dbf
TEST                          6          6 /u01/app/oracle/oradata/stdb/test01.dbf
BIGTBS                        9       1024 /u01/app/oracle/oradata/stdb/bigfile01.dbf
9 rows selected.

資料庫所能夠建立的資料檔案數量受CREATE DATABASE ... MAXDATAFILES語句和DB_FILES引數的影響。另外,還應注意作業系統在建立檔案數量方面的強制限制。在例項啟動過程中,Oracle將根據初始化引數DB_FILES分SGA中用於儲存資料檔案資訊的空間,例項可以根據這個引數值來決定所能建立的最大檔案的數量。該引數可以修改,但必須重啟資料庫方可生效,該引數在例項的整個生命週期中有效。

表空間中包含的資料檔案的資料量的多少,最終會影響到資料庫的效能。Oracle允許的線上檔案數量超過了作業系統的預設限制,DBWn程式能夠開啟所有的線上資料檔案,並有能力快取所有處理中的檔案,當開啟檔案資料量達到作業系統的預設限制時,Oracle將自動關閉檔案。這可能會對效能產生負面的影響,建議調整作業系統的預設限制值,使其大於資料庫的線上檔案數量。

二、為表空間建立和新增檔案
為表空間建立和新增資料檔案的方法在之前已經學習過了,這裡僅簡要回顧一下。
1、在建立表空間的同時建立資料檔案
create tablespae ... datafile '/xxx/xxxx/xxxx ...' size xx 
create temporary tablespace  datafile '/xxx/xxxx/xxxx ...' size xx
2、為已存在的表空間新增資料檔案
alter tablespace ... add datafile  '/xxx/xxxx/xxxx ... ' size xx
alter tablespace ... add tempfile '/xxx/xxxx/xxxx ... ' size xx

三、修改資料檔案大小
使用自動擴充套件子句為表空間新增資料檔案:
SQL> create tablespace test_tbs
  2  datafile '/u01/app/oracle/oradata/stdb/test03.dbf' size 10m
  3  autoextend on
  4  next 1m
  5  maxsize 100m;
Tablespace created.

開啟資料檔案自動擴充套件:
SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test02.dbf'     
  2  autoextend on
  3  next 1m
  4  maxsize 100m;
Database altered.

關閉資料檔案自動擴充套件:
SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test02.dbf'
  2  autoextend off;
Database altered.

手動RESIZE資料檔案大小:
SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' resize 20m;
Database altered.

四、修改資料檔案可用性
可以透過執行資料檔案的線上和離線操作修改資料檔案的可用性,離線的資料檔案不能被資料庫所訪問,直到它恢復線上狀態之前。只讀表空間中的資料檔案也可以被離線或線上,只讀表空間內的資料檔案的線上或離線不影響表空間自身的狀態,不管怎麼樣,在表空間未處於讀寫狀態之前,這些檔案都是不可寫的。

1、歸檔模式下的資料檔案離線
SQL>  alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' offline;
Database altered.

SQL>  alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' online;
 alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' online
*
ERROR at line 1:
ORA-01113: file 10 needs media recovery             //test03.dbf檔案離線時不觸發檢查點操作,所以該檔案恢復線上時提示需要介質恢復
ORA-01110: data file 10: '/u01/app/oracle/oradata/stdb/test03.dbf'

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /u02/arch_1
Oldest online log sequence     5
Next log sequence to archive   7
Current log sequence           7

SQL> recover datafile 10;
Media recovery complete.

SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test03.dbf' online;
Database altered.

2、非歸檔模式下的資料檔案離線
在非歸檔模式下使用alter database ... offline for drop語句離線資料檔案。offline關鍵字標記該資料檔案離線,不論其是否損壞,所以可以開啟資料庫;for drop關鍵字標記該資料檔案隨後被刪除,該資料檔案不能再次恢復到線上狀態。實際上,在線上日誌組還未發生切換之前,還是可以恢復到線上狀態的

SQL> alter database datafile 'D:\app\Manganese\oradata\orcl\test01.dbf' offline for drop;
資料庫已更改。

SQL> alter system switch logfile;
系統已更改。

SQL> alter system switch logfile;
系統已更改。

SQL> alter system switch logfile;
系統已更改。

SQL> alter database datafile 'D:\app\Manganese\oradata\orcl\test01.dbf' online;
alter database datafile 'D:\app\Manganese\oradata\orcl\test01.dbf' online
*
第 1 行出現錯誤:
ORA-01113: 檔案 7 需要介質恢復
ORA-01110: 資料檔案 7: 'D:\APP\MANGANESE\ORADATA\ORCL\TEST01.DBF'

SQL> recover datafile 7;
ORA-00279: 更改 1108304 (在 03/19/2014 15:44:41 生成) 對於執行緒 1 是必需的
ORA-00289: 建議:
D:\APP\MANGANESE\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_03_19\O1_MF_1_9_%U_.ARC
ORA-00280: 更改 1108304 (用於執行緒 1) 在序列 #9 中
指定日誌: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 無法開啟歸檔日誌
'D:\APP\MANGANESE\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_03_19\O1_MF_1_9_%U_.ARC'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。
ORA-00308: 無法開啟歸檔日誌
'D:\APP\MANGANESE\FLASH_RECOVERY_AREA\ORCL\ARCHIVELOG\2014_03_19\O1_MF_1_9_%U_.ARC'
ORA-27041: 無法開啟檔案
OSD-04002: 無法開啟檔案
O/S-Error: (OS 2) 系統找不到指定的檔案。

3、修改表空間內所有資料檔案和臨時檔案的可用性
alter tablespace ... datafile  { online | offline }
alter tablespace ... tempfile { online | offline }

五、重新命名(修改儲存位置)資料檔案
1、將包含資料檔案的表空間離線。
2、使用作業系統命令修改資料檔名。
3、使用alter database ... rename datafile ...語句改變資料庫中的資料檔名。
4、備份資料庫。

示例一:重新命名同一表空間內的資料檔案
SQL> alter tablespace test_tbs offline normal;
Tablespace altered.

[oracle@stdb stdb]$ mv test03.dbf test04.dbf

SQL> alter tablespace test_tbs                
  2  rename datafile '/u01/app/oracle/oradata/stdb/test03.dbf'
  3  to '/u01/app/oracle/oradata/stdb/test04.dbf';
Tablespace altered.

SQL> alter tablespace test_tbs online;
Tablespace altered.

示例二:重新命名不同表空間中的資料檔案
SQL> select status from v$instance;
STATUS
------------
MOUNTED        //該操作必須在mount下進行

SQL> alter database
  2  rename file '/u01/app/oracle/oradata/stdb/test01.dbf', 
  3              '/u01/app/oracle/oradata/stdb/test02.dbf',
  4              '/u01/app/oracle/oradata/stdb/test04.dbf'
  5           to
  6              '/u01/app/oracle/oradata/stdb/test1.dbf',
  7              '/u01/app/oracle/oradata/stdb/test2.dbf',
  8              '/u01/app/oracle/oradata/stdb/test3.dbf';

Database altered.

SQL> alter database open;
Database altered.

六、刪除資料檔案

從表空間內刪除資料檔案:
alter tablespace ... drop datafile ... ;
alter tablespace ... drop tempfile ... ;

從資料庫中刪除資料檔案:
alter database tempfile '/xxx/xxxx/....' drop including datafiles;

SQL> alter database tempfile '/u01/app/oracle/oradata/stdb/temp03.dbf' drop including datafiles;
Database altered.

SQL> alter database datafile '/u01/app/oracle/oradata/stdb/test1.dbf' drop including datafiles;    //注意:資料檔案不能以這樣的方式刪除
alter database datafile '/u01/app/oracle/oradata/stdb/test1.dbf' drop including datafiles
                                                                 *
ERROR at line 1:
ORA-01916: keyword ONLINE, OFFLINE, RESIZE, AUTOEXTEND or END/DROP expected

注意:
1、從字典管理遷移到本地管理的只讀表空間內的資料檔案時不能被刪除的。除此之外,其他的只讀表空間內的資料檔案可以刪除。
2、系統表空間內的資料檔案無法被刪除。
3、如果一個本地管理的表空間被離線,則其內的資料檔案無法被刪除。
SQL> alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test4.dbf';
alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test4.dbf'
*
ERROR at line 1:
ORA-03264: cannot drop offline datafile of locally managed tablespace
4、如果表空間內僅包含一個資料檔案,該資料檔案無法被刪除。
SQL> alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test3.dbf';
alter tablespace test_tbs drop datafile '/u01/app/oracle/oradata/stdb/test3.dbf'
*
ERROR at line 1:
ORA-03261: the tablespace TEST_TBS has only one file
5、如果資料檔案不為空,該資料檔案無法被刪除。
6、刪除資料檔案必須保證資料塊處於開啟狀態。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31520497/viewspace-2156864/,如需轉載,請註明出處,否則將追究法律責任。

相關文章