將 Windows Server A 上 TEST1 Schema 遷移至 Linux Server B 的 TEST2 Schema,涉及跨平台、跨 Schema、表空間映射、權限重建、Session 清理等多環節。本文提供經驗證的標準化操作手冊,從導出、表空間對照、目標端預建、導入參數、驗證,全鏈路無遺漏。
TEST1 (密碼 TEST1PASSWD 或用 SYSTEM 導出)。TEST2 (可能存在/不存在)。exp/imp (非 Data Pump),適用 10g/11g 混合環境。# Windows CMD
exp TEST1/TEST1PASSWD OWNER=TEST1 FILE=D:\files\TEST1.dmp LOG=D:\files\TEST1_exp.log
關鍵: OWNER=TEST1 包含表、索引、視圖、序列、同義詞、包、觸發器、授權等所有對象。COMPRESS=Y 可合併 Extent (導入時生效)。
-- 1. 默認表空間
SELECT username, default_tablespace FROM dba_users WHERE username = 'TEST1';
-- RESULT: TEST1 CMIS
-- 2. 實際使用表空間
SELECT DISTINCT owner, tablespace_name FROM dba_extents WHERE owner = 'TEST1';
-- RESULT: TEST1 XSL
-- TEST1 CMIS
-- 3. 表空間對應資料檔與大小
SELECT file_name, bytes, tablespace_name FROM dba_data_files
WHERE tablespace_name IN ('CMIS','XSL');
記錄每個 Tablespace 總大小、檔案路徑、Autoextend 狀態,目標端按需創建 (可合併小檔、調整大小、啟用 ASSM)。
CREATE TABLESPACE xsl LOGGING
DATAFILE '/opt/oracle/oradata/xsl.dbf' SIZE 15000M EXTENT MANAGEMENT LOCAL;
CREATE TABLESPACE cmis LOGGING
DATAFILE '/opt/oracle/oradata/cmis.dbf' SIZE 37000M EXTENT MANAGEMENT LOCAL;
建議: 啟用 AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED、SEGMENT SPACE MANAGEMENT AUTO (ASSM)。
CREATE USER test2 IDENTIFIED BY test2passwd
DEFAULT TABLESPACE cmis TEMPORARY TABLESPACE temp PROFILE DEFAULT;
GRANT CONNECT, RESOURCE TO test2;
-- 1. 殺除殘留 Session
SELECT 'ALTER SYSTEM KILL SESSION ''' || sid || ',' || serial# || ''' IMMEDIATE;'
FROM v$session WHERE username = 'TEST2';
-- 複製輸出的 ALTER SYSTEM 語句在 SQL*Plus 執行
-- 2. 刪除用戶及所有對象
DROP USER test2 CASCADE;
-- 3. 重建
CREATE USER test2 IDENTIFIED BY test2passwd
DEFAULT TABLESPACE cmis TEMPORARY TABLESPACE temp PROFILE DEFAULT;
GRANT CONNECT, RESOURCE TO test2;
用 scp/sftp/WinSCP 將 TEST1.dmp 傳至 Linux /tmp/TEST1.dmp。二進制模式傳輸,校驗 MD5/SHA256 確保完整。
# Linux Shell (非 SQL*Plus)
imp TEST2/TEST2PASSWD FROMUSER=TEST1 TOUSER=TEST2 \
FILE=/tmp/TEST1.dmp \
LOG=/opt/oracle/admin/log/imp_TEST2.log \
IGNORE=Y BUFFER=64000 COMMIT=Y
核心參數:
FROMUSER=TEST1 TOUSER=TEST2:Schema 重映射,自動處理對象擁有者、引用遷移。IGNORE=Y:忽略建立錯誤 (如表已存在),繼續導入資料。BUFFER=64000:提高陣列獲取效能。COMMIT=Y:定期提交,避免大交易回滾段爆滿。-- 對象計數對比
SELECT object_type, COUNT(*) FROM dba_objects WHERE owner = 'TEST2' GROUP BY object_type;
-- 與源端 TEST1 對比
-- 資料筆數抽檢
SELECT COUNT(*) FROM test2.key_table;
-- 與源端對比
-- 無效對象檢查
SELECT object_name, object_type FROM dba_objects WHERE owner = 'TEST2' AND status = 'INVALID';
-- 重新編譯: EXEC UTL_RECOMP.RECOMP_SERIAL('TEST2');
| 問題 | 原因 | 對策 |
|---|---|---|
| ORA-01917: user TEST2 does not exist | 導入前未建用戶 | 步驟 4 預建用戶 |
| ORA-01503: tablespace CMIS not found | 目標端缺表空間 | 步驟 3 預建表空間 |
| ORA-00001: unique constraint violated | IGNORE=Y 但資料重複 | 確認目標表為空或 TRUNCATE 後導入 |
| 導入極慢 | BUFFER 小、無 COMMIT、索引維護 | BUFFER=64000+、COMMIT=Y、大表可 INDEXES=N 後重建 |
| 權限缺失 | GRANTS=N 或角色不存在 | 導出含 GRANTS、目標端預建角色 |
10g+ 環境強烈建議改用 Data Pump:
PARALLEL=4) 導入導出提速 5-10 倍。REMAP_SCHEMA=TEST1:TEST2、REMAP_TABLESPACE=CMIS:CMIS_NEW 靈活映射。NETWORK_LINK) 免 DMP 落地、跨版本遷移。INCLUDE/EXCLUDE)。跨平台 Schema 遷移,核心在於表空間預建對齊、用戶重映射參數精準、Session 清理徹底、驗證全覆蓋。將上述步驟封裝為腳本 (Shell/Bat + SQL),納入變更管理流程,才能實現「可重複、可審計、可回滾」的專業級遷移交付。