【資料庫遷移系列】使用pg_chameleon將資料從MySQL遷移至openGauss資料庫

語言: CN / TW / HK

概述 資料庫遷移是實際工作中經常遇到的問題,比如由於磁碟空間、業務效能、專案改造等等原因,有從甲伺服器遷移到乙伺服器,從A種資料庫遷移到B種資料庫,從源路徑遷移到另一個目標路徑、同一個機器下從一個使用者遷移到另一個使用者等各種場景,有時需要整個資料庫所有檔案都遷移,有時只需要遷移部分資料檔案如REDO、表空間檔案等。 chameleon是一個基於Python的MySQL到openGauss的實時複製工具。該工具提供了初始全量資料的複製及增量資料的實時複製能力,支援MySQL中各種資料型別的遷移。本文就介紹如何使用pg_chameleon將MySQL資料庫遷移至openGauss。

文章目錄 概述 一、工具介紹 二、工具安裝 1.whl直接安裝: 2. 原始碼安裝 三. chameleon配置檔案說明 四、執行遷移 1.初始化遷移過程 2.複製基礎資料 3.開啟實時同步複製 4.結束複製過程及清理資源 Q&A: 一、工具介紹 chameleon工具使用mysql-replication庫從MySQL中提取row images,這些row images將以jsonb格式被儲存到openGauss中。在openGauss中會執行一個pl/pgsql函式,解碼jsonb並將更改重演到openGauss。同時,工具通過一次初始化配置,使用只讀模式,將MySQL的全量資料拉取到openGauss,使得該工具提供了初始全量資料的複製以及後續增量資料的實時線上複製功能,可大大降低系統切換資料庫時的停服時間。

二、工具安裝 注意這裡需要使用非root使用者繼續後續的操作,應該是為了控制執行許可權。因為我將工具和openGauss安裝在同一個機器,所以我這裡直接使用的是omm使用者。這裡需要連線到外網進行一些工具依賴庫的下載。

1.whl直接安裝: 獲取安裝包 https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/chameleon/chameleon-3.0.0-py3-none-any.whl 建立python虛擬環境並激活。

python3 -m venv venv source venv/bin/activate 然後通過pip安裝即可。

pip3 install ./chameleon-3.0.0-py3-none-any.whl 提示“Successfully installed ****”就可以。

  1. 原始碼安裝 通過git下載原始碼:

git clone [email protected]:opengauss/openGauss-tools-chameleon.git

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

python3 -m venv venv source venv/bin/activate

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

cd openGauss-tools-chameleon python3 setup.py install

安裝完成後,不要退出python虛擬環境,可以開始使用chameleon工具。若退出了,後續繼續執行進入Python環境的兩行即可。

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

完整的配置檔案如下所示:

# 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: "127.0.0.1" port: "15400" user: "opengauss_test" password: "Gauss_234" database: "opengauss_db" charset: "utf8" sources: mysql: readers: 4 writers: 4 db_conn: host: "1.1.1.1" port: "3306" user: "mysql_t1" password: "Mysql_234" charset: 'utf8' connect_timeout: 10 schema_mappings: mysql_database: mysql_db1_sch limit_tables: skip_tables: 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 sleep_loop: 1 on_error_replay: continue on_error_read: continue auto_maintenance: "disabled" 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

配置檔案使用yaml檔案規則配置,需要特別注意對齊,縮排表示層級關係,縮排時不允許使用Tab鍵,只允許使用空格,縮排的空格數目不重要,但相同層級的元素左側需要對齊。 以上配置檔案的含義是,遷移資料時,MySQL側使用的使用者名稱密碼分別是 mysql_t1 和 Mysql_234。MySQL伺服器的IP和port分別是1.1.1.1和3306,待遷移的資料庫是mysql_database。 openGauss側使用的使用者名稱密碼分別是 opengauss_test和 Gauss_234。openGauss伺服器的IP和port分別是127.0.0.1(因為我是在openGauss伺服器上部署的遷移工具)和5432,目標資料庫是opengauss_db,同時會在opengauss_database下建立mysql_db1_sch,遷移的表都將位於該schema下。 需要注意的是,這裡使用的使用者需要有遠端連線MySQL和openGauss的許可權,以及對對應資料庫的讀寫許可權。同時對於openGauss,執行chameleon所在的機器需要在openGauss的遠端訪問白名單中。對於MySQL,使用者還需要有RELOAD、REPLICATION CLIENT、REPLICATION SLAVE的許可權。

(venv) [omm@pekphisprb70593 chameleon]$ chameleon set_configuration_files creating directory /home/omm/.pg_chameleon creating directory /home/omm/.pg_chameleon/configuration/ creating directory /home/omm/.pg_chameleon/logs/ creating directory /home/omm/.pg_chameleon/pid/ copying configuration example in /home/omm/.pg_chameleon/configuration//config-example.yml (venv) [omm@pekphisprb70593 configuration]$ touch config-example.yml (venv) [omm@pekphisprb70593 configuration]$ vi config-example.yml (venv) [omm@pekphisprb70593 configuration]$ ll total 4 -rw------- 1 omm dbgrp 2276 Sep 16 10:18 config-example.yml (venv) [omm@pekphisprb70593 configuration]$ cp config-example.yml default.yml (venv) [omm@pekphisprb70593 configuration]$ vi default.yml

根據上面的示例修改default.yml檔案,注意這個冒號後面有空格。

四、執行遷移 1.初始化遷移過程 開始使用工具做遷移過程。先初始化複製流。

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

2.複製基礎資料 接下來開始複製基礎資料。這裡使用的Mysql和資料與上一篇相同。 chameleon init_replica --config default --source mysql

做完此步驟後,將把MySQL當前的全量資料複製到openGauss。可以在openGauss側檢視全量資料複製後的情況。 資料已複製成功。

3.開啟實時同步複製 在MySQL側插入資料

mysql> insert into test2 values (7654321,'Bob');

在openGauss可以馬上查詢到

新建表插入資料也是可以的: 在MySQL側新建t1,插入一條資料

mysql> create table if not exists t1(id int(10)); mysql> insert into t1 values (1);

在openGauss側查詢

4.結束複製過程及清理資源 chameleon stop_replica --config default --source mysql chameleon detach_replica --config default --source mysql chameleon drop_replica_schema --config default

Q&A: q1: 執行報錯 [root@pekphisprb70593 chameleon]# python3 -m venv venv [root@pekphisprb70593 chameleon]# source venv/bin/activate (venv) [root@pekphisprb70593 chameleon]# chameleon set_configuration_files pg_chameleon cannot be run as root

A: 不允許用root,切換omm使用者執行

q2: omm使用者執行沒有許可權 [omm@pekphisprb70593 chameleon]$ python3 -m venv venv Error: [Errno 13] Permission denied: ‘/opt/software/chameleon/venv’ A: 使用omm 使用者安裝 和進入 python3 source命令 q3:執行(venv) [omm@pekphisprb70593 logs]$ chameleon add_source --config default --source mysql 報錯

results: ('count' 'BIGINT', 'dest_schema' 'pg_catalog.text') statement_id: py:0x7f854e40ef60 string: WITH t_check AS ( SELECT (jsonb_each_text(jsb_schema_mappings)).value AS dest_schema FROM sch_chameleon.t_sources WHERE i_id_source <> -1 UNION ALL SELECT value AS dest_schema FROM json_each_text('"mysql_db1:mysql_db1_sch"'::json) ) SELECT count(dest_schema), dest_schema FROM t_check GROUP BY dest_schema HAVING count(dest_schema)>1 ; CONNECTION: [idle] client_address: 127.0.0.1/32 client_port: 39710 version: (openGauss 3.0.0 build 02c14696) compiled at 2022-04-01 18:12:34 commit 0 last mr on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit CONNECTOR: [IP4] pq://opengauss_test:***@127.0.0.1:15400/opengauss_db?[sslmode]=disable category: None

A:schema_mapping 的配置項,注意冒號後面有空格

除了基礎資料同步,chameleon後續還將支援將檢視、觸發器、自定義函式、儲存過程等資料庫物件從MySQL遷移到openGauss。期待一下吧~ openGauss: 一款高效能、高安全、高可靠的企業級開源關係型資料庫。

🍒如果您覺得博主的文章還不錯或者有幫助的話,請關注一下博主,如果三連點贊評論收藏就更好啦!謝謝各位大佬給予的支援!