【openGauss資料遷移系列】使用pgloader將資料從MySQL遷移到openGauss的最佳實踐

語言: CN / TW / HK

資料庫遷移是實際工作中經常遇到的問題,比如由於磁碟空間、業務效能、專案改造等等原因,有從甲伺服器遷移到乙伺服器,從A種資料庫遷移到B種資料庫,從源路徑遷移到另一個目標路徑、同一個機器下從一個使用者遷移到另一個使用者等各種場景,有時需要整個資料庫所有檔案都遷移,有時只需要遷移部分資料檔案如REDO、表空間檔案等。

目錄

  • 一、概述
  • 二、遷移前準備:
    • 下載pgloader
    • 修改openGauss加密方式(重要)
    • openGauss設定監聽
    • 測試使用者和資料
  • 三、配置檔案
  • 四、執行遷移
  • 五、結果驗證

 

一、概述

雲原生資料庫openGauss也支援若干資料庫遷移工具,其中的pgloader是一個數據匯入工具,使用COPY命令將資料匯入到PostgreSQL。pgloader有兩種工作模式,一種是從檔案匯入,一種是遷移資料庫。pgloader在兩種情況下都使用PostgreSQL的COPY協議高效的傳輸資料。
openGauss相容PostgreSQL的通訊協議以及絕大部分語法,本文就介紹如何使用pgloader將MySQL資料庫遷移至openGauss。
在這裡插入圖片描述

整個過程可以基本分為四步:
遷移前準備 > 相關檔案配置 > 執行遷移 > 結果驗證

二、遷移前準備:

下載pgloader

除了 源資料庫MySQL 和目標資料庫openGauss,它們之間需要網路互通外。還需要關鍵工具pgloader。因為某些網路原因,我這裡使用的是docker 版本的pgloader 下載,安裝在目標庫所在伺服器上。
預設pull最新版本。

[[email protected] software]# docker pull dimitri/pgloader
[[email protected] software]# docker run --rm --name pgloader dimitri/pgloader:latest pgloader --version
pgloader version "3.6.7~devel"
compiled with SBCL 2.1.1.debian

需要注意的是,它只是命令列工具,所以一旦執行完畢會自動退出。故每次都需要“docker run --rm --name pgloader dimitri/pgloader:latest pgloader + 具體操作”的命令。

修改openGauss加密方式(重要)

使用者密碼儲存在系統表pg_authid中,為防止使用者密碼洩露,openGauss對使用者密碼進行加密儲存,所採用的加密演算法由配置引數password_encryption_type決定。

  • 當引數password_encryption_type設定為0時,表示採用md5方式對密碼加密。
  • 當引數password_encryption_type設定為1時,表示採用sha256和md5方式對密碼加密。
  • 當引數password_encryption_type設定為2時,表示採用sha256方式對密碼加密,為預設配置。
    在這裡插入圖片描述

由於MD5加密演算法安全性低,存在安全風險,不建議使用。openGauss 對原生PostgreSQL的通訊協議進行了安全加固,這導致與PostgreSQL的預設通訊協議互相不相容了,因此,使用pgloader的PostgreSQL原生版本預設是不能連線openGauss的。會報類似下述錯誤:
在這裡插入圖片描述

通過修改該GUC引數修改資料庫加密演算法,執行如下命令將引數修改為1 ,同時支援md5 和sha256

gs_guc reload -N all -I all -c "password_encryption_type=1"

一定要在設定完上述引數後,再新建使用者。

openGauss設定監聽

若不設定,可能會像我一樣遇到“Failed to connect to pgsql at “xxx” (port 15400) as user “opengauss_test”: Database error 28000: no pg_hba.conf entry for host “172.17.0.2”.”
在這裡插入圖片描述
設定方法:

cd /opt/huawei/install/data/dn/
vi pg_hba.conf
在IPv4中新增一行
host    all    all     0.0.0.0/0                      md5
然後重啟資料庫
[[email protected] dn]$ gs_om -t stop
[[email protected] dn]$ gs_om -t start

在這裡插入圖片描述

測試使用者和資料

這一步是可選的,包括源庫的資料庫、使用者和原始資料,目標庫的資料庫和使用者。如果都已經有了則直接跳過看下一步,缺啥補啥。
建立目標庫openGauss的使用者及database.

[[email protected] ~]$ gsql -d postgres -p 15400 
openGauss=# CREATE USER opengauss_test identified by 'Gauss_234'; 
openGauss=# GRANT ALL PRIVILEGES TO opengauss_test; 
openGauss=# CREATE DATABASE opengauss_db with owner opengauss_test ENCODING 'utf8' template = template0; 

新建了一個空表test2。

[[email protected] dn]$ gsql -d opengauss_db -p 15400
opengauss_db=# create table if not exists test2(id integer);
CREATE TABLE

建立源資料庫和使用者,刷新系統授權表。

CREATE DATABASE IF NOT EXISTS mysql_db1 default charset utf8;
CREATE USER mysql_t1 identified by 'Mysql_234' ;
GRANT ALL PRIVILEGES ON *.* TO 'mysql_t1' WITH GRANT OPTION;
FLUSH PRIVILEGES;

構造資料

[email protected]:~> mysql -u mysql_t1 -p
mysql> use mysql_db1;
create table if not exists test1 (id int(10),name char(20),salary float,time datetime(6),addr varchar(200),primary key(id)) ;
insert into test1 values (1,'zhangsan',2000.00,'2018-06-01 00:00:00','beijing');
insert into test1 values (2,'李四',2000.89,'2018-06-01 00:00:00','西安');
insert into test1 values (3,'Bob',2000,'2018-06-02 00:00:00','南京');

#建立了一個和目標資料庫表結構不同的test2。
create table if not exists test2(id int(10),name varchar(20));
insert into test2 values (1234567,'Kevin');
#建立空表test3。
create table if not exists test3(id int(10));

三、配置檔案

pgloader提供豐富的配置項,我們可以自由定義遷移時的各類動作,如通過include drop,刪除目標資料庫中名稱出現在MySQL資料庫中的所有表,以允許連續多次使用同一命令,從乾淨的環境自動啟動。
在pgloader所在伺服器任意路徑下建立一個配置檔案,檔案可以命名為opengauss.loader。下面是一個配置檔案示例,裡面的值需要修改為自己環境的實際值。

LOAD DATABASE 
  
FROM mysql://mysql_t1:[email protected]:3306/mysql_db1 
  
INTO postgresql://opengauss_test:[email protected]:15400/opengauss_db 
  
WITH include drop, create tables, create indexes, reset no sequences, 
  
workers = 8, concurrency = 1, 
  
multiple readers per thread, rows per range = 50000 
  
CAST 
  
type varchar when(= 1 precision) to "boolean" drop typemod keep default keep not null;

幾個配置項簡單介紹下:

  • FROM:源庫,格式:
    mysql://使用者名稱:密碼@IP :埠/資料庫名稱
  • INTO:目標庫,格式:
    postgresql://使用者名稱:密碼@IP :埠/資料庫名稱
  • WITH:從MySQL資料庫載入時的選項。有include drop、create tables、create indexes等選項。
  • CAST:因為兩種資料庫的資料型別並不完全一致,工具允許使用者覆蓋已有的預設轉換規則或者使用特殊情況修改它們,自定義型別轉換規則。
    還有個比較重要的功能是部分遷移:使用者可以通過 including only table names matching 和 excluding table names matching 實現只遷移特定的表或者在遷移過程中排除特定的表。

更詳細的配置項解讀,可檢視官網的說明:https://pgloader.readthedocs.io/en/latest/ref/mysql.html
Migratinga MySQL Database to PostgreSQL — pgloader 3.4.1 documentation

四、執行遷移

啟動docker:

docker run -tid --name pgloader_test dimitri/pgloader

複製配置檔案到docker:

docker cp ./openGauss.loader pgloader_test:/

進入docker環境:

docker exec -it pgloader_test /bin/bash

啟動遷移

[email protected]:/# pgloader opengauss.loader

在這裡插入圖片描述

如果遇到問題可以先按照上面的配置步驟去檢查下。

五、結果驗證

現在來看下遷移結果與預期是否一致:
在目標庫進行查詢:

[[email protected] dn]$ gsql -d opengauss_db -p 15400

可以看出表 test1和test3包括資料都已經遷移過來。test2由於遷移前後的資料庫結構不一致並沒有遷移成功。與預期一致。
但是之前mysql定義的float型別,被強制轉成double precision。其他的一些不同和限制有興趣或者必須要遷移的同學自行探索下。

總結:使用pgloader進行資料庫的遷移過程還是比較簡單的,有興趣的同學可以嘗試下。

openGauss: 一款高效能、高安全、高可靠的企業級開源關係型資料庫。

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