ORA-01578: Oracle data block corrupted
成因
- 硬體 I/O 錯誤 (磁碟壞軌、控制器故障)
- 作業系統 I/O 層或快取問題
- 記憶體/分頁錯誤
- 嘗試存取未格式化的系統區塊
- 資料檔部分溢出
產生邏輯壞塊 (Checksum 驗證失敗) 或物理壞塊 (媒體損壞)。報錯時間可能晚於實際損壞時間。
診斷步驟
-- 1. 定位壞塊所屬物件
SELECT owner, segment_name, segment_type
FROM dba_extents
WHERE file_id = &file_no
AND &block_no BETWEEN block_id AND block_id + blocks - 1;
-- 2. 若為 Index → 直接 REBUILD
ALTER INDEX idx_name REBUILD;
-- 3. 若為 Table → 驗證結構
ANALYZE TABLE table_name VALIDATE STRUCTURE CASCADE;
處理策略
| 情況 | 處理方式 |
| 有完整備份 | RMAN RESTORE/RECOVER 該表空間或資料檔 |
| 無備份、壞塊於 Index | REBUILD INDEX |
| 無備份、壞塊於 Table、資料可犧牲 | Event 10231 跳過壞塊匯出殘存資料 |
| 字典/系統/Undo 區塊損毀 | 立即聯繫 Oracle Support,勿自行處理 |
Event 10231 搶救資料流程
-- 1. 關閉資料庫
SHUTDOWN IMMEDIATE
-- 2. 修改 init.ora 加入
event = "10231 trace name context forever, level 10"
-- 3. 啟動限制模式
STARTUP RESTRICT
-- 4. 建立臨時表搶救資料
CREATE TABLE temp_rescue AS SELECT * FROM corrupted_table;
-- 5. 移除 event 參數,重啟資料庫
SHUTDOWN IMMEDIATE
-- 移除 event 行
STARTUP
-- 6. 重命名原表,臨時表改回原名,重建索引/約束/權限
ORA-01628: max # extents reached
成因
Segment (Table/Index/Rollback) 的 Extents 數達到 MAXEXTENTS 限制,非硬體容量上限。
解決方案
- 調大 MAXEXTENTS:
ALTER TABLE table_name STORAGE (MAXEXTENTS 10000);
(上限受 DB_BLOCK_SIZE 限制,8K 區塊約 2^24 extents)
- 調大 NEXT/PCTINCREASE: 減少 Extent 配置頻率
ALTER TABLE table_name STORAGE (NEXT 10M PCTINCREASE 50);
- 改用 LMT (Locally Managed Tablespace): 9i+ 建議,自動管理 Extent,消除此錯誤
CREATE TABLESPACE tbs_data DATAFILE '...' SIZE 1G
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
- Rollback Segment 特殊處理: 若發生於 Undo/RBS,需 DROP/CREATE 或調整
ROLLBACK_SEGMENTS 參數
預防與監控
- 監控
DBA_SEGMENTS 中 EXTENTS 接近 MAX_EXTENTS 的物件
- 全面採用 LMT + ASSM (Automatic Segment Space Management)
- 定期檢查 Alert Log 是否出現 ORA-01578/ORA-01628
- 硬體層面:RAID、ECC 記憶體、定期磁碟掃描
- 上一篇文章: Oracle 資料庫操作技巧全景導覽:從入門到高階維運
- 下一篇文章: Oracle 快速刪除重複資料:四大方法效能實測與選型指南
Copyright ©
程式碼之家 All Rights Reserved