首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SQL*Plus COPY 命令實戰:跨版本遷移 LONG 類型歷史表數據

     編輯:Oracle 資料庫基礎

業務背景

Oracle 8i 之前廣泛使用 LONG 類型存儲大文本。
遷移痛點: CREATE TABLE new AS SELECT * FROM old 遇到 LONG 列直接報錯:ORA-00997: illegal use of LONG datatype。
Data Pump (expdp/impdp) 雖支持 LONG,但跨版本、跨平台、大表導出導入耗時極長。

COPY 命令:輕量級跨實例數據傳輸利器

特性: SQL*Plus 內建、基於數據庫鏈/連接描述符、支持 CHAR/DATE/LONG/NUMBER/VARCHAR2、單條命令完成結構+數據複製。

語法結構

COPY FROM  TO  
CREATE  
USING ;

-- 簡化:同實例內複製
COPY FROM  CREATE  USING ;

實戰案例:複製 USER_VIEWS (含 LONG 列 TEXT)

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 LONGLONG 列最大傳輸字節數最大列長度 (如 1000000)
SET ARRAYSIZE網絡往返批次行數500-5000 (大表調大)
SET COPYCOMMIT每 N 批次提交一次10-100 (防長事務)
SET LONGCHUNKSIZELONG 分塊傳輸大小與 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;

局限性與替代方案對比

維度COPYCTAS (DB Link)Data PumpGoldenGate
支持 LONG✅❌✅✅
支持 LOB/CLOB❌ (8.0 凍結功能)✅✅✅
支持新類型 (XMLType, JSON...)❌視版本✅✅
並行度單線程可並行高並行高並行
適用場景小/中表 LONG 遷移、臨時同步同版本、無 LONG 表大表、跨版本、全庫遷移實時同步、異構、零停機

最佳實踐建議

  1. 遷移後立即轉型:ALTER TABLE t MODIFY (long_col CLOB) + UPDATE t SET long_col = TO_LOB(long_col) (12c+ 支持在線)。
  2. 大表分批:WHERE 條件按主鍵範圍/時間分片,多會話並行 COPY。
  3. 網絡優化:SDU=32767、TCP.NODELAY=YES、啟用 SQL*Net 壓縮。
  4. 驗證:SELECT COUNT(*), SUM(LENGTH(long_col)) FROM src; vs tgt;

總結: COPY 命令是 Oracle 遺留給 LONG 類型遷移的「特效藥」。雖功能凍結、單線程、不支持現代類型,但在存量 LONG 表歷史數據歸檔/遷移場景下,它以「零配置、單命令、保真複製」的極簡體驗,仍是 DBA 工具箱中不可或缺的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved