---
title: 【数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践-官方技术文章-鲲鹏社区
description: 本文主要介绍使用chameleon工具进行从MySQL到openGauss的数据库对象迁移实践。
keywords: MySQL,Gauss,数据库迁移系,的数据库对象,迁移实践,官方技术文章,鲲鹏社区,软件安装
url: https://www.hikunpeng.com/developer/techArticles/20230915-1?envFlag=1
section: (其他)
---

# 【数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践-官方技术文章-鲲鹏社区

URL: https://www.hikunpeng.com/developer/techArticles/20230915-1?envFlag=1
描述: 本文主要介绍使用chameleon工具进行从MySQL到openGauss的数据库对象迁移实践。
关键词: MySQL,Gauss,数据库迁移系,的数据库对象,迁移实践,官方技术文章,鲲鹏社区,软件安装

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

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

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

实战经验

发表于 2022/11/07

0

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

（1）工具链：MySQL全量迁移支持并行迁移，提升全量迁移性能

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

（2）工具链：MySQL增量迁移支持十五级并行消费，提升增量迁移性能

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

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

（3）工具链：支持基于默克尔树的数据校

实现基于默克尔树的数据实时校验工具，支持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 [了解详情](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
```

## 数据库对象迁移测试

### 1. 初始化迁移过程

```
(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不支持的字段被注释 |

### 2. 视图迁移

（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。

### 3. 触发器迁移

（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中已经成功插入了数据。

### 4. 自定义函数迁移

（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。

### 5. 存储过程迁移

（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的。

### 6. 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不支持这种变量名加@，因此，实际迁移前需要仔细查看工具使用约束。

往期推荐：

如何使用DataChecker保证迁移后数据的正确性？ [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230912-9?envFlag=1)

如何使用pg_chameleon迁移MySQL数据库至openGauss [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230912-8?envFlag=1)

如何使用pgloader迁移MySQL数据库至openGauss [了解详情](https://www.hikunpeng.com/zh/developer/techArticles/20230912-6?envFlag=1)

openGauss 3.1.0版本正式发布 | 七个方面全面增强 [了解详情](http://mp.weixin.qq.com/s?__biz=MzIyMDE3ODk1Nw==&mid=2247505211&idx=1&sn=fbad1bc119b28296bfbd2f3e8845c4b5&chksm=97cd6a59a0bae34f5614050fac1bf5cf814d2db0f526fd9c0c3ccb6cd479d281b2bb2809b22b&scene=21#wechat_redirect)

本页内容
