GaussDB遷移實戰:我的DataSync工具使用心得

莫熙鍾,新炬網絡數據庫運維專家。精通Oracle、MySQL、PostgreSQL等數據庫運維技術,擁有Oracle OCP、MySQL OCP、GaussDB HCIP等認證,擁有豐富的數據庫系統架構轉型、分佈式改造、數據遷移經驗,擅長開源數據庫轉型技術支持,參與多個行業核心系統的Oracle到MySQL轉型項目。2019年開始學習和研究華為GaussDB數據庫運維技術,目前正在積極參與國產數據庫轉型改造項目和國產數據庫通用型自動化運維工具的研發等工作。


背景


在上篇文章中, ,文中提及過在SDR之前還曾使用DataSync工具進行遷移測試;雖然最終採用SDR作為正式遷移方案,但DataSync本身也有其可取之處,本文將對之前的測試過程做一個簡單的回顧。


1、環境信息


1)硬件配置信息


GaussDB遷移實戰:我的DataSync工具使用心得


GaussDB遷移實戰:我的DataSync工具使用心得


2)軟件配置信息


GaussDB側操作系統及數據庫軟件版本如下所示:


GaussDB遷移實戰:我的DataSync工具使用心得


ORACLE側操作系統及數據庫軟件版本如下所示:


GaussDB遷移實戰:我的DataSync工具使用心得


由於本次文章的重點不在於環境的搭建,所以操作系統及GaussDB的安裝過程就不細述。


Datasync是什麼


DataSync是華為提供的GaussDB 100數據遷移工具,支持從Sybase、 Oracle、 MySQL、 GaussDB 100V100R003C10和SQL Server遷移數據至GaussDB 100 V300R001數據庫。支持在線遷移和離線遷移兩種數據遷移方式。配置好源庫以及目標庫相關配置信息後,啟動遷移工具即可,運行過程中會生成相關的日誌文件和報告,便於用戶進行日常的管理及維護。


1、Datasync工具使用注意事項


Datasync工具約束和限制如下:


  • 使用時必須確保遷移數據庫的服務器和被遷移數據庫的服務器可以正常連接。
  • 使用時用戶應提前創建好目標庫表結構,確保源表與目標表的字段順序和表結構一致、字段類型兼容。(並非必要條件)
  • 使用時需保證通過配置的IP、端口、用戶名、密碼能夠正確連接數據庫。
  • 使用時用戶需要評估目標數據庫佔用空間和割接過程中使用的空間是否滿足需求。
  • 使用時確保已在運行遷移工具的設備安裝JAVA,版本須為1.8及以上。
  • 使用時確保當前運行遷移工具設備的IP已配置在源數據庫和目標數據庫的白名單中,避免數據遷移工具連接數據庫失敗。
  • 用戶需要將需要導出的源數據庫JDBC驅動放置在dependency-jars中且驅動包名需要跟規定的一致,否則會導致連接數據庫失敗。
  • GaussDB 100 V300R001數據庫密碼不支持" "(空格)和";"(分號),否則工具無法使用zsql命令連接數據庫。l 確保配置用戶有權限執行相關操作,否則會導致運行工具達不到預期結果。
  • data_path配置項中所有路徑均需遵循遷移工具路徑白名單規則:路徑只允許包含大小寫字母、數字、 '\\', '/', ':', '-', '_',不能以'-'開頭,不能同時包含 / 和 \\。


2、Datasync工具準備


1)掛載NFS目錄(可選項,Datasync支持部署在源端,目標端,第三方機器等,這次測試中掛載NFS只是為了儘量排除網絡傳遞數據文件可能帶來的效率影響)


在源庫服務器及目標端服務器同時掛載遷移用的NFS文件系統。


源庫操作:


<code>su - root

mkdir /datasync

mount -F nfs -o rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,proto=tcp,suid 192.168.xxx.xx:/vx/tycj_dcmp_tmp /datasync/<code>


在目標端操作:


<code>su - root

mkdir /datasync

mount -t nfs -o rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,proto=tcp,suid 188.0.xxx.xx:/vx/tycj_dcmp_tmp /datasync
/<code>


2)上傳和解壓介質


① 上傳介質到NFS目錄


使用FTP工具上傳GAUSSDB100-V300R001C00-DATASYNC.tar.gz 至/datasync目錄。


② 解壓介質


在源庫服務器操作:


<code>su - root

cd /datasync

tar -xvf GAUSSDB100-V300R001C00-DATASYNC.tar.gz/<code>


進入 GAUSSDB100-V300R001C00-DATASYNC.目錄繼續解壓

tar -xvftar -zxvf DataSync.tar.gz。


3、檢查java版本不低於1.8(源端目標端都要更新)


由於Datasync的腳本都需要依賴java驅動,要求服務器的java版本不低於1.8。


<code>#java -version

Java version “1.8.0_231

Java(TM) SE Runtime Environment (build 1.8.0_231-b11)

Java HotSpot 64-Bit Server VM (build 25.231-b11, mixed mode)/<code>


4、把JDBC驅動包遷移到指定目錄


由於datasync本身沒有Oracle的JDBC的驅動包,需要提前把源庫的JDBC驅動包拷貝到dependency-jars目錄中(缺失這個驅動包,會在檢查配置時提示無法連接Oracle庫)。


在源庫服務器執行:


<code>su - oracle

cd $ORACLE_HOME/jdbc/

cp ojdbc6.jar/datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/dependency-jars/ojdbc8-12.2.0.1.jar/<code>


注意:ojdbc8-12.2.0.1.jar這個命名是固定的,必須要改成同名文件才能識別。


3、Datasync配置


1)Datasync有4個配置文件


如下所示:


  • cfg.ini:配置服務器和數據庫配置信息,必須配置該文件。
  • exp_obj.ini:配置需要導出或導入的庫、用戶或表,可以不配置該文件。
  • exclusive_obj.ini:配置遷移時需要排除的庫、用戶或表,可以不配置該文件。
  • ignore_ddl.ini:配置遷移時不要校驗DDL表結構的庫、用戶或表,可以不配置該文件


2)配置密碼密文


出於安全方面的考慮,遷移過程中需要用到的密碼都必須使用密文方式記錄在配置文件中,使用明文密碼會被當做錯誤密碼無法識別。因此在修改配置文件cfg.ini前,需要先將目標庫服務器賬號、源庫數據庫賬號、目標庫數據賬號等賬號密碼生成對應密文。


生成密碼密文方法如下:


① 生成導出數據庫密碼


<code>java -jar DSS.jar -pwd 1/<code>


GaussDB遷移實戰:我的DataSync工具使用心得


② 生成導入數據庫密碼


<code>java -jar DSS.jar -pwd 2/<code>


GaussDB遷移實戰:我的DataSync工具使用心得


③ 生成導入服務器密碼


<code>java -jar DSS.jar -pwd 3/<code>


GaussDB遷移實戰:我的DataSync工具使用心得


-pwd後面跟的數字表示cfg.ini文件中要生成密文的密碼類型。取值範圍是:整數,[1, 9]。


具體含義如下:


  • 1:導出數據庫密碼;
  • 2:導入數據庫密碼;
  • 3:導入服務器密碼;
  • 4:導出操作所使用數據文件所在的遠程服務器密碼;
  • 5:導入操作所使用數據文件所在的遠程服務器密碼;
  • 6:導出數據庫生成truststore文件設置的密碼;
  • 7:導出數據庫生成keystore文件設置的密碼;
  • 8:導入數據庫生成truststore文件設置的密碼;
  • 9:導入數據庫生成keystore文件設置的密碼。


PS:密碼如果更新,或者重新生成新密文後,都需要更新配置文件裡面的密文;另外往Gaussdb導入的時候不能使用root用戶導入,必須使用其他賬號。


3)新建存儲導出文件目錄(如果沒有用NFS需要在源端和目標端分別創建)


<code>mkdir -p /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/data/<code>


4)修改配置文件cfg.ini(部分配置參數內容)


<code>cd /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/config

vi cfg.ini

{

        "flow_type":1,導出程序

        "export_db":{

                "database_type":2,   ##數據庫類型Oracle

                "db":{

                        "ip":"192.168.xxx.xxx",

                        "username":"username",

                        "password":"B/AaX+yBemxxxxxxxx", ##剛剛生成的密文密碼

                        "port":1522,


                        "db_name":"db_name",

                        "server_name":" server_name 1",

                        "trust_store":"",

                        "trust_store_password":"",

                        "key_store":"",

                        "key_store_password":""

                }

        },

        "import_db":{

                "database_type":6,   ##數據庫類型為GaussDB

                "db":{

                        "ip":"192.168.xxx.xxx",

                        "username":"username",

                        "password":"Cbs48z0vL+AUyY1xxxxxxxxx",

                        "port":40000,

                         ……

                        ……

                },

                "server":{

                        "ip":"192.168.xxx.xxx",

                        "username":"username",

                        "password":"N2B+M6xIRQxxxxxxxxxxx",

                        "pub_key_file":"",

                        "port":22

                }


        },

        "data_path":{

                "export_local_path":"/datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/data",

                "export_remote_path":{

                        "ip":"",

                        "username":"",

                        "password":"",

                        "pub_key_file":"",

                        "port":22,

                        "path":""

                },

                "import_local_path":"/datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/data",

                ……

               ……

                }

        },

        "option":{

……

               ……

                "ignore_lost_table":3,     ##自動創建缺失的表

                "disable_trigger":true,     ##導入時禁用觸發器

                "import_total_task":40,    ##資源允許下開啟更大並行可提高導入效率

"export_total_task":25,    ##資源允許下開啟更大並行可提高導出效率


……

…….

        }

}/<code>


部分參數配置可參考下表:


GaussDB遷移實戰:我的DataSync工具使用心得


Datasync執行(離線導入+導出)


1、在源端執行


1)進入到datasync安裝目錄


<code>cd /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/<code>


2)啟動導出進程


<code>java -jar DSS.jar -l /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/  -p /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/config/cfg.ini/<code>


3)查看導出結果


GaussDB遷移實戰:我的DataSync工具使用心得


2、在目標端執行


1)編輯cfg.ini文件,把"flow_type"改為2 表示執行導入操作


<code>vi cfg.ini

“flow_type”:2/<code>


2)手動導入源庫所有表的DDL(可選)


在cfg.ini中有ignore_lost_table參數控制,可在目標庫不存在導入表時,選擇忽略該表並繼續導入/報錯並自動退出/自動創建不存在表。但在實際使用過程中,選擇自動創建表時受到的影響因素太多,容易出現較多的創建失敗對象,影響整體數據的導入成功率,所以建議手動導入DDL。


導入DDL的方式可通過在源庫用dbms_metadata.get_ddl包導出所有DDL,並手動刪除DDL中GaussDB不支持的參數(例如storage和maxtrans等)和修改需要轉換的數據類型(例如:數據類型long需要改成clob等),在datasync的安裝目錄下有一個TypeMappers目錄,裡面有OracleToGauss.json文件,包含大部分Oracle遷移到GaussDB需要轉換的數據類型,可作為參考。


OracleToGauss.json部分內容截圖:


GaussDB遷移實戰:我的DataSync工具使用心得


3)在目標庫提前創建用戶和表空間


用戶、用戶權限和用戶的默認表空間需要提前手動創建,具體創建語法跟Oracle基本一致。這裡就不一一細述。


4)啟動導入進程(在目標庫執行)


<code>java -jar DSS.jar -l /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/  -p /datasync/GAUSSDB100-V300R001C00-DATASYNC/DataSync/config/cfg.ini /<code>


命令和選項都跟導出命令是一樣的,區別就在於提前修改cfg.ini文件中的flow_type參數,從1改到2。


5)查看導入結果


導入進程跑完之後可以在安裝目錄的reports_日期目錄下面的LoadReport.csv文件查看詳細到的導入情況,下面是部分截圖:


GaussDB遷移實戰:我的DataSync工具使用心得


遷移結果的校驗


雖然Datasync工具本身會有較多的校驗過程和日誌記錄(包括失敗的行數和對象等),但是為了確保遷移結果的準確性,在遷入成功之後還是建議人工進行一次數據對象的對比校驗(正式的遷移還需要進行更嚴格的數據對比,這裡不一一鋪開)。


1、在源庫執查看對象情況:


GaussDB遷移實戰:我的DataSync工具使用心得


2、在目標庫庫執查看對象情況:


GaussDB遷移實戰:我的DataSync工具使用心得


通過對比可以看到索引、視圖等對象都有部分缺失,GaussDB暫時不支持DBLINK和存在索引字段總字節數不能超過3900等限制,這些需要協調業務層進行調整。


而在源庫導出時部分表有中文亂碼、業務表之間太多外鍵約束等問題,容易導致部分視圖和索引會創建失敗。這種情況可以根據報錯信息,逐項修改。


小結


上述例子只是datasync最簡單的使用測試過程,實際上還可以通過配置exp_obj.ini、exclusive_obj.ini和ignore_ddl.ini等配置文件進行更細化的遷移配置。


在整個遷移過程中,Datasync遷移數據的過程可以簡單總結為:把源庫數據的DDL和數據按根據定義的格式分別導出,並完成數據的校驗和轉換,通過load文件的形式導入到GaussDB中,跟ORACLE數據泵的導數遷移過程相似。而在實際操作當中,仍然會有諸如中文亂碼/大字段表導出和校驗慢/外鍵約束限制等等問題,需要根據實際報錯信息進行逐一修改和調整。


在遷移測試的時候也發現,導出數據過程需要進行較長時間DDL和數據檢驗,即使開啟並行導出也無法明顯降低導出時間。另外,本次使用的Datasync版本暫時不支持增量備份,所以如要用Datasync進行數據遷移,可能需要準備較長的工程時間。


相關文章:



從過去40年至今,數據庫的形態基本經歷了傳統商業數據庫、開源數據庫到雲原生數據庫的演進過程。雲時代下數據庫將如何革新與創變?金融行業核心數據庫遷移與建設如何安全平穩展開?來Gdevops全球敏捷運維峰會北京站尋找答案:


  • 《All in Cloud 時代,下一代雲原生數據庫技術與趨勢》阿里巴巴集團副總裁/達摩院首席數據庫科學家 李飛飛(飛刀)
  • 《AI和雲原生時代的數據庫進化之路》騰訊數據庫產品中心總經理 林曉斌(丁奇)
  • 《ICBC的MySQL探索之路》工商銀行軟件開發中心 魏亞東
  • 《金融行業MySQL高可用實踐》愛可生技術總監 明溪源
  • 《OceanBase分佈式數據庫在西安銀行的落地和實踐》螞蟻金服P9資深專家/OceanBase核心負責人 蔣志勇

讓我們9月11日北京共同眺望數據庫發展變革更長遠的未來!


GaussDB遷移實戰:我的DataSync工具使用心得


分享到:


相關文章: