1. 使用pgloader迁移MySQL至openGauss

参考:

官方迁移教程:如何使用pgloader迁移MySQL数据库至openGauss (qq.com)

pgloader使用指南PDF

pgloader英文官方文档

前言: pgloader是一款数据导入工具,用于迁移数据到PostgreSQL数据库,因为openGauss是基于postgresql开发的,openGauss兼容PostgreSQL的通信协议以及绝大部分语法,所以可使用pgloader将MySQL数据库迁移至openGauss。

以下演示基于使用docker image方式安装的pgloader。

迁移步骤

1、先安装docker

使用root用户执行

具体安装步骤可参考教程:https://cloud.tencent.com/developer/article/1701451

2、拉取pgloader镜像

# 拉取镜像
docker pull dimitri/pgloader:ccl.latest

3、创建用于迁移的openGauss用户

使用omm用户执行

注意:迁移时,pgloader将openGauss当成是PostgreSQL数据库,而PostgreSQL使用MD5的加密规则,openGauss则默认使用sha256,所以为了使openGauss兼容PostgreSQL,需要修改密码加密类型为1:MD5+sha256,否则无法使用pgloader登录openGauss。

解释:password_encryption_type有0,1,2三个值可供选择(默认为2),分别表示:

  • 2:使用sha256;

  • 1:使用md5和sha256;

  • 0:使用md5

# 修改密码加密类型,兼容PostgreSQL
gs_guc reload -D /opt/software/openGauss/data/single_node -c "password_encryption_type = 1"# 登录openGauss
gsql -d postgres
# 创建用于迁移的用户(需修改加密规则后再创建用户,否则该用户无法以PostgreSQL类型登录)
CREATE USER opengauss_pgloader_user WITH PASSWORD 'gauss_123';

创建用于迁移的兼容性为B的数据库
注意: 这里需先开启enable_global_syscache再创建兼容性为B的数据库,否则会触发bug,导致数据库崩溃。

我一开始就踩了这个bug,后面尝试解决了很久,最后才发现这是一个openGauss的bug,bug的链接:修复enable_global_syscache关闭时连接B兼容性数据库的core问题,有兴趣的可以看下。
该bug已被修复,但我安装的3.0版本是4月1号编译的,该版本还没修复该bug。

# 开启enable_global_syscache
gs_guc reload -N all -I all -c "enable_global_syscache = on"
# 创建用于迁移的兼容性为B的数据库
CREATE  DATABASE db_pgloader WITH OWNER opengauss_pgloader_user dbcompatibility='B';

运行pgloader所在的机器需要在openGauss的远程访问白名单中,设置如下:

# -D 后面填写的是数据目录的路径,请自行替换(下同)
gs_guc set -D /opt/software/openGauss/data/single_node -c " listen_addresses = '*'" # 将xx.xx.xx.xx设置为你机器的IP,特别注意:使用docker进行迁移则ip需设置为docker容器的ip
gs_guc set -D /opt/software/openGauss/data/single_node -h "host all all xx.xx.xx.xx/32 sha256" # 重启数据库
gs_ctl restart -D /opt/software/openGauss/data/single_node

4、创建MySQL可远程登录的用户

注意: 用户名和IP是mysql.user表的联合主键,二者唯一确定了一个用户,所以root@localhost和root@%是两个用户,他们之间的权限和密码都是独立的,更详细的介绍见教程:
MySQL用户与权限:https://www.jianshu.com/p/b38255b96006

注意:MySQL 5和8版本的命令不同,请选择你对应版本的命令

# MySQL8
# 先创建允许远程访问的用户,'%'表示允许从任意IP登录MySQL
create user 'root'@'%' identified by 'Root@1234';
# 再授予数据库和表的访问权限
grant all privileges on *.* to 'root'@'%' with grant option;# MySQL5 (创建用户的同时授予权限)
grant all privileges on *.* to root@'%' IDENTIFIED by '你的密码' with grant option;

pgloader不支持MYSQL8默认为caching_sha2_password的authentication plugin,

所以如果想要连上MYSQL8版本的数据库,需要在配置文件my.cnf中添加默认认证插件,如下:

vim /etc/my.cnf
# 添加到[mysqld]下
default-authentication-plugin=mysql_native_password
# 重启mysql服务
systemctl restart mysqld

再将用户的认证插件改为mysql_native_password

命令如下:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '用户密码';

参考:

pgloader运行错误:QMYND:MYSQL-UNSUPPORTED-AUTHENTICATION

解决:https://stackoverflow.com/questions/56542036/pgloader-failed-to-connect-to-mysql-at-localhost-port-3306-as-user-root

5、创建并填写迁移配置文件

切换回root用户执行

创建迁移配置文件:

vim pg.loader

内容如下:

注意:

1:请将数据库账号、密码、IP、迁移的数据库名称修改为你自己的;

2:如果你的数据库密码中有:@这两个特殊字符,则要对应增加一个:或@,否则pgloader 会无法识别,如果我的密码是 openGauss@123,则在配置文件中我的数据库密码应该写成 openGauss@@123。

3:如果你的数据库在本机,IP也不能写成:localhost或127.0.0.1,需将IP设置为具体的本机IP

LOAD DATABASEFROM mysql://root:Root@@1234@192.168.1.219:3306/vue_demoINTO postgresql://opengauss_pgloader_user:gauss_123@192.168.32.101:5432/db_pgloaderWITH include drop, create tables, create indexes, reset no sequences,workers = 8, concurrency = 1, multiple readers per thread, rows per range = 50000CASTtype varchar when(= 1 precision) to "boolean" drop typemod keep default keep not null;

6、运行docker容器

docker run -tid --name pgloder.ccl dimitri/pgloader:ccl.latest

7、复制配置文件到容器中

docker cp pg.loader pgloder.ccl:/

8、进入容器,执行迁移

# 进入容器
docker exec -it pgloder.ccl /bin/bash
# 执行迁移
pgloader pg.loader

docker容器命令:

退出容器的命令:exit (执行exit后,容器还在后台运行)

查看正在运行的docker容器实例(显示CONTAINER ID,NAMES(容器名)等信息):

docker ps

如果想停止实例,则执行:docker stop 容器名;

想移除则执行:docker rm 容器名

更多操作docke容器,见教程:https://www.cnblogs.com/mindzone/p/13363685.html

9、登录openGauss查看迁移结果 (以omm用户执行)

# -d 后面指定数据库名
gsql -d db_pgloader
# 列出所有表:
\dt
# 查询表
select * form xxx

2. pgloader迁移总结

2.1 MySQL的自增整数类型

pgloader默认情况下,MySQL的自增整数会迁移成openGauss的序列整型类型

openGauss的序列整型本质上是整数加上对应的sequence类型

迁移后在openGauss端会自动创建序列整型字段对应名称为:表名_自增字段名_seq的sequence,用该sequence的nextval方法作为字段的默认值,实现自增效果

sequence类型即等差数列,可以指定每次递增多少 (如1)

sequence教程:https://blog.csdn.net/qq_40907977/article/details/104914674

注意:迁移完成后,要使用setval函数,设置sequence的下一个值 (初始为1)

比如迁移后,要设置tb_fault_event表的sequence字段的下一个值:

# 查询出id的当前最大值,假设结果为363
select max(id) from tb_fault_event
# 设置序列的当前值
select setval('tb_fault_event_id_seq', 363)

例子:

创建表:

CREATE TABLE tb_product (    id bigint DEFAULT nextval('tb_product_id_seq'::regclass) NOT NULL,server_ip character varying(255) DEFAULT ''::character varying,product_asset_tag character varying(255) DEFAULT ''::character varying,delay bigint DEFAULT 1::bigint NOT NULL,time_unit tb_product_time_unit DEFAULT 'HOURS'::tb_product_time_unit NOT NULL,create_time timestamp with time zone DEFAULT pg_systimestamp(),update_time timestamp with time zone DEFAULT pg_systimestamp()
)

创建对应的sequence:

CREATE  SEQUENCE tb_product_id_seq START  WITH  1 INCREMENT  BY  1 NO MINVALUE   MAXVALUE 9223372036854775807 CACHE 1;

2.2 枚举

参考:https://blog.csdn.net/liyazhen2011/article/details/82991920

通过CREATE TYPE自定义类型,其中就有枚举类型:

CREATE TYPE:
在当前数据库中定义一种新的数据类型。定义数据类型的用户将成为该数据类型的拥有者。类型只适用于行存表
有四种形式的CREATE TYPE,分别为:复合类型、基本类型、shell类型和枚举类型。

例子:创建枚举类型,并在建表中使用

create type tb_product_time_unit
as enum('DAYS','HOURS','MINUTES','SECONDS','MILLISECONDS','MICROSECONDS','NANOSECONDS'); CREATE TABLE tb_product ( ...time_unit tb_product_time_unit DEFAULT 'HOURS'::tb_product_time_unit NOT NULL,
)

2.3 大小写敏感问题

openGauss的大小写敏感与postgres一致:

  • 建表时表名和字段名默认不区分大小写,除非使用双引号包裹
  • 查询时,查询的字段名转化为小写再去表里查询,如果需要区分大小写同样要使用双引号包裹

pgloader迁移后不会添加双引号,navicat建表会自动添加双引号

2.4 字符类型的长度问题

openGauss数据库中varchar(n)和char(n)等字符类型中,它的(n),代表的是字节的大小,而不是字符的大小!而utf8编码下一个汉字就占3个字节!

而MySQL数据库中varchar(n)和char(n)的n都指的是字符的大小

这个不兼容的问题可能会导致迁移发生异常!

比如MySQL中某条记录在某个字段char(10)中存了10个汉字(没有问题),但迁移到openGauss中会报错,因为10个汉字的大小已经超过10个字节了。

使用pgloader迁移MySQL至openGauss相关推荐

  1. 【数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践

    在之前这一篇中我们分享过使用chameleon工具完成MySQL到openGauss的全量数据复制.实时在线复制.9.30新发布的openGauss 3.1.0版本 ,工具的全量迁移和增量迁移的性能不 ...

  2. python脚本迁移数据库_Python迁移MySQL数据到MongoDB脚本

    MongoDB是一个文档数据库,在存储小文件方面存在天然优势.随着业务求的变化,需要将线上MySQL数据库中的行记录,导入到MongoDB中文档记录. 一.场景:线上MySQL数据库某表迁移到Mong ...

  3. 实践练习四:迁移 MySQL 数据到 OceanBase 集群

    练习目的 本次练习目的掌握从 MySQL 向 OceanBase 迁移数据的基本方法:mysqldump.datax .canal 等. 练习内容 请记录并分享下列内容: (必选)使用 mysqldu ...

  4. 如何在两个服务器之间迁移MySQL数据库

    英文原作者:Etel Sverdlov   转载&翻译来源:https://www.digitalocean.com/community/tutorials/how-to-migrate-a- ...

  5. 迁移mysql数据目录

    迁移mysql数据目录 mysql运行一段时间后,发现mysql数据所在盘空间不够了,需要将mysql数据,数据目录迁移到另一个磁盘. 1,复制/var/lib/mysql下所有文件.目录到/home ...

  6. mysql中如何迁移数据文件,迁移mysql数据文件存放位置

    迁移mysql数据文件存放位置 (2012-01-11 14:46:30) 标签: mysql db datafile 数据 文件 1.备份当前的数据库 2.停止mysql服务 root@box:~/ ...

  7. 关于Ubuntu 16.04系统挂载硬盘以及迁移MYSQL数据存储目录的操作步骤

    转载链接 : 关于Ubuntu 16.04系统挂载硬盘以及迁移MYSQL数据存储目录的操作步骤 :https://www.jianshu.com/p/58093888ee25 本文背景: 现有项目系统 ...

  8. oracle异构迁移mysql方案实施(含原理)——已迁移成功

    从迁移方案的落地.迁移前准备.N次迁移演练.回归测试.性能调优整整用了四个月左右的时间(当然在此期间还包括其他项目及日常操作耗费工时).正式迁移到迁移成功.以及上线开服后性能稳定这些操作已经过去了一个 ...

  9. Oracle数据迁移MySQL

    前言: 现今,Oracle数据迁移MySQL的需求已经越来越普遍,主要的迁移场景大致可以分为三类,第一类是涉及小表以及少量表的一次性迁移,无需进行增量同步,第二类是涉及大表以及多表的一次性迁移,第三类 ...

最新文章

  1. [2018.12.9]BZOJ2153 设计铁路
  2. go操作网页元素_7天用Go动手写/从零实现分布式缓存GeeCache
  3. ZOJ-2770 Burn the Linked Camp 差分约束
  4. 云服务远程登录---设置安全组
  5. C/C++|Qt工作笔记-4种方法判断当前对象(类)名或标识(继承发,typeid法,元对象className()法,Q_CLASSINFO法)
  6. Fabric node sdk 1.4简明教程
  7. WWDC 2018: ARKit 2 的新功能
  8. xfire开发webservice
  9. jquery jstree 插件的使用
  10. Flash Player版本相关问题
  11. apache camel file(二)
  12. (1)GO数据库存储结构详解(从数据库构建角度解析)
  13. 系统管理:传统UNIX文件系统
  14. python中哈希是什么意思_python hash是什么
  15. 阿里拍卖全链路导购策略首次揭秘
  16. 所谓计算机网络是指利用通信设备,《计算机应用基础》模拟试卷考卷二含答案...
  17. c#在output窗口输出调试信息
  18. Redis的哨兵详解
  19. 自动识别图片验证码登录
  20. getservbyname 及 struct servent

热门文章

  1. PINQ-验证数据集-多面搜索
  2. 后台开发面试问题整理
  3. Pyserial 实例教程详细用法
  4. 外贸财务英语-支票用语
  5. MG3680无法在网络上检测到打印机
  6. leetcode 分治 beautiful array
  7. Mysql_基本操作命令
  8. ceph 分布式文件存储部署
  9. SpringBoot集成Activiti6教程
  10. 公告:请访问我Blog新站——酷壳 CoolShell.me