pgloader介紹
pgloader是一個數(shù)據(jù)導(dǎo)入工具,使用COPY命令將數(shù)據(jù)導(dǎo)入到PostgreSQL。pgloader有兩種工作模式,一種是從文件導(dǎo)入,一種是遷移數(shù)據(jù)庫。pgloader在兩種情況下都使用PostgreSQL的COPY協(xié)議高效的傳輸數(shù)據(jù)。
openGauss兼容PostgreSQL的通信協(xié)議以及絕大部分語法,可使用pgloader將MySQL數(shù)據(jù)庫遷移至openGauss。
pgloader在openGauss上的問題
由于openGauss 對原生PostgreSQL的通信協(xié)議進(jìn)行了安全加固,這導(dǎo)致與PostgreSQL的默認(rèn)通信協(xié)議互相不兼容了,因此,使用pgloader的PostgreSQL原生版本默認(rèn)是不能連接openGauss的。會報類似下述錯誤:

處理方式是通過修改GUC進(jìn)行規(guī)避,涉及的GUC參數(shù)是password_encryption_type,PostgreSQL默認(rèn)的加密方式是md5,由于md5已經(jīng)不安全了,為了提高openGauss的安全能力,openGauss支持sha256, 并且默認(rèn)是sha256的加密方式,這就導(dǎo)致了上述報錯。但是openGauss并沒有刪除md5的加密和驗證邏輯,因此,是可以通過修改該GUC參數(shù)開啟md5加密方式的。
開啟方法:
gs_guc reload -D $PGDATA -c "password_encryption_type = 1"
一定要在設(shè)置完上述參數(shù)后,再新建用戶。然后就可以使用該新建用戶登錄數(shù)據(jù)庫了。
接下來我們將演示如何使用pgloader遷移MySQL數(shù)據(jù)庫至openGauss。
安裝pgloader
您可以直接從 apt.postgresql.org 和官方 debian 存儲庫 packages.debian.org/pgloader 安裝 pgloader。
$ apt-get install pgloader
同時,您也可以通過 docker image 使用pgloader。
$docker pull dimitri/pgloader
$docker run --rm --name pgloader dimitri/pgloader:latest pgloader --version
$docker run --rm --name pgloader dimitri/pgloader:latest pgloader –help
配置pgloader
pgloader提供豐富的配置項,您可以自由定義遷移時的各類動作,如通過include drop,刪除目標(biāo)數(shù)據(jù)庫中名稱出現(xiàn)在MySQL數(shù)據(jù)庫中的所有表,以允許連續(xù)多次使用同一命令,從干凈的環(huán)境自動啟動。
這里簡單介紹幾個常用的配置項。
FROM:源數(shù)據(jù)庫的連接URL,格式如下:
?mysql://[user[:password]@][netloc][:port][/dbname][?option=value&...]
INTO:目標(biāo)數(shù)據(jù)庫的連接URL,格式如下:
?postgresql://[user[:password]@][netloc][:port][/dbname][?option=value&...]
WITH:從MySQL數(shù)據(jù)庫加載時的選項。有include drop、create tables、create indexes等選項。
CAST:用戶自定義類型轉(zhuǎn)換規(guī)則。允許用戶覆蓋已有的默認(rèn)轉(zhuǎn)換規(guī)則或者使用特殊情況修改它們。
部分遷移:用戶可以通過 including only table names matching 和 excluding table names matching 實現(xiàn)只遷移特定的表或者在遷移過程中排除特定的表。
詳細(xì)的配置項解讀,可查看官網(wǎng)的說明:
https://pgloader.readthedocs.io/en/latest/ref/mysql.html
下面是一份從MySQL遷移到openGauss的配置文件示例:
LOAD DATABASE
FROM mysql://mysql_test:password123@1.1.1.1:3306/mysql_database
INTO postgresql://opengauss_test:password_123@1.1.1.1:5432/opengauss_database
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;
以上配置文件的含義是,遷移數(shù)據(jù)時,MySQL側(cè)使用的用戶名密碼分別是 mysql_test 和 password123。MySQL服務(wù)器的IP和port分別是1.1.1.1和3306,待遷移的數(shù)據(jù)庫是mysql_database。
openGauss側(cè)使用的用戶名密碼分別是 opengauss_test 和 password_123。openGauss服務(wù)器的IP和port分別是1.1.1.1和5432,目標(biāo)數(shù)據(jù)庫是opengauss_database。
需要注意的是,這里使用的用戶需要有遠(yuǎn)程連接MySQL和openGauss的權(quán)限,以及對對應(yīng)數(shù)據(jù)庫的讀寫權(quán)限。同時對于openGauss,運行pgloader所在的機(jī)器需要在openGauss的遠(yuǎn)程訪問白名單中。
創(chuàng)建用戶及database
在openGauss側(cè)創(chuàng)建遷移時需要用到的用戶以及database。

運行pgloader進(jìn)行數(shù)據(jù)遷移
以下演示基于使用docker image方式安裝的pgloader。將前面準(zhǔn)備好的配置文件命名為 openGauss.loader。

啟動docker:docker run -tid --name pgloader_test dimitri/pgloader
復(fù)制配置文件到docker:docker cp ./openGauss.loader pgloader_test:/
進(jìn)入docker環(huán)境:docker exec -it pgloader_test bin/bash

啟動pgloader,等待數(shù)據(jù)遷移完成,查看遷移結(jié)果報告:pgloader openGauss.loader

在openGauss側(cè)查看遷移結(jié)果:

https://docs.opengauss.org/zh/docs/3.1.0/docs/BriefTutorial/BriefTutorial.html