【项目实战经验】DataKit迁移MySQL到openGauss(下)

上一篇我们分享了安装、设置、链接、启动等步骤,本篇我们将继续分享迁移、启动~

 

目录

 9. 离线迁移

9.1. 迁移插件安装

中断安装,比如 kill 掉java进程(安装失败也要等待300s)

下载安装包准备上传

缺少mysqlclient lib包

mysql如果是二进制安装的话,我这个版本是没有18这个lib包的

安装成功后的截图

 主机上有对应的进程

10. 全量迁移

10.1. 选中主机,启动迁移

 10.2. 迁移中

 10.3. 迁移结束

 10.4. 日志所在目录

11. 增量迁移

11.1. PG里面创建第二个库

 11.2. 创建在线迁移任务

 11.3. 启动

11.4. 在mysql端进行DDL和DML

mysql 端进行了5个事务

第6次增量

停止增量

 12. 反向迁移

 12.1. 在PG端进行增删改

12.2. PG端DDL 


 9. 离线迁移

 

 

 

 

 

9.1. 迁移插件安装

中断安装,比如 kill 掉java进程(安装失败也要等待300s)
update tb_migration_host_portal_install set install_status=10;

下载安装包准备上传

 

缺少mysqlclient lib包
  • mysql如果是二进制安装的话,我这个版本是没有18这个lib包的
[root@mysqldb lib]# ls -ltrh /usr/local/mysql/lib
total 1001M
-rw-r--r-- 1 mysql mysql 392M Jun 21  2023 libmysqld-debug.a
-rw-r--r-- 1 mysql mysql  43K Jun 21  2023 libmysqlservices.a
-rwxr-xr-x 1 mysql mysql  11M Jun 21  2023 libmysqlclient.so.20.3.30
-rw-r--r-- 1 mysql mysql  26M Jun 21  2023 libmysqlclient.a
-rw-r--r-- 1 mysql mysql 574M Jun 21  2023 libmysqld.a
lrwxrwxrwx 1 mysql mysql   25 Jun 21  2023 libmysqlclient.so.20 -> libmysqlclient.so.20.3.30
lrwxrwxrwx 1 mysql mysql   20 Jun 21  2023 libmysqlclient.so -> libmysqlclient.so.20
drwxr-xr-x 2 mysql mysql   28 Jan 10 13:36 pkgconfig
drwxr-xr-x 4 mysql mysql   28 Jan 10 13:36 mecab
drwxr-xr-x 3 mysql mysql 4.0K Jan 10 13:36 plugin
lrwxrwxrwx 1 root  root    25 Jan 10 14:41 libmysqlclient.so.18 -> libmysqlclient.so.20.3.30
  • 在porta安装日志下面,会有如下报错

[root@mysqldb logs]# cat /ops/portal/error.log 
/ops/portal/tools/chameleon/chameleon-5.1.0
install.sh: /ops/portal/tools/chameleon/chameleon-5.1.0/venv/bin/chameleon: /venv/bin/python3.6: bad interpreter: No such file or directory
Traceback (most recent call last):
  File "/ops/portal/tools/chameleon/chameleon-5.1.0/venv/lib/python3.6/site-packages/MySQLdb/__init__.py", line 18, in <module>
    from . import _mysql
ImportError: libmysqlclient.so.18: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:
  • 查看到符合当前mysql的版本,通过yum安装即可

Installed:
  mysql-community-libs-compat.x86_64 0:5.7.44-1.el7                                                                             

Complete!
[root@datakit bin]# rpm -ql mysql-community-libs-compat-5.7.44-1.el7.x86_64
/etc/ld.so.conf.d/mysql-x86_64.conf
/usr/lib64/mysql
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.so.18.1.0
/usr/lib64/mysql/libmysqlclient_r.so.18
/usr/lib64/mysql/libmysqlclient_r.so.18.1.0
/usr/share/doc/mysql-community-libs-compat-5.7.44
/usr/share/doc/mysql-community-libs-compat-5.7.44/LICENSE
/usr/share/doc/mysql-community-libs-compat-5.7.44/README
  • 其他有用命令

# 重新加载lib库
/sbin/ldconfig -v
# 查看位置
locate libmysql
# 手动配置lib库
vi /etc/ld.so.conf.d/mysql.conf
# 查看是否有对应的lib库
ldconfig -p|grep mysql
  • ldconfig,此时安装迁移插件应该没有问题

[root@mysqldb lib]# ldconfig -p|grep mysql
        libmysqlclient.so.20 (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so.20
        libmysqlclient.so.20 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.20
        libmysqlclient.so.18 (libc6,x86-64) => /usr/lib64/mysql/libmysqlclient.so.18
        libmysqlclient.so (libc6,x86-64) => /usr/local/mysql/lib/libmysqlclient.so
  • 如果是在线安装,会遇到403错误,现在要登陆了才能下载

download portal package failed: 
--2024-01-09 12:11:24--  https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/tools/PortalControl-5.1.0.tar.gz
Resolving opengauss.obs.cn-south-1.myhuaweicloud.com (opengauss.obs.cn-south-1.myhuaweicloud.com)... 122.9.127.163, 122.9.127.162
Connecting to opengauss.obs.cn-south-1.myhuaweicloud.com (opengauss.obs.cn-south-1.myhuaweicloud.com)|122.9.127.163|:443... connected.
HTTP request sent, awaiting response... 403 Forbidden
2024-01-09 12:11:25 ERROR 403: Forbidden.
  • 出现如下提示最终还是能成功安装的:

/ops/portal/tools/chameleon/chameleon-5.1.0 
install.sh: /ops/portal/tools/chameleon/chameleon-5.1.0
/venv/bin/chameleon: /venv/bin/python3.6: bad interpreter: No such file or directory
安装成功后的截图

 

 主机上有对应的进程
[root@mysqldb alternatives]# jps
19073 QuorumPeerMain
19122 SupportedKafka
4874 Jps
19487 SchemaRegistryMai

10. 全量迁移

10.1. 选中主机,启动迁移

 10.2. 迁移中

 10.3. 迁移结束

 

 

 10.4. 日志所在目录

[root@mysqldb datacheck]# pwd
/ops/portal/workspace/2/logs/datacheck
[root@mysqldb datacheck]# ls -ltrh
total 36K
-rw-rw-r-- 1 appadm appadm 2.2K Jan 10 15:31 business-source.log
-rw-rw-r-- 1 appadm appadm 2.1K Jan 10 15:31 business-sink.log
-rw-rw-r-- 1 appadm appadm  282 Jan 10 15:31 business-check.log
-rw-rw-r-- 1 appadm appadm 3.1K Jan 10 15:31 source.log
-rw-rw-r-- 1 appadm appadm 3.3K Jan 10 15:31 sink.log
-rw-rw-r-- 1 appadm appadm  422 Jan 10 15:31 kafka-sink.log
-rw-rw-r-- 1 appadm appadm  422 Jan 10 15:31 kafka-source.log
-rw-rw-r-- 1 appadm appadm 3.3K Jan 10 15:31 check.log
-rw-rw-r-- 1 appadm appadm 2.1K Jan 10 15:31 kafka-check.log

[root@mysqldb datacheck]# ls -l /ops/portal/workspace/2/logs/
total 24
drwxrwxr-x 2 appadm appadm   204 Jan 10 15:30 datacheck
drwxrwxr-x 2 appadm appadm    51 Jan 10 15:30 debezium
-rw-rw-r-- 1 appadm appadm   162 Jan 10 15:31 error.log
-rw-rw-r-- 1 appadm appadm 17400 Jan 10 15:31 full_migration.log

[root@mysqldb datacheck]# find /ops -name schema-registry.log
/ops/portal/workspace/2/logs/debezium/schema-registry.log
/ops/portal/tools/debezium/confluent-5.5.1/logs/schema-registry.log

11. 增量迁移

11.1. PG里面创建第二个库

create database world2 with dbcompatibility='b';

 11.2. 创建在线迁移任务

 11.3. 启动

 

  • 全量迁移完成并校验成功后进入增量迁移

 

 

11.4. 在mysql端进行DDL和DML

mysql 端进行了5个事务
root@localhost 16:08:00 [world]> create table t1(id int primary key,name varchar(32));
Query OK, 0 rows affected (0.01 sec)

root@localhost 16:08:31 [world]> insert into t1 values(1,'zhangsan');
Query OK, 1 row affected (0.01 sec)

root@localhost 16:08:45 [world]> insert into t1 values(2,'22'),(3,'33');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@localhost 16:09:00 [world]> create table city_copy like city;
Query OK, 0 rows affected (0.03 sec)

root@localhost 16:09:22 [world]> insert into city_copy select * from city;
Query OK, 4079 rows affected (0.06 sec)
Records: 4079  Duplicates: 0  Warnings: 0

 上面一直卡住,再起一个的时候报错(内存不足):

OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000680000000,

中间还有一次翻车了

py_opengauss.exceptions.ClientCannotConnectError: could not establish connection to server
CODE: 08001
LOCATION: CLIENT
CONNECTION: [failed]
failures[0]:
socket('192.168.2.3', 5432)
py_opengauss.exceptions.InsufficientPrivilegeError: Please use the original role to connect B-compatibility database first, to load extension dolphin
CODE: 42501
LOCATION: SERVER
CONNECTOR: [IP4] pq://datakit:***@192.168.2.3:5432/world4?[sslmode]=disable
category: None
DRIVER: py_opengauss.driver.pq3.Driver
第6次增量

在mysql端进行增删改和DDL

root@localhost 16:48:04 [world]> delete from t1 where id=3;
Query OK, 1 row affected (0.01 sec)

root@localhost 16:48:12 [world]> insert into t1 values(4,44);
Query OK, 1 row affected (0.01 sec)

root@localhost 16:48:24 [world]> update t1 set name=222 where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@localhost 16:48:36 [world]> update t1 set name=2223 where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

root@localhost 16:49:03 [world]> create table t2 (id int primary key, name char(20));
Query OK, 0 rows affected (0.01 sec)

root@localhost 16:49:41 [world]> insert into t2 select * from t1;
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

 

停止增量

 12. 反向迁移

 

 12.1. 在PG端进行增删改

world4=# \c world4
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "world4" as user "omm".
world4=# set search_path=world;
SET
world4=# select * from t2;
 id |         name         
----+----------------------
  1 | zhangsan            
  2 | 2223                
  4 | 44                  
(3 rows)

world4=# insert into t2 values(5,55);
INSERT 0 1
world4=# update t2 set name=5555 where id=5;
UPDATE 1
world4=# delete from t2 where id=1;
DELETE 1

 

12.2. PG端DDL 

PG建表无法同步到mysql,但是继续在PG继续进行DML,原有表的数据依然能同步到mysql

orld4=# create table pg_table( id bigint primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "pg_table_pkey" for table "pg_table"
CREATE TABLE
world4=# create table t3(id bigint primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t3_pkey" for table "t3"
CREATE TABLE
world4=# show tables;
 Tables_in_world 
-----------------
 city
 city_copy
 country
 countrylanguage
 pg_table
 t1
 t2
 t3
(8 rows)

world4=# update t2 set name=55555555 where id=5;              
UPDATE 1
world4=# create table t4(id bigint);
CREATE TABLE
world4=# insert into t4 values(1),(2);
INSERT 0 2
world4=# select * from t4;
 id 
----
  1
  2
(2 rows)

 

 


root@localhost 17:01:41 [world]> show tables;
+-----------------+
| Tables_in_world |
+-----------------+
| city            |
| city_copy       |
| country         |
| countrylanguage |
| t1              |
| t2              |
+-----------------+
6 rows in set (0.00 sec)

root@localhost 17:03:08 [world]> select * from t2;
+----+----------+
| id | name     |
+----+----------+
|  2 | 2223     |
|  4 | 44       |
|  5 | 55555555 |
+----+----------+
3 rows in set (0.00 sec)

至此,迁移部分实践分享结束,欢迎大家一起交流学习。

<think>好的,用户的问题是关于Dolphin插件和内核如何实现MySQLOpenGauss之间的全量语法兼容,以及如何通过该插件让MySQL客户端和JDBC直接访问OpenGauss而不需要修改应用程序。我需要先理解Dolphin插件的基本原理和架构。 首先,用户提到“全量语法兼容”,这可能意味着Dolphin插件需要处理SQL语法的差异。例如,MySQLOpenGauss在某些SQL语法上可能有不同的实现,比如数据类型、函数名或特定的语法结构。Dolphin插件可能需要在解析阶段将这些MySQL特有的语法转换为OpenGauss能理解的格式。这可能需要一个语法转换层或者兼容层。 接下来,用户提到允许MySQL客户端和JDBC直接访问OpenGauss。这可能涉及到协议兼容性。MySQL客户端与服务器通信使用的是特定的协议,比如认证方式、数据包格式等。如果OpenGauss要接受MySQL客户端的连接,Dolphin插件可能需要实现MySQL的通信协议,使得客户端认为它正在与MySQL服务器交互,而实际上请求被转发到OpenGauss处理。这可能包括处理认证过程、SQL语句的转发和结果集的返回格式。 然后,参考信息中提到了DataKit迁移MySQLOpenGauss时,需要处理libmysqlclient的库文件。这可能意味着Dolphin插件需要链接或模拟MySQL的客户端库,以便在OpenGauss中处理来自MySQL客户端的请求。例如,可能需要动态加载这些库或者实现兼容的接口。 另外,用户提到无需修改应用程序,这说明Dolphin插件需要完全透明地处理所有兼容性问题。这可能涉及到对数据类型、函数、存储过程、事务处理等方面的兼容性处理。例如,MySQL的AUTO_INCREMENT和OpenGauss的SERIAL可能需要自动转换,或者某些内置函数如DATE_FORMAT可能需要映射到OpenGauss的等效函数。 还需要考虑JDBC驱动的问题。JDBC驱动通常依赖于特定的数据库URL格式和驱动类。Dolphin插件可能需要提供一个兼容MySQL的JDBC驱动,或者配置OpenGauss的JDBC驱动以接受MySQL的连接字符串和参数,从而让现有的应用程序无需更改驱动配置即可连接。 此外,全量语法兼容可能还包括错误码和消息的兼容。当执行SQL时,如果出现错误,MySQLOpenGauss可能返回不同的错误码和消息。Dolphin插件可能需要捕获OpenGauss的错误,并将其转换为MySQL客户端预期的错误码和消息,以避免应用程序因错误处理逻辑而失败。 还有事务和锁机制的差异需要处理。MySQLOpenGauss在事务隔离级别、锁机制等方面可能有不同的实现,Dolphin插件需要确保在这些方面的行为对客户端来说是一致的,或者进行适当的转换,使得应用程序的行为在迁移后保持一致。 另外,存储过程和触发器的兼容性也是一个重要方面。如果应用程序使用了MySQL特定的存储过程语法,Dolphin插件需要能够解析并在OpenGauss中执行等效的逻辑,或者将其转换为OpenGauss支持的PL/pgSQL或其他过程语言。 还需要考虑性能问题,兼容层可能会引入额外的开销,Dolphin插件需要优化转换和处理逻辑,以确保性能不会成为瓶颈。例如,通过预编译语句、缓存转换结果或批量处理请求来减少延迟。 最后,用户可能还关心Dolphin插件的安装和配置步骤,以及如何与现有的OpenGauss环境集成。参考信息中提到了ldconfig和库文件的路径,这可能涉及到动态库的配置和环境变量的设置,确保插件能够正确加载所需的依赖库。 总结来说,Dolphin插件需要在协议层、语法层、功能层等多个层面实现兼容,确保MySQL客户端和JDBC驱动能够无缝连接到OpenGauss,而应用程序无需修改。这涉及到大量的适配和转换工作,以及对两者差异的深入理解。</think>Dolphin插件通过语法兼容层、协议适配和内核扩展三大核心机制,实现MySQLopenGauss之间的全量语法兼容。其架构设计包含以下关键环节: 1. **语法兼容层实现** - 构建MySQL语法解析器,支持$CREATE TABLE...ENGINE=InnoDB$等MySQL特有语法 - 实现$SHOW TABLES$/$SELECT @@tx_isolation$等300+MySQL特有命令的语法树转换 - 自动转换差异数据类型,如将MySQL的$TINYINT(1)$映射为openGauss的$BOOLEAN$[^1] 2. **协议级兼容** ```python # 协议适配流程示例 def handle_mysql_packet(packet): if packet.type == AUTH_PACKET: return opengauss_auth(packet) # 认证协议转换 elif packet.type == QUERY_PACKET: translated_sql = sql_parser.convert(packet.sql) return opengauss_execute(translated_sql) # SQL转换执行 ``` 3. **内核扩展机制** - 新增dolphin扩展模块,通过hook函数拦截特定语法 $$ \text{OriginalSQL} \xrightarrow{\text{DolphinHook}} \text{TransformedSQL} $$ - 实现差异函数映射,如将MySQL的$DATE_FORMAT()$转换为openGauss的$TO_CHAR()$
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值