從 Mysql 遷移到Oracle前需要了解的50件事

jopen 11年前發布 | 35K 次閱讀 MySQL

  英文原文:Taking a Stab at "50" Things to Know Before Migrating MySQL to Oracle

  Robert Treat

  1. 有些人說 Oracle 沒有限制,實際上他們說得可能是 Oracle 不支持 LIMIT 語法.不過可以 rownum 虛列來實現,不過會更加麻煩.

  2. Oracle 不支持偏移(offset)語法.

  3. Oracle 的復制功能可能比 MySQL 更加健壯,不過也更加難以配置.

  4. 對于多個 Master 類型的系統,大部分用戶都希望你使用更加復雜也更加昂貴的 Oracle RAC (雖然可能 NDB 更加健壯).

  5. Oracle 的分區功能非常健壯,但是它不是內置的,并需要專門為此付費(分區功能是在 Enterprise Edition 里面是內置的).

  6. 在 Linux/Unix 上,Oracle 并不象 Mysql 那么方便,很多 Linux/Unix 發行版默認就會自帶 Mysql.(我對這一點的理解與翻譯可能都有偏差)

  7. INSERT … ON DUPLICATE KEY UPDATE 語法將不再可用,不過你需要學習更加復雜(但是符合 SQL 標準)的 MERGE 語法.

  8. Oracle 的 ROLE 架構與 MySQL 有很大差異,無法再使用 root 角色來完整所有工作.(不過 Sys 用戶的權限仍然與 root 相差無幾,只是為了安全著想,不建議這么使用了).

  9. Role 帳戶與特定的 Schema 聯系在一起(反之也一樣),類似于 MySQL 數據庫中的 Database 概念.(Role 并不完全與 Schema 聯系在一起,系統有一些固定的 role,這些 Role 包含部分已經定義好的權限集(privilege set),也可以再自定義部分新的 role).

  10. 事實上,丟棄一切已知的關于連接訪問的設置吧,Oracle 使用一套全新的系統來處理連接訪問.

  11. 支持全文搜索,不過語法完全不同.

  12. Oracle 的文檔非常豐富,不過,如果需要 Oracle 的專業服務,你需要擁有 Metalink 的訪問權限.

  13. 在非數據庫社區很難找到相關的支持信息(例如,PHP 論壇或者網站開發者的網志)

  14. 自增功能可以通過 Trigger 與 sequence 對象來實現.

  15. 大量日常熟悉的 SHOW 命令將不再可用,想要獲取系統信息,需要你學習 Oracle 的數據字典(或信息 Schema),深入一點的還需要學習 Oracle 動態性能.

  16. MySQL 為信息 Schema 添加了多個非標準的擴展,在 Oracle 中將很難找到這些信息.

  17. 為了管理好生產系統與非生產系統的的轉入轉出,需要你深入理解 Oracle 的授權規則.

  18. 大體上講,Oracle 的數值類型更加簡單,如果你確實需要類似于 MySQL 的多粒度的數值類型,就需要你自己來實現它,或者通過制定不同的精度(Number (n,x))來實現.

  19. 在 Oracle 中,表可以做到無限制的增長,但是大部分情況下,都建議通過表空間(tablespace)來對此作細粒度的管理.

  20. Oracle 不支持 ALTER TABLE ADD COLUMN BEFOREAFTER,也就是不支持自己制定字段的位置.(我們這邊之前有部分應用對字段順序有嚴格地要求,不過,從理論上講,這是業務設計的問題,主要是其大部分情況下都是使用 select *或者 insert table values 來處理數據,而不是在 select,insert 中指定具體需要處理的字段名列表).

  21. 如果你習慣于通過圖形界面(GUI)來管理數據庫,你一定會喜歡上 Oracle,但是如果你傾向于使用類似與 Mysql 命令行的客戶端,你可能會對 sql*plus 這個客戶端工具感到失望(需要一個習慣的過程,sql*plus 還是蠻好用的).

  22. Oracle 的數據校驗比 Mysql 更加嚴格,依賴于 MySQL 的模糊規則可能會導致應用無法運行 .MySQL 接受”0000-00-00″來作為日期類型的值就是個典型的例子.

  23. 雖然 Oracle 的 PL/SQL 功能更強,但是它不支持標準的 PSM 語言來編寫存儲過程,因此你可能不得不學習它的非標準的語法.

  24. Oracle 不支持 ENUM 數據類型,只能通過使用基于文本的 check 約束或者創建外鍵關聯表來實現.

  25. Mysql 的一些更加神秘的表類型(例如,blackhole,csv),在 Oracle 中找不到相對應的功能. (不清楚 blockhole 是何種類型,不過 Oracle 的外部表(external table)確實是支持 csv 格式的,在 11g 版本中還支持對此文件的壓縮/加密以及其他處理).

  26. Oracle 中的 Group By 語句必須是確定的,它需要 select list 中出現的所有列都必須包含在 group by 從句中.

  27. Oracle 的 exp 命令輸出的 dmp 文件無法象 Mysql 的轉儲文件一樣可以手工修改.

  28. Oracle 的底層實現有較大變化,需要你學習 UNDO 與 REDO segment,歸檔,以及 DBWR 進程. (個人認為 Oracle 相對于其他數據庫的主要的優勢可能就是其 UNDO/REDO 的設計了.)

  29. Oracle 不是開源軟件,因此你無法在上面進行修補/優化/修復/實現你自己的東西.

  Robert Hodges

  30. Oracle 的查詢優化是一件需要專家介入的工作.它的優化器比 MySQL 的要成熟的多,這意味著查詢計劃也相應的更加難以解釋.如果你有一個大的應用,請準備好聘用一位了解如何有效進行此項工作的伙計.

  31. Oracle 的基于成本的優化器的有效運行需要精確的統計信息.對于發生變化的表,需要定期的為其收集統計信息.批量數據加載進程也需要在處理過程中不時的執行 estimate/compute statistics 命令來收集統計信息以取得滿意的性能.

  32. 在 Oracle 中,創建連接是個代價高昂的操作.性能良好的 Oracle 應用都傾向于使用連接池來最小化登陸的開銷.

  33. Oracle 應用需要應用 prepared statement 以獲取可觀的性能.如果你的應用不使用 prepared statement 的話,需要對應用進行調整.這是應用 Oracle 數據庫的標準編程實踐.(此處的 prepared statement 應該更多的是指使用綁定變量).

  34. 應用需要關閉結果集游標,否則很快就會遇到著名的”ORA-01000 Too many open cursors”錯誤.在 Oracle 中,這被認為是一個用戶錯誤,需要你去調整你的代碼.

  35. 繁忙系統上的長查詢可能會遭遇到” ORA-01555 Snapshot too old”錯誤.可以通過調整 redo 段的大小(有時通過調整應用)來消除此錯誤,但是還是需要你關注這一點.(此處的 redo segments 的表述是有點問題,此處應該是 Undo tablespace 以及對應的 Undo Retention,Oracle 沒有所謂的 redo segment 的說法).

  36. Oracle 沒有類似于非事務表的概念.大部分 Oracle 用戶都認可這一點.

  37. Oracle 的臨時表定義是持久的 SQL 對象,并且對所有用戶都可見(此處應該理解成以此用戶登陸的會話,Session).這一點與 MySQL 中使用的輕量級表有區別,在 MySQL 中,臨時表是在單個會話內創建并銷毀的.

  Denish Patel

  38. 在 Oracle 中,多個 Alter Table 操作不能在同一個 SQL 語句中執行,例如 alter table emp modify name varchar (64) not null, add gender char (1) not null;

  39. 默認情況下,Oracle 不會自動提交.

  40. KILL 命令在 Oracle 中無效,它使用 alter system kill 命令.(不清楚第一個 kill 是什么概念,操作系統級別的 kill,Oracle 還是支持的,我經常使用).

  41. Oracle 在 Order by 語句中不支持使用減號(-).(不清楚這個具體的減號是什么東西).

  42. Oracle 的 sqlplus 命令行接口不支持高亮顯示.

  Roland Bouman

  43. Oracle 不支持 group_concat 或者類似的分組函數.需要你通過循環調取游標來實現,或者通過組合 XMLAGG 與 XMLQUERY 來實現你需要的查詢.(在 Oracle 9R2 之后,可以使用自定義聚合函數來實現這個功能,到 Oracle 11gR1 之后,Oracle 自己還提供了一個新的 listagg 分組函數來實現這個功能).

  44. 對于 count (distinct expression)函數,Oracle 只支持一個表達式(要么一個列名,要么*),而 Mysql 支持一組表達式. (在 Oracle 中要實現一組表達式,可以通過使用子查詢來實現).

  45. Oracle 對子查詢的支持非常好.不要因為 Mysql 中的習慣而不去使用它.

  46. Oracle 不支持用戶變量(@num).如果你需要利用它來計算運行時總和,可以利用分析函數(窗口函數)來實現.如果用用戶變量來實現特定的匯總函數功能,你將發現 Oracle 已經有內置得功能支持這些功能.(另外在 Oracle 中,可以通過在 package 中應用 dbms_session 來設置 context 以實現用戶變量).

  47. Oracle 沒有區分 TIME 與 DATE 類型,Oracle 的 Date 類型實際上就是一個 DATETIME 類型(但是比 MySQL 支持一個更大的日期范圍).

  48. 相對于 MySQL 來講,Oracle 的存儲過程與觸發器功能與性能都要好很多.不要習慣性地不去使用它們.

  49. 如果需要在 Oracle 中編寫存儲過程,記得在開始編碼前花點時間了解下 Oracle 是不是有相應的內置 package. 你將發現大部分問題已經解決掉了,或者至少大量的基礎代碼已經在那兒了.

  50 如果你在 MySQL 中有使用 BLOB 類型或者 TEXT 類型,你可能會將他們遷移到 Oracle 地 BLOB 與 CLOB 中.然而,與 MySQL 不同,Oracle 并不是透明地實體化這些數據.在大部分情況下,這確實是件好事情,但是它也意味著如果你只是想把 BLOB/CLOB 當作文本處理,你將需要花費大量瑣碎的時間來使用 LOB 函數,在使用之初,LOB 函數還是蠻讓人氣餒的.(LOB 相關函數確實挺煩人,LOB 的處理效率也非常差,即使是使用 Oracle 11g 的 SecureFile).

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!