MySQL資料庫使用pg_chameleon遷移至openGauss

ppddt發表於2022-11-22

pg_chameleon介紹

pg_chameleon 是一個用Python  3編寫的 實時複製工具,經過內部適配,目前支援MySQL遷移到openGauss。工具使用mysql -replication 庫從MySQL 中提取row  images ,這些row  images 將以jsonb 格式被儲存到openGauss 中。在openGauss 中會執行一個pl /pgsql 函式,解碼jsonb 並將更改重演到 openGauss 。同時,工具透過一次初始化配置,使用只讀模式,將MySQL 的全量資料拉取到openGauss,使得該工具提供了初始全量資料的複製以及後續增量資料的實時線上複製功能。pg_chameleon的特色包括:
  • 透過讀取MySQL的binlog,提供實時線上複製的功能。

  • 支援從多個MySQL schema讀取資料,並將其恢復到目標openGauss資料庫中。源schema和目標schema可以使用不同的名稱。

  • 透過守護程式實現實時複製,包含兩個子程式,一個負責讀取MySQL側的日誌,一個負責在openGauss側重演變更。

使用pg_chameleon將MySQL資料庫遷移至openGauss,透過pg_chameleon的實時複製能力,可以大大降低系統切換資料庫時的停服時間。

pg_chameleon在openGauss上的使用注意事項

  1. pg_chameleon依賴psycopg2,psycopg2內部透過pg_config檢查PostgreSQL版本號,限制低版本PostgreSQL使用該驅動。而openGauss的pg_config返回的是openGauss的版本號(當前是 openGauss 2.0.0),會導致該驅動報版本錯誤,“Psycopg requires PostgreSQL client library (libpq) >= 9.1”。解決方案為透過原始碼編譯使用psycopg2,並去掉原始碼標頭檔案 psycopg/psycopg.h 中的相關限制。

  2. pg_chameleon透過設定LOCK_TIMEOUT GUC引數限制在PostgreSQL中的等鎖的超時時間。openGauss不支援該引數(openGauss支援類似的GUC引數lockwait_timeout,但是需要管理員許可權設定)。需要將pg_chameleon原始碼中的相關設定去掉。

  3. pg_chameleon用到了upsert語法,用來指定發生違反約束時的替換動作。openGauss支援的upsert功能語法與PostgreSQL的語法不同。openGauss的語法是 ON DUPLICATE KEY UPDATE { column_name = { expression | DEFAULT } } [, ...]。PostgreSQL的語法是 ON CONFLICT [ conflict_target ] DO UPDATE SET { column_name = { expression | DEFAULT } }。兩者在功能和語法上略有差異。需要修改pg_chameleon原始碼中相關的upsert語句。

  4. pg_chameleon用到了CREATE SCHEMA IF NOT EXISTS、CREATE INDEX IF NOT EXISTS語法。openGauss不支援SCHEMA和INDEX的IF NOT EXISTS選項。需要修改成先判斷SCHEMA和INDEX是否存在,然後再建立的邏輯。

  5. openGauss對於陣列的範圍選擇,使用的是 column_name[start, end] 的方式。而PostgreSQL使用的是 column_name[start : end] 的方式。需要修改pg_chameleon原始碼中關於陣列的範圍選擇方式。

  6. pg_chameleon使用了繼承表(INHERITS)功能,而當前openGauss不支援繼承表。需要改寫使用到繼承表的SQL語句和表。

接下來我們將演示如何使用pg_chameleon遷移MySQL資料庫至openGauss。

配置pg_chameleon

pg_chameleon透過 ~/.pg_chameleon/configuration下的配置檔案config-example.yaml定義遷移過程中的各項配置。整個配置檔案大約分成四個部分,分別是全域性設定、型別過載、目標資料庫連線設定、源資料庫設定。全域性設定主要定義log檔案路徑、log等級等。型別過載讓使用者可以自定義型別轉換規則,允許使用者覆蓋已有的預設轉換規則。目標資料庫連線設定用於配置連線至openGauss的連線引數。源資料庫設定定義連線至MySQL的連線引數以及其他複製過程中的可配置專案。

詳細的配置項解讀,可檢視官網的說明:

https://pgchameleon.org/documents_v2/configuration_file.html

下面是一份配置檔案示例:

    
    # 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: ''

    # type_override allows the user to override the default type conversion
    # into a different one.
    type_override:
    "tinyint(1)":
        override_to: boolean
        override_tables:
        -  "*"
               
    # postgres  destination connection
    pg_conn:
      host: "1.1.1.1"
      port: "5432"
      user: "opengauss_test"
      password: "password_123"
      database: "opengauss_database"
      charset: "utf8"
     
    sources:
     mysql:
      db_conn:
       host: "1.1.1.1"
       port: "3306"
       user: "mysql_test"
       password: "password123"
       charset: 'utf8'
       connect_timeout: 10
      schema_mappings:
        mysql_database:sch_mysql_database
       limit_tables:
       skip_tables:
       grant_select_to:
        - usr_migration
       lock_timeout:  "120s"
       my_server_id: 1
       replica_batch_size: 10000
       replay_max_rows: 10000
       batch_retention: '1 day'
       copy_max_memory: "300M"
       copy_mode: 'file'
       out_dir: tmp
       sleep_loop: 1
       on_error_replay: continue
       on_error_read: continue
       auto_maintenance: "disabled"
       gtid_enable: false
       type: mysql
       keep_existing_schema: No

    以上配置檔案的含義是,遷移資料時,MySQL側使用的使用者名稱密碼分別是 mysql_test 和 password123。MySQL伺服器的IP和port分別是1.1.1.1和3306,待遷移的資料庫是mysql_database。

    openGauss側使用的使用者名稱密碼分別是 opengauss_test 和 password_123。openGauss伺服器的IP和port分別是1.1.1.1和5432,目標資料庫是opengauss_database,同時會在opengauss_database下建立sch_mysql_database schema,遷移的表都將位於該schema下。

    需要注意的是,這裡使用的使用者需要有遠端連線MySQL和openGauss的許可權,以及對對應資料庫的讀寫許可權。同時對於openGauss,執行pg_chameleon所在的機器需要在openGauss的遠端訪問白名單中。對於MySQL,使用者還需要有RELOAD、REPLICATION CLIENT、REPLICATION SLAVE的許可權。

    下面開始介紹整個遷移的步驟。

    建立使用者及database

    在openGauss側建立遷移時需要用到的使用者以及database。

    MySQL資料庫使用pg_chameleon遷移至openGauss

    在MySQL側建立遷移時需要用到的使用者並賦予相關許可權。

    MySQL資料庫使用pg_chameleon遷移至openGauss

    開啟MySQL的複製功能

    修改MySQL的配置檔案,一般是/etc/my.cnf或者是 etc/my.cnf.d/ 資料夾下的cnf配置檔案。在[mysqld] 配置塊下修改如下配置(若沒有mysqld配置塊,新增即可):

      
      [mysqld]
      
      binlog_format= ROW
      log_bin = mysql-bin
      server_id = 1
      binlog_row_image=FULL
      expire_logs_days = 10

      修改完畢後需要重啟MySQL使配置生效。

      執行pg_chameleon進行資料遷移

      1. 建立python虛擬環境並啟用

        
        
        python3 
        -m venv venv
        
        source venv/bin/activate

        2. 下載安裝psycopg2和pg_chameleon

          
          更新pip:pip 
          install pip 
          --upgrade
          

          將openGauss的 pg_config 工具所在資料夾加入到 $PATH 環境變數中。例如:

            
            
            export PATH={openGauss-server}/dest/bin:
            $PATH
            

            下載psycopg2原始碼( ),去掉檢查PostgreSQL版本的限制,使用 python setup.py install編譯安裝。

            下載pg_chameleon原始碼( ),修改前面提到的在openGauss上的問題,使用 python setup.py install編譯安裝。

            3. 建立pg_chameleon配置檔案目錄

              
              
              chameleon set_configuration_files
              

              4. 修改pg_chameleon配置檔案

                
                cd ~
                /.pg_chameleon/configuration
                
                cp config-example.yml default.yml

                根據實際情況修改 default.yml 檔案中的內容。重點修改pg_conn和mysql中的連線配置資訊,使用者資訊,資料庫資訊,schema對映關係。前面已給出一份配置檔案示例供參考。

                5. 初始化複製流

                  
                  chameleon create_replica_schema --config 
                  default
                  
                  chameleon add_source --config default --source mysql

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

                  6. 複製基礎資料

                    
                    chameleon init_replica --config 
                    default --source mysql
                    

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

                    可以在openGauss側檢視全量資料複製後的情況。

                    MySQL資料庫使用pg_chameleon遷移至openGauss

                    7. 開啟線上實時複製

                      
                      chameleon start_replica --config 
                      default --source mysql
                      

                      開啟實時複製後,在MySQL側插入一條資料:

                      MySQL資料庫使用pg_chameleon遷移至openGauss

                      在openGauss側檢視 test_decimal 表的資料:

                      MySQL資料庫使用pg_chameleon遷移至openGauss

                      可以看到新插入的資料在openGauss側成功被複制過來了。

                      8. 停止線上複製

                        
                        chameleon stop_replica --config 
                        default --source mysql
                        
                        chameleon detach_replica --config default --source mysql
                        chameleon drop_replica_schema --config default

                        更多內容請參考:

                        來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69999989/viewspace-2924558/,如需轉載,請註明出處,否則將追究法律責任。

                        相關文章