作者:吴毅
之前有做过python+flask+echarts+mysql的大屏数据可视化,现在想把mysql改为openGauss,需要把mysql的基础数据shares_basic表迁移到openGauss上。在网上看到如何使用pgloader迁移MySQL数据库至openGauss:,也想根据步骤做,测试一下是否能安装成功。

1. 安装docker的pgloader

运行yum clean all时,出现如图所示:


opengauss哪些语法不兼容mysql opengauss和mysql_docker



原因是安装openGauss时升级了python的版本, 导致python3.6解析python2.7的语法出错。解决方法:修改/usr/bin/yum和/usr/libexec/urlgrabber-ext-down文件中的第一行为#!/usr/bin/python2.7。

yum install -y yum-utils device-mapper-persistent-data lvm2
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum list docker-ce --showduplicates | sort -r
yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y
systemctl start docker
docker pull dimitri/pgloade
/

启动docker:

docker run -tid --name pgloader1 dimitri/pgloader
/

opengauss哪些语法不兼容mysql opengauss和mysql_database_02


2. 创建数据库和修改MySQL迁移到openGauss的配置文件openGauss.loader

create database  share1 with owner wuy 
/

opengauss哪些语法不兼容mysql opengauss和mysql_database_03


修改openGauss.loader

LOAD DATABASE
 FROM mysql://root:xxxxxx@kafka1.wuyi.com:3306/test/shares_basic
INTO postgresql://wuyicom:xxxxxx@kfaka1.wuyi.com:26000/share1/ 
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;

3. 复制配置文件到docker

docker cp openGauss.loader pgloader1:/
/

进入docker环境

docker exec -it pgloader1 /bin/bash
/

4. 执行pgloader openGauss.loader后报错,如图所示:

opengauss哪些语法不兼容mysql opengauss和mysql_docker_04



把openGauss.loader 里面kafka.wuyi.com:26000/share1/的最后面的’/’去掉再把修改后的配置文件拷贝到pgloader1容器里,进入容器在执行,还是报错:


opengauss哪些语法不兼容mysql opengauss和mysql_mysql_05



原因是:配置里WITH include drop, create tables, create indexes, reset no sequences, workers = 8, concurrency = 1, multiple readers per thread, rows per range = 50000是一条命令,被我拆分成3条命令。修改如图所示:


opengauss哪些语法不兼容mysql opengauss和mysql_database_06



执行后还是报错,如图所示:


opengauss哪些语法不兼容mysql opengauss和mysql_数据库_07



域名写错了,应该把kfaka1修改为kafka1,因为是docker版的pgloader,使用域名会报错,还是写内部IP地址172.16.32.5,还有把mysql数据库test修改为test1。运行还是出错,报错如图所示:


opengauss哪些语法不兼容mysql opengauss和mysql_docker_08

原因是:openGauss数据库部署在服务器上时,如果要允许其他电脑远程连接,则需要对openGauss进行配置,否则,出现上图的错误。

gs_guc reload -I all -N all -h "host all wuyicom 172.17.0.1/24 md5"

opengauss哪些语法不兼容mysql opengauss和mysql_docker_09


还是不行,出现报错如图所示:

opengauss哪些语法不兼容mysql opengauss和mysql_docker_10


最后经过多次排查,发现之前创建的用户名wuyicom有问题,重新创建新用户名wuyi,执行远程白名单:

gs_guc reload -I all -N all -h "host all wuyi 172.17.0.1/24 md5"

重新拷贝到容器,再执行成功,如下图所示:

opengauss哪些语法不兼容mysql opengauss和mysql_数据库_11


opengauss哪些语法不兼容mysql opengauss和mysql_数据库_12

通过这次测试,了解到openGauss用户权限的重要性。使用迁移时,建议创建新用户,因为以前的用户权限可能变动或没设置好,造成报错。还有需要不同IP的连接时,需要给新用户分配IP权限,否则也会报错。还有可以从上图看到,迁移的mysql的数据库名test1变成openGauss里面schema的test1。openGauss的一个数据库可以包含多个schema,在不同的schema可以创建相同的表名,用户一次只能访问一个数据库,但可以访问该数据库的多个schema中的数据库对象。