关系型数据库迁移达梦数据库

前言
本文章描述对于金融机构纷纷转用国产数据库进行市场调研,在业务背景中做了粗略说明。同时详细介绍达梦数据库特性和优势。在项目中通常会使用第三方组件,在文章中以Flowable为例提供了解决方案。

业务背景
随着国家有关部门近年来陆续出台相关政策指导文件,推动探索安全可控的金融科技产品,加强银行业信息安全建设,国内众多金融政企机构纷纷开始探索改造原有IT系统,对国产化数据库的需求日益强烈。
除了政策指导以外,金融机构纷纷选择国产化数据库很重要的原因是“降本增效”。传统集中型数据库,成本高、扩容难、依赖资源堆砌来保证数据库可用性和扩展性,这种方案正面临越来越大的压力。自主可控的国产达梦通用性、高性能、高安全性、高可靠、高可用性、易用性、海量数据存储和管理、全文索引、对存储模块的支持。
金融数据如何平滑迁移至国产化数据库。在金融业务场景中,数据库迁移升级、数据分发与数据备份是数据库系统必不可少的基本功能。其中数据库迁移升级、数据分发是实现数据解耦及汇总的重要基础,例如:保险行业常见的总分系统架构,多个子库需要实时的将业务数据同步至总库汇总查询;银行核心交易系统中,需要将交易数据实时同步至分析子系统进行报表,跑批等业务员操作。而数据备份则是数据安全的基石,更是金融业务数据的生命线。

达梦介绍
达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦数据库管理系统的最新版本是8.0版本,简称DM8。
DM7采用全新的体系架构,在保证大型通用的基础上,针对可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLTP和OLAP请求,从根本上提升了DM8产品的品质。
全文检索:DM提供多文本数据检索服务,包括全文索引和全文检索。全文索引为在字符串数据中进行复杂的词搜索提供了有效支持。全文索引存储关于词和词在特定列中的位置信息,全文检索利用这些信息,可快速搜索包含具体某个词或某一组词的记录。DM的全文索引支持中、英、俄文等多种语言。
多字符集支持:为了实现对多种语言的存储和访问,达梦数据库采用两种编码方式来存储数据。一种是根据操作系统所提供的系统默认编码来进行存储,一种是利用Unicode编码来进行存储。由于Unicode的一致性,它在大多数情况下都可能简化软件的国际化过程。它取消了处理多种代码页的必要,并且由于是采用多字节进行编码,因此由双字节字符集所引起的额外处理也不必要了。达梦数据库已经能够有效支持包括中、英、俄、韩、日文等在内的多种字符集。
物理数据页大小可选:物理数据页是系统内部数据组织的基本单位。系统的高速磁盘缓冲、 I/O等都以数据页为单位进行。DM系统允许用户在建立系统时,可在4K、8K、16K或32K中任选一个值作为页的大小,以达到最优的应用系统性能。
代理服务与作业调度:在DM系统中,代理服务是运行在服务器端,调度并执行作业、监视警报的服务。通过它用户可以自动执行部分管理任务,如定期备份、出错通知等,减轻工作负担。必须启动代理服务后,作业与调度才能正常工作。代理服务加载系统定义的所有作业,并根据其调度信息安排其执行时间。当特定的时刻到来时,启动作业,并依次执行作业包含的每个步骤。代理服务不仅监控时间事件,同时也监控服务器内部的警报事件,当服务器在运行中产生某个特定事件时(如执行操作失败),代理服务会检测到这个事件的发生,并触发相应的警报。
多媒体和空间信息支持:DM采用创新的混合数据库模型,扩展的多媒体和GIS数据类型等技术,成功实现了空间数据、多媒体数据与常规数据的一体化定义、存储和管理,在空间地理信息及多媒体信息管理方面具有明显的优势。此外,DM系统还提供了地理信息的分层检索、限定检索、漫游、特写、局部放大、叠加等功能。
迁移前期准备与常见问题解决方案
迁移前的准备工作查看数据格式检查、数据长度检查、区间范围检查、空值、默认值检查、完整性检查、一致性检查。如图所示迁移支持的数据库。

  1. 达梦数据库默认是大写,会照成我们前端获取的时候全部变成大写,所以我们需要取改动量比较小的方式去迁移,所以我们在安装时这里配置好大小写敏感。
  2. 建议不要用root用户安装,检查系统限制,检查系统内存与存储空间。 安装完数据库后,初始化实例。 Sql中达梦不支持单引号。、
  3. 如果在安装是未设置大小写敏感需要修改所以代码中的get(“”)取值,请安装时设置好避免此类问题。
  4. 达梦中没有FIND_IN_SET函数,需要使用存储过程替代。 GROUP_CONCAT函数修改成wm_concat() 函数。 JPA sql in中获取List数组写法不支持,请更换更换mybatis写法并且#号要更换成$符号。
  5. ADMIN与USER…等关键字问题请在表中更换名称,在代码中取重命名的名称,在使用map或json放到原来的关键字中即可使用,以免修改前端
  6. 达梦中使用group up请包涵所有的列

达梦兼容第三方组件
以Flowable工作流引擎为例兼容达梦数据库。目前大部分第三方组件是不支持达梦数据库,所以我们需要源码二次开发去兼容。

Flowable是Activiti原班主创人员从activiti-6.0.0.Beta4 分支重新开发出来的一套工作流引擎,是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎,易于与 Spring集成使用。

问题:Flowable启动项目,报错信息如下: couldn’t deduct database type from database product name ‘DM DBMS’。说明Flowable并不认识国产数据库,需要修改源码。

解决方案:在Flowable源码项目中搜索AbstractEngineConfiguration文件,修改其中getDefaultDatabaseTypeMappings方法,从下图可见,增加达梦数据库标识。

public static final String DATABASE_TYPE_ORACLE = "oracle";

public static Properties getDefaultDatabaseTypeMappings() {
    databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);
// 兼容达梦数据库 **
    databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_ORACLE);
    return databaseTypeMappings;
}

Flowable中的Liquibase 是一个用于跟踪,管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据) 都保存在XML文件中,便于版本控制。liquibase说白了就是一个将你的数据库脚本转化为xml格式保存起来,其中包含了你对数据库的改变,以及数据库的版本信息,方便数据的升级和回滚等操作。

问题:于达梦数据库不能自动转换true/false为1/0。

解决方案: Liquibase源码中覆盖了com.alibaba.druid.pool.DruidPooledStatement,将其中的executeUpdate和execute方法中待执行的SQL语句做了转换。

@Override
public final boolean execute(String sql) throws SQLException {
    checkOpen();
    incrementExecuteCount();
    transactionRecord(sql);
    try {
        if (StringUtils.isNotEmpty(sql)){
            sql = sql.replace("TRUE", "1");
            sql = sql.replace("FALSE", "0");
        }
        return stmt.execute(sql);
    } catch (Throwable t) {
        errorCheck(t);
        throw checkException(t, sql);
    }
}

总结
随着国家对信创工程的日益重视,目前采用有自主知识产权的国产数据库将成为主流。 DM 数据库和 MySQL 体系结构上存在差异,SQL 语法也存在一定的差异。DM 数据库针 对 MySQL 做了部分兼容性。但由于有根本性的差异,兼容度不高。从 MySQL 迁移到 DM 数 据库,DM 数据库提供了自动数据迁移工具,但在开发级别还需要一定的人工干预。

MySQL 到 DM 的迁移主要有分析待移植系统,确定移植对象、通过数据迁移工具 DTS 完成常规数据库对象及数据的迁移。通过人工完成 MSQL 的移植、移植完成后对移植的结果进行校验,确保移植的完整性和正确性、对应用系统进行移植、测试和优化。

项目中使用第三方组件,如果是开源的可以通过修改源码的方式去解决兼容性问题,上述以Flowable为例描述了兼容的详细过程。项目不同所使用的组件也有所差异,通过源码二次开发完全可以解决目前所遇到的项目难点,也可以通过达梦官方社区参与提问。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

隨時隨地-在等待

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

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

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

打赏作者

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

抵扣说明:

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

余额充值