数据库迁移系列从mysql到opengauss的数据库对象迁移实践(代码片段)

Gauss松鼠会 Gauss松鼠会     2022-12-12     520

关键词:

之前这一篇中我们分享过使用chameleon工具完成MySQL到openGauss的全量数据复制、实时在线复制。9.30新发布的openGauss 3.1.0版本 ,工具的全量迁移和增量迁移的性能不但有了全面提升,而且支持数据库对象视图、触发器、自定义函数、存储过程的迁移。

本篇就来分享一下使用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_objectbigintid
i_id_sourcebigint与sch_schema.t_sources的id相对应
en_object_type枚举类型迁移对象所属类型(VIEW/TRIGGER/FUNC/PROC)
ts_createdtimestamp with time zone迁移时间
b_statusboolean迁移状态。true表示迁移成功,false表示迁移失败
t_src_object_sqltext原始sql语句
t_dst_object_sqltext翻译后的语句。若无法翻译或者翻译出现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;

  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_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

  1. 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,'!')//

启动迁移操作,如下图所示,总共两个,成功两个。
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)
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不支持这种变量名加@,因此,实际迁移前需要仔细查看工具使用约束。

🍒如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果三连点赞评论收藏就更好啦!谢谢各位大佬给予的支持!

❤️‍如何使用pgloader迁移mysql数据库至opengauss❤️‍(代码片段)

...两种工作模式,一种是从文件导入,一种是迁移数据库。pgloader在两种情况下都使用PostgreSQL的COPY协议高效的传输数据。openGauss兼容PostgreSQL的通信协议以及绝大部分语法,可使用pgloa 查看详情

❤️‍如何使用pg_chameleon迁移mysql数据库至opengauss❤️‍(代码片段)

❤️‍大家好,我是Gauss松鼠会,欢迎进来学习啦~❤️‍👇👇👇pg_chameleon介绍pg_chameleon是一个用Python 3编写的实时复制工具,经过内部适配,目前支持MySQL迁移到openGauss。工具使用mysql-replication库从MyS... 查看详情

仅将表数据从 MSSQL 迁移到 MySQL

...布时间】:2019-09-1705:03:14【问题描述】:负责将代码优先数据库从MSSQL迁移到MySQL。经过几个小时的功夫,我能够让asp.net核心项目正确部署所有迁移到mysql。现在我需要迁移现有mssql表中的数据。我看到提到MySQLMigrationToolkit的帖子... 查看详情

使用 pymongo 将数据从 Mysql 迁移到 MongoDB

】使用pymongo将数据从Mysql迁移到MongoDB【英文标题】:MigratedatafromMysqltoMongoDBusingpymongo【发布时间】:2021-11-0505:44:04【问题描述】:我正在创建一个脚本Python(使用pymongo)来将我的数据从Mysql迁移到MongoDB(500万行),但是我遇到... 查看详情

从mysql迁移到sql server

...在使用SQl迁移工具,但已经走到了这一步。当我选择我的数据库时:nih_bw我无法访问“转换架构”。当我双击数据库时,我得到:TargetMetadatadoesnotex 查看详情

如何将数据库从 Filemaker 迁移到 Mysql?

】如何将数据库从Filemaker迁移到Mysql?【英文标题】:HowtomigratethedatabasefromFilemakertoMysql?【发布时间】:2011-10-2617:28:40【问题描述】:我正在重建一个基于Symfony1.4和MySQL5.1的ERP系统。挑战在于以前的系统是在FilemakerPro上构建的,... 查看详情

如何使用文件将数据从 mysql 迁移到 clickhouse?

...我需要将数据从Mysql迁移到ClickHouse并做一些测试。这两个数据库网络都不行,我只好用文件来传输。我首先想到的是可以使用mysqldump工具导出.sql文件。mysqldump-t-h192. 查看详情

将数据和架构从 MySQL 迁移到 SQL Server

...:10【问题描述】:是否有任何免费的解决方案可以自动将数据库从MySQL迁移到“正常工作”的SQLServerServer?我整天都在尝试这个简单的(至少我是这么认为的)任务。我试过了:SQLServerManagementStudio的导入数据功能创 查看详情

从 MySQL 迁移到 PostgreSQL [关闭]

...是出于许可原因。有没有其他人做过这样的举动?我们的数据库是应用程序的命脉,最终将存储TB的数据,所以我很想听听性能改进/损失、转换SQL和存储过程的 查看详情

从 mysql 迁移到 postgresql 时,Laravel 雄辩的 ORM 不起作用

...2017-12-1813:50:34【问题描述】:ORM的基本特性通常说是因为数据库迁移很容易从一个数据库迁移到另一个数据库。在这里,我最初在我的项目中使用了MySQL数据库,并计划将其迁移到PostgreSQL。 查看详情

opengauss数据库源码解析系列文章——审计与追踪(代码片段)

...计日志设计审计内容的记录方式通常有两种:记录到数据库的表中、记录到OS文件中。openGauss采用记录到OS文件中(即审计日志& 查看详情

将数据库数据从 mssql 迁移到 mysql

】将数据库数据从mssql迁移到mysql【英文标题】:migratingdatabasedatafrommssqltomysql【发布时间】:2017-09-3016:59:30【问题描述】:mssql数据库有数据,我想将它移动到mysql数据库。数据来自的表与我将数据放入的表不同。我在想的是做一... 查看详情

如何从 ms sql 迁移到 mysql

...09-0405:14:22【问题描述】:有没有什么软件可以用来将mssql数据库转换成mysql?我测试了使用mssqlservermanagementstudio导出mssql数据库。并使用phpmyadmin导入sql文件。但是我收到了这个错误:USE[students]GO/******Object:Ta 查看详情

将 mysql db 从 XAMPP 迁移到 WAMP

...:20:12【问题描述】:我在xampp中使用phpmyadmin构建了一个sql数据库。我现在正在切换到wamp。为了传输数据库,我从xampp复制了数据库文件,位于xampp//...mysql/data//并将它们粘贴到wamp//...mysql/data//。但是,当我从wa 查看详情

Django 从 MySQL 迁移到 Postgres

...迁移方法,我查看了py-mysql2pgsql但这导致了我无法追踪的数据库中的问题。我还使用django-admin. 查看详情

将数据从 MySQL 迁移到 SQL Server

...Server中。那么有没有什么办法可以得到一个.bak格式的MySQL数据库备份文件呢?另外,有没有更简单、更容易的方法?【问题讨论】:您始终可以将转储文件扩展名指定为.bak.bak是特定于 查看详情

从 MySQL 到 SQL Server 的 Hibernate + Spring 迁移

...】:2016-08-1219:05:08【问题描述】:我最近在我的项目中将数据库从MySQL迁移到SQLServer,但是在对数据库执行查询时出现此错误(ConversionfromBINARY到BYTE不受支持)。我在我的项目中进行了这些更改:我使用S 查看详情

使用 MySQL Workbench 从 PostgreSQL 迁移到 MySQL 会引发错误

...5:55:20【问题描述】:我正在尝试使用MySQLWorkbench将PostreSQL数据库迁移到本地MySQL服务器。我已经设置了两个连接,对其进行了测试并成功,选择了要迁移的架构并单 查看详情