架構選擇
| 方案 | 架構 | 適用場景 | 優點 | 缺點 |
| Sybase CIS (Component Integration Services) | Sybase 端建立 Proxy Table 映射 Oracle | Sybase 為主、少量 Oracle 查詢 | Sybase 原生、無額外軟體 | Oracle 端無感知、功能受限 |
| Oracle Database Link (DG4ODBC/Heterogeneous Services) | Oracle 端建立 DB Link 連 Sybase | Oracle 為主、需在 Oracle 端 Join Sybase 資料 | Oracle 原生 SQL、完整功能 | 需 Gateway/ODBC 設定 |
| ETL 工具 (Informatica/DataStage/自製) | 中間層抽取/轉換/載入 | 大量資料同步、複雜轉換 | 效能最佳、解耦 | 架構複雜、授權成本 |
方案一:Oracle Heterogeneous Services + ODBC (推薦雙向查詢)
1. Sybase 端準備
- 建立 Sybase ODBC System DSN (64-bit):
ODBC Data Sources (64-bit) → System DSN → Add → Sybase ASE ODBC Driver → 設定 Server/Database/User/Pass → Test 成功
2. Oracle 端設定
# $ORACLE_HOME/hs/admin/initdg4odbc.ora
HS_FDS_CONNECT_INFO = sybase_odbc_dsn
HS_FDS_TRACE_LEVEL = OFF
HS_FDS_SHAREABLE_NAME = /opt/sybase/OCS-16_0/lib/libsybodbc.so
HS_LANGUAGE = TRADITIONAL CHINESE_TAIWAN.AL32UTF8
HS_NLS_DATE_FORMAT = YYYY-MM-DD HH24:MI:SS
HS_FDS_FETCH_ROWS = 100
HS_FDS_REPORT_REAL_AS_DOUBLE = TRUE
3. Listener 註冊 Gateway
# $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = dg4odbc)
(ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
(PROGRAM = dg4odbc)
(ENVS = "LD_LIBRARY_PATH=/opt/sybase/OCS-16_0/lib:/u01/app/oracle/product/19.0.0/dbhome_1/lib")
)
)
重啟 Listener:lsnrctl reload
4. TNSNAMES 定義
SYBASE_DG =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle_host)(PORT = 1521))
(CONNECT_DATA = (SID = dg4odbc))
(HS = OK)
)
5. 建立 Database Link
CREATE DATABASE LINK sybase_link
CONNECT TO "sybase_user" IDENTIFIED BY "pass"
USING 'SYBASE_DG';
6. 查詢驗證
SELECT * FROM "schema"."table"@sybase_link WHERE rownum <= 10;
-- 注意:Sybase 物件名區分大小寫,需雙引號
方案二:Sybase CIS (Proxy Table)
-- Sybase 端
sp_addserver 'ORACLE_SERVER', 'ASEnterprise', 'oracle_tds_entry'
-- 需在 Sybase interfaces 檔定義 Oracle TDS 端點 (Oracle 不原生支援 TDS,需第三方 Gateway)
-- 此方案較少用,建議改用方案一
資料類型對照與轉換
| Sybase ASE | Oracle | 注意 |
| INT / SMALLINT / TINYINT | NUMBER(10/5/3) | |
| DECIMAL(p,s) / NUMERIC(p,s) | NUMBER(p,s) | |
| FLOAT / REAL / DOUBLE PRECISION | BINARY_DOUBLE / BINARY_FLOAT | |
| CHAR / VARCHAR / TEXT | CHAR / VARCHAR2 / CLOB | TEXT → CLOB |
| BINARY / VARBINARY / IMAGE | RAW / BLOB | IMAGE → BLOB |
| DATETIME / SMALLDATETIME | DATE / TIMESTAMP | 精度轉換 |
| BIT | NUMBER(1) / CHAR(1) | 0/1 或 Y/N |
| IDENTITY | GENERATED AS IDENTITY | 12c+ |
| UNIQUEIDENTIFIER | RAW(16) / SYS_GUID() | |
效能調優關鍵
- Array Fetch:
HS_FDS_FETCH_ROWS = 500-1000 減少網路往返
- 推謂下推:WHERE 條件盡量下推到 Sybase 執行,避免全表拉回 Oracle 過濾
- 統計資訊:
DBMS_STATS.GATHER_TABLE_STATS 於 Oracle 端收集遠端表統計 (12c+ 支援)
- 平行查詢:大量資料啟用
PARALLEL,但注意 Gateway 程序數限制
- 快取:頻繁查詢的小表考慮 Oracle 端物化視圖定時刷新
遷移驗證腳本
-- 筆數對比
SELECT 'Sybase' src, COUNT(*) cnt FROM "dbo"."customers"@sybase_link
UNION ALL
SELECT 'Oracle', COUNT(*) FROM customers;
-- 關鍵欄位檢查和
SELECT SUM(balance) FROM "dbo"."accounts"@sybase_link
UNION ALL
SELECT SUM(balance) FROM accounts;
-- 抽樣逐欄比對
SELECT c1, c2, c3 FROM "dbo"."table"@sybase_link MINUS
SELECT c1, c2, c3 FROM table;
常見問題排查
| 現象 | 原因 | 解決 |
| ORA-28500: connection failed | ODBC DSN/Listener/Gateway 設定錯誤 | 檢查 tnsping、Listener 狀態、Gateway 程序存在 |
| ORA-28528: data type conversion error | 資料類型不匹配 | 調整 HS_FDS_* 參數、建立 View 轉換 |
| 查詢極慢 | Predicate 未下推、Array Fetch 太小 | 調大 HS_FDS_FETCH_ROWS、改寫 SQL 推謂 |
| 中文亂碼 | NLS_LANG/HS_LANGUAGE 不一致 | 統一 AL32UTF8、設定 HS_NLS_NCHAR |