- 引言
-
一、前期準(zhǔn)備工作
- 1.搭建新的MySQL數(shù)據(jù)庫(kù)
-
2 .建立相應(yīng)的數(shù)據(jù)表
-
2.1 數(shù)據(jù)庫(kù)兼容性分析
- 2.1.1 字段類(lèi)型兼容性分析
- 2.1.2 函數(shù)兼容性分析
- 2.1.3 是否使用存儲(chǔ)過(guò)程?存儲(chǔ)過(guò)程的個(gè)數(shù)?復(fù)雜度?
- 2.1.4 是否使用觸發(fā)器?個(gè)數(shù)?使用的場(chǎng)景?
- 2.2 建表過(guò)程中其他需要注意的事項(xiàng)
-
2.1 數(shù)據(jù)庫(kù)兼容性分析
- 3.為項(xiàng)目配置Oracle和MySQL雙數(shù)據(jù)源
- 4.對(duì)項(xiàng)目進(jìn)行改造添加MySQL數(shù)據(jù)CRUD代碼
-
二、數(shù)據(jù)遷移操作步驟
- 1、配置初始化
- 2、同步數(shù)據(jù)檢查
- 3、全量數(shù)據(jù)遷移
- 4、檢查全量遷移的數(shù)據(jù)
- 5、開(kāi)啟雙寫(xiě)
- 6、獲取遷移過(guò)程中oracle數(shù)據(jù)庫(kù)的增量數(shù)據(jù)
- 7、增量數(shù)據(jù)腳本準(zhǔn)備
- 8、數(shù)據(jù)補(bǔ)償
- 9、核對(duì)整體數(shù)據(jù)
- 10、在灰度環(huán)境里驗(yàn)證數(shù)據(jù)的正確性
- 11、數(shù)據(jù)庫(kù)讀取的配置設(shè)置為從MySQL數(shù)據(jù)庫(kù)讀取。
- 12、數(shù)據(jù)庫(kù)寫(xiě)入的配置設(shè)置為只寫(xiě)MySQL
-
三、數(shù)據(jù)遷移的經(jīng)驗(yàn)教訓(xùn)
- 1. 遇到的坑
引言
隨著技術(shù)的進(jìn)步,許多企業(yè)開(kāi)始考慮將他們的數(shù)據(jù)從Oracle遷移到更現(xiàn)代、成本效益更高的數(shù)據(jù)庫(kù)系統(tǒng)如MySQL或PostgreSQL。本文將詳細(xì)描述我們?nèi)绾芜M(jìn)行這樣的數(shù)據(jù)遷移過(guò)程。
一、前期準(zhǔn)備工作
1.搭建新的MySQL數(shù)據(jù)庫(kù)
? 首先,我們需要設(shè)置一個(gè)新的MySQL數(shù)據(jù)庫(kù)環(huán)境,這將作為我們的新數(shù)據(jù)源。這包括安裝MySQL服務(wù)器,創(chuàng)建數(shù)據(jù)庫(kù),以及配置適當(dāng)?shù)挠脩?hù)權(quán)限。
2 .建立相應(yīng)的數(shù)據(jù)表
? 我們可以使用PowerDesigner等數(shù)據(jù)表模型設(shè)計(jì)工具,將Oracle的模型轉(zhuǎn)換成MySQL模型,然后根據(jù)這個(gè)模型生成DDL腳本。這些腳本可能需要根據(jù)實(shí)際情況進(jìn)行一些修改。例如,我們可能需要調(diào)整字段類(lèi)型以適應(yīng)MySQL的特性,或者修改索引和約束的定義。
2.1 數(shù)據(jù)庫(kù)兼容性分析
2.1.1 字段類(lèi)型兼容性分析
以下是常用的oracle字段類(lèi)型和和mysql字段類(lèi)型的對(duì)應(yīng)關(guān)系 ,如果使用特殊的字段類(lèi)型,需要檢查確認(rèn)字段轉(zhuǎn)換是否符合真實(shí)需求。
oracle字段類(lèi)型 | mysql字段類(lèi)型 |
---|---|
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 函數(shù)兼容性分析
Oracle和MySQL的函數(shù)有一定對(duì)的相似性也要有一定的區(qū)別,下面表格列出了Oracle和MySQL常用函數(shù)的對(duì)比和區(qū)別。
功能 | oracle函數(shù) | mysql函數(shù) | 備注 |
---|---|---|---|
舍入函數(shù) | round | round | 一樣 |
取絕對(duì)值 | abs | abs | 一樣 |
返回 expr 的最小或最大值 | Max(expr)/Min(expr) | Max(expr)/Min(expr) | 一樣 |
在字符串 str 中所有出現(xiàn)的字符串 from_str 均被 to_str 替換 | REPLACE(str,from_str,to_str) | REPLACE(str,from_str,to_str) | 一樣 |
截取函數(shù) | SUBSTR('abcd',2,2) | substring('abcd',2,2) | 函數(shù)名稱(chēng)不同 |
獲取長(zhǎng)度 | length(str) | char_length() | 函數(shù)名稱(chēng)不同 |
轉(zhuǎn)大寫(xiě) | UPPER(str) | UPPER(str) | 一樣 |
轉(zhuǎn)小寫(xiě) | LOWER(str) | LOWER(str) | 一樣 |
轉(zhuǎn)字符 | TO_CHAR(SQLCODE) | date_format/ time_format | 函數(shù)名稱(chēng)不同 |
轉(zhuǎn)時(shí)間 | to_date(str,format) | STR_TO_DATE(str,format) | 函數(shù)名稱(chēng)不同 |
獲取當(dāng)前時(shí)間 | SYSDATE | now() / SYSDATE() | 函數(shù)名稱(chēng)不同 |
求和 | SUM(num) | SUM(num) | 一樣 |
返回兩個(gè)日期之間的天數(shù) | (D1-D2) | DATEDIFF(date1,date2) |
2.1.3 是否使用存儲(chǔ)過(guò)程?存儲(chǔ)過(guò)程的個(gè)數(shù)?復(fù)雜度?
在這次的案例中,沒(méi)有使用存儲(chǔ)過(guò)程,因此不需要進(jìn)行這方面的分析。
2.1.4 是否使用觸發(fā)器?個(gè)數(shù)?使用的場(chǎng)景?
公司的數(shù)據(jù)庫(kù)使用規(guī)范里禁止使用觸發(fā)器,因此這次也不需要進(jìn)行這方面的分析。
2.2 建表過(guò)程中其他需要注意的事項(xiàng)
- 自增主鍵 mysql默認(rèn)需要有自增主鍵,而oracle的表可以不加主鍵
- 編碼格式:oracle的編碼格式utf8在mysql需要修改成utf8mb4 要確保所有的表都有一個(gè)自增的主鍵列。
- 時(shí)間字段:時(shí)間字段需要精確到時(shí)分秒的需要修改為datatime類(lèi)型。這是因?yàn)镸ySQL的DATETIME類(lèi)型可以存儲(chǔ)到秒級(jí)別的時(shí)間信息,而Oracle的DATE類(lèi)型只能存儲(chǔ)到天級(jí)別的時(shí)間信息。
- 索引格式:索引格式需要按照規(guī)范重新定義,最好在測(cè)試環(huán)境中進(jìn)行檢查和校驗(yàn)。這是因?yàn)镺racle和MySQL的索引實(shí)現(xiàn)方式有所不同,直接復(fù)制索引可能會(huì)導(dǎo)致性能問(wèn)題。
3.為項(xiàng)目配置Oracle和MySQL雙數(shù)據(jù)源
在項(xiàng)目的數(shù)據(jù)源配置里添加剛剛新建的MySQL數(shù)據(jù)源配置,并配置雙數(shù)據(jù)源和Mapper的匹配規(guī)則。
4.對(duì)項(xiàng)目進(jìn)行改造添加MySQL數(shù)據(jù)CRUD代碼
添加一套針對(duì)MuSQL數(shù)據(jù)庫(kù)CRUD的Dao和Mapper代碼,同時(shí)我們寫(xiě)了一個(gè)注解以切面的方式實(shí)現(xiàn)根據(jù)配置實(shí)例化Oracle的Dao、MySQl的Dao、同時(shí)調(diào)用Oracle和MySQLDao的功能。
改造方式:
數(shù)據(jù)庫(kù)遷移切換流程:
二、數(shù)據(jù)遷移操作步驟
數(shù)據(jù)遷移操作的答題步驟如下圖所示:
1、配置初始化
? 數(shù)據(jù)庫(kù)寫(xiě)入的配置設(shè)置為只寫(xiě)Oracle數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)讀取的配置設(shè)置為從OracleL數(shù)據(jù)庫(kù)讀取。
2、同步數(shù)據(jù)檢查
? 查詢(xún)待遷移的幾張表的數(shù)據(jù)量:
? select count(1) from table;
3、全量數(shù)據(jù)遷移
? 在遷移工具上執(zhí)行數(shù)據(jù)遷移腳本SQL
4、檢查全量遷移的數(shù)據(jù)
? 查詢(xún)遷移后的數(shù)據(jù)量,檢查是否和需要遷移的數(shù)據(jù)量能匹配:
5、開(kāi)啟雙寫(xiě)
數(shù)據(jù)庫(kù)寫(xiě)入的配置設(shè)置為Oracle數(shù)據(jù)庫(kù)和MYSQl數(shù)據(jù)庫(kù)雙寫(xiě)
6、獲取遷移過(guò)程中oracle數(shù)據(jù)庫(kù)的增量數(shù)據(jù)
查詢(xún)updated_time在全量數(shù)據(jù)遷移開(kāi)始時(shí)間之后的數(shù)據(jù)
select * from table whereupdated_time>to_Date('2022/12/16 04:00:00', 'yyyy/mm/dd hh24:mi:ss')
7、增量數(shù)據(jù)腳本準(zhǔn)備
根據(jù)監(jiān)控的增量數(shù)據(jù)對(duì)比,找出需要新增和修改的數(shù)據(jù),準(zhǔn)備腳本
8、數(shù)據(jù)補(bǔ)償
在遷移工具上執(zhí)行數(shù)據(jù)補(bǔ)償腳本SQL
9、核對(duì)整體數(shù)據(jù)
我們有額外的數(shù)據(jù)核對(duì)方案,通過(guò)應(yīng)用讀Oracle,再異步讀取MySQL并進(jìn)行對(duì)比的方式進(jìn)行業(yè)務(wù)表的數(shù)據(jù)核對(duì)。這樣可以確保數(shù)據(jù)的一致性。
10、在灰度環(huán)境里驗(yàn)證數(shù)據(jù)的正確性
將灰度機(jī)器的數(shù)據(jù)庫(kù)讀取的配置設(shè)置為從MySQL數(shù)據(jù)庫(kù)讀取。并在灰度環(huán)境驗(yàn)證數(shù)據(jù)的正確性
11、數(shù)據(jù)庫(kù)讀取的配置設(shè)置為從MySQL數(shù)據(jù)庫(kù)讀取。
將正式環(huán)境的機(jī)器的數(shù)據(jù)庫(kù)讀取的配置設(shè)置為從MySQL數(shù)據(jù)庫(kù)讀取。
12、數(shù)據(jù)庫(kù)寫(xiě)入的配置設(shè)置為只寫(xiě)MySQL
在生產(chǎn)環(huán)境運(yùn)行一段時(shí)間,如果運(yùn)行平穩(wěn)的話,就可以關(guān)閉數(shù)據(jù)庫(kù)雙寫(xiě),將數(shù)據(jù)庫(kù)寫(xiě)入配置改為只寫(xiě)MySQL數(shù)據(jù)庫(kù)了。
三、數(shù)據(jù)遷移的經(jīng)驗(yàn)教訓(xùn)
1. 遇到的坑
在遷移過(guò)程中,我們發(fā)現(xiàn)了一些Oracle語(yǔ)法與MySQL語(yǔ)法不兼容的地方,有些寫(xiě)法在Oracle中可行,在MySQL中會(huì)報(bào)錯(cuò):
(1)子查詢(xún)語(yǔ)句要取別名
(2)字段別名需要注意,AS后是否為空
(3)條件語(yǔ)句中判斷需要注意文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-847843.html
(4)oracle轉(zhuǎn)mysql條件語(yǔ)句is null需格外注意,在Oracle中null和空串是一個(gè)含義,在mysql中是兩個(gè)含(只針對(duì)字段類(lèi)型為varchar類(lèi)型的字段)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847843.html
Oracle中:
IS_LIMIT_SUCESS is null
Mysql替換為:
(IS_LIMIT_SUCESS is null or IS_LIMIT_SUCESS = '')
到了這里,關(guān)于從 Oracle 到 MySQL 數(shù)據(jù)庫(kù)的遷移之旅的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!