664  
查询码:00000131
MySQL数据库迁移至达梦DM数据库中的注意事项
作者: 潘帅 于 2020年11月12日 发布在分类 / 人防组 / 人防后端 下,并于 2020年11月12日 编辑
达梦数据库

1.通过配置文件在后台服务中切换数据库

在近期的项目中存在多种类型的数据库,为了让同一套代码在不同的数据库环境下切换使用,通过修改后端代码使得服务部署后能够通过修改配置文件实现数据库的切换。

已现有的ABP框架为例,数据库相关配置位于基础设施层EntityFrameworkCore项目中。

1.1修改数据上下文配置项类DbContextOptionsConfigurer

修改使用数据库的方法,因为默认是只能使用一种数据库,要修改数据库类型就需要改代码。通过判断语句让程序初始化是自动选择数据库驱动。

        public static void Configure(DbContextOptionsBuilder<ConstructionDbContext> dbContextOptions,string connectionString,bool isDm)
        {
            /* This is the single point to configure DbContextOptions for PersonnelDbContext */
            if (isDm)
            {
                dbContextOptions.UseDm(connectionString);
            }
            else
            {
                dbContextOptions.UseMySql(connectionString);
            }
        }

1.2修改数据上下文工厂类ConstructionDbContextFactory


        public ConstructionDbContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<ConstructionDbContext>();
            var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());
            bool isDm = configuration["ConnectionStrings:IsDameng"] == "true"?true:false;//是否为达梦数据库

            string connectionString = configuration.GetConnectionString(RunGoConsts.DefaultConnectionStringName);//默认数据库连接字符串
            if (isDm)
            {
                connectionString = configuration.GetConnectionString(RunGoConsts.ExtendConnectionStringName);//达梦数据库连接字符串
            }

            DbContextOptionsConfigurer.Configure(builder,connectionString,isDm);

            return new ConstructionDbContext(builder.Options);
        }

1.3修改展现层Web项目的启动类Startup

读取配置文件关于数据库的选项,在启动时初始化数据库仓储。

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {

            bool isDm = _appConfiguration["ConnectionStrings:IsDameng"] == "true" ? true : false;//是否为达梦数据库

            //Configure DbContext
            services.AddAbpDbContext<ConstructionDbContext>(options =>
            {
                DbContextOptionsConfigurer.Configure(options.DbContextOptions, options.ConnectionString, isDm);
            });
//////
}

1.4修改Web项目的配置文件appsetting.json

当IsDameng为true时,服务使用Extend项作为数据库连接字符串(此处为达梦数据库);当IsDameng为false时,服务使用Default项作为数据库连接字符串;

  "ConnectionStrings": {
    "IsDameng": "true",
    "Default": "Server=192.168.199.221; Database=Construction_dev; User ID=root; Password=admin@123;port=3306",
    "Extend": "Server=192.168.199.2:5236;UID=CONSTRUCTION;Password=admin@123;"
  },
注意:使用数据库切换的前提是要安装MySQL和达梦数据库的驱动。


2.MySQL数据库迁移至达梦数据库的常见问题

在上面步骤中,代码层面的数据库切换已经准备好了,下面就是数据库层面的切换了。但在实际操作过程中,会出现各种不同类型的问题。

对于已有的MySQL数据库,一般使用达梦官方提供的数据迁移工具进行迁移。在安装了达梦数据库的计算机上可以找到。

粘贴图片

按照引导步骤一步步操作就能完成数据库迁移。

常见问题有以下几项 :

2.1.MySQL驱动问题

DM数据迁移工具默认使用的是MySQL 5.0的驱动,经常会出现连接失败的问题。通过下载较高版本的MySQL驱动解决。

粘贴图片


驱动包下载

2.2.数据库表空间问题

MySQL数据库默认是在一个表空间下的,一个数据库实例中包含多个库;而达梦数据库中是按照模式区分的。所以迁移时MySQL数据库中的所有库中的表都会出现在源对象中,需要手动选择相应的表迁移至达梦数据库的指定模式中。

当源对象较多时,只能通过查找功能搜索相应的表进行迁移。

粘贴图片


2.3.数据库表名的问题

不同数据库中表名的规则也不同,比如MySQL默认小写,SQL Server区分大小写,达梦则是默认大写。MySQL数据库迁移到达梦数据库后表名会全部变为大写,运行后端服务就会报错“不存在相应的表”。

使用迁移工具时可以勾选“保持对象名大小写”,确保表名不会发生变化。

粘贴图片


2.4.数据增删改查失败的问题

数据库切换后,同样的代码使用SQLServer没有问题,使用MySQL没有问题,使用达梦DM数据库却不行。这类问题出现的最多,原因也是五花八门,也比较难排除。但总体来讲不是达梦数据库本身的问题,更多的是开发人员自身和代码的问题。

  1. 文本格式问题:MySQL中的longtext类型在DM中会被转换为Clob类型,建议在MySQL中把longtext改为varchar并限制长度;
  2. 数据格式问题:MySQL中的decimal类型默认长度65、精度30,在DM中对应DEC类型精度38、标度30,在后端接口中执行插入操作就会出现格式转换失败的错误。这么高的精度完全没有必要,而且对于decimal类型在领域层的实体中就要对其格式进行约束。
  3. 时间格式问题:MySQL中的Datetime类型在DM中会被转为TIMESTAMP类型,建议将TIMESTAMP类型改为DATETIME类型。

问题还在持续发现,后续会不断完善更新。开发人员也要严格规范自己的代码,把细节做好,才能避免出现更多问题。







 推荐知识

 历史版本

修改日期 修改人 备注
2020-11-12 15:39:45[当前版本] 潘帅 1.0

 附件

附件类型

RARRAR PNGPNG

知识分享平台 -V 4.8.7 -wcp