概述
資料庫遷移是實際工作中經常遇到的問題,比如由於磁碟空間、業務效能、專案改造等等原因,有從甲伺服器遷移到乙伺服器,從A種資料庫遷移到B種資料庫,從源路徑遷移到另一個目標路徑、同一個機器下從一個使用者遷移到另一個使用者等各種場景,有時需要整個資料庫所有檔案都遷移,有時只需要遷移部分資料檔案如REDO、表空間檔案等。
chameleon是一個基於Python的MySQL到openGauss的實時複製工具。該工具提供了初始全量資料的複製及增量資料的實時複製能力,支援MySQL中各種資料型別的遷移。本文就介紹如何使用pg_chameleon將MySQL資料庫遷移至openGauss。
一、工具介紹
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 ****”就可以。
PS:這裡需要連線到外網進行一些工具依賴庫的下載。若是公司內網可以透過-i ——trusted-host來指定內部網路。
(venv) [root@pekphisprb70593 chameleon]# pip3 install 。/chameleon-3。0。0-py3-none-any。whl -i http://mirrors。tools。huawei。com/pypi/simple ——trusted-host mirrors。tools。huawei。com
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
python3 setup。py install
安裝完成後,不要退出python虛擬環境,可以開始使用chameleon工具。若退出了,後續繼續執行進入Python環境的兩行即可。
三。 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: “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: - delphis_mediterranea。foo skip_tables: - delphis_mediterranea。bar 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.複製基礎資料
接下來開始複製基礎資料。
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
omm使用者解決
q2: omm使用者執行沒有許可權
[omm@pekphisprb70593 chameleon]$ python3 -m venv venv
Error: [Errno 13] Permission denied: ‘/opt/software/chameleon/venv’
解決 使用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
schema_mapping 的配置項,注意冒號後面有空格
除了基礎資料同步,chameleon後續還將支援將檢視、觸發器、自定義函式、儲存過程等資料庫物件從MySQL遷移到openGauss。期待一下吧~