docker安装达梦数据库最佳实践

达蒙数据库

数据库安装部署

下载地址:

到官网docker部署那一章节,下载镜像tar包,上传到服务器上后,运行下面的命令 docker安装启动脚本:

docker run -d -p 5236:5236 
--restart=always 
--name dm8_01 
--privileged=true 
-e CASE_SENSITIVE=0 
-e UNICODE_FLAG=1 
-e LENGTH_IN_CHAR=1 
-e PAGE_SIZE=16 
-e LD_LIBRARY_PATH=/opt/dmdbms/bin 
-e INSTANCE_NAME=dm8_01 
-v /data/dm8_01:/opt/dmdbms/data 
dm8_single:v8.1.2.128_ent_x86_64_ctm_pack4

说明:

    CASE_SENSITIVE=0 设置大小写不敏感 LENGTH_IN_CHAR=1 VARCHAR 类型对象的长度以字符为单位 UNICODE_FLAG 字符集 (0),可选值: 0[GB18030], 1[UTF-8], 2[EUC-KR]

备注:安装好达梦数据库后,需要新建库名、新建用户、分配这个用户的权限和所拥有的库

mysql迁移到达梦

    dm.ini修改兼容参数 在迁移数据之前,需要修改 DM 数据库参数,修改兼容参数为兼容 MySQL 数据库 COMPATIBLE_MODE=4 ,重启数据库服务使其生效即可 迁移工具设置映射字段修改 数据类型映射 -> MySQL/DM -> 源数据类型名(DOUBLE)映射到 目的数据类型名(VARCHAR)

java适配

添加驱动

此驱动可直接网络下载到本地maven仓库

<!-- 添加 达梦数据库 驱动-->
<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmJdbcDriver18</artifactId>
    <version>8.1.2.79</version>
</dependency>

jpa服务

event、app、fileupload服务

  1. 进入到本地的安装目录 dmdbms8/drivers/jdbc/dialect,上传对应版本的方言包到本地仓库
mvn install:install-file -DgroupId=com.dameng -DartifactId=DmDialect-for-hibernate -Dversion=5.4 -Dpackaging=jar -Dfile=DmDialect-for-hibernate5.4.jar
  1. 配置文件添加对应的方言配置 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect spring.jpa.database-platform=org.hibernate.dialect.DmDialect

mysql和达梦数据库的差别

达梦开发指南

https://eco.dameng.com/document/dm/zh-cn/sql-dev/practice-single-table.html

关键字

    查询字段不能是admin、damain、order,否则报错 达梦不支持LocalDateTime,需要适配(两种方案) 第一种:common包中添加适配类 第二种:使用最新的达梦在线驱动依赖包并去掉druid依赖

语法兼容

  1. 创建表的时候,不支持在列的后面直接加 comment 注释,使用 COMMENT ON IS 代替,如: COMMENT ON TABLE xxx IS xxx COMMENT ON COLUMN xxx IS xxx
  2. 字段不支持反引号``包裹(mysql可兼容)
  3. 查询字段不允许双引号包裹,如,SELECT vc_direct AS "direct"(mysql可兼容)
  4. like "%xxx%" 会报错,使用单引号包裹like %xxx%(mysql可兼容)
  5. date_sub(date,INTERVAL expr type), expr 在达梦中需要加单引号(mysql可兼容) 如:date_sub(now(),interval 6 month)
  6. 达梦数据库保错‘-2685:试图在blob或者clob列上排序或比较’,达梦数据库对大字段排序默认是会报错的,需要修改配置,执行一下语句修改即可 sp_set_para_value(1,‘ENABLE_BLOB_CMP_FLAG’,1);
  7. if语句不支持带有表达式的值(如:if(?3 is not null, direct = ?3, 1 = 1)),所以需要转换成 if(?3 is not null, if(direct = ?3, 1, 0), 1)这样;(mysql可兼容)
经验分享 程序员 微信小程序 职场和发展