服务从mysql迁移达梦数据库

一、背景

根据信创国产适配要求,针对业务系统迁移至达梦数据库,保持系统稳定、可靠。

当前系统技术栈:springboot+mybatis(3.5.9)+mybaits plus

我们采用的是拦截器方案,结合JavaAgent字节码增强技术,实现最小化代码改动。

二、迁移方案

  • 通过拦截器实现
  • 通过mybatis自带的databaseId 多数据源机制

三、梳理现有使用方式

使用方式 demoMapperXml demoMapperAnno demoMapper demoBeanService queryWrap

四、方案实现

3.1 拦截器方式实现

主要实现两个拦截器:

拦截器 作用 备注
mapper调用方法级别拦截器 拦截复杂sql的执行方法 精确到单个方法的拦截,仅对达梦不支持的方法进行更改
sql函数拦截器 简单的函数替换例如(​group_concat->WM_CONCA )

3.1.1 方法拦截器

实现原理

  • 在MyBatis调用Mapper方法时进行拦截
  • 自动将原方法调用重定向到对应的DM版本方法

示例:

// 原方法
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(@Param("id") Long id); 
// DM专用方法(仅当原SQL不兼容时需实现)
@Select("SELECT * FROM user WHERE id = #{id}") // 修改后的DM兼容SQL
User selectByIdDM(@Param("id") Long id);

拦截逻辑

  1. 检查是否存在原方法名+DM后缀的方法
  2. 存在则调用DM版本方法,否则调用原方法

3.1.2 sql函数拦截器

对sql的进行拦截并处理,处理简单函数转换

例如:

  • group_concat → WM_CONCAT

迁移SQL分类处理

类别 处理方式 示例
无需更改 直接执行 dm可以执行的sql
仅替换函数 函数拦截器处理 GROUP_CONCAT→WM_CONCAT
需要重写SQL 方法拦截器+DM方法 replace to > merge into
重写SQL+替换函数 方法拦截器+DM方法 包含特殊函数的复杂查询

代码整体情况

方法拦截器代码

@Intercepts({
        @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),
        @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})
})
@Log
public class DmMethodRouterInterceptor implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
//        System.out.println("DmMethodRouterInterceptor.intercept()");
        Object[] args = invocation.getArgs();
        MappedStatement ms = (MappedStatement) args[0];
        String methodId = ms.getId();
        // 如果是DM数据库且方法名不带Dm后缀
        if ( !methodId.endsWith("DM")) {
            try {
                // 尝试查找对应的Dm方法
                Configuration configuration =
您好!对于将MySQL迁移达梦数据库的问题,您可以按照以下步骤进行操作: 1. 首先,确保您已经在目标服务器上安装了达梦数据库,并且数据库服务正在运行。 2. 在MySQL中创建一个备份文件,以便将数据导出到达梦数据库。您可以使用mysqldump命令导出MySQL数据库。例如,执行以下命令导出名为"mydatabase"的数据库: ``` mysqldump -u [用户名] -p [密码] [mydatabase] > mydatabase.sql ``` 这将生成一个名为"mydatabase.sql"的备份文件。 3. 将备份文件传输到达梦数据库服务器上,您可以使用FTP或其他文件传输工具进行传输。 4. 在达梦数据库服务器上,使用达梦数据库客户端工具打开终端或命令提示符。 5. 创建一个新的数据库,用于存储MySQL数据。例如,执行以下命令创建名为"mydatabase"的数据库: ``` create database mydatabase; ``` 6. 导入MySQL备份文件到达梦数据库。例如,执行以下命令导入备份文件: ``` dm_import -u [用户名] -p [密码] -d mydatabase -f mydatabase.sql ``` 这将导入备份文件中的数据到达梦数据库中的"mydatabase"数据库。 7. 确认数据导入成功,您可以使用达梦数据库客户端工具连接到达梦数据库并验证数据是否正确导入。 请注意,由于MySQL达梦数据库之间的差异,某些功能和语法可能不兼容。在迁移过程中,您可能需要进行一些调整和修改以适应达梦数据库的要求。 希望这些步骤对您有所帮助!如果您还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值