數(shù)據(jù)庫(kù)遷移是實(shí)際工作中經(jīng)常遇到的問(wèn)題,比如由于磁盤(pán)空間、業(yè)務(wù)性能、項(xiàng)目改造等等原因,有從甲服務(wù)器遷移到乙服務(wù)器,從A種數(shù)據(jù)庫(kù)遷移到B種數(shù)據(jù)庫(kù),從源路徑遷移到另一個(gè)目標(biāo)路徑、同一個(gè)機(jī)器下從一個(gè)用戶遷移到另一個(gè)用戶等各種場(chǎng)景,有時(shí)需要整個(gè)數(shù)據(jù)庫(kù)所有文件都遷移,有時(shí)只需要遷移部分?jǐn)?shù)據(jù)文件如REDO、表空間文件等。
一、概述
云原生數(shù)據(jù)庫(kù)openGauss也支持若干數(shù)據(jù)庫(kù)遷移工具,其中的pgloader是一個(gè)數(shù)據(jù)導(dǎo)入工具,使用COPY命令將數(shù)據(jù)導(dǎo)入到PostgreSQL。pgloader有兩種工作模式,一種是從文件導(dǎo)入,一種是遷移數(shù)據(jù)庫(kù)。pgloader在兩種情況下都使用PostgreSQL的COPY協(xié)議高效的傳輸數(shù)據(jù)。
openGauss兼容PostgreSQL的通信協(xié)議以及絕大部分語(yǔ)法,本文就介紹如何使用pgloader將MySQL數(shù)據(jù)庫(kù)遷移至openGauss。
整個(gè)過(guò)程可以基本分為四步:
遷移前準(zhǔn)備 > 相關(guān)文件配置 > 執(zhí)行遷移 > 結(jié)果驗(yàn)證
二、遷移前準(zhǔn)備:
下載pgloader
除了 源數(shù)據(jù)庫(kù)MySQL
和目標(biāo)數(shù)據(jù)庫(kù)openGauss
,它們之間需要網(wǎng)絡(luò)互通外。還需要關(guān)鍵工具pgloader。因?yàn)槟承┚W(wǎng)絡(luò)原因,我這里使用的是docker 版本的pgloader 下載,安裝在目標(biāo)庫(kù)所在服務(wù)器上。
默認(rèn)pull最新版本。
[root@pekphisprb70593 software]# docker pull dimitri/pgloader
[root@pekphisprb70593 software]# docker run --rm --name pgloader dimitri/pgloader:latest pgloader --version
pgloader version "3.6.7~devel"
compiled with SBCL 2.1.1.debian
需要注意的是,它只是命令行工具,所以一旦執(zhí)行完畢會(huì)自動(dòng)退出。故每次都需要“docker run --rm --name pgloader dimitri/pgloader:latest pgloader + 具體操作”的命令。
修改openGauss加密方式(重要)
用戶密碼存儲(chǔ)在系統(tǒng)表pg_authid中,為防止用戶密碼泄露,openGauss對(duì)用戶密碼進(jìn)行加密存儲(chǔ),所采用的加密算法由配置參數(shù)password_encryption_type決定。
- 當(dāng)參數(shù)password_encryption_type設(shè)置為0時(shí),表示采用md5方式對(duì)密碼加密。
- 當(dāng)參數(shù)password_encryption_type設(shè)置為1時(shí),表示采用sha256和md5方式對(duì)密碼加密。
- 當(dāng)參數(shù)password_encryption_type設(shè)置為2時(shí),表示采用sha256方式對(duì)密碼加密,為默認(rèn)配置。
由于MD5加密算法安全性低,存在安全風(fēng)險(xiǎn),不建議使用。openGauss 對(duì)原生PostgreSQL的通信協(xié)議進(jìn)行了安全加固,這導(dǎo)致與PostgreSQL的默認(rèn)通信協(xié)議互相不兼容了,因此,使用pgloader的PostgreSQL原生版本默認(rèn)是不能連接openGauss的。會(huì)報(bào)類似下述錯(cuò)誤:
通過(guò)修改該GUC參數(shù)修改數(shù)據(jù)庫(kù)加密算法,執(zhí)行如下命令將參數(shù)修改為1 ,同時(shí)支持md5 和sha256
gs_guc reload -N all -I all -c "password_encryption_type=1"
一定要在設(shè)置完上述參數(shù)后,再新建用戶。
openGauss設(shè)置監(jiān)聽(tīng)
若不設(shè)置,可能會(huì)像我一樣遇到“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”.”
設(shè)置方法:
cd /opt/huawei/install/data/dn/
vi pg_hba.conf
在IPv4中新增一行
host all all 0.0.0.0/0 md5
然后重啟數(shù)據(jù)庫(kù)
[omm@pekphisprb70593 dn]$ gs_om -t stop
[omm@pekphisprb70593 dn]$ gs_om -t start
測(cè)試用戶和數(shù)據(jù)
這一步是可選的,包括源庫(kù)的數(shù)據(jù)庫(kù)、用戶和原始數(shù)據(jù),目標(biāo)庫(kù)的數(shù)據(jù)庫(kù)和用戶。如果都已經(jīng)有了則直接跳過(guò)看下一步,缺啥補(bǔ)啥。
創(chuàng)建目標(biāo)庫(kù)openGauss的用戶及database.
[omm@pekphisprb70593 ~]$ 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;
新建了一個(gè)空表test2。
[omm@pekphisprb70593 dn]$ gsql -d opengauss_db -p 15400
opengauss_db=# create table if not exists test2(id integer);
CREATE TABLE
創(chuàng)建源數(shù)據(jù)庫(kù)和用戶,刷新系統(tǒng)授權(quán)表。
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;
構(gòu)造數(shù)據(jù)
mysql@siaphisprk01345:~> 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','南京');
#創(chuàng)建了一個(gè)和目標(biāo)數(shù)據(jù)庫(kù)表結(jié)構(gòu)不同的test2。
create table if not exists test2(id int(10),name varchar(20));
insert into test2 values (1234567,'Kevin');
#創(chuàng)建空表test3。
create table if not exists test3(id int(10));
三、配置文件
pgloader提供豐富的配置項(xiàng),我們可以自由定義遷移時(shí)的各類動(dòng)作,如通過(guò)include drop,刪除目標(biāo)數(shù)據(jù)庫(kù)中名稱出現(xiàn)在MySQL數(shù)據(jù)庫(kù)中的所有表,以允許連續(xù)多次使用同一命令,從干凈的環(huán)境自動(dòng)啟動(dòng)。
在pgloader所在服務(wù)器任意路徑下創(chuàng)建一個(gè)配置文件,文件可以命名為opengauss.loader。下面是一個(gè)配置文件示例,里面的值需要修改為自己環(huán)境的實(shí)際值。
LOAD DATABASE
FROM mysql://mysql_t1:Mysql_234@1.1.1.1:3306/mysql_db1
INTO postgresql://opengauss_test:Gauss_234@2.2.2.2: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;
幾個(gè)配置項(xiàng)簡(jiǎn)單介紹下:
- FROM:源庫(kù),格式:
mysql://用戶名:密碼@IP:端口/數(shù)據(jù)庫(kù)名稱 - INTO:目標(biāo)庫(kù),格式:
postgresql://用戶名:密碼@IP:端口/數(shù)據(jù)庫(kù)名稱 - WITH:從MySQL數(shù)據(jù)庫(kù)加載時(shí)的選項(xiàng)。有include drop、create tables、create indexes等選項(xiàng)。
- CAST:因?yàn)閮煞N數(shù)據(jù)庫(kù)的數(shù)據(jù)類型并不完全一致,工具允許用戶覆蓋已有的默認(rèn)轉(zhuǎn)換規(guī)則或者使用特殊情況修改它們,自定義類型轉(zhuǎn)換規(guī)則。
還有個(gè)比較重要的功能是部分遷移:用戶可以通過(guò) including only table names matching 和 excluding table names matching 實(shí)現(xiàn)只遷移特定的表或者在遷移過(guò)程中排除特定的表。
更詳細(xì)的配置項(xiàng)解讀,可查看官網(wǎng)的說(shuō)明:https://pgloader.readthedocs.io/en/latest/ref/mysql.html
Migratinga MySQL Database to PostgreSQL — pgloader 3.4.1 documentation
四、執(zhí)行遷移
啟動(dòng)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
啟動(dòng)遷移
root@548498fb64a6:/# pgloader opengauss.loader
如果遇到問(wèn)題可以先按照上面的配置步驟去檢查下。
五、結(jié)果驗(yàn)證
現(xiàn)在來(lái)看下遷移結(jié)果與預(yù)期是否一致:
在目標(biāo)庫(kù)進(jìn)行查詢:
[omm@pekphisprb70593 dn]$ gsql -d opengauss_db -p 15400
可以看出表 test1和test3包括數(shù)據(jù)都已經(jīng)遷移過(guò)來(lái)。test2由于遷移前后的數(shù)據(jù)庫(kù)結(jié)構(gòu)不一致并沒(méi)有遷移成功。與預(yù)期一致。
但是之前mysql定義的float類型,被強(qiáng)制轉(zhuǎn)成double precision。其他的一些不同和限制有興趣或者必須要遷移的同學(xué)自行探索下。
總結(jié):使用pgloader進(jìn)行數(shù)據(jù)庫(kù)的遷移過(guò)程還是比較簡(jiǎn)單的,有興趣的同學(xué)可以嘗試下。
openGauss: 一款高性能、高安全、高可靠的企業(yè)級(jí)開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-783343.html
??如果您覺(jué)得博主的文章還不錯(cuò)或者有幫助的話,請(qǐng)關(guān)注一下博主,如果三連點(diǎn)贊評(píng)論收藏就更好啦!謝謝各位大佬給予的支持!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-783343.html
到了這里,關(guān)于【數(shù)據(jù)庫(kù)遷移系列】使用pgloader將數(shù)據(jù)從MySQL遷移到openGauss的最佳實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!