從 Oracle 到 MySQL 資料庫的遷移之旅

来源:https://www.cnblogs.com/fhey/p/18129258
-Advertisement-
Play Games

添加一套針對MuSQL資料庫CRUD的Dao和Mapper代碼,同時我們寫了一個註解以切麵的方式實現根據配置實例化Oracle的Dao、MySQl的Dao、同時調用Oracle和MySQLDao的功能。​ 首先,我們需要設置一個新的MySQL資料庫環境,這將作為我們的新數據源。我們有額外的數據核對方... ...


目錄

引言

隨著技術的進步,許多企業開始考慮將他們的數據從Oracle遷移到更現代、成本效益更高的資料庫系統如MySQL或PostgreSQL。本文將詳細描述我們如何進行這樣的數據遷移過程。

一、前期準備工作

1.搭建新的MySQL資料庫

​ 首先,我們需要設置一個新的MySQL資料庫環境,這將作為我們的新數據源。這包括安裝MySQL伺服器,創建資料庫,以及配置適當的用戶許可權。

2 .建立相應的數據表

​ 我們可以使用PowerDesigner等數據表模型設計工具,將Oracle的模型轉換成MySQL模型,然後根據這個模型生成DDL腳本。這些腳本可能需要根據實際情況進行一些修改。例如,我們可能需要調整欄位類型以適應MySQL的特性,或者修改索引和約束的定義。

2.1 資料庫相容性分析

2.1.1 欄位類型相容性分析

以下是常用的oracle欄位類型和和mysql欄位類型的對應關係 ,如果使用特殊的欄位類型,需要檢查確認欄位轉換是否符合真實需求。

oracle欄位類型 mysql欄位類型
varchar2 varchar
number(1,0))->number(2,0) tinyint
number(3,0)->number(4,0) smallint
number(5,0)->number(6,0) mediumint
number(7,0)->number(9,0) int
number(10,0) -> number(18,0) bigint
number(x,y) decimal(x,y)
date datetime
timestamp(6) datetime
char varchar
clob Text 或 Midiumtext 或 longtext

2.1.2 函數相容性分析

Oracle和MySQL的函數有一定對的相似性也要有一定的區別,下麵表格列出了Oracle和MySQL常用函數的對比和區別。

功能 oracle函數 mysql函數 備註
舍入函數 round round 一樣
取絕對值 abs abs 一樣
返回 expr 的最小或最大值 Max(expr)/Min(expr) Max(expr)/Min(expr) 一樣
在字元串 str 中所有出現的字元串 from_str 均被 to_str 替換 REPLACE(str,from_str,to_str) REPLACE(str,from_str,to_str) 一樣
截取函數 SUBSTR('abcd',2,2) substring('abcd',2,2) 函數名稱不同
獲取長度 length(str) char_length() 函數名稱不同
轉大寫 UPPER(str) UPPER(str) 一樣
轉小寫 LOWER(str) LOWER(str) 一樣
轉字元 TO_CHAR(SQLCODE) date_format/ time_format 函數名稱不同
轉時間 to_date(str,format) STR_TO_DATE(str,format) 函數名稱不同
獲取當前時間 SYSDATE now() / SYSDATE() 函數名稱不同
求和 SUM(num) SUM(num) 一樣
返回兩個日期之間的天數 (D1-D2) DATEDIFF(date1,date2)

2.1.3 是否使用存儲過程?存儲過程的個數?複雜度?

在這次的案例中,沒有使用存儲過程,因此不需要進行這方面的分析。

2.1.4 是否使用觸發器?個數?使用的場景?

公司的資料庫使用規範里禁止使用觸發器,因此這次也不需要進行這方面的分析。

2.2 建表過程中其他需要註意的事項

  • 自增主鍵 mysql預設需要有自增主鍵,而oracle的表可以不加主鍵
  • 編碼格式:oracle的編碼格式utf8在mysql需要修改成utf8mb4 要確保所有的表都有一個自增的主鍵列。
  • 時間欄位:時間欄位需要精確到時分秒的需要修改為datatime類型。這是因為MySQL的DATETIME類型可以存儲到秒級別的時間信息,而Oracle的DATE類型只能存儲到天級別的時間信息。
  • 索引格式:索引格式需要按照規範重新定義,最好在測試環境中進行檢查和校驗。這是因為Oracle和MySQL的索引實現方式有所不同,直接複製索引可能會導致性能問題。

3.為項目配置Oracle和MySQL雙數據源

在項目的數據源配置里添加剛剛新建的MySQL數據源配置,並配置雙數據源和Mapper的匹配規則。

4.對項目進行改造添加MySQL數據CRUD代碼

添加一套針對MuSQL資料庫CRUD的Dao和Mapper代碼,同時我們寫了一個註解以切麵的方式實現根據配置實例化Oracle的Dao、MySQl的Dao、同時調用Oracle和MySQLDao的功能。

改造方式:
請添加圖片描述

資料庫遷移切換流程:
請添加圖片描述

二、數據遷移操作步驟

數據遷移操作的答題步驟如下圖所示:
請添加圖片描述

1、配置初始化

​ 資料庫寫入的配置設置為只寫Oracle資料庫。資料庫讀取的配置設置為從OracleL資料庫讀取。

2、同步數據檢查

​ 查詢待遷移的幾張表的數據量:

​ select count(1) from table;

3、全量數據遷移

​ 在遷移工具上執行數據遷移腳本SQL

4、檢查全量遷移的數據

​ 查詢遷移後的數據量,檢查是否和需要遷移的數據量能匹配:

5、開啟雙寫

資料庫寫入的配置設置為Oracle資料庫和MYSQl資料庫雙寫

6、獲取遷移過程中oracle資料庫的增量數據

查詢updated_time在全量數據遷移開始時間之後的數據

select * from table whereupdated_time>to_Date('2022/12/16 04:00:00', 'yyyy/mm/dd hh24:mi:ss')

7、增量數據腳本準備

根據監控的增量數據對比,找出需要新增和修改的數據,準備腳本

8、數據補償

在遷移工具上執行數據補償腳本SQL

9、核對整體數據

我們有額外的數據核對方案,通過應用讀Oracle,再非同步讀取MySQL併進行對比的方式進行業務表的數據核對。這樣可以確保數據的一致性。

10、在灰度環境里驗證數據的正確性

將灰度機器的資料庫讀取的配置設置為從MySQL資料庫讀取。併在灰度環境驗證數據的正確性

11、資料庫讀取的配置設置為從MySQL資料庫讀取。

將正式環境的機器的資料庫讀取的配置設置為從MySQL資料庫讀取。

12、資料庫寫入的配置設置為只寫MySQL

在生產環境運行一段時間,如果運行平穩的話,就可以關閉資料庫雙寫,將資料庫寫入配置改為只寫MySQL資料庫了。

三、數據遷移的經驗教訓

1. 遇到的坑

在遷移過程中,我們發現了一些Oracle語法與MySQL語法不相容的地方,有些寫法在Oracle中可行,在MySQL中會報錯:

(1)子查詢語句要取別名

(2)欄位別名需要註意,AS後是否為空

(3)條件語句中判斷需要註意

(4)oracle轉mysql條件語句is null需格外註意,在Oracle中null和空串是一個含義,在mysql中是兩個含(只針對欄位類型為varchar類型的欄位)

Oracle中:
IS_LIMIT_SUCESS is null
Mysql替換為:
(IS_LIMIT_SUCESS is null or IS_LIMIT_SUCESS = '') 

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 點擊查看代碼 丐版sqlserver集群 之前試過docker的,k8s的,然後發現,還是最朴素的是最簡單的,希望有大佬能夠漢化,他媽的,那些英文看得人要發癲啊。 前置準備,參照丐版pxc集群: https://www.cnblogs.com/zwnfdswww/p/18112077 如果不關防火牆 ...
  • 背景介紹 近來一套業務系統,從庫一直處於延遲狀態,無法追上主庫,導致業務風險較大。從資源上看,從庫的CPU、IO、網路使用率較低,不存在伺服器壓力過高導致回放慢的情況;從庫開啟了並行回放;在從庫上執行show processlist看到沒有回放線程阻塞,回放一直在持續;解析relay-log日誌文件 ...
  • 作用 GROUP_CONCAT 是 MySQL 中用於將查詢結果集中的多行數據合併為單個字元串的聚合函數。它將每行數據的指定欄位值連接起來,並以指定的分隔符分隔,最終返回一個包含所有值的字元串。 以下是 GROUP_CONCAT 函數的一般語法: SELECT GROUP_CONCAT(column ...
  • 目錄一、Linux下MySQL忘記root密碼情景再現1、停止MySQL服務2、安全模式啟動MySQL服務,並暫時跳過許可權表驗證以及禁用網路連接3、更新mysql.user表中root用戶的密碼。4、刷新MySQL的許可權緩存二、Windows下MySQL忘記密碼(8.0以上版本)情景再現1、通過管理 ...
  • 生產環境有一套3個節點的MySQL InnoDB Cluster,MySQL的版本為Server version: 8.0.35 MySQL Community Server - GPL, 早上突然收到Zabbix的告警,其中一個節點出現空間告警:"/data: Disk space is low ...
  • 各位熱愛 SeaTunnel 的小伙伴們,SeaTunnel 社區 3 月月報來啦!這裡將記錄 SeaTunnel 社區每個月的重要更新,並評選出月度之星,歡迎關註。 SeaTunnel 月度 Merge Stars 感謝以下小伙伴 3 月為 Apache SeaTunnel 做的精彩貢獻(排名不分 ...
  • 各位熱愛 DolphinScheduler 的小伙伴們,DolphinScheduler 社區月報開始更新啦!這裡將記錄 DolphinScheduler 社區每月的重要更新。 社區為 DolphinScheduler 3.2.x 版本做了諸多功能改進和 bug 修複 DolphinSchedule ...
  • 4月10日,以“Data+AI,構建新質生產力”為主題的袋鼠雲春季發佈會圓滿落幕。大會中,袋鼠雲帶來了一系列“+AI”的數字化產品與最新行業沉澱,旨在將數據與AI緊密結合,打破傳統的生產力邊界,賦能企業實現更高質量、更高效率的數字化發展。 2部白皮書:聚焦行業沉澱 《行業指標體系白皮書》:系統闡述了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...