写点什么

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

作者:daydayup
  • 2023-08-02
    北京
  • 本文字数:3265 字

    阅读完需:约 11 分钟

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

原创 酷哥 [openGauss](javascript:void(0);) 2022-11-07 18:03 发表于广东


9 月 30 日新发布的 openGauss 3.1.0 版本 ,工具的全量迁移和增量迁移的性能不但有了全面提升,而且支持数据库对象视图、触发器、自定义函数、存储过程的迁移。


  • 工具链:MySQL 全量迁移支持并行迁移,提升全量迁移性能

  • 通过支持表级并行迁移,提升 MySQL 全量迁移性能,基于 sysbench 测试模型,在 Kunpeng-920 2p 服务器上,10 张表(单表容量三百万以上)使用 10 并发迁移,可达到大于 300M/s 的迁移性能。

  • 工具链:MySQL 增量迁移支持十五级并行消费,提升增量迁移性能

  • 基于开源三方件 mysql-binlog-connector-java 解析 mysql 的 binlog, 并根据 mysql 主备进行复制的原理,对可并行的事务在 openGauss 端采用多线程进行并行回放,以实现 MySQL 到 openGauss 的在线迁移。

  • 利用 sysbench 对 MySQL 压测,在 10 张表 30 个线程并发情况下,IUD 混合场景下,在 Kunpeng-920 2p 服务器上测试整体增量迁移性能可达 3w tps.

  • 工具链:支持基于默克尔树的数据校

  • 实现基于默克尔树的数据实时校验工具,支持 MySQL 数据迁移到 openGauss 时,源端与目的端数据全量和增量校验。


本篇就来分享一下使用 chameleon 工具进行从 MySQL 到 openGauss 的数据库对象迁移实践。


软件安装


  1. 由于我之前已经安装过 3.0 版本的工具了,需要先卸载一下。


[root@pekphisprb70593 chameleon]# pip3 uninstall chameleonUninstalling chameleon-3.0.0:Would remove:/usr/local/python3/bin/chameleon/usr/local/python3/bin/chameleon.py/usr/local/python3/lib/python3.6/site-packages/chameleon-3.0.0.dist-info/*/usr/local/python3/lib/python3.6/site-packages/pg_chameleon/*Proceed (y/n)? ySuccessfully uninstalled chameleon-3.0.0[root@pekphisprb70593 chameleon]# rm -rf chameleon-3.0.0-py3-none-any.whl
复制代码


2.从官网https://opengauss.org/zh/supporttools.html 获取获取工具包:chameleon-3.1.0-py3-none-any.whl



3.将新的 3.1.0 工具上传到 openGauss 数据库所在节点的 chameleon 文件夹下。


[root@pekphisprb70593 chameleon]# python3 -m venv venv[root@pekphisprb70593 chameleon]# source venv/bin/activate(venv) [root@pekphisprb70593 chameleon]# pip3 install ./chameleon-3.1.0-py3-none-any.whl
复制代码


最后提示“Successfully installed chameleon-3.1.0”说明安装成功。


  1. 设置配置文件。这里继续使用之前已经配置好的 default.yml.


切换到 omm 用户进行操作。


(venv) [root@pekphisprb70593 chameleon]# su - ommLast login: Tue Oct 25 16:24:30 CST 2022 on pts/0[omm@pekphisprb70593 ~]$ cd /opt/software/chameleon/[omm@pekphisprb70593 chameleon]$ python3 -m venv venv[omm@pekphisprb70593 chameleon]$ source venv/bin/activate(venv) [omm@pekphisprb70593 chameleon]$  chameleon set_configuration_filesupdating configuration example with /home/omm/.pg_chameleon/configuration//config-example.yml
复制代码


数据库对象迁移测试


初始化迁移过程


(venv) [omm@pekphisprb70593 chameleon]$ chameleon create_replica_schema --config default(venv) [omm@pekphisprb70593 chameleon]$ chameleon add_source --config default --source mysql
复制代码


除了基础数据同步,chameleon 还支持将视图、触发器、自定义函数、存储过程从 MySQL 迁移到 openGauss。以下四个命令无先后之分。若不想日志输出到控制台,可去掉--debug 参数。


复制视图:


chameleon start_view_replica --config default --source mysql --debug


复制触发器:


chameleon start_trigger_replica --config default --source mysql --debug


复制自定义函数:


chameleon start_func_replica --config default --source mysql --debug


复制存储过程:


chameleon start_proc_replica --config default --source mysql --debug


此外,工具还提供了可以在对象迁移信息表 sch_chameleon.t_replica_object 中查看迁移对象的记录能力。下表展示了 t_replica_object 表的字段说明。



视图迁移


  1. mysql 构造视图数据。


mysql> create view test1_view as-> select * from test1 where id=1;Query OK, 0 rows affected (0.01 sec)mysql> select * from test1_view;
复制代码



  1. 工具执行视图迁移命令


chameleon start_view_replica --config default --source mysql --debug



3.在 openGauss 侧查询视图,迁移成功。注意查询的时候需要携带 schema:mysql_db1_sch,视图名称和 mysql 中定义的一致,都是 test1_view。



触发器迁移


1.mysql 构造如下触发器:每删除一条 test1 中的数据,就向 test2 表中插入一条记录。


DELIMITER //CREATE TRIGGER del_logAFTER DELETEON test1FOR EACH ROWBEGININSERT INTO test2(id,name) VALUES (old.id,concat("delete record:",old.name));END; //
复制代码


2.工具执行命令,成功


chameleon start_trigger_replica --config default --source mysql --debug



3.openGauss 侧测试触发器


从测试结果来看,触发器是直接生效的,test2 中已经成功插入了数据。




自定义函数迁移


  1. 在 MySQL 侧构造了两个简单的函数。


DELIMITER // create function mysql_func2(x smallint unsigned, y smallint unsigned) returns smallint deterministic BEGIN DECLARE a, b SMALLINT UNSIGNED DEFAULT 10; SET  a = x, b = y; RETURN a+b; END; //  create function mysql_func1(s char(20)) returns char(50) deterministic return concat('mysql_func1, ',s,'!')//
复制代码


  1. 启动迁移操作,如下图所示,总共两个,成功两个。


chameleon start_func_replica --config default --source mysql --debug



  1. openGauss 侧直接测试函数调用,也是 OK 的。注意携带 schema。



存储过程迁移


  1. 在 MySQL 侧构造了一个简单的存储过程。


DELIMITER //CREATE PROCEDURE mysql_sp(IN x SMALLINT ,IN y SMALLINT ,OUT sum int)BEGINSET  sum = x + y;END //DELIMITER ;
复制代码


  1. 工具侧执行迁移,提示总共一个,成功一个。


chameleon start_proc_replica --config default --source mysql --debug



3.openGauss 直接测试调用,也是 OK 的。



Q&A


1、迁移数据库对象过程中报类似错误“‘replica_engine’ object has no attribute ”


(venv) [omm@pekphisprb70593 configuration]$ chameleon start_func_replica --config default --source mysql --debugTraceback (most recent call last):File "/opt/software/chameleon/venv/bin/chameleon", line 5, in <module>exec(compile(open(__file__).read(), __file__, 'exec'))File "/opt/software/chameleon/venv/bin/chameleon.py", line 58, in <module>getattr(replica, args.command)()AttributeError: 'replica_engine' object has no attribute 'start_func_replica'
复制代码


这个错误的话是工具 3.0.0 之前版本还不支持 ,请确认工具版本是 3.1.0。


2、迁移触发器限制


create table test1_log(id int not null auto_increment,operation varchar(200) ,oper_time date, primary key (id));DELIMITER //CREATE TRIGGER del_write_logAFTER DELETEON test1FOR EACH ROWBEGINset @t_name = old.name;INSERT INTO test1_log(operation,oper_time) VALUES (concat("delete record:",@t_name),NOW());END; //
复制代码


工具执行迁移命令 ,结果失败了。


2022-10-26 14:37:56 MainProcess ERROR mysql_lib.py (1845): 2022-10-26 02:37:56.294 [main] ERROR org.opengauss.sqltranslator.dialect.mysql.MySqlToOpenGaussOutputVisitor - openGauss does not support set @T_NAME,trigger name is del_write_log2022-10-26 14:37:56 MainProcess ERROR mysql_lib.py (1845): 2022-10-26 02:37:56.295 [main] ERROR org.opengauss.sqltranslator.dialect.mysql.MySqlToOpenGaussOutputVisitor - openGauss does not support variable started with @,trigger name is del_write_log
复制代码


openGauss 不支持这种变量名加 @,因此,实际迁移前需要仔细查看工具使用约束。

用户头像

daydayup

关注

还未添加个人签名 2023-07-18 加入

还未添加个人简介

评论

发布
暂无评论
数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践_daydayup_InfoQ写作社区