Oracle 8i 之前廣泛使用 LONG 類型存儲大文本。
遷移痛點: CREATE TABLE new AS SELECT * FROM old 遇到 LONG 列直接報錯:ORA-00997: illegal use of LONG datatype。
Data Pump (expdp/impdp) 雖支持 LONG,但跨版本、跨平台、大表導出導入耗時極長。
特性: SQL*Plus 內建、基於數據庫鏈/連接描述符、支持 CHAR/DATE/LONG/NUMBER/VARCHAR2、單條命令完成結構+數據複製。
COPY FROM TO
CREATE
USING ;
-- 簡化:同實例內複製
COPY FROM CREATE USING ;
SQL> SET LONG 100000 -- 關鍵:設置 LONG 顯示/傳輸截斷長度
SQL> COPY FROM CREATE my_views USING SELECT * FROM user_views;
Array fetch/bind size is 15. (arraysize is 15)
Will commit when done. (copycommit is 0)
Maximum long size is 100000. (long is 100000)
Table MY_VIEWS created.
1 rows selected from DEFAULT HOST connection.
1 rows inserted into MY_VIEWS.
1 rows committed into MY_VIEWS at DEFAULT HOST connection.
SQL> DESC my_views;
Name Null? Type
----------------------- -------- --------------------
VIEW_NAME NOT NULL VARCHAR2(30)
TEXT_LENGTH NUMBER(38)
TEXT LONG -- 保留 LONG 類型
TYPE_TEXT_LENGTH NUMBER(38)
TYPE_TEXT VARCHAR2(4000)
OID_TEXT_LENGTH NUMBER(38)
OID_TEXT VARCHAR2(4000)
VIEW_TYPE_OWNER VARCHAR2(30)
VIEW_TYPE VARCHAR2(30)
SUPERVIEW_NAME VARCHAR2(30)
| 參數 | 作用 | 建議值 |
|---|---|---|
| SET LONG | LONG 列最大傳輸字節數 | 最大列長度 (如 1000000) |
| SET ARRAYSIZE | 網絡往返批次行數 | 500-5000 (大表調大) |
| SET COPYCOMMIT | 每 N 批次提交一次 | 10-100 (防長事務) |
| SET LONGCHUNKSIZE | LONG 分塊傳輸大小 | 與 LONG 一致或略小 |
-- 源庫: 192.168.1.10:1521/orcl (用戶 app_read)
-- 目標庫: 本地 (用戶 app_write)
SET LONG 2000000
SET ARRAYSIZE 1000
SET COPYCOMMIT 50
SET LONGCHUNKSIZE 2000000
COPY FROM app_read/pwd@//192.168.1.10:1521/orcl -
TO app_write/pwd@//localhost:1521/orcl -
CREATE history_log_archive -
USING SELECT * FROM history_log WHERE create_dt < SYSDATE - 365;
| 維度 | COPY | CTAS (DB Link) | Data Pump | GoldenGate |
|---|---|---|---|---|
| 支持 LONG | ✅ | ❌ | ✅ | ✅ |
| 支持 LOB/CLOB | ❌ (8.0 凍結功能) | ✅ | ✅ | ✅ |
| 支持新類型 (XMLType, JSON...) | ❌ | 視版本 | ✅ | ✅ |
| 並行度 | 單線程 | 可並行 | 高並行 | 高並行 |
| 適用場景 | 小/中表 LONG 遷移、臨時同步 | 同版本、無 LONG 表 | 大表、跨版本、全庫遷移 | 實時同步、異構、零停機 |
ALTER TABLE t MODIFY (long_col CLOB) + UPDATE t SET long_col = TO_LOB(long_col) (12c+ 支持在線)。SELECT COUNT(*), SUM(LENGTH(long_col)) FROM src; vs tgt;總結: COPY 命令是 Oracle 遺留給 LONG 類型遷移的「特效藥」。雖功能凍結、單線程、不支持現代類型,但在存量 LONG 表歷史數據歸檔/遷移場景下,它以「零配置、單命令、保真複製」的極簡體驗,仍是 DBA 工具箱中不可或缺的利器。