Oracle/雲MySQL/MsSQL“大遷移”真相及最優方案
最近一段時間碰到一些資料遷移的專案,如:Oracle遷移到MySQL,MsSQL遷移到MySQL,雲MySQL遷移到本地MySQL。對於這方面做了系統的整理。包括:遷移方案的選擇、如何跳出遷移遇到的坑、怎樣修改MySQL引數獲取最大效能,加入分庫分表的需求如何實現?文章的最後,作者做了很多可行性的總結,碼字不易,如果對您有幫助,感謝轉發。
遷移方案的選擇:
拋開業務邏輯的因素,根據不同的版本、不同平臺、不同停機時間需求,有不同的可選路徑決定遷移方
法和工具:
遷移方法 | 優點 | 缺點 |
SQL LOAD | 操作簡單、速度快、選擇資料範圍靈活 | 需自定義開發批次操作、對於CLOB等特殊欄位無法支援 |
OGG | 商用軟體,廣泛的資料庫平臺支援、靈活的複製架構、基於日誌的實時資料同步、穩定性高 | 對維護技能有一定的要求、費用高 |
ETL 軟體 | 使用方便簡單、定時同步 | 批次處理大量表需定製化配置 |
MYSQL移植工具 | 安裝簡單、可自動建立表 | 不可定製、技術支援較弱 |
定製遷移工具 | 可高度定製,保證最佳效能和最短停機時間 | 暫無 |
由於不同的資料庫版本、不同的元件安裝、不同的應用開發特徵都會導致遷移計劃的複雜性和差異性。
調研中,除了OGG,有幾個MySQL遷移的工具,推薦的比較多,但是收費的。
【工具:OGG (goldengate)
同時支援Oracle,Mssql 遷移到 MySQL 上
引數:filter,COMPUTE 進行分庫分表邏輯】
● SQLyog
()
● Navicat Premium
()
● Mss2sql
()
● DB2DB
()
選擇遷移軟體,必須要考慮 軟體易用性, 處理速度和記憶體佔用,資料完整性。這部分很重要。
以上四款軟體中:
1. 最不推薦使用的是 Navicat Premium,主要原因是資料的完整性表現較差,轉換後的數
據不能立即用於生產環境,需要程式設計師仔細自行查詢原因和分析。
2. SQLyog 有較好的資料完整性,但整體處理速度非常的慢,如果資料較大的情況下,需要浪費非常多寶
貴的時間。比較推薦的是
3. DB2DB,處理速度,資料完整性,整體表現較好,操作起來實在方便。
我本人趨向於自己寫python指令碼。
遷移中會存在哪些細節上的問題?
1. 字符集
字符集轉化:Oracle字符集AL32UTF8,ZHS16GBK,轉換成MySQL支援的字符集Latin1,utf8,utf8mb4(emoji的表情符)
Mysql對於字符集裡有兩個概念:一個是"Character set"另一個是"Collations"。
Collations:Mysql對字元的比較,排序規則
Character set:字元的編碼方式
2. 欄位型別
Oracle Row, Clob,BINARY_DOUBLE型別轉化成MySQL支援的欄位型別。
如:Oracle CLOB欄位最大長度4G對應MySQL LONGTEXT 等等,但要是把資料這些資料遷移到MySQL上,可以想象到會發生什麼事情。
3. 主鍵
有些源表沒有設定主鍵, 但對於MySQL來說主鍵的意思非常大,特別是複製環節裡。
4. 遷移時間和資料量
對於現在線上不間斷提供的業務非常重要,按照這個指標可以制定全量或者增量方式進行遷移。
5. 考慮因素
除了以上內容源資料庫還有賬號、檢視、儲存過程、函式、觸發器,索引等,同樣也很重要,都是需要考慮的一個因素。
6. 校驗資料
這一關最後門卡,當資料遷移完成後,如何確保資料的正確遷移、沒有遺漏和錯誤是一個很難的問題。這裡的難不是實現起來困難,而是要把它自動化,達到節省人力的目標有點難,因為兩者的資料型別不同,資料量偏大,寫一些指令碼去做檢查效果不大。
資料的完整性驗證是十分重要的,千萬不要怕驗證到錯誤後要花好長時候去抽取同步的操作這一步。因為一旦沒有驗證到錯誤,讓資料進行了使用卻亂掉了,後果將更嚴重。
一般場景下都是對應查詢資料行數count來判斷資料的是否存在問題。或則 是用create_time時間欄位進行驗證資料。或則抽取部分資料進行驗證。還有匯入過程中的log和警告 ,errors 等資訊。
MySQL一些效能引數
可以在匯入資料的時候預先修改一些引數,來獲取最大效能的處理,比如可以把自適應hash關掉,Doublewrite關掉,然後調整快取區,log檔案的大小,把能變大的都變大,把能關的都關掉來獲取最大的效能,接下來說幾個常用的:
1. innodb_flush_log_at_trx_commit
如果innodb_flush_log_at_trx_commit設定為0,log buffer將每秒一次地寫入log file中,並且log file的flush(刷到磁碟)操作同時進行。該模式下,在事務提交時,不會主動觸發寫入磁碟的操作。
如果innodb_flush_log_at_trx_commit設定為1,每次事務提交時MySQL都會把log buffer的資料寫入log file,並且flush(刷到磁碟)中去。
如果innodb_flush_log_at_trx_commit設定為2,每次事務提交時MySQL都會把log buffer的資料寫入log file。但是flush(刷到磁碟)的操作並不會同時進行。該模式下,MySQL會每秒執行一次 flush(刷到磁碟)操作。
注意:由於程式排程策略問題,這個“每秒執行一次 flush(刷到磁碟)操作”並不是保證100%的“每秒”。
2. sync_binlog
sync_binlog 的預設值是0,像作業系統刷其它檔案的機制一樣,MySQL不會同步到磁碟中去,而是依賴作業系統來重新整理binary log。
當sync_binlog =N (N>0) ,MySQL 在每寫N次 二進位制日誌binary log時,會使用fdatasync()函式將它的寫二進位制日誌binary log同步到磁碟中去。
注意:如果啟用了autocommit,那麼每一個語句statement就會有一次寫操作;否則每個事務對應一個寫操作。
3. max_allowed_packet
在導大容量資料特別是CLOB資料時,可能會出現異常:“Packets larger than max_allowed_packet are not allowed”。這是由於MySQL資料庫有一個系統引數max_allowed_packet,其預設值為1048576(1M),可以透過如下語句在資料庫中查詢其值:show VARIABLES like '%max_allowed_packet%';
修改此引數的方法是在MySQL資料夾找到my.cnf檔案,在my.cnf檔案[MySQLd]中新增一行:max_allowed_packet=16777216
4. innodb_log_file_size
InnoDB日誌檔案太大,會影響MySQL崩潰恢復的時間,太小會增加IO負擔,所以我們要調整合適的日誌大小。在資料匯入時先把這個值調大一點。避免無謂的buffer pool的flush操作。但也不能把innodb_log_file_size開得太大,會明顯增加 InnoDB的log寫入操作,而且會造成作業系統需要更多的Disk Cache開銷。
5. innodb_log_buffer_size
InnoDB用於將日誌檔案寫入磁碟時的緩衝區大小位元組數。為了實現較高寫入吞吐率,可增大該引數的預設值。一個大的log buffer讓一個大的事務執行,不需要在事務提交前寫日誌到磁碟,因此,如果你有事務比如update、insert或者delete 很多的記錄,讓log buffer 足夠大來節約磁碟I/O。
6. innodb_buffer_pool_size
這個引數主要快取InnoDB表的索引、資料、插入資料時的緩衝。為InnoDN加速最佳化首要引數。一般讓它等於你所有的innodb_log_buffer_size的大小就可以,innodb_log_file_size要越大越好。
7. innodb_buffer_pool_instances
InnoDB緩衝池拆分成的區域數量。對於數GB規模緩衝池的系統,透過減少不同執行緒讀寫緩衝頁面的爭用,將緩衝池拆分為不同例項有助於改善併發性。
分庫分表方案
現在加難度加入分庫分表需求。
這種情況建議選擇傳統的方式寫一個遷移程式,讀源資料庫,透過中介軟體寫入目標庫db1,db2,db3裡
如果源資料來源設計的合理完全可以用全量+增量方式實現。如下圖所示
雖然這種方式很靈活,自行控制,但也有缺點,所有業務邏輯,分庫分表方案,驗證都需要手動編寫
下次可以在不同的平臺下使用。
現在業界比較常用的分庫分表的中介軟體有兩種:
proxy形,如:基於阿里開源的Cobar產品而研發的mycat, 需要部署另外伺服器,作為分庫分表的代理,對外服務,包含分庫分表的配置資訊,現在版本是mycat2.0。
client形式,如噹噹出的sharding-jdbc,現在有京東金融進行維護,現在版本sharding-jdbc4.0開發中。是jar包,使用非常方便。我個人趨向於Sharding-JDBC,這種方式,無需額外部署,替換原有jdbc,DBA也無需改變原有的運維方式,減輕了DBA的任務。
總結
1. 一定要選擇合適你的遷移工具,沒有哪一個工具是最好的。
2. 資料的檢驗非常重要,有的時候我們遷過去很開心,校驗時發生錯誤,這個時候必須要重來。
3. 重複地遷移是很正常的,合乎每次遷移可能需要很長時間,總會是有錯誤的,要做好再遷的心態。
4. 遷移過程中的日誌記錄非常重要,一段出現故障,可以再問題點開始繼續進行遷移。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31556440/viewspace-2644799/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql 大表mysqldump遷移方案MySql
- MSSQL Server 遷移至 ORACLE解決方案SQLServerOracle
- Mysql for nagios 遷移方案MySqliOS
- 從Oracle遷移到MySQL的各種坑及自救方案OracleMySql
- MySQL 資料遷移Oracle工作MySqlOracle
- 從雲資料遷移服務看MySQL大表抽取模式MySql模式
- 不同場景下 MySQL 的遷移方案MySql
- MySQL兩千萬資料優化&遷移MySql優化
- mysql遷移oracle週末計劃MySqlOracle
- Oracle資料庫(DataGuard)遷移方案(上)Oracle資料庫
- Oracle資料庫(DataGuard)遷移方案(中)Oracle資料庫
- Oracle資料庫(DataGuard)遷移方案(下)Oracle資料庫
- Oracle資料庫遷移方案比較Oracle資料庫
- 摩杜雲遷移全週期解決方案:助力企業加速遷移
- MySQL與SQLite的區別及遷移MySqlSQLite
- [原]不同場景下MySQL的遷移方案MySql
- MySQL大表優化方案MySql優化
- yugong之多張表oracle到mysql遷移GoOracleMySql
- ORACLE資料庫切換和遷移方案Oracle資料庫
- Oracle10g 資料遷移方案(zt)Oracle
- Codable 的遷移方案
- 儲存遷移方案
- 【遷移】SqlServer 遷移到 MySQL 方法ServerMySql
- sqlldr 完成mysql到oracle的資料遷移MySqlOracle
- yugong之單張表oracle到mysql遷移GoOracleMySql
- Oracle資料庫(資料泵)遷移方案(上)Oracle資料庫
- Oracle資料庫(資料泵)遷移方案(下)Oracle資料庫
- 技術分享 | MySQL 的幾種資料遷移方案MySql
- 資料遷移的預檢測及修復方案
- MySQL 大表優化方案探討MySql優化
- 網易雲 MySQL例項遷移的技術實現MySql
- 阿里雲資料庫遷移方案-不間斷業務阿里資料庫
- DBMotion——MySQL遷移利器MySql
- 一個跨平臺資料遷移的方案優化優化
- Fastdfs資料遷移方案AST
- 資料庫遷移方案資料庫
- 1.0 ORACLE到MYSQL資料遷移方式選型OracleMySql
- oracle高可用性遷移方案簡介_轉摘Oracle