首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

從 MySQL 遷移到 Oracle 必須知道的 50 件事

     編輯:Oracle 資料庫相關知識

當團隊決定將資料庫從 MySQL 遷移至 Oracle 時,往往會遭遇諸多意想不到的差異。這份整理自資深專家 Robert Treat、Robert Hodges、Denish Patel 與 Roland Bouman 見解的清單,雖然部分觀點帶有 MySQL DBA 的視角,甚至有些項目略顯湊數,但綜合來看仍能幫助開發者快速掌握兩大資料庫在架構、語法、管理與效能調校上的核心差異。

語法與 SQL 標準差異

  • 分頁查詢: Oracle 不支援 LIMIT 與 OFFSET,需改用 ROWNUM 偽欄或 ROW_NUMBER() OVER() 分析函數實現,寫法較繁瑣。
  • Upsert 操作: MySQL 的 INSERT ... ON DUPLICATE KEY UPDATE 需改寫為符合 SQL 標準的 MERGE 語句,邏輯更嚴謹但複雜度提高。
  • 自增欄位: 沒有 AUTO_INCREMENT,必須結合 SEQUENCE 與 TRIGGER 手動實現。
  • 欄位順序: ALTER TABLE ADD COLUMN 不支援 BEFORE/AFTER 指定位置,理論上不應依賴欄位順序,應在 SELECT/INSERT 中明確列出欄位名。
  • GROUP BY 嚴格模式: SELECT 清單中所有非聚合欄位必須出現在 GROUP BY 子句中,否則報錯。
  • 字串聚合: 無 GROUP_CONCAT,早期版本需用游標迴圈或 XMLAGG,11gR1 起提供 LISTAGG。
  • 多重表達式 COUNT DISTINCT: 僅支援單一表達式,多欄位需用子查詢繞過。
  • 日期型別: 無獨立 TIME 型別,DATE 實際為 DATETIME,且支援更大年份範圍。
  • ENUM 型別: 不支援,需用 CHECK 約束或外鍵關聯表替代。
  • 使用者變數: 無 @var,改用分析函數(窗口函數)或 DBMS_SESSION.SET_CONTEXT 實現會話級變數。

資料型別與儲存特性

  • 數值型別簡化: Oracle 僅有 NUMBER(p,s),若需 MySQL 多種整數/浮點型別,需自行透過精度控制模擬。
  • 大物件處理: BLOB/CLOB 非透明實體化,單純當文本處理時需大量 DBMS_LOB API,效率較低(即使 11g SecureFile 仍有改善空間)。
  • 特殊表類型: MySQL 的 BLACKHOLE、CSV 引擎在 Oracle 無對應;外部表(EXTERNAL TABLE)支援 CSV,11g 更支援壓縮/加密。
  • 資料驗證嚴格: 不接受 '0000-00-00' 等非法日期,遷移前必須清洗髒資料。

權限、安全與連線架構

  • 角色與 Schema 綁定: Role 掛在特定 Schema 下,系統內建 Role(如 DBA、CONNECT、RESOURCE)含預定義權限集,亦可自訂 Role。
  • 連線管理全不同: 捨棄 MySQL 的連線設定觀念,Oracle 使用 Listener、Service Name、TNSNAMES、Wallet 等完整體系。
  • 預設不自動提交: 需顯式 COMMIT,應用層需注意事務邊界。
  • KILL SESSION: 改用 ALTER SYSTEM KILL SESSION,OS 層面 kill -9 仍可用但不建議。

管理工具與日常操作

  • 命令列客戶端: SQL*Plus 功能強大但學習曲線陡峭,習慣 MySQL CLI 的開發者初期會不適應;圖形工具(SQL Developer、TOAD、PL/SQL Developer)體驗較佳。
  • SHOW 命令消失: 改查資料字典(DBA_*、ALL_*、USER_* 視圖)與動態效能視圖(V$*)。
  • 匯出/匯入: EXP/IMP 產出的 .dmp 為二進位格式,不可像 MySQL mysqldump 那樣手工修改;Data Pump(EXPDP/IMPDP)是現代替代方案。
  • 多重 ALTER TABLE: 單條語句不可包含多個 ALTER TABLE 子句,需拆分執行。

複寫、高可用與分區

  • 複寫功能: Oracle GoldenGate / Data Guard 比 MySQL Replication 健壯,但配置複雜度指數級上升。
  • 多 Master: 多寫入節點通常上 Oracle RAC,授權成本極高;MySQL NDB Cluster 在此場景或具成本優勢。
  • 分區表: 企業版內建,標準版需額外付費選項。

效能調優核心差異

  • CBO 統計資訊: 成本優化器高度依賴準確統計資訊,大量載入過程中需穿插 DBMS_STATS.GATHER_TABLE_STATS,否則易產生惡劣執行計畫。
  • 連線池不可或缺: 建立連線開銷極大,生產環境強制使用連線池(UCP、HikariCP、DBCP 等)。
  • 綁定變數強制: 不使用 PreparedStatement(綁定變數)會導致共用池洪水、硬解析風暴,是 Oracle 應用鐵律。
  • 游標洩漏即災難: 未關閉 ResultSet/游標會觸發 ORA-01000,屬應用層 Bug,需修代碼而非調參數。
  • 長查詢與 ORA-01555: 長跑查詢易遇 Snapshot too old,需調整 UNDO_RETENTION 與 Undo 表空間大小,而非 Redo Segment。
  • UNDO/REDO 設計是核心優勢: 多版本一致性讀(MVCC)完全依賴 Undo Segment,讀寫不阻塞是 Oracle 架構精華。
  • 無非事務表: 所有表皆受事務控制,無 MyISAM 類似物。
  • 臨時表定義持久化: GLOBAL TEMPORARY TABLE 定義對所有 Session 可見,資料才是 Session 級隔離,與 MySQL CREATE TEMPORARY TABLE 定義與資料皆 Session 級不同。

PL/SQL 與開發生態

  • PL/SQL 非標準: 不支援 ANSI SQL/PSM,需學習 Oracle 專屬語法,但功能極其強大(集合、物件型別、動態 SQL、編譯期警告等)。
  • 內建套件優先: 撰寫預存程序前先查 DBMS_*、UTL_* 等內建套件,九成需求已有現成 API。
  • 子查詢優化優異: 勿因 MySQL 子查詢效能差的刻板印象而避免使用,Oracle 對子查詢轉換(Unnesting、Predicate Pushdown)極為成熟。
  • 社群資源差異: 非資料庫圈(PHP、Web 論壇)的 Oracle 實戰資源遠少於 MySQL,遇到疑難雜症常需查 Metalink(需 CSI 授權)或開 SR。

授權與法律

  • 非開源: 無法自行修補、優化核心或實作私有功能,所有變更受限於 Oracle 支援政策與授權條款。
  • 授權規則複雜: 生產/非生產環境轉換、Core Factor、Named User Plus 等授權模型需深入理解,否則面臨合規風險與鉅額罰款。

專家建議總結

遷移不只是語法轉換,更是思維模式的重構。建議團隊:
1. 先建立效能基準線,量化 SLAs;
2. 投資 DBA 培訓,特別是 CBO、統計資訊、Undo/Redo、RAC 架構;
3. 採用 Data Pump、SQL Plan Baseline、Real Application Testing 降低風險;
4. 應用層強制綁定變數、連線池、游標管理三件套;
5. 預算中納入 Enterprise Edition 必選項(分區、壓縮、Advanced Security 等)與年費 22% 的維護費。

這 50 項差異涵蓋了從開發習慣到架構決策的完整光譜。逐項攻克,方能在 Oracle 生態中行穩致遠。

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