从 MySQL 到 openGauss 的数据库对象迁移实战演练
2022 年 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 时,源端与目的端数据全量和增量校验。
上一篇学习了从 Oracle 11g 迁移到 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/download/ 获取获取工具包: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 不支持这种变量名加 @,因此,实际迁移前需要仔细查看工具使用约束。
相关文章
- MySQL数据库实践学习(二)
- MySQL求两个时间差的计算方法(mysql两个时间差)
- MySQL无限极分类实现与技巧(mysql无限极分类)
- MySQL数据库引擎查询详解(查询mysql引擎)
- 使用百度云搭建MySQL数据库:体验新方便(百度云mysql数据库)
- MySQL中调用存储过程函数的方法(mysql过程调用函数)
- 保护MySQL数据库安全:密码保护的重要性(mysql数据库的密码)
- 填坑记:MySQL常见问题及如何解决(mysql常见的坑)
- MySQL数据库:从入门到精通(mysql数据库应用从入门到精通)
- MySQL查看数据库隔离级别(mysql查看隔离级别)
- MySQL数据库字段删除操作,简单易懂!(删除mysql数据库字段)
- MySQL 存储过程与数据管理(mysql存储过程数据)
- 「掌握主机屋MySQL数据库的重要性」(主机屋mysql数据库)
- leave like语句的应用MySQL中CASELIKE语句的应用(mysql中case)
- MySQL文件目录管理之旅(mysql文件目录)
- MySQL数据库的共享技术(mysql共享)
- php安全:MySQL数据库安全技巧(php安全mysql)
- MySQL数据库精通:百度网盘免费课程(mysql教程百度网盘)
- Mastering MySQL: A Guide to Setting Up and Configuring MasterSlave Replication(mysql的主从配置)
- 数据库比较:MSSQL与MySQL(mssql与mysql)
- MySQL Sparks Innovation: Latest News Unveils Exciting Content(mysql新闻内容)
- 使用特殊符号在MySQL中进行数据操作(特殊符号mysql)
- MySQL查看数据库:掌握必备的SQL语句(mysql查看数据库语句)
- MySQL数据库的归档管理策略(mysql数据库归档)
- MySQL中的file类型存储文件路径的最佳选择(mysql中file类型)
- MySQL转换Oracle实现数据库迁移(mysql转换oracle)
- 35岁学习MySQL是否值得一试(35岁学mysql有用吗)
- 解决CMD下无法执行MySQL指令的方法(cmd不能使用mysql)
- MySQL括号应用优化查询效率(mysql 中包含括号)
- MySQL数据库一般需要配备多大的磁盘(mysql一般配多大磁盘)
- 使用MySQL数据库管理数据(mysql_db_)
- 解决MySQL中文乱码问题简单方法(mysql z中文乱码)
- 解析MySQL无行锁优势与风险(mysql不加行锁)
- MySQL下载指南安装不同版本的数据库管理系统(mysql下载 不同版本)
- MySQL上季度数据统计回顾(mysql 上季度)