说明
dm_svc.conf
客户端配置文件说明
dm_svc.conf
是一个客户端配置文件,它包含了 DM 各接口和客户端工具所需要配置的一些参数。
它必须和接口/客户端工具位于同一台机器上才能生效(使用者及业务程序的用户,需要有文件的读取权限)。
文件目录
dm_svc.conf
的工作目录,不同平台的生成目录有所不同:
• 32 位的 DM 安装在 Win32 操作平台下,此文件位于%SystemRoot%\system32
目录;
• 64 位的 DM 安装在 Win64 操作平台下,此文件位于%SystemRoot%\system32
目录;
• 32 位的 DM 安装在 Win64 操作平台下,此文件位于%SystemRoot%\SysWOW64
目录;
• 在 Linux 平台下,此文件位于/etc
目录。
修改默认工作目录的方法
修改dm_svc.conf
的默认工作目录,有以下几种方法:
• 可设置操作系统环境变量DM_SVC_PATH
来修改dm_svc.conf
文件路径;
• 在jdbc
的url
中指定dmsvcconf
指定文件位置;
• 在GO
中使用svcConfPath
自定义客户端配置文件 (dm_svc.conf
) 的完整路径。
配置说明
常用配置说明如下,更多配置请参考官网说明:
https://eco.dameng.com/document/dm/zh-cn/pm/physical-storage.html#2.1.1.4.1%20dm_svc.conf%20%E9%85%8D%E7%BD%AE%E9%A1%B9
| KEYWORDS | |||
| LOGIN_MODE | 关于达梦中数据库模式说明请参考本表格下方备注内容。 | ||
| SWITCH_TIMES | |||
| SWITCH_INTERVAL | |||
备注:
DM 数据库包含以下几种模式:
·NORMAL:(默认)普通模式,用户正常访问数据库,操作没有限制。通常见于单机及非主备集群实例。
·PRIMARY:主库模式,用用正常访问数据库,通常见于达梦数据库主备集群。
·STANDBY:备库模式,接收主库发送的 REDO 日志并重做。数据对用户只读。通常见于达梦数据库主备集群。
常用配置举例
cat etc/dm_svc.conf
# 以#开头的行表示是注释
# 全局配置区
TIME_ZONE=(+480)
LANGUAGE=(cn)
#单机配置服务名举例
DM=(10.101.10.9:5236)
# 集群配置服务名举例
DW_PARTY=(10.101.10.10:5236,10.101.10.11:5236)
# 服务配置区
# 单机配置服务名举例
[DM]
LOGIN_MODE=(4)
SWITCH_TIMES=(300)
SWITCH_INTERVAL=(200)
# 集群配置服务名举例
[DW_PARTY]
LOGIN_MODE=(1)
SWITCH_TIMES=(300)
SWITCH_INTERVAL=(200)
注意:
配置文件中可同时添加多套服务名配置,文件中服务名应保持唯一性 配置优先级由高到低:局部服务区配置 > 全局配置区配置 > 默认配置
jdbc 连接串配置举例
数据库连接配置
1)使用 IP 端口连接
--单机
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://10.101.10.10:5236</URL>
--集群
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://test?test=(192.168.0.96:5236, 192.168.0.96:5237)</URL>
2)使用dm_svc.conf
连接
<DRIVER>dm.jdbc.driver.DmDriver</DRIVER>
<URL>jdbc:dm://DM</URL>
#说明:DM为dm_svc.conf中配置的服务名
兼容性参数配置
用法 1:在连接串的 url 后添加属性
参数:compatible_mode
或compatibleMode
:
作用:兼容其他数据库。
当前支持的兼容性值:
oracle
:表示兼容Oracleoracle19
:表示兼容oracle 19c
(最早见于手册 8.1.3.26)oracle11
:表示兼容Oracle 11g
(最早见于手册 8.1.3.62)mysql
:表示兼容Mysql
兼容Oracle
的情况分为对老版本Oracle
的兼容和对新版本Oracle 19c
的兼容。
当 JDBC 驱动端 compatible_mode=oracle,兼容 Oracle JDBC 接口时,会出现以下情况:
1.会话上的 readOnly 属性设置无效。
Connection.setReadOnly()接口忽略设置,Connection.isReadOnly() == false。
2.会话关闭前做事务提交。
相关接口 Connection.close() ,调用时会先执行 Connection.commit()。
3.statement 有多种执行接口,各执行接口不再有对 SQL 类型的限制。
Statement 的多种执行接口包括 execute、executeUpdate、executeQuery 等。当 checkExecType=1 时,这些接口对执行的 sql 语句类型有限制,executeUpdate 不能执行查询语句,executeQuery 不能执行更新语句等诸如此类的。当 checkExecType=0 时,兼容 Oracle 的处理,各执行接口不再有对 SQL 类型的限制。
4.DatabaseMetaData 类的 getFunctions getProcedures getFunctionColumns getProcedureColumns 接口,可以搜索到包对象的内部存储过程和函数 。
5.DatabaseMetaData.getPrimaryKeys()返回结果中的列 pk_name 为索引名。
DM 本来返回的为约束名,Oracle 为索引名。
6.Url 格式串兼容 Oracle url 格式串前缀"jdbc:oracle:@" / "jdbc:oracle:thin:@"。
例如:连接 DM 数据库时 url 可写为:”jdbc:oracle:thin:@localhost:5236” 7.CLOB/BLOB 类的写入数据接口(setXXX),参数偏移允许从 0 开始。
DM 偏移从 1 开始, 而 Oracle 从 0 开始,内部做兼容处理,允许偏移从 0 开始。
8.对于所有的数值类型,ResultSetMetaData 和 ParameterMetaData 的类型描述都为 Types.NUMERIC,当调用 getObject 接口获取数据时返回的为 BigDecimal。
9.从数据库中获取到 dec 类型的数据,不保留无效的末尾 0。
当 JDBC 驱动端 compatible_mode=oracle19 时兼容 Oracle 19c JDBC 接口,同时也包含对老版本 Oracle 的兼容,但进行批量
绑 定 时 , executeBatch 的 返 回 值 存 在 差 异 : 配 置 为 compatiblemode=oracle19 时 正 常 返 回 实 际 影 响 的 行 数 , 配 置 为
compatiblemode=oracle 时返回-2。
兼容Mysql
的情况
当 JDBC 驱动端 compatible_mode=mysql,兼容 Mysql JDBC 接口时,会出现以下情况:
会话上设置事务隔离级别 Connection.TRANSACTION_REPEATABLE_READ 时,系统强制改为
Connection.TRANSACTION_READ_COMMITTED。DM 不支持隔离级 Connection.TRANSACTION_REPEATABLE_READ,不开兼
容时会忽略设置使用默认隔离级。开启兼容时强制设为 Connection.TRANSACTION_READ_COMMITTED 级别。
格式:jdbc:dm://GroupName?GroupName=(host1:port1,host2:port2,…) [&propName1=propValue1] [ & propName2=propValue2] [&…]…
举例:
jdbc:dm://192.xx.xx.xx:5236?schema=cs&compatibleMode=oracle
参数介绍:
host:数据库所在 IP 地址,缺省为 localhost。若 host 为 ipv6 地址,则应包含在[]中;
port:数据库端口号,缺省为 5236;
在?后添加参数schema_name=cs: 指定连接的模式名,效果等同于/cs,推荐使用schema_name=cs的形式。模式名省略时,默认连接到与连接用户同名的模式;
?:是参数分隔符,表示后面的都是参数;
&:是参数间隔符,多个参数用&分开;
propName:连接串属性名称。详见表 4.1;
propValue:连接串属性值。
更多属性配置,请参考官方网站(表 4.1 JDBC 连接串属性):
用法 2:配置在 DM 客户端工具连接中


更多属性配置,请参考官方网站(表 4.1JDBC
连接串属性):
SQL 兼容解析器配置
DM
提供SQL
兼容解析器以兼容不同数据库语法。目前仅支持兼容SQL Server
和MySQL
语法:
兼容 SQL Server 语法的解析器称为 TSQL 解析器 兼容 MySQL 语法的解析器称为 MySQL 解析器。 SQL 兼容解析器仅在会话层面生效。 仅单机和数据守护环境下支持 SQL 兼容解析器。 支持配置方式: 1)调用系统过程 SP_SET_SESSION_PARSE_TYPE
可以在会话中开启 SQL 兼容解析器2)使用 JDBC 连接串连接 DM
数据库时,在连接串的serverOption
属性中指定 parse_type 字段来开启 SQL 兼容解析器
调用系统函数配置 SQL 兼容解析器
使用说明:
SP_SET_SESSION_PARSE_TYPE (
PARSE_TYPE VARCHAR(16)
)
参数说明:
parse_type:可取值 TSQL、MySQL、DM。
- TSQL 表示开启 TSQL 解析器;
- MySQL 表示开启 MySQL 解析器;
- DM 表示开启 DM 解析器,即关闭 TSQL 或 MySQL 解析器,使用 DM自身语法策略
举例说明:
例 1 开启 TSQL 解析器。
SP_SET_SESSION_PARSE_TYPE('TSQL');
例 2 开启 MySQL 解析器。
SP_SET_SESSION_PARSE_TYPE('MySQL');
例 3 开启 DM 解析器。
SP_SET_SESSION_PARSE_TYPE('DM');
在 URL 配置 SQL 兼容解析器
parse_type 字段可取值 TSQL、MySQL、DM,分别表示开启 TSQL 解析器、MySQL 解析器、DM 解析器,默认为 DM 解析器。
例 1 在连接串中指定 parse_type=TSQL 来开启 TSQL 解析器。
jdbc:dm://localhost:5236?serverOption={parse_type=TSQL}
例 2 在连接串中指定 parse_type=MySQL 来开启 MySQL 解析器。
jdbc:dm://localhost:5236?serverOption={parse_type=MySQL}
例 3 在连接串中指定 parse_type=DM 来开启 DM 解析器。
jdbc:dm://localhost:5236?serverOption={parse_type=DM}
URL 指定客户端配置文件位置
# jdbc的url参数增加dmsvcconf,实现读取指定位置的服务名配置文件
jdbc:dm://dm?dmsvcconf=path of dm_svc.conf
举例:
jdbc:dm://dm?dmsvcconf=/etc/dmsvc.conf
配置 maven 依赖
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.2.138</version>
</dependency>
关键字屏蔽说明
首先我们要知道哪些是达梦的关键字?避免在数据库对象设计时使用
V$RESERVED_WORDS 视图中 RESERVED=Y 的关键字为系统保留字,无法直接在 SQL 语句中使用。 RES_FIXED=Y 的保留字是不能屏蔽的,屏蔽会影响使用。
SQL> select * from V$RESERVED_WORDS where RESERVED='Y' and KEYWORD='TOP';
行号 KEYWORD LENGTH RESERVED RES_SQL RES_PL RES_SCHEMA RES_VARIABLE RES_ALIAS RES_FIXED
---------- ------- ----------- -------- ------- ------ ---------- ------------ --------- ---------
1 TOP 3 Y Y Y N N N N
如果非要使用这些关键字,方法有以下四种:
以下以有使用关键字 percent 和 top 为例
1.写 sql 时通过双引号引起来
select "percent","top" from tt;
注意:如果需要屏蔽的关键字属于 SQL 中的常用子句的关键字,不建议使用除添加双引号外的其他方式进行屏蔽。
2.客户端连接字符串 url 中屏蔽掉
url 连接字符串添加 keywords=(屏蔽的关键字, 屏蔽的关键字)
jdbc:dm://192.168.80.133:5236/DAMENG?keywords=(percent, top)
注意:这里的/DAMENG 是在指定模式名,不是实例名,效果等同于使用?schema_name=DAMENG
3.客户端连接配置文件中屏蔽掉
修改/etc/dm_svc.conf
文件,在全局部分或者局部服务名后面添加【多个需屏蔽的关键字之间用逗号隔开】
注意:若全局和局部均进行了关键字屏蔽配置,局部优先级高于全局
举例:
TIME_ZONE=(480)
LANGUAGE=(cn)
KEYWORDS=(percent,top) #全局
DM1=(192.168.80.133:5237) # 为某个单机实例配置服务名为DM1
[DM1] # 为服务名为DM1的实例配置具体参数
TIME_ZONE=(480)
LANGUAGE=(cn)
KEYWORDS=(percent,top) #局部
需要重启应用生效
数据库服务端屏蔽掉(不推荐)
不建议这样处理,可能引起其它异常
--查询数据库中屏蔽的关键字
select * from v$dm_ini where para_name='EXCLUDE_RESERVED_WORDS';
方式 1:直接修改 dm.ini 配置文件中的 EXCLUDE_RESERVED_WORDS 参数
注意:多个需屏蔽的关键字之间用逗号隔开
EXCLUDE_RESERVED_WORDS=屏蔽的关键字, 屏蔽的关键字
方式 2:disql 进入数据库实例,不推荐使用,执行以下命令:
sp_set_para_string_value(2,'EXCLUDE_RESERVED_WORDS','percent,top');
修改参数后,重启数据库服务生效
关键字导致的问题举例
1)设置屏蔽 DM 关键字方式不正确导致 DM 自增出问题
问题:IDENTITY 关键字屏蔽后无法使用自增列
具体描述:修改数据库 dm.ini 中参数 EXCLUDE_RESERVED_WORDS、配置客户端 dm_svc.conf 文件,添加 KEYWORDS 配置项
以上这两种屏蔽关键字的方法都会使自增列无法使用
正确的处理方式:这种情况不建议使用除添加双引号外的其他方式进行屏蔽。
2)数据库执行 SQL 语句,总提示语法分析错误。
SQL 语句语法确定是正确的情况下,总提示语法分析错误,并且不存在特殊字符引发报错的可能。
可先查看是否在数据库开启了关键字屏蔽。





