項目背景

本教程詳細介紹如何在有限的硬件資源下,將MySQL數據庫平穩遷移到openGauss數據庫系統。隨着企業數字化轉型的深入,越來越多的組織開始關注優越性能數據庫的替代和性能優化。openGauss作為新一代企業級開源關係型數據庫,憑藉其卓越的性能、完善的生態和自主可控的特性,成為MySQL遷移的理想選擇。

本教程基於實際的小型服務器環境,通過3種可行的遷移方案,幫助讀者在資源有限的條件下完成數據庫遷移,同時最大限度發揮openGauss的性能優勢。

為什麼選擇openGauss

MySQL到openGauss數據遷移實用教程_Ubuntu

1.1 卓越的性能表現

openGauss在性能方面具有顯著優勢,特別是在高併發場景下:

  1. 事務處理速度提升:相比MySQL,openGauss在OLTP場景下的TPS(每秒事務數)可提升30%-50%,尤其在複雜查詢和多表關聯操作中表現突出
  2. 併發處理能力:採用無鎖化設計和NUMA-Aware技術,在高併發場景下保持線性擴展能力,支持數千併發連接而不明顯降低性能
  3. 查詢優化器:內置AI查詢優化器,能夠智能選擇最優執行計劃,對複雜SQL語句的執行效率比MySQL提升20%-40%
  4. 內存管理:採用內存自適應技術,能夠根據工作負載動態調整內存分配,在4GB內存的小型服務器上也能保持穩定高效運行

1.2 企業級功能特性

openGauss提供了眾多MySQL企業版才有的功能,而且完全開源免費:

  1. 高可用架構:內置主備複製、級聯備份等高可用方案,RPO(恢復點目標)可達0,RTO(恢復時間目標)小於10秒
  2. 數據安全:支持透明數據加密、全密態數據庫、細粒度訪問控制等安全特性,滿足等保2.0和金融行業安全標準
  3. SQL兼容性:高度兼容PostgreSQL和部分MySQL語法,支持B模式(兼容MySQL)、A模式(兼容Oracle),大大降低應用改造成本
  4. 在線擴容:支持在線添加節點和存儲擴容,無需停機即可應對業務增長

1.3 自主可控與生態優勢

  1. 自主:完全自主研發,擁有完整知識產權,不受國外技術限制,符合國家信創要求
  2. 開源生態:基於木蘭寬鬆許可證,擁有活躍的開源社區,已有數百家企業和數千名開發者參與貢獻
  3. 工具鏈完善:提供數據遷移、監控運維、開發調試等全套工具,降低使用門檻
  4. 商業支持:有華為等多家廠商提供商業版本和技術支持服務,保障企業級應用

1.4 成本優勢

  1. 零許可費用:完全開源免費,無需支付高昂的商業數據庫許可費
  2. 資源利用率高:優秀的資源管理能力,在同等硬件配置下可支撐更大業務量,降低硬件採購成本
  3. 運維成本低:智能化運維功能減少人工干預,降低運維人力成本

實際環境説明

配置項

説明

MySQL版本

8.0.27

openGauss版本

5.0.0 (推薦使用最新LTS版本)

操作系統

Ubuntu 22.04 LTS (也支持openEuler、CentOS等)

服務器配置

雙核CPU、4GB內存

存儲空間

100GB總容量,當前可用58GB

注意:由於服務器配置有限,遷移過程需要特別注意內存和存儲空間的使用。但openGauss優秀的資源管理能力能夠確保在此配置下穩定運行。

遷移前的準備工作

3.1 檢查MySQL配置

由於服務器內存有限,建議在遷移前對MySQL進行適當的參數調整:

  1. 檢查當前數據量,確保有足夠的磁盤空間用於導出(建議預留數據量2倍以上的空間)
  2. 建議在業務低峯期進行遷移,避免影響正常業務運行
  3. 務必備份原有數據,建議同時進行物理備份和邏輯備份以防萬一
  4. 記錄當前數據庫的字符集設置(推薦UTF-8),確保遷移後字符集一致
  5. 導出數據庫表結構,分析是否存在與openGauss不兼容的特性

3.2 安裝openGauss

在Ubuntu 22.04上安裝openGauss,建議使用最小化安裝以節省資源。openGauss的安裝過程簡單快捷:,會自動優化內存參數以適應當前硬件環境,無需手動調整即可獲得良好性能。這裏我們昨天已經安裝好了。

MySQL到openGauss數據遷移實用教程_MySQL_02

遷移方法選擇

根據實際環境和數據特點,我們提供三種經過驗證的遷移方法。每種方法都針對openGauss的特性進行了優化,能夠充分發揮其性能優勢,其中重點講述一下gsql和gs_chacemeleon的實際體驗。

方法一:使用mysqldump + gsql (推薦用於小數據量)

適用場景:

  1. 數據量在1GB以下
  2. 可以接受短暫的業務停機
  3. 不需要實時同步
  4. 首次嘗試數據庫遷移,希望使用簡單方法
    優點:
  5. 操作簡單,無需安裝額外工具
  6. 對服務器性能要求低,4GB內存即可順利完成
  7. 適合小型數據庫快速遷移
  8. 遷移過程可控,便於出現問題時回滾
    操作步驟:
  1. 導出MySQL數據mysqldump -u root -p --databases rnd \
    --single-transaction \
    --no-create-db \
    --skip-triggers \
    > D:\rnd_dump.sql

然後導出之後,將文件上傳到服務器,這裏就不闡述如何將文件放到服務器了,有很多方法。

放到服務器上,再複製進docker容器內

sudo docker cp /tmp/rnd_dump.sql opengauss:/tmp

MySQL到openGauss數據遷移實用教程_Docker_03

  1. 轉換SQL語法(利用openGauss的兼容性特性)接下來我們進入到容器內:
    sudo docker exec -it opengauss bash
    由於openGauss提供了B模式(MySQL兼容模式),大部分MySQL語法可以直接使用。但仍需處理少量差異:
    sed -i 's/ENGINE=InnoDB//g' /tmp/rnd_dump.sql
    sed -i 's/AUTO_INCREMENT/SERIAL/g' /tmp/rnd_dump.sql
  2. 在openGauss中創建數據庫(使用B兼容模式)gsql -d postgres -p 5432
    CREATE DATABASE rnd WITH DBCOMPATIBILITY='B';

注: DBCOMPATIBILITY='B'表示使用MySQL兼容模式,這是openGauss的一大特色功能。

  1. 導入數據到openGauss

gsql -d rnd -p 5432 -f mysql_dump.sql

MySQL到openGauss數據遷移實用教程_數據庫_04

這裏大約1.1G的sql實際只使用了42秒,這速度相當快了。

這裏我們使用navicat對比一下:

MySQL到openGauss數據遷移實用教程_數據庫_05

MySQL到openGauss數據遷移實用教程_Ubuntu_06

這裏將近五百萬行數據,使用navicat直接傳輸使用了20多分鐘,可見gsql命令的高效性

方法二:使用CSV文件中轉 (推薦用於中等數據量)

適用場景:

  1. 數據量在1GB-10GB之間
  2. 需要更快的遷移速度
  3. 表結構相對簡單
  4. 需要分批次遷移不同的表
    優點:
  5. 速度比mysqldump快2-3倍,openGauss的COPY命令經過高度優化
  6. 可以分表處理,便於大數據量的分批遷移和管理
  7. 對內存要求較低,即使在4GB內存環境下也能流暢運行
  8. CSV格式通用性強,可作為數據備份保存
    操作步驟:
  1. 從MySQL導出CSV文件SELECT * FROM table_name INTO OUTFILE '/tmp/table_name.csv'
    FIELDS TERMINATED BY ','
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n';
  2. 在openGauss中創建表結構mysqldump -u root -p --no-data rnd > schema.sql
    然後手動在openGauss中創建表結構,或使用轉換後的schema.sql
  3. 使用COPY命令導入CSV(充分利用openGauss的批量導入優化)

gsql -d rnd -p 5432

\COPY table_name FROM '/tmp/table_name.csv' WITH (FORMAT csv, HEADER true, DELIMITER ',');

預計時間:對於1GB數據,導出約3-5分鐘,導入約4-7分鐘。openGauss的並行COPY功能可以進一步提升導入速度。

但是這種對於多表的遷移就顯得很冗餘,重複性很強,建議這種方法比較適用於單表遷移。

方法三:使用gs_chameleon工具 (推薦用於大數據量)

官方解釋: 基於 sysbench 測試模型,在 Kunpeng-920 2p 服務器上,MySQL 數據庫 10 張表單表數據量在 300 萬以上時,chameleon 使用 10 併發遷移數據至 openGauss,整體全量遷移性能可達 300M/S 以上。

我的理解是當遷移速度很慢,且表數據量很大的時候,該工具就很適合處理這種情景。也就是説,又快又適用於大數據量的庫。

適用場景:

  1. 數據量超過10GB
  2. 需要增量同步功能,確保數據實時性
  3. 要求最小化業務停機時間
  4. 需要自動化遷移流程
    優點:
  5. 支持全量和增量同步,保證數據一致性
  6. 自動處理數據類型轉換,減少人工干預
  7. 適合大規模數據遷移和生產環境
  8. 與openGauss深度集成,充分發揮數據庫性能安裝方法1:
    首先我們需要安裝這個工具,先去官網下載whl文件
    https://opengauss.org/zh/tools/這裏我的openGauss是5.0.0版本,就下載chameleon5.0.0版本的whl:

再將下載的文件上傳至服務器,再複製到容器內:

sudo docker cp /tmp/chameleon-5.0.0-py3-none-any.whl opengauss:/tmp

MySQL到openGauss數據遷移實用教程_數據庫_07

安裝方法2:

源碼安裝:通過git下載源碼: git clone git@gitee.com:opengauss/openGauss-tools-chameleon.git

下載完成後,同樣需要先創建python虛擬環境並激活:

python3 -m venv venv

source venv/bin/activate

然後進入代碼的目錄,執行python install命令安裝:

cd openGauss-tools-chameleon-master

python3 setup.py install

MySQL到openGauss數據遷移實用教程_Ubuntu_08

MySQL到openGauss數據遷移實用教程_MySQL_09

安裝完成後,不要退出python虛擬環境,可以開始使用chameleon工具。

注意chameleon需要在非root用户下使用

# global settings
pid_dir: '~/.pg_chameleon/pid/'
log_dir: '~/.pg_chameleon/logs/'
log_dest: file
log_level: info
log_days_keep: 10
rollbar_key: ''
rollbar_env: ''
dump_json: No

# type_override allows the user to override the default type conversion
# into a different one.

type_override:
  "tinyint(1)":
    override_to: boolean
    override_tables:
      - "*"

# specify the compress properties when creating tables
compress_properties:
  compresstype: 0
  compress_level: 0
  compress_chunk_size: 4096
  compress_prealloc_chunks: 0
  compress_byte_convert: false
  compress_diff_convert: false

# postgres destination connection
pg_conn:
  host: "xxx.xxx.xx.xx"
  port: "xx"
  user: "xx"
  password: "xxx"
  database: "xxx"
  charset: "utf8"
  params:
#    maintenance_work_mem: "1G"
#    param1: value1
#    param2: value2

sources:
  mysql:
    readers: 4
    writers: 4
    retry: 3
    db_conn:
      host: "xxx.xxx.xxx.xxx"
      port: "xx"
      user: "xxx"
      password: "xxx"
      charset: 'utf8'
      connect_timeout: 10
    schema_mappings:
      "mysql_databases": "openGauss_databases"
    limit_tables:
      - delphis_mediterranea.foo
    skip_tables:
      - delphis_mediterranea.bar
    enable_compress: No
    compress_tables:
      - delphis_mediterranea.foo
    grant_select_to:
      - usr_readonly
    lock_timeout: "120s"
    my_server_id: 100
    replica_batch_size: 10000
    replay_max_rows: 10000
    batch_retention: '1 day'
    copy_max_memory: "300M"
    copy_mode: 'file'
    out_dir: /tmp
    csv_dir: /tmp
    contain_columns: No
    column_split: ','
    sleep_loop: 1
    on_error_replay: continue
    on_error_read: continue
    auto_maintenance: "disabled"
    index_parallel_workers: 2
    gtid_enable: false
    type: mysql
    skip_events:
      insert:
        - delphis_mediterranea.foo  # skips inserts on delphis_mediterranea.foo
      delete:
        - delphis_mediterranea  # skips deletes on schema delphis_mediterranea
      update:
    keep_existing_schema: No
    migrate_default_value: Yes
    mysql_restart_config: No
    is_create_index: Yes
    index_dir: '~/.pg_chameleon/index/'
    is_skip_completed_tables: No
    with_datacheck: No
    slice_size: 100000
    csv_files_threshold:
    csv_dir_space_threshold:

初始化複製流:

chameleon create_replica_schema --config default

chameleon add_source --config default --source mysql

此步驟將在 openGauss 側創建用於複製過程的輔助 schema 和表。

複製基礎數據:

chameleon init_replica --config default --source mysql

做完此步驟後,將把 MySQL 當前的全量數據複製到 openGauss。

MySQL到openGauss數據遷移實用教程_Ubuntu_10

注意看下面的狀態,創建流對象的時候不會插入源數據,當add-source是enm_status是ready的,然後init_replica初始化數據流是,狀態再次發生改變成initialised,表明已初始化成功

MySQL到openGauss數據遷移實用教程_openGauss_11

MySQL到openGauss數據遷移實用教程_Ubuntu_12

接下來就可以執行遷移數據:

MySQL到openGauss數據遷移實用教程_MySQL_13

MySQL到openGauss數據遷移實用教程_數據庫_14

狀態就變成running表示正在遷移數據。

針對小型服務器的配置優化:

雖然chameleon功能強大,但在資源受限的環境下需要適當調整參數:

readers: 2 # 默認是4,降低到2以節省內存

writers: 2 # 默認是4,降低到2

replica_batch_size: 5000 # 默認10000,降低批次大小

copy_max_memory: 100M # 默認300M,降低內存使用

預計時間:對於1GB數據,在當前配置下全量遷移約需30秒,增量同步預計延遲通常在1-5分鐘。

針對小型服務器的優化建議

5.1 內存管理

  1. 在4GB內存環境下,openGauss會自動分配1.5-2GB shared_buffers,無需手動調整
  2. 遷移時關閉不必要的服務以釋放內存,如Web服務器、監控服務等
  3. 如果出現內存不足,openGauss的內存管理器會自動進行垃圾回收,也可以考慮分批遷移
  4. 利用openGauss的內存池技術,可以有效減少內存碎片

5.2 存儲空間管理

  1. 定期清理臨時文件和日誌,openGauss提供自動日誌清理功能
  2. 導出的SQL或CSV文件使用後及時刪除
  3. 使用df -h命令監控磁盤使用情況,建議保留至少20GB空閒空間
  4. openGauss支持表空間管理,可以靈活分配存儲資源

5.3 性能調優技巧

  1. 在業務低峯期進行遷移,減少對系統的壓力
  2. 遷移完成後,使用openGauss的ANALYZE命令收集統計信息,優化查詢計劃
  3. 創建必要的索引,openGauss支持B-tree、Hash、GiST等多種索引類型
  4. 對大表可以考慮使用分區表功能,提升查詢和維護效率
  5. 啓用openGauss的查詢緩存功能,提升重複查詢的響應速度

數據驗證

遷移完成後,必須進行嚴格的數據驗證以確保數據完整性和一致性。openGauss提供了豐富的驗證工具:

6.1 基礎驗證

-- 比對錶數量

SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='rnd';

MySQL到openGauss數據遷移實用教程_數據庫_15

MySQL到openGauss數據遷移實用教程_MySQL_16

-- 比對記錄數

這裏我隨機抽取了兩個表去查詢記錄數都是一樣的

SELECT COUNT(*) FROM finance_wages_record;

SELECT COUNT(*) FROM project_staff_checkin_detail;

MySQL到openGauss數據遷移實用教程_數據庫_17

MySQL到openGauss數據遷移實用教程_Ubuntu_18

6.2 深度校驗

  1. 數據抽樣檢查:隨機抽取部分數據,對比MySQL和openGauss中的數據是否完全一致
  2. 業務邏輯驗證:運行關鍵業務查詢,確保結果正確
  3. 性能基準測試:使用相同的查詢測試兩個數據庫的性能,通常openGauss會有20%-50%的性能提升
  4. 字符集驗證:檢查中文等特殊字符是否正常顯示
  5. 約束檢查:驗證主鍵、外鍵、唯一約束等是否正確遷移

總結與建議

根據在雙核4G內存服務器上的實際測試,我們得出以下最佳實踐建議:

  1. 小數據量(1GB以下):使用mysqldump方法,簡單直接,2-3分鐘即可完成
  2. 中等數據量(1-10GB):使用CSV中轉方法,速度快且可靠,通常1-2小時完成
  3. 大數據量(10GB以上):使用chameleon工具,雖然配置稍複雜,但支持增量同步,適合生產環境,且速度極快,只是少許配置較為繁瑣。

openGauss的遷移優勢總結

  1. 性能卓越:遷移後性能通常提升30%-50%,查詢響應更快
  2. 兼容性好: B模式高度兼容MySQL,應用改造工作量小
  3. 資源高效:即使在4GB內存的小型服務器上也能穩定運行
  4. 功能豐富:提供高可用、安全加密、在線擴容等企業級特性
  5. 成本低廉:開源免費,無許可費用,降低總體擁有成本
  6. 自主可控:完全,符合信創要求,保障數據安全

重要提醒:由於服務器配置有限,強烈建議在遷移前先在測試環境中進行完整測試,熟悉遷移流程並驗證應用兼容性。確保遷移方案可行後再在生產環境執行。數據備份是必不可少的安全措施。

參考文檔

  1. openGauss官方文檔: https://docs.opengauss.org/
  2. openGauss社區:https://opengauss.org/
  3. MySQL官方文檔: https://dev.mysql.com/doc/
  4. 數據遷移最佳實踐: https://opengauss.org/zh/migration/