暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

Coding Big Tree 2022-12-07
341


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 chameleon
    Uninstalling 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)? y
    Successfully 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”说明安装成功。

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

      切换到omm 用户进行操作。

        (venv) [root@pekphisprb70593 chameleon]# su - omm
        Last 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_files
        updating 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表的字段说明。

          字段

          类型

          描述

          i_id_object

          bigint

          id

          i_id_source

          bigint

          与sch_schema.t_sources的id相对应

          en_object_type

          枚举类型

          迁移对象所属类型(VIEW/TRIGGER/FUNC/PROC)

          ts_created

          timestamp with time zone

          迁移时间

          b_status

          boolean

          迁移状态。true表示迁移成功,false表示迁移失败

          t_src_object_sql

          text

          原始sql语句

          t_dst_object_sql

          text

          翻译后的语句。若无法翻译或者翻译出现error的情况为空;openGauss不支持的字段被注释

          视图迁移

          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;

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

            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_log
              AFTER DELETE
              ON test1
              FOR EACH ROW
              BEGIN
              INSERT 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,'!')//

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

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

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

                存储过程迁移

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

                  DELIMITER //
                  CREATE PROCEDURE mysql_sp(IN x SMALLINT ,IN y SMALLINT ,OUT sum int)
                  BEGIN
                  SET  sum = x + y;
                  END //
                  DELIMITER ;

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

                  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 --debug
                    Traceback (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_log
                      AFTER DELETE
                      ON test1
                      FOR EACH ROW
                      BEGIN
                      set @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_log
                        2022-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不支持这种变量名加@,因此,实际迁移前需要仔细查看工具使用约束。

                        文章转载自Coding Big Tree,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论