錯誤現象:導入過程中拋出空間分配失敗
IMP-00003: 遇到 ORACLE 錯誤 1659
ORA-01659: 無法分配超出 1 的 MINEXTENTS (在表空間 ZSTA_DATA_TBS 中)
IMP-00003: 遇到 ORACLE 錯誤 1658
ORA-01658: 無法為表空間 ZSTA_DATA_TBS 中的段創建 INITIAL 區
**核心原因:目標表空間 `ZSTA_DATA_TBS` 可用空間耗盡**,無法滿足導入物件的 `INITIAL` / `NEXT` 儲存參數需求。
根因深度剖析
- 匯出檔 (`dmp`) 內含物件的 `STORAGE` 子句保留了源環境的 `INITIAL`、`NEXT`、`MINEXTENTS` 參數。
- 目標表空間若為**字典管理 (DMT)** 或**本地管理 (LMT) 但未啟用自動擴展**,且資料檔已達 `MAXSIZE` 或磁碟空間不足,分配失敗。
- 大表導入時,`INITIAL` 可能極大 (如 100M+),現有連續空閒區滿足不了。
即時解決方案:啟用資料檔自動擴展
-- 確認自動擴展生效
SELECT file_name, autoextensible, maxbytes/1024/1024 AS max_mb
FROM dba_data_files
WHERE tablespace_name = 'ZSTA_DATA_TBS';
-- 重新執行 IMP,加上 IGNORE=Y 跳過已存在物件
imp system/manager@target file=export.dmp ignore=y full=y
進階優化:從源頭避免空間衝突
- 預建表空間與用戶: 目標環境預先建立大表空間、啟用自動擴展、建立用戶並指定預設表空間,再 `IMP` 時 `FROMUSER=src TOUSER=tgt`。
- 使用 `TRANSFORM=SEGMENT_ATTRIBUTES:N` (Data Pump 10g+): 導入時**忽略源物件的儲存參數**,改用目標表空間預設值,徹底避免 `INITIAL` 過大導致分配失敗。
impdp system/manager@target directory=dp_dir dumpfile=exp.dmp \
transform=segment_attributes:n \
remap_tablespace=src_tbs:tgt_tbs
- 大表分區導入: `impdp` 支援 `PARTITION_OPTIONS=DEPARTITION` 將分區表轉為非分區,或 `MERGE` 合併分區,靈活適配目標存儲。
- 磁碟配額監控: 部署 `DBMS_SPACE_ADMIN` / EM 警報,表空間使用率超 80% 自動告警。
避坑清單
- ❌ 直接刪除表空間資料檔 (`RMAN` / OS 刪除) → 導致資料庫掛起,需 `OFFLINE DROP` 後再刪除。
- ❌ 盲目 `ADD DATAFILE` 卻未設 `AUTOEXTEND` → 臨時緩解,根因未除。
- ❌ `MAXSIZE UNLIMITED` 無上限 → 風險:失控 SQL / 導入佔滿磁碟 → 整庫 Crash。**必須設定合理上限**。
- ✅ 定期 `ANALYZE` / `DBMS_STATS` 收集統計,優化器才能生成最優計劃減少臨時段空間壓力。
**核心結論:** 啟用資料檔 `AUTOEXTEND` 配合合理 `MAXSIZE` 是解決 `ORA-01658/1659` 的標準動作;長期治理需推行 **Data Pump + `TRANSFORM=SEGMENT_ATTRIBUTES:N` + 統一表空間規劃** 的標準化遷移流程。