將關鍵 Oracle 資料檔案分散至多顆實體磁碟,是降低 I/O 爭用、提升資料庫吞吐量的經典架構優化手段。本文以 Oracle 11g 為例,系統闡述分佈原則、必分檔案清單、I/O 爭用評估指標與決策流程。
將資料表與其索引、線上重做日誌與資料檔、系統表空間與UNDO 表空間分別置於不同磁碟,類似將單車道拓寬為多車道,並行 I/O 大幅降低等待時間。
| 群組 | 檔案類型 | 分離理由 | 建議磁碟特性 |
|---|---|---|---|
| 群組 A | 資料表空間(USERS, APP_DATA) | 查詢需同時讀取表與索引 | 高 IOPS、低延遲(SSD/NVMe) |
| 索引表空間(INDEXES) | |||
| 群組 B | 系統表空間 | DDL、資料字典存取頻繁 | 中高 IOPS |
| SYSAUX 表空間 | |||
| 群組 C | UNDO 表空間 | 大量交易產生連續寫入 | 高頻寫入耐久度佳(企業級 SSD) |
| 群組 D | 臨時表空間 | 排序、雜湊連接產生大量臨時段讀寫 | 高吞吐、大容量 |
| 群組 E | 線上重做日誌 | LGWR 循序寫入,極度敏感延遲 | 專用低延遲裝置(NVMe/獨立 RAID 1) |
| 歸檔日誌 | |||
| 群組 F | 控制檔(多路徑) | 關鍵元資料,需多副本防單點 | 不同物理磁碟/控制器 |
| 群組 G | 作業系統/二進制檔 | 避免 OS 頁面交換與資料庫 I/O 爭搶 | 獨立系統盤 |
Oracle 提供檔案級 I/O 統計視圖 V$FILESTAT(累積值)與 V$IOSTAT_FILE(11g+ 即時)。核心指標:
SELECT file_no,
filetype_name,
small_read_reqs, small_read_latency,
small_write_reqs, small_write_latency,
large_read_reqs, large_read_latency,
large_write_reqs, large_write_latency
FROM v$iostat_file
WHERE filetype_name IN ('Data File', 'Log File', 'Control File')
ORDER BY small_read_latency + small_write_latency DESC;
SELECT f.file_name,
fs.phyrds, fs.phywrts,
fs.readtim, fs.writetim,
ROUND(fs.readtim/DECODE(fs.phyrds,0,1,fs.phyrds)*1000,2) AS avg_read_ms,
ROUND(fs.writetim/DECODE(fs.phywrts,0,1,fs.phywrts)*1000,2) AS avg_write_ms
FROM v$filestat fs, dba_data_files f
WHERE fs.file# = f.file_id
ORDER BY avg_read_ms + avg_write_ms DESC;
-- 1. 離線資料檔
ALTER DATABASE DATAFILE '/u01/oradata/users01.dbf' OFFLINE;
-- 2. OS 層複製至新磁碟
cp /u01/oradata/users01.dbf /u02/oradata/users01.dbf
-- 3. 重命名
ALTER DATABASE RENAME FILE '/u01/oradata/users01.dbf' TO '/u02/oradata/users01.dbf';
-- 4. 上線
ALTER DATABASE DATAFILE '/u02/oradata/users01.dbf' ONLINE;
增加磁碟意味著採購、電力、機櫃、管理成本。決策矩陣:
持續監控 V$IOSTAT_FILE、定期遷移熱點、善用 ASM 磁碟組自動均衡,才能在成本可控前提下,維持 Oracle I/O 子系統長期高效能運行。