达梦数据库使用配置及问题整理

1. 达梦数据库理解及安装

1.1 达梦数据库是基于模式的

达梦数据库是基于模式的(具体我也不太清楚,感兴趣的可以自己研究),创建一个用户就会创建一个模式,这里的模式有点类似于mysql中库的概念。

如果用当前用户访问当前用户同名的模式下的表,可以直接访问,如TEST_A用户访问user表:

select * from user;

如果是TEST_B用户想访问TEST_A模式下的user表就需要通过模式.表名访问:

select * from TEST_B.user;

1.2 安装

直接看官网文档:https://eco.dameng.com/document/dm/zh-cn/pm/install-uninstall.html

2. jdbc连接配置

2.1 引入数据库驱动

MySQL 同样如此,也需要驱动包来连接 MySQL,只不过 SpringBoot 对 MySQL 做了集成,没有对达梦数据库做集成,所以,我们需要自己引入驱动包,这个驱动包通过 maven 仓库是下载不了的

由于我们之前是安装了达梦数据库(DM8)的,然后我们在其安装目录下是可以找到驱动包的
在这里插入图片描述
这三个驱动包分别对应的是 JDK 的版本,我用的是 JDK 1.8 的,所以我选择的是 DmJdbcDriver18.jar 驱动包,将其放在 resources\lib\ 目录下
在这里插入图片描述
然后我们在 pom.xml 文件中,引入该文件

<dependency>
    <groupId>com.dm</groupId>
    <artifactId>DmJdbcDriver18</artifactId>
    <version>1.8</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/resources/lib/DmJdbcDriver18.jar</systemPath>
</dependency>

2.2 yml中配置连接信息

spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://192.168.0.196:5236/mid_exam?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=UTF-8
    username: admin
    password: admin

至此,配置基本上完成。

3. 启动项目后出现的问题

3.1 问题一:多数据源配置问题

启动后报错:dynamic-datasource Please check the setting of primary
这是因为我们本来的项目中配置了多数据源,我使用多数据源配置如下:

spring:
  # Mysql配置
  datasource:
    dynamic:
      druid:
        initial-size: 5
        min-idle: 5
        maxActive: 20
        maxWait: 60000
        timeBetweenEvictionRunsMillis: 60000
        minEvictableIdleTimeMillis: 300000
        validationQuery: SELECT 1 FROM DUAL
        testWhileIdle: true
        testOnBorrow: false
        testOnReturn: false
        poolPreparedStatements: true
        maxPoolPreparedStatementPerConnectionSize: 20
        filters: stat,slf4j
        connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
      primary: base
      datasource:
        base:
          driver-class-name: dm.jdbc.driver.DmDriver
          url: jdbc:dm://192.168.0.96:5236/mid_exam?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=Asia/Shanghai&useSSL=true&characterEncoding=UTF-8
          username: test_user
          password: crea_2020

3.2 问题二:定时任务启动报错

启动服务后,由于配置了定时任务(quartz框架),读取定时任务配置文件,去查看定时任务时,报错找不到定时任务相关配置表,我这边用的是quartz.properties

注意:由于达梦是可以设置大小写不敏感的,所以不用在意大小写(注意在初始化库时设置),但是!!!注意!!!达梦访问表都是模式.表名访问,模式名即mysql的库名。

所以这里需要修改:

在这里插入图片描述

3.3 问题三:不存在的表或者字段名

问题二已经说了,达梦可以不区分大小写,但是访问表需要用模式.表名访问,如:

# mall为模式名即mysql中的库名
# user为表名
select * from mall.user;

3.4 问题四:不支持ingore

官方文档地址:https://eco.dameng.com/document/dm/zh-cn/pm/insertion-deletion-modification.html#5.4%20MERGE%20INTO%20%E8%AF%AD%E5%8F%A5

达梦数据库是不支持ingore根据索引存在就不插入的语法的。这里可以通过使用merge into来解决这个问题。如:

# mysql中:
insert ignore into g_classify_entity (classify_id, entity_id) values (1,1);

# dameng中:
merge into mid_exam.g_classify_entity a 
using (
	select classify_id,entity_id from (
		select 1 as classify_id,2 as entity_id
	) tmp
) b
on (a.classify_id = b.classify_id and a.entity_id = b.entity_id)
WHEN NOT MATCHED THEN INSERT (classify_id, entity_id) values (1,2);

3.5 问题五:数据转换丢失警告

官方文档地址:https://eco.dameng.com/document/dm/zh-cn/pm/function.html#8.5%20%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%E5%87%BD%E6%95%B0

这是因为我在原来的sql中使用了,CAST(value as char),达梦数据库中的char是定长的(mysql中也是定长),官方文档中有一句话:定义 CHAR 类型的列时,可以指定一个不超过 32767 的正整数作为字节长度,例如:CHAR(100)。如果未指定长度,缺省为 1,这里可能是默认长度为1,所以报了长度溢出数据丢失。

所以这里我们应该使用varchar作为数据转换类型。(mysql中也应该使用varchar,记得要改一下)

3.6 问题六:[SEPARATOR]附近出现错误,无法解析的成员访问表达式[GROUP_CONCAT]

官方文档地址:https://eco.dameng.com/document/dm/zh-cn/pm/check-phrases.html#4.1.4.3.8%20WM_CONCAT%20%E5%87%BD%E6%95%B0

达梦数据库不支持使用group_concat,更不用说group_concat(a, ‘,’),这里可以用wm_concat代替。
由于wm_concat只能用’,'拼接,所以我们还需要replace一下。

# mysql中用法:
GROUP_CONCAT(qua.user_answer SEPARATOR '!,');

# 达梦中用法:
replace(WM_CONCAT(qua.user_answer ),',', '!,')

3.7 问题七:不是 GROUP BY 表达式

3.7.1 报错示例:
--可以利用达梦数据库内置的员工表测试
select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;

---------报错信息---------------
总共1个语句正依次执行...

[执行语句1]:
select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;
执行失败(语句1)
-4080: 第1 行附近出现错误:
不是 GROUP BY 表达式

1条语句执行失败
3.7.2 解决方法1:

直接在查询中添加参数: /*+ GROUP_OPT_FLAG(1)*/

##达梦支持灵活的处理方式,可以直接在查询中加hint参数。
select /*+ GROUP_OPT_FLAG(1)*/ e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;

101	马学铭	72424
102	程擎武	21592
103	郑吉群	129443
104	陈仙	75945
105	金纬	194399
201	李慧军	45299
202	常鹏程	20491
204	谢俊人	81014
301	苏国华	112344
..............
3.7.3 方法2:
##也可以修改dm.ini参数GROUP_OPT_FLAG=1,动态,会话级参数,不用重启数据库。
select para_name,para_value,file_value from v$dm_ini where para_name='GROUP_OPT_FLAG';
##sp_set_para_value(1,'GROUP_OPT_FLAG',1);
select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;

101	马学铭	72424
102	程擎武	21592
103	郑吉群	129443
104	陈仙	75945
105	金纬	194399
201	李慧军	45299
202	常鹏程	20491
204	谢俊人	81014
301	苏国华	112344
...............
3.7.4 方法3:
#达梦还可以配置兼容参数,COMPATIBLE_MODE=4,静态参数,需要重启数据库后生效!
sp_set_para_value(2,'COMPATIBLE_MODE',4);
select para_name,para_value,file_value from v$dm_ini where para_name='COMPATIBLE_MODE';

#!!注意修改后需要重启数据库!!

select e.department_id,e.employee_name,sum(e.salary) from dmhr.employee e group by e.department_id;

101	马学铭	72424
102	程擎武	21592
103	郑吉群	129443
104	陈仙	75945
105	金纬	194399
201	李慧军	45299
202	常鹏程	20491
204	谢俊人	81014
301	苏国华	112344
...............

#COMPATIBLE_MODE参数解释:
0: 不兼容
1:兼容 SQL92 标准
2: 部分兼容 ORACLE
3: 部分兼容 MS SQL SERVER 
4: 部分兼容 MYSQL
5:兼容 DM6
6: 部分兼容 TERADATA

3.7.5 注意事项:
使用 GROUP BY 要注意以下问题:
1.在 GROUP BY 子句中的每一列必须明确地命名属于在 FROM 子句中命名的表的一列。分组列的数据类型不能是多媒体数据类型;
2.分组列不能为集函数表达式或者在 SELECT 子句中定义的别名;
3.当分组列值包含空值时,则空值作为一个独立组;
4.当分组列包含多个列名时,则按照 GROUP BY 子句中列出现的顺序进行分组;
5. GROUP BY 子句中至多可包含 255 个分组列; 6. ROLLUP\CUBE\GROUPING SETS 组合不能超过 9 个。

3.8 错误八:无法解析的成员访问表达式[IF]

达梦数据库应该是不支持if判断函数,这里我们可以用case when代替
如:

if(a > 0, a, 0);
====>>>>
case when a > 0 then a else 0 end

3.9 错误九:[`]附近出现错误: 语法分析出错

可能达梦是不支持"`"符号标注字段的,直接查询字段名就行,在mysql中字段名和关键字名称相同可能会有问题,所以需要标注。

3.10 错误十:试图在blob或者clob列上排序或比较

在DM8上对大字段类型列进行排序、分组等操作时,会报错-2685:试图在blob或者clob列上排序或比较。

3.10.1 示例:
  1. 创建测试表并插入数据
create table T (ID int ,C1 TEXT);
INSERT INTO T VALUES(1,'新华社北京12月5日电 题:步履坚定,共绘高质量发展新篇章——各地贯彻党的十九届六中全会精神纪实

新华社记者

发展,是解决一切问题的总钥匙。

党的十九届六中全会审议通过《中共中央关于党的百年奋斗重大成就和历史经验的决议》强调,必须实现创新成为第一动力、协调成为内生特点、绿色成为普遍形态、开放成为必由之路、共享成为根本目的的高质量发展。

近日新华社记者奔赴多地,到企业车间、基层一线、群众当中,亲历贯彻全会精神的火热气象,感受落实新发展理念蔚然成风。

提质增效,跃上发展新台阶

走进济钢集团,黑色钢铁已不见踪影。36岁的技术人员陈书超身着白大褂,正操作数控机床加工直径几微米的精密零部件。

对于转型发展,他有着切身收获:“企业从‘靠钢吃饭’到‘无钢发展’,我的工作也从铸造‘大黑粗’变成加工‘高精尖’,环境好了,收入也高了。”

2017年,有着60年历史的济钢关停全部钢铁生产线。如今,济钢度过转型阵痛,向新材料、高端装备制造转型。2021年,集团产值预计和退出钢铁产能前相当,但能耗、大气污染物排放均只有以前的“零头”。

“要努力提升技能,适应企业转型的新需要,以实际行动响应全会关于推动高质量发展的号召。”陈书超说。');
COMMIT;

  1. 执行:
select c1,count(*) from T group by c1;
SELECT ID,C1 FROM T ORDER BY C1;
  1. 结果:可以观察到,对C1列进行排序和排序操作均报错"[-2685]:试图在blob或者clob列上排序或比较."
    在这里插入图片描述
3.10.2 解决方法1:修改数据库参数ENABLE_BLOB_CMP_FLAG

参数说明:
将数据库参数ENABLE_BLOB_CMP_FLAG设置为1后,数据库支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。

ENABLE_BLOB_CMP_FLAG: 是否支持大字段类型的比较。0:不支持;1:支持。设置为1后支持DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。

注意:该参数并不能支持GROUP BY 对大字段进行处理。

  1. 测试
# 将ENABLE_BLOB_CMP_FLAG参数设置为1
sp_set_para_value(1,'ENABLE_BLOB_CMP_FLAG',1);
  1. 新开会话,执行order by SQL语句
    在这里插入图片描述

  2. 执行group by SQL语句:group by 语句还是会报错,报错信息为"[-6116]:无法比较的数据类型."
    在这里插入图片描述

3.10.3 解决方法2:将大字段类型转换为字符串类型

通过上面测试,GROUP BY 无法通过修改ENABLE_BLOB_CMP_FLAG参数来支持,所以需要将对应的大对象列转换为字符串类型进行处理。

使用CAST将字段类型转换为字符串类型:

SELECT ID,CAST(C1 AS VARCHAR) FROM T ORDER BY CAST(C1 AS VARCHAR);
SELECT CAST(C1 AS VARCHAR), COUNT(*) FROM T GROUP BY CAST(C1 AS VARCHAR);

在这里插入图片描述
在这里插入图片描述

可以观察到,通过CAST将大字段列转换为字符串类型之后,ORDER BY 、GROUP BY 操作均可以执行。

3.10.4 解决方法4:使用DBMS_LOB.SUBSTR函数

DBMS_LOB.SUBSTR函数对CLOB或者TEXT类型,返回的结果为字符串类型,具体细节请参考《DM8 系统包使用》。

SQL语句如下:

SELECT ID,DBMS_LOB.SUBSTR(C1) FROM T ORDER BY DBMS_LOB.SUBSTR(C1);
select DBMS_LOB.SUBSTR(C1),count(*) from T group by DBMS_LOB.SUBSTR(C1);

在这里插入图片描述

在这里插入图片描述
可以观察到,使用DBMS_LOB.SUBSTR函数后,对于ORDER BY 、GROUP BY 操作均可以执行。

3.10.5 限制条件
  1. 使用第一种方法,修改数据库参数的方式,无法支持GROUP BY 对大字段的处理。
  2. 使用第二种方法,通过转换大字段类型为字符串类型可以达到相应的效果,但是如果大字段的内容长度比较长超过32767,内容会自动截断。

3.11 错误十一:无法解析的成员访问表达式[timediff]

官方文档:https://eco.dameng.com/document/dm/zh-cn/pm/function.html#8.3%20%E6%97%A5%E6%9C%9F%E6%97%B6%E9%97%B4%E5%87%BD%E6%95%B0
使用DATEDIFF代替。

#mysql中:
select TIME_TO_SEC(timediff('2022-04-15 16:57:20', '2022-04-15 16:57:16'));

# 达梦中:
select datediff(second, '2022-04-15 16:57:16', '2022-04-15 16:57:20')

3.12 问题十二:date_sub(now(),interval #{time} minute)报错

达梦数据库不支持date_sub函数,可以用DATEADD(MINUTE, -5, now())来完成。

#mysql
select date_sub(now(),interval 5 minute)
# 达梦:
select DATEADD(MINUTE, -5, now())

3.13 问题十三:仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值

设置为自增的列,要在字段上添加type = IdType.AUTO

@TableId(value = "practice_question_id", type = IdType.AUTO)
private Long practice_question_id;
<think>好的,用户想了解达梦数据库的归档日志相关配置。首先,我需要回忆一下达梦数据库的归档日志基本概念和作用。归档日志主要用于数据恢复和容灾,开启后可以保留完整的事务日志,这对数据库的安全非常重要。 接下来,我需要整理配置归档日志的步骤。通常,这涉及到修改数据库的dm.ini和dmarch.ini文件。要确认用户是否了解这些配置文件的位置和基本结构,可能需要分步骤说明如何修改参数,比如ARCH_INI、ARCH_TYPE等。 然后,需要考虑不同的归档类型,比如本地归档、实时归档、异步归档和远程归档。用户可能有不同的需求,比如是否需要实时同步到备用库,或者异步传输到其他服务器。需要分别解释每种类型的适用场景和配置方法,并提供示例,这样用户能更清楚如何选择。 另外,用户可能对如何验证配置是否生效有疑问,所以应该包含检查归档状态的方法,比如使用SQL语句查询V$ARCHIVED_LOG和V$DM_ARCH_INI视图。这部分需要确保语法正确,并且步骤清晰。 还要注意提醒用户在修改配置后需要重启数据库才能生效,这是一个常见的易错点。同时,安全方面的建议,比如归档日志的存储位置和定期清理,也是必要的,帮助用户避免磁盘空间问题。 用户可能的隐藏需求包括高可用性配置或者性能优化,比如实时归档与数据守护结合,或者调整归档文件的大小。虽然用户没有明确提到,但在回答中适当提及这些高级配置可以增加信息的全面性。 最后,要确保整个回答结构清晰,步骤详细,示例准确,并且符合用户的中文要求。避免使用复杂术语,保持语言简洁明了,让不同技术水平的用户都能理解。同时检查LaTeX格式是否正确,特别是行内公式和独立公式是否符合要求,但根据问题内容,可能LaTeX使用较少,主要集中在配置参数和路径的格式上,所以需要正确使用代码块或引用格式。</think>达梦数据库归档日志配置详解(以DM8为例): 一、归档日志的作用 1. 确保数据库完整恢复:记录所有已完成事务的REDO日志 2. 支持数据库级时间点恢复 3. 数据守护、主备集群等容灾方案的基础 二、配置步骤 1. 修改dm.ini参数 ```ini ARCH_INI = 1 # 启用归档配置 RLOG_APPEND_LOGIC = 0 # 逻辑日志强制归档(建议保持默认) ``` 2. 配置dmarch.ini(默认位于$DM_HOME/data/DAMENG/) ```ini [ARCHIVE_LOCAL1] ARCH_TYPE = LOCAL # 本地归档类型 ARCH_DEST = /dm8/arch # 归档路径(需提前创建目录) ARCH_FILE_SIZE = 1024 # 单个归档文件大小(单位MB) ARCH_SPACE_LIMIT = 0 # 空间限制(0表示不限制) ``` 3. 重启数据库生效 ```bash systemctl restart DmServiceDMSERVER ``` 三、归档类型详解 1. 本地归档(LOCAL) - 基本配置,必须启用 - 示例配置: ```ini ARCH_TYPE = LOCAL ARCH_DEST = /dmdata/arch ``` 2. 实时归档(REALTIME) - 用于读写分离集群 - 示例配置: ```ini ARCH_TYPE = REALTIME ARCH_DEST = SYSDBA/SYSDBA@192.168.1.100:5236 ``` 3. 异步归档(ASYNC) - 定时同步到备库 - 示例配置: ```ini ARCH_TYPE = ASYNC ARCH_DEST = SYSDBA/SYSDBA@192.168.1.101:5236 ARCH_TIMER = 60 # 同步间隔(秒) ``` 4. 远程归档(REMOTE) - 异机备份归档 - 示例配置: ```ini ARCH_TYPE = REMOTE ARCH_DEST = 192.168.1.102:5236 ARCH_INCOMING_PATH = /dm8/remote_arch ``` 四、状态验证 1. 检查归档状态 ```sql SELECT ARCH_NAME, ARCH_TYPE, ARCH_DEST, ARCH_FILE_SIZE FROM V$DM_ARCH_INI; ``` 2. 查看已生成归档 ```sql SELECT CLIENT_NAME, PATH, BEGIN_LSN, END_LSN FROM V$ARCHIVED_LOG; ``` 五、注意事项 1. 存储规划建议: - 建议单独挂载归档存储设备 - 保留空间应至少能存放3天以上的归档日志 - 文件系统建议使用XFS/ext4 2. 自动清理策略 ```ini ARCH_RESERVE_TIME = 1440 # 保留时间(分钟),0表示不自动删除 ``` 3. 性能优化参数 ```ini ARCH_SEND_BUF_SIZE = 16 # 发送缓冲区大小(单位MB) ARCH_RECV_BUF_SIZE = 16 # 接收缓冲区大小 ``` 六、常见问题处理 1. 归档空间满: ```sql ALTER DATABASE ARCHIVELOG CURRENT; # 手动切换归档 ``` 2. 归档不同步: ```sql ALTER DATABASE MOUNT; ALTER DATABASE ARCHIVELOG RESET; # 重置归档 ALTER DATABASE OPEN; ``` 建议定期检查归档完整性: ```bash dmrachk TYPE=ARCH FILE=/dmdata/arch/DAMENG_ARCH_LOCAL1_20230615.log ``` 附:最佳实践 1. 生产环境建议同时配置本地归档+远程归档 2. 归档目录权限应设置为700,属组dmdba:dinstall 3. 建议设置ARCH_FILE_SIZE=2048(2GB)平衡性能与恢复粒度 4. 结合crontab定期清理过期归档: ```bash 0 2 * * * find /dmdata/arch -name "*.log" -mtime +7 -exec rm {} \; ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值