本章节主要对达梦数据库访问常见问题进行分析和处理,以下提供达梦数据库访问常见问题的分析和解决思路供用户参考。除此之外,用户还可前往达梦技术社区参与更多问题讨论。
目录
- 无法连接数据库,报错 6001 网络通信异常/socket 连接失败/ Create SOCKET connection failure
- DM 数据库怎么设置/修改最大连接
- 连接 DM 数据库时提示:未经授权的用户
- 数据库会话不释放或者不重复利用;会一直申请到最大连接数后报错退出
- 在不关闭防火墙的情况下管理工具如何远程连接数据库
- 数据库会不会关闭空闲会话
- 必须给字段加双引号,否则提示无效的列名 TRIGGER_TIME
- 分区表(非堆表)是否能支持 global 索引/全局索引
- 在 DM 数据库中并没有 DmJobMonitor 这个服务,但是在数据库中创建的作业也是能跑起来,有什么实际用途
- DM 数据库如何删除主键索引
- 怎么解决没有查询动态视图权限的问题?没有对象的查询权限
- 快速获取表定义、详细信息的 SQL 语句
- 报错:无效的用户名
- 创建用户失败要怎么解决
- 数据库登录密码问题
- 如何和 Oracle 一样 nvl 函数处理值
- DM 如何将空字符串自动转换为 NULL
- 存储过程使用动态数组报错:标识符长度非法
- 使用图形界面创建作业
- DM 数据库是否支持 navicat 连接
- MANAGER 如何保存登录信息
- MANAGER 如何执行 SQL
- MANAGER 常用配置
- MANAGER 写 SQL 时如何提示表名
- 图形化界面处理自增参数
- 使用 DM 管理工具更新表数据
- 执行插入语句提示成功但数据并没有真正保存
- 非法的基类名\无效的列名
- disql 连接工具的位置
- 命令行终端工具的使用
- disql 登录含特殊字符的密码
- 运行 SQL 文件/执行 SQL 脚本
- SYSDBA 用户名称能修改吗
- SYSDBA 模式下带 ## 的表不可以删除
- 没有创建函数的权限/外部函数共享库加载失败
- [-70070]: Init SSL context error
- 客户端和服务端的通信协议
- 能否在 Windows 连接 Linux 服务器上的达梦数据库
- 达梦有没有生成 uuid 的函数
- 查询时如何忽略值的大小写
- 管理工具连接达梦数据库报错:argument cannot be null
- 达梦管理工具有 Format/美化的功能吗
- 批量执行任务的时候,执行几句就报错
- Failure occurs in data_recv_inet_once
- 如何启用/删除系统包?
- 如何在工具里可视化插入一条数据
- 当指定列列表,且 SET IDENTITY_INSERT 为 ON 时,才能对自增列赋值
- 用户账户锁定了,怎么解锁
- 是否支持开启 cdc 或者类似 binlog 功能,提供实时监控采集数据到外部的功能么?比如实时到 kafka
- DM8 是否支持 OLEDB 驱动
- 服务启动后使用管理工具登录时会报系统错误
- 管理工具执行 SQL 文件,出现乱码
- 前台启动数据库显示乱码
- 达梦事务/SQL 自动提交设置
- 如何调出达梦的可视化管理工具
- 报错:没有[CIPHERS]对象的查询权限
- 达梦管理工具打开报错:faild to create the java virtual machine
- DISQL 中设置了 set autocommit on; 但 manager 工具还是需要 commit, 数据才能入库
- 客户端执行脚本时报错内存不足
- 执行 SQL 脚本,报错 invalid file path 错误
- 语句块/包/存储函数中的间隔分区如何支持自动扩展
- 创建局部唯一索引或者 primary key, 必须包含分区列。全局索引不受此限制
- 远程 linux 的数据库服务端,一定要关闭防火墙吗
- 运行管理工具报错:screen for GtkWindow not set
- 运行./manager 或者./dts 图形工具开启报错
- 使用管理工具和 ddl 脚本修改表的注释之后,注释在管理工具中不显示
- 表插入数据以后,重启服务或停止服务后开启服务,表里面的数据丢失
- 用户名密码错误
- linux 系统中,打开管理工具乱码
- DM 集群中,通过 disql 无法连接数据库,manager 工具可以连
- 访问达梦数据库报错:无效的 ip
- 在达梦管理工具上怎么修改结果集?
- 密码非明文登录 DISQL 方法
- 指定 dm_svc.conf 非默认位置
- 数据库设置手动提交模式,但执行新建表后,发现之前未提交事务已被自动提交
- DM8 创建链接访问 Oracle 数据库报错:DBLINK 加载库文件失败
- 使用 xmanger 等工具打开远程服务器上的管理工具报错
- Manager 管理工具连接后没有模式等相关信息
- 使用 disql 连接数据库报错:没有匹配的可登录服务器
- 应用通过私网 IP 连接数据报错:网络通信异常
- Manager 管理工具无法修改表、更新统计信息以及查看表属性
- 使用 DM 客户端管理工具进行某些操作时,弹框报错:Java heap space
- manager 工具关闭了对象导航栏后如何重新打开
- 在 linux 环境下打开 SQL 命令行工具,按“Backspace”无法正常删除
- 达梦如何设置某用户某些 IP 远程访问
- DM 数据库使用 ODBC 方式创建 DBLINK 访问 Oracle 时报错 "[-70037]:字符串不完整" 或者中文显示为问号
- 达梦数据库如何使用 IPV6 连接
- 登录数据库使用 127.0.0.1 或者 localhost 能在本服务器登录,不写则报创建 SOCKET 连接失败
- dm 通过 dblink 查询 Oracle 表,报错:字符串截断
- LINUX/UOS 环境,使用非 ROOT 用户启动管理工具时失败并报错:GLib-Gobject-Warming**: 时间日期: invalid (NULL) pointer instance
- 普通用户开启操作系统认证,用 root 用户登录数据库报错:未经授权的用户
- 管理工具连接单机数据库时报错:服务器模式不匹配
- 打开 manage 客户端工具无响应
- 采用 GM 算法进行通信加密。
- mpp 集群全局登录失败报错:”[-6024]:Remote node global login failed.”
- disql 连接数据库报错 Segmentation fault (core dumped)
- Linux 如何设置别名来快速访问达梦数据库
- 如何实现使用 DM 保留字作为对象名
正文
无法连接数据库,报错 6001 网络通信异常/socket 连接失败/ Create SOCKET connection failure
【问题描述】
连接数据库时出现报错:登录服务器失败。
- 客户端管理工具连接数据库报错:错误号 6001,错误消息:网络通信异常。如下图所示:
- 或命令行连接数据库报错:socket 连接失败或 Create SOCKET connection failure。如下图所示:
【问题分析】
使用 DM 数据库时,有时会碰到登录失败的情况。根据使用的连接工具不同,问题具体可能表现为网络通信异常或者 socket 连接失败。
当出现网络通信异常报错时,先考虑客户端与数据库服务器之间网络通信问题;如果客户端与数据库服务器之间网络通信正常,则考虑数据库服务器是否已正常启动。如果网络和数据库服务都正常,则考虑数据库相关连接配置等。
【问题解决】
具体解决办法可参考 DM 数据库连接失败的排查方法。
此外,若是登录时用户名和密码填写错误,也会出现连接失败,但会提示:用户名或密码错误。
详情解决办法请参照:disql 登录含特殊字符的密码
DM 数据库怎么设置/修改最大连接
【问题解决】
关于最大连接数,可参考《DM 系统管理员手册》dm.ini 章节(手册位于数据库安装路径 /dmdbms/doc
文件夹下),最大连接数参数如下:
- 主要修改
MAX_SESSIONS
的值,根据用户自行赋值。建议值大小如下:
以主机 CPU 4 路 8 核内存 64 GB 为例,建议值大小如下:
max_session=500~1000
max_session_statnment=2000
修改参数在数据库实例路径下的 dm.ini 文件,修改完成后,重启数据库才生效。
- /etc/security/limits.conf 的 open file 也要扩大。跟 Oracle 的 session 和 process 一样。
连接 DM 数据库时提示:未经授权的用户
【问题描述】
新建实例,修改 max_session 为 1。
SELECT * FROM V$DM_INI WHERE "V$DM_INI".PARA_NAME LIKE 'MAX_SESSIONS';
报错复现: TEST 用户登录
【问题解决】
修改 dm.ini 里面的 MAX_SESSIONS,SP_SET_PARA_VALUE(2,'MAX_SESSIONS',2000)
,修改完重启数据库。
启动服务端的 console 工具查询 KEY 信息(工具在安装目录的 TOOL 目录下)。
如上图所示的最大并发数为 25,调整参数是无效的,需要找销售人员申请对应的 KEY。
再次验证 TEST 用户登录,登录成功,如下图所示:
数据库会话不释放或者不重复利用;会一直申请到最大连接数后报错退出
【问题分析】
其原因很有可能就是连接池没有做好相关配置,或者配置了却设置的值不对,那么超时的原因大概有以下几点:
- 最大连接数大于数据库服务器端配置的最大连接数,多余的连接在被使用到的时候出现连接超时。
- 网络抖动:每次连接的时候提交或维护大量数据,此时网络不稳定导致连接超时。
- 占用的资源未被释放,一般只 Open 一次,获取一个 *DB,但是在使用 stmt,rows 或者是 tx 时候用完没有关闭,耗尽资源也有可能导致连接超时。
【问题解决】
对于出现的 3 种问题,可以试试下面的解决方法:
- 对于最大连接数的问题,调用函数
Db.SetMaxOpenConns()
设置值(小于数据库配置的最大连接)。 - 对于维护大量数据,可以尝试采用事务操作,若失败,回滚。然后重试。
- 使用 defer 关键字,在启用操作的时候直接在下一行加上
defer *.close()
函数 return 的时候会执行相关的关闭函数。
如果尝试了以上的解决方法,还是发现偶尔会出现连接超时的错误的话,很可能是因为数据库本身对连接有一个超时时间的设置,如果超时时间到了数据库会单方面断掉连接,此时再用连接池内的连接进行访问就会出错,连接池中的每个连接都维护了一个创建时间,取连接的时候会自动检查的,可以试试调用 db 的 SetConnMaxLifetime()
方法来给 db 设置一个超时时间,时间小于数据库的超时时间即可。
在不关闭防火墙的情况下连接管理工具如何远程连接数据库
【问题解决】
配置服务器防火墙,以 root 身份编辑 /etc/sysconfig/iptables
文件,向文件中增加 -A
部分信息。
\ vi /etc/sysconfig/iptables
\# Firewall configuration written by system-config-firewall
\# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5236 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
重启 iptables 服务。
\#service iptables restart
数据库会不会关闭空闲会话
【问题描述】
创建线程时就连接数据库了,之后线程一直闲置中,过了一天后链接会话还在吗?数据库会不会把这个会话关闭?
【问题分析】
这个相当于长连接的问题,一天后连接还在,因为数据库不会把这个会话关闭。下面简单介绍下数据库的长连接和短连接。
- 短连接操作步骤:连接-数据传输-关闭连接。
- 长连接操作步骤:连接-数据传输-保持连接-数据传输-保持连接-…………-关闭连接。
这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了。
什么时候用长连接,短连接?
长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生 Socket 出错,并且频繁创建 Socket 连接也是对资源的浪费。一般情况下应用和数据库直接的连接都是通过连接池实现,也就是采用长连接的方式。而一般连接到服务器查询某个数据时,这种情况采用的是短连接。
DM 数据库可以通过 v$sessions 视图
查看会话连接情况。比如查询连接超过 7 天的会话,可以通过下面的 SQL 实现:
select from v$sessions where create_time < sysdate -7;
如果要删掉超过 7 天的会话,可以通过下面的 SQL 先找过超过 7 天的会话,然后把里面的内容拿出来执行:
select 'sp_close_session('||sess_id||');' from v$sessions where create_time < sysdate -7;
假如结果是:sp_close_session(910688560)
:直接在 manager 中执行即可删除该条连接。
执行结果,910688560 这个会话被关闭。
因为测试机刚启动的没有超过 7 天的会话,执行的时候没加后面的 where 条件。
必须给字段加双引号,否则提示无效的列名 TRIGGER_TIME
【问题分析】
可能与大小写敏感的设置有关:
- 大小写敏感的情况下,字段会自动转换成大写。
- 加引号是不让字段转换成大写,这个表里面的字段在创建时应该是小写的。
- 从 MySQL 迁移到 DM,最好在迁移到之前,设置 DM 数据库初始化大小写不敏感。
大小写设置方法:
大小写敏感设置在初始化实例中可以设置大小写敏感参数。
查看大小写敏感的方式:
- 链接数据库右键数据库管理服务器页面。可以看到当前数据库是否是大小写敏感设置。
- 命令行的方式查看
select para_name,case para_value when 1 then 'y' else 'n' end
from v$dm_ini where para_name= 'GLOBAL_STR_CASE_SENSITIVE';
分区表(非堆表)是否能支持 global 索引/全局索引
【问题分析】
DM 数据库支持对水平分区表建立普通索引、唯一索引、聚集索引和函数索引。创建索引时若未指定 GLOBAL 关键字则建立的索引是局部索引,即每一个表分区都有一个索引分区,并且只索引该分区上的数据。如果指定了 GLOBAL 关键字则建立的索引是全局索引,即每个表分区的数据都被索引在同一个 B 树中。
详见《DM8 系统管理员手册》第 15 章节内容。(手册位于数据库安装路径 /dmdbms/doc
文件夹下)
在 DM 数据库中并没有 DmJobMonitor 这个服务,但是在数据库中创建的作业也是能跑起来,有什么实际用途
DmJobMonitor 是监控作业的服务,监控作业是否正常,一般是在 DM 管理工具里点击【作业】-【查看历史作业信息】即可获取作业的运行情况。
DM 数据库如何删除主键索引
遇到 DM 数据库主键索引无法删除的情况不要着急,可以先将表的主键约束去除,再执行删除即可。
怎么解决没有查询动态视图权限的问题?没有对象的查询权
【问题描述】
用户查询报错:
【解决方法】
- 使用 SYSDBA 用户,给没有权限的用户赋权(赋予 VTI 角色):
grant VTI to user123;
- 或者直接赋予相应视图的查询权限(比如查询 v$dm_ini 视图的权限):
grant select on v$dm_ini to user123;
快速获取表定义、详细信息的 SQL 语句
如果是在 windows 操作界面,可以直接用管理工具-单击表然后右键查看。
如果是在 Linux 界面可通过以下方法查看。
- 方法一
调用 DM 存储系统过程 SP_TABLEDEF
,获得表的定义,如下图所示:
参数说明:
schname:模式名
tablename:表名
这个存储过程,直接 call 调用或者写在匿名块中调用均可。
比如,查询 DMHR 模式下 EMPLOYEE 表定义:
call sp_tabledef(‘DMHR’,’EMPLOYEE’);
BEIGN
Sp_tabledef(‘DMHR’,’EMPLOYEE’);
END;
这个存储过程是 DM 数据库独有的,Oracle 并没有这个存储过程。但是它存在一个缺点,只能查询表,不能查询其他类型的对象。
所以这里推荐第二种方法,也是笔者最常用的查询表定义的方法。
- 方法二
DBMS_METADATA.GET_DDL
,DBMS_METADATA 系统包包含了许多实用的函数,有兴趣可以查看 DM 官方文档慢慢了解,这里就不一一赘述了,介绍一下 GET_DDL,如下图所示:
我们再测试一下这个包:
GET_DDL 功能非常强大,可以用于获取数据库对表、视图、索引、全文索引、存储过程、函数、包、序列、同义词、约束、触发器等的 DDL 语句。
报错:无效的用户名
- 建立用户的时候,会建个同名的模式,如果模式已存在就会报错,如下图所示:
- 所登录的用户名就没有建立。
- 搭建 dsc 的时候,asm 环境初始化报的
无效的用户名
,检查一下 DMDCR_CFG.INI 里面的dcr_seqno
,如下图所示:
创建用户失败要怎么解决
创建用户失败的原因可能有多,具体问题要具体分析,遇到错误时首先查看报错的详细信息,这样才能快速的定位和解决问题,下面列举几种常见的错误:
1、用户名已经存在该用户:
2、密码复杂度不符合要求
密码策略:PWD_POLICY
设置系统缺省口令策略。取值:15、31。
15 表示同时启用策略 1-4;
31 表示同时启用策略 1-5。
各策略介绍如下:
- 策略 1:禁止与用户名相同;
- 策略 2:口令长度需大于等于 INI 参数 PWD_MIN_LEN 设置的值;
- 策略 3:须同时包含大写字母(A~Z)和小写字母(A-Z);
- 策略 4:至少包含一个数字(0-9);
- 策略 5:至少包含一个标点符号(英文输入法状态下,除“ 和空格外的所有符号)。
DMINIT 工具中 SYSDBA_PWD、SYSAUDITOR_PWD、SYSSSO_PWD、SYSDBO_PWD 使用的口令策略,请参考 PWD_POLICY 为 15
解决方法:修改密码策略
3、授权不正确,如下授权,选择的是【ALL】,有些权限是不能分配给普通用户的,如下图所示:
数据库登录密码问题
- 忘记密码怎么办?
如果是系统用户 SYSDBA、SYSSSO 忘记密码,是没有办法找回来的。
温馨提示:
- 强烈建议用户在首次安装数据库初始化实例时,立即修改数据库系统用户的初始密码,并设置一定的密码强度,以保障数据安全性。
- 如果数据库中还有其它的用户,可以尝试在数据迁移工具 DTS 中使用其它用户登录,把数据库中相关用户的数据迁移到新的实例对应的用户中。
- 如果库里面没有业务数据或者数据不重要,则可以考虑卸载重装。
- 密码中含有 @/等特殊字符怎么办?
需要通过转义符来处理。disql 转义符使用如下:
linux 环境,需要使用双引号将密码包含进来,同时外层再使用单引号进行转义,具体例子如下:
./disql SYSDBA/' "abcd@efgh" '@localhost
windows 环境,需要使用双引号将密码包含进来,同时对双引号使用\进行转义,具体例子如下:
disql SYSDBA/\"abcd@efgh\"@localhost
- Manager 客户端登录保存密码为什么还是需要输入密码?
需要注册连接。
- SYS 用户密码是多少,SYS 能登录吗?
SYS 是不能登录的。
- 数据库更改密码策略,对以前建立的用户不生效?
删除重建。
- 用户密码过期及修改用户登录失败次数超过限制怎么办?
用 SYSDBA 登录来修改用户的配置,先修改密码再修改资源。
alter user "SYSDBA" limit password_life_time unlimited;
- DM 数据库的密码策略是什么?
通过 DM.INI 里的参数:PWD_POLICY 设置系统口令策略。
设置系统缺省口令策略。取值:15、31。
15表示同时启用策略1~4;
31表示同时启用策略1~5。
各策略介绍如下:
策略1:禁止与用户名相同;
策略2:口令长度需大于等于INI参数PWD_MIN_LEN设置的值;
策略3:须同时包含大写字母(A~Z)和小写字母(A-Z);
策略4:至少包含一个数字(0-9);
策略5:至少包含一个标点符号(英文输入法状态下,除“ 和空格外的所有符号)。
DMINIT工具中SYSDBA_PWD、SYSAUDITOR_PWD、SYSSSO_PWD、SYSDBO_PWD使用的口令策略,请参考PWD_POLICY为15
- 怎么查看密码策略?
可以通过如下视图查询系统策略情况:
SELECT * FROM V$PARAMETER WHERE NAME= 'PWD_POLICY';
- 怎么设置或修改密码?
通过如下命令设置系统密码策略,该参数为动态参数,修改后即时生效,不需要重启数据库。
SP_SET_PARA_VALUE(1, 'PWD_POLICY',15);
设置策略成功后,对新创建的用户有效。原来的用户需要通过 alter user 修改用户的密码策略:
alter user 用户名 PASSWORD_POLICY 15;
更多关于设置密码相关问题,请参考《DM_SQL 语言使用手册》管理用户-用户定义语句。(手册位于数据库安装路径 /dmdbms/doc 文件夹下)
如何和 Oracle 一样 nvl 函数处理值
【问题描述】
Oracle 中 nvl 函数处理的值,达梦数据库用 ifnull/isnull/nvl 处理,我看数据库值是 NULL 才处理了,’’就不能处理,怎么和 Oracle 一样处理?
【问题解决】
将 dm.ini 的参数 COMPATIBLE_MODE 改成 2,处理 NULL 的方式就和 Oracle 一样了。
DM 如何将空字符串自动转换为 NULL
将 dm.ini 的参数 COMPATIBLE_MODE 改成 2。
存储过程使用动态数组报错:标识符长度非法
检查 dm.ini 参数 COMPATIBLE_MODE,如果值为 3,达梦数据库为兼容 SQL Server 的模式,则不支持数组,可以选择改变兼容模式或使用动态表改写。
使用图形界面创建作业
首次使用时,需要先创建代理环境,如下图,在代理上右键,选择【创建代理环境】,如下图所示:
然后在作业上右键新建作业,出现右边的方框中选择【添加】,如下图所示:
选择作业调度之后,在右下方选择【新建】,然后出现调度频率和时间的选项。
DM 数据库是否支持 navicat 连接
Navicat 工具暂不支持 DM 数据库,DM 数据库的连接可以使用数据库自身的 DM 管理工具进行连接。
DM 数据库管理工具存放在安装目录 dmdbms 下的 tool 文件夹中打开 manager.exe 进行连接即可。
MANAGER 如何保存登录信息
DM 管理工具 MANAGER,在打开以后,可以通过注册连接按钮新建连接,该方法新建的连接会保存到左侧的连接导航栏中。
MANAGER 如何执行 SQL
DM 管理工具 MANAGER,在登录以后,右侧 SQL 窗口输入 SQL 语句后,可以点击工具栏上对应的绿色三角按钮执行,完成后需要点击后面的【提交】或者【回滚】按钮完成事务的提交和回滚。
MANAGER 常用配置
- 打开管理工具-选项
- 在选项下有一些设置,DM 管理工具-窗口-选项。可以根据实际需求进行一些配置的调整。
- 消息区-显示的最大字符数
会影响使用语句块进行批量循环 PRINT 信息,需要调大。如果过小,消息区显示的 SQL 内容不全,PRINT 的信息也显示不全。
- 大小写敏感
如果不是必须大小写敏感,建议将管理工具上保持大小写敏感配置取消,这样后台全部转换成大写,就不会造成表名、字段名等由于大小写缘故出现无效的字段或者表名之类的错误。
- 出错后继续执行
生产环境要关闭自动提交和出错后继续运行的配置,避免出现错误后,无法挽回。
- 显示的最大字符数
MANAGER 写 SQL 时如何提示表名
DM 数据库中可以模糊提示表名,在 DM 管理工具中右键【选项】,把编辑器中需要的选项全部勾选上。
根据需要勾选好就可以达到自己想要的设置了。
图形化界面处理自增参数
DM 支持 INT 和 BIGINT 两种数据类型的自增列,并提供以下函数查看表上自增列的当前值、种子和增量等信息:
IDENT_CURRENT:获得表上自增列的当前值;
IDENT_SEED:获得表上自增列的种子信息;
IDENT_INCR:获得表上自增列的增量信息。
在新建表的时候,选中表-修改-把对应列设置为自增列。
使用 DM 管理工具更新表数据
登录用户,找到【模式】,找到相关的表,点击右键,选择【浏览数据】,将列表中的数据拉到最底下,点击【not null】输入数据,然后点击保存。
执行插入语句提示成功但数据并没有真正保存
管理工具默认是非自动提交的(窗口—选项),在执行 insert、update 等对数据进行修改的语句以后,需要执行 commit 命令进行提交。
如需修改成自动提交模式,可以在管理工具的对应选项中进行勾选,如下图所示:
非法的基类名\无效的列名
使用 DM 管理工具访问 DM 数据库,在使用图形化工具查看数据库对象时,报错:非法的基类名/无效的列名等。
- 这种情况一般发生在客户端工具与服务器的版本差别较大的时候,需要更新客户端,并与服务器版本保持一致。
- 需要启动系统包,比如
非法的基类名 DBMS_SQL
,启动相应的系统包,具体方法参考《DM 系统包使用手册》(手册位于数据库安装路径/dmdbms/doc/special
文件夹下)。
disql 连接工具的位置
数据库 disql 连接工具的存放位置,在 Linux 环境下假设数据库安装目录在 /opt/dmdbms/ 目录下,进入 /opt/dmdbms/bin 下执行 ./disql
输入对应的用户名和密码即可访问数据库。
DM 命令行工具位于数据库安装目录的 bin 下,图形化工具位于数据库安装目录的 tool 下。我们以 Linux 环境为例,假设 DM 数据库安装目录为 /opt/dmdbms 下,则命令行工具都在 /opt/dmdbms/bin 下,常用的命令行工具包括并不限于:
实例初始化工具 dminit
命令行客户端工具 disql
逻辑导入导出工具 dimp/dexp
数据库校验工具 dmdbchk
core 文件读取工具 dmrdc
数据库恢复管理工具 dmrman
脱机备份/还原工具 dmbackup/dmrestore
快速数据装载工具 dmfldr
集群监控工具 dmmonitor
解析日志工具 dmlcvt
命令行终端工具的使用
DM 数据库提供了类似于 Oracle 的 sqlplus 的终端工具,即 DM 命令行客户端工具 disql,工具的路径在安装路径下的 ../dmdbms/bin/ 下,格式: disql 用户名/密码@IP:端口号
Linux 环境基本使用方法如下(路径以实际环境为准):
$ cd /home/dmdba/dmdbms/bin
$ ./disql SYSDBA/*****@127.0.0.1:5236
Windows 环境使用和 Linux 环境类似。
当密码后面不跟 @ip:port
时,则默认为 @127.0.0.1:5236
。
更多功能的详细使用方法请参考《DM_disql 使用手册》。(手册位于数据库安装路径 /dmdbms/doc/special
文件夹下)。
disql 登录含特殊字符的密码
详细描述型可以帮助您更了解 DM SQL 语言处理特殊字符转义字符,如果您急需解决问题,请往下查看“简单描述型”。
举例 1:window 操作系统:
创建用户,如下所示:
create user "TELLER" identified by "TELLER@/!12";
grant "PUBLIC","RESOURCE" to "TELLER"; --用户权限
使用 disql 登录报错如下:
disql 正确的登录如下:
- disql 的关键字符,disql 的要求对连接串的特殊字符需要使用双引号括起来"aaaa/aaaa",操作系统的要求需要再在最外加双引号和转义"""aaaa/aaaa"""。例如:用户名为 user01,密码为 aaaa/aaaa,那么连接串要写成:
disql user01/"""aaaa/aaaa"""
- 空格,需要使用双引号括起来作为一个整体(这是操作系统的要求)。例如:用户名为 user01,密码为 aaaa aaaa,那么连接串要写成:
disql user01/"aaaa aaaa"
。 - 双引号:disql 要求对双引号需要使用双引号括起来,同时双引号需要转义"aaaa""aaaa";操作系统要求再对双引号转义和最外层加双引号那 么 连 接 串 要 写 成 :
disql user01/"""aaaa""""aaaa"""
。
举例 2:Linux 操作系统:
创建用户,如下所示:
create user "TELLER" identified by "TELLER@/!12";
grant "PUBLIC","RESOURCE" to "TELLER"; --用户权限
disql 登录报错如下:
Linux 登录输入反斜杠\结果显示 W
如下。
原因是字体选择问题导致。
Linux,shell 输入反斜杠显示 W
。
solution:字体必须为 Courier New
。
正确的登录方式如下:
bash 的引号设计为:在单引号中,所有的特殊字符都失去其特殊含义;在双引号中,特殊字符包括:美元符($)、反引号(`)、转义符(\)、感叹号(!)。
如果密码中没有单引号的,应该都只有外面加单引号就可以解决了;如果密码只有单引号,那么可以将单引号用双引号括起来;如果既有单引号又有美元符($)、反引号(`)、转义符(\)、感叹号(!)四个特殊字符,那么在特殊字符之前全部加\转义即可。举例如下:
'aaaa\aaaa' 传给 disql 为 aaaa\aaaa。
"aaaa'aaaa" 传给 disql 为 aaaa'aaaa。
"aaa'\$aaaa" 传给 disql 为 aaa'$aaaa。
其次,在操作系统要求的基础上,增加 disql 对关键字和双引号的要求。
- disql 的关键字符,disql 的要求对连接串的特殊字符需要使用双引号括起来。
例如:密码为 aaaa\aaaa,使用双引号括起来“aaaa\aaaa”,因为此密码中不含有单引号,根据操作系统的要求直接在最外面加单引号。
例如:用户名为 user01,密码为 aaaa/aaaa,那么连接串要写成:./disql user01/’”aaaa/aaaa”’
- 双引号, disql 要求对双引号需要使用双引号括起来,同时双引号需要转义。例如:密码为 aaa”\aaaa,那么根据 disql 的要求加双引号同时转义。
为”aaa””\aaaa”,因为没有单引号,根据操作系统的要求直接加单引号。例如:用户名为 user01,密码为 aaa”\aaaa,那么连接串要写成:./disql user01/’”aaa””\aaaa”’
- 单引号,根据操作系统的要求,只能将单引号放入双引号中。
例如:用户名为 user01,密码为 aaaa'aaaa,那么连接串要写成:./disql user01/”aaaa'aaaa”
- 单引号 + 操作系统下的特殊字符,根据操作系统的要求,因为单引号只能放在双引号内,同时双引号中还有一些特殊字符不能被识别需要加反斜杠转义。
例如: 用户名为 user01,密码为 aaa'$aaaa
,使用双引号括起来,同时对 $ 加反斜杠转义。那么连接串要写成:./disql user01/”aaa'\$aaaa”
- 单引号 + 双引号,根据操作系统的要求,单引号需要放在双引号中,在双引号中表示双引号则使用反斜杠转义双引号。
例如: 用户名为 user01,密码为 aaa”'aaaa,根据 disql 的要求双引号作为特殊字符,需要使用双引号在括起来,同时使用双引号对双引号转义”aaa””'aaaa”;同时考虑操作系统的要求,因为含有单引号,只能将整个密码放入双引号中,同时对双引号使用反斜杠转义,
那么连接串要写成:./disql user01/”\”aaa\”\”'aaaa\””
如何转义双引号?
disql 的要求使用双引号对双引号内的双引号转义。
- Windows 命令行,使用双引号或者反斜杠对双引号内的双引号转义。
- Linux 命令行,使用反斜杠对双引号内的双引号转义
简单描述型:
有时候密码包含了 @
等特殊字符导致 disql 无法直接连接和运行。需要通过转义符来处理。disql 转义符使用如下:
- Linux 环境下,需要使用双引号将密码包含进来,同时外层再使用单引号进行转义,具体例子如下:
./disql SYSDBA/'"abcd@efgh"'@localhost
- windows 环境下,需要使用双引号将密码包含进来,同时对双引号使用\进行转义,具体例子如下:
disql SYSDBA/\"abcd@efgh\"@localhost
运行 SQL 文件/执行 SQL 脚本
- Windows 环境
启动 disql 时,运行脚本如下:
disql SYSDBA/***** `D:\test.sql
启动 disql 之后,运行脚本如下:
start D:\test.sql
- Linux 环境
./disql SYSDBA/***** \`/dev/test.sql
具体使用方式,参考《DM_Disql 使用手册》第 5 章节-如何在 Disql 中使用脚本。(手册位于数据库安装路径 /dmdbms/doc/special
文件夹下)。
SYSDBA 用户名称能修改吗
SYSDBA 是超级管理员,无法修改。
SYSDBA 模式下带 ##
的表不可以删除
此为系统表,一般有两张,##HISTOGRAMS_TABLE 、##PLAN_TABLE
。不可删除。
没有创建函数的权限/外部函数共享库加载失败
【问题描述】:
执行创建外部 Java 函数的操作,提示没有权限/没有创建函数的权限/"外部函数共享库加载失败"
【解决方法】:
根据以下步骤进行排查:
- 检查参数 ENABLE_EXTERNAL_CALL 是否等于 1,在 dm.ini 里面修改
ENABLE_EXTERNAL_CALL = 1
重启数据库服务才能创建外部函数。 - 检查 jar 包所在绝对路径是否正确;
- 检查 dmagent 配置是否正确,自建的 jar 包能否正常调用。
- 检查 jar 包打包方式,若 jar 包中存在多个主类,使用 Maven 进行打包会导致依赖不全,外部函数无法调用。正确打包方式应使用 Build Artifacts 打包,指定好主类集所有依赖包在项目中打包成一个 jar,这样能确保 jar 包能正常调用。打包方式如下图所示。
(1)点击 文件--> 项目结构---> 工件,添加 jar。
(2)指定好主类。
(3)左上角菜单栏 构建---> 构建工件,即可完成多主类 jar 包的打包。
- 更多外部函数正确调用过程,请参考《DM_SQL 语言使用手册》第 10 章节。(手册位于数据库安装路径
/dmdbms/doc
文件夹下)。
[-70070]: Init SSL context error
【问题描述】
在安全版数据库中,使用 disql 或是 客户端登录时,显示:
stat private key fail [-70070]: Init SSL context error 或者 [-70070]:初始化 SSL 环境失败
要如何解决?
【问题解决】
检查初始化参数 ENABLE_ENCRYPT 是否设为 1,如果为 1,说明所有的通信都已经 SSL 加密了,同时任何用户连接数据库都需要 SSL 证书。安全版中默认开启了 SSL 加密。
如果链接的时候不需要 SSL 证书 ,可将 ENABLE_ENCRYPT 设置为 0。执行以下语句将其关闭:
sp_set_para_value(2,'ENABLE_ENCRYPT',0);
执行完后重启数据库才能生效。
ENABLE_ENCRYPT 参数是在 DM.INI 配置文件里面设置,其他设置方法参考《DM 系统管理员手册》第 2.1 小节(手册位于数据库安装路径 /dmdbms/doc
文件夹下)。
在确认使用 SSL 加密的情况下,有以下几种可能的原因:
- 输入的 SSL 验证密码不正确:
如果是通过 jdbc 接口来加密访问数据库,是使用的.keystore 文件,所以 SSL 认证密码是 keystore 文件的密码;
如果是通过 ODBC 或者其他方式加密访问数据库,那么是使用 ca-cert.pem、client-cert.pem 和 client-key.pem 三个文件,所以 SSL 密码为客户端私钥密码。 - 证书文件可能存在问题;
- 当前操作系统用户无访问客户端证书的权限;
对应的处理方法为:
- 检查验证客户端私钥密码或者 keystore 文件密码是否正确,或者直接重新生成客户端证书等文件;
- 使用多种方式登录测试验证,比如使用 disql 和 jdbc 两种方式进行测试验证;
- 检查当前用户是否有访问客户端证书的权限,或者将证书目录权限设置为 777,比如:chmod 777 -R client_ssl;
客户端和服务端的通信协议
TCP/IP 协议,可以通过 SSL 加密。
如果想拥有审计 SQL 语句的功能,建议通过 sp_set_para_value(1,’SVR_LOG’,1)
,配合修改 sqllog.ini 生成 SQL 日志(详见《DM 系统管理员手册》-2.1.1 章节,手册位于数据库安装路径 /dmdbms/doc
文件夹下),对生成的日志文件进行审计。如果是希望在网络层通过截取消息包进行解析,从而获取 SQL,建议通过商务联系,进行产品适配。
能否在 Windows 连接 Linux 服务器上的达梦数据库
使用 DM 数据库客户端工具可以实现在 Windows 上连接 Linux 服务器。
达梦有没有生成 uuid 的函数
使用 guid() 函数查询:
SELECT SYS_GUID();
SELECT GUID();
查询时如何忽略值的大小写
- 初始化数据库实例的时候,“大小写敏感”参数设置成“N”。
- 用函数进行查询。
管理工具连接达梦数据库报错:argument cannot be null
客户端和服务端版本不匹配,比如高版本连接低版本等。
达梦管理工具有 Format/美化的功能吗
使用快捷键 crtl+shift+F
或使用右键菜单-->SQL 脚本--> 格式化
批量执行任务的时候,执行几句就报错
数据库日志有这个错误,批量执行任务的时候,执行几句就报错:Database P0000024537 main_thread cmd 13 validate error
可以把 dm.ini 参数配置文件里面的参数 COMM_VALIDATE(是否对消息进行校验。0:不检验;1:检验) 设置成 0。
Failure occurs in data_recv_inet_once
这是通信中产生的告警信息,错误代码是操作系统返回的,107 Transport endpoint 传输终点没有连接,在系统繁忙的时候会刷这个,通常可以忽略。
如何启用/删除系统包?
SP_CREATE_SYSTEM_PACKAGES(1);--启动
SP_CREATE_SYSTEM_PACKAGES(0);--删除
可以参考《DM 系统包使用手册》,手册位于数据库安装路径 /dmdbms/doc/special
文件夹。
如何在工具里可视化插入一条数据
在 DM 管理工具中,右键点击【表】,浏览数据:
直接在结果集进行编辑,然后点击右键选择【保存】:
当指定列列表,且 SET IDENTITY_INSERT 为 ON 时,才能对自增列赋值
这个是会话级的,而且同一会话只能有一个表 set,当插入数据并且要指定自增列的值时,必须要通过语句将 IDENTITY_INSERT 设置为 ON 时,插入语句中必须指定“PERSON_ TYPEID ”(举例)中要插入的列。对自增列插入指定数据时候,先执行一下 SET IDENTITY xxx 就行了。
一般情况下,当数据表中,某一列被设置成了标识列之后,是无法向标识列中手动的去插入标识列的显示值。但是,可以通过设置 SET IDENTITY_INSERT 属性来实现对标识列中显示值的手动插入。
语法:
- .SET IDENTITY_INSERT 表名 ON :表示开启对标识列显示值插入模式,允许对标识列显示值进行手动插入数据。
- .SET IDENTITY_INSERT 表名 OFF:表示关闭对标识列显示值的插入操作,标识列不允许手动插入显示值。
注意IDENTITY_INSERT 的开启 ON 和关闭 OFF 是成对出现的,所以,在执行完手动插入操作之后,记得一定要把 IDENTITY_INSERT 设置为OFF,否则下次的自动插入数据会插入失败。
用户账户锁定了,怎么解锁
使用系统管理员登录执行:
alter user '用户名' account unlock;
也可以使用管理工具进行可视化处理:
是否支持开启 cdc 或者类似 binlog 功能,提供实时监控采集数据到外部的功能么?比如实时到 kafka
可通过达梦数据实时同步软件 DMHS,来进行处理同步推送。
DM8 是否支持 OLEDB 驱动
DM8 不支持 OLEDB 驱动,请用达梦的 ODBC 驱动代替。
服务启动后使用管理工具登录时会报系统错误
- 重启下数据库,看问题是否解决。若重启后解决,可能是旧版本 BUG,建议升级数据库版本彻底解决此问题,或者定期重启数据库。
- 如果重启数据库后还是报错,可能是客户端与数据库版本不匹配导致的,需要将客户端和服务端版本换成一致的。
管理工具执行 SQL 文件,出现乱码
需要确保操作系统、数据库、SQL 文本三者字符集一致,避免出现乱码。
前台启动数据库显示乱码
更改连接工具字符集,确保同服务器字符集一致。
达梦事务/SQL 自动提交设置
- 默认非自动提交
- 管理工具设置自动提交方式:窗口-选项-查询分析器-自动提交,请参考执行插入语句提示成功但数据并没有真正保存
如何调出达梦的可视化管理工具
进入到安装目录的 tool 目录下:
- Windows 系统:可以直接双击运行
- Linux 系统:./manager
报错:没有[V$CIPHERS]对象的查询权限
修改用户所属角色,勾选授予 VTI 权限,或者用 sysdba 给账号权限:
grant select on XXX to XXX;
达梦管理工具打开报错:faild to create the java virtual machine
- 可能是和其他软件冲突了。先关闭掉其他软件,再打开管理工具试试。
- 服务器内存不够。
DISQL 中设置了 set autocommit on; 但 manager 工具还是需要 commit, 数据才能入库
需要设置选择管理工具-窗口-选项-查询分析器-自动提交。请参考执行插入语句提示成功但数据并没有真正保存
客户端执行脚本时报错内存不足
- 分段执行 SQL 脚本;
- 点击客户端右下角垃圾收集,缩小堆大小,释放空间。
执行 SQL 脚本,报错 invalid file path 错误
- 检查 SQL 脚本路径是否正确,要脚本的绝对路径。
- start d:/test.sql 注意,在该语句后面不要加";"结束符。
语句块/包/存储函数中的间隔分区如何支持自动扩展
可以设置 dm.ini 参数:DEL_HP_OPT_FLAG 取值为 4,允许语句块中的间隔分区表自动扩展。
创建局部唯一索引或者 primary key, 必须包含分区列。全局索引不受此限制
执行下列语句:
create unique index "index_02" on "USER01"."TABLE_1"("COLUMN_1");
错误号: -2683
错误消息: 第 1 行附近出现错误:局部唯一索引必须包含全部分区列
远程 linux 的数据库服务端,一定要关闭防火墙吗
如果不关闭防火墙的话 要把相关端口加入到策略里。
可以参考:无法连接数据库(网络通信异常)、
客户不愿意关闭防火墙,连接管理工具远程连不上的问题
运行管理工具报错:screen for GtkWindow not set
【问题描述】:
dmdba 用户在 /home/dmdba/dmdbms/tool 路径下,执行 ./manager 报错。
screen for GtkWindow not set; you must always set a screen for a GtkWindow before using the Window
dmdba 用户执行 xhost + 可以正常出来 access control disabled, clients can connect from any host.
【问题解答】:
这个是图形化界面打不开的问题,建议咨询操作系统技术人员。或者改用命令行方式进行数据库操作。
运行./manager 或者./dts 图形工具开启报错
【问题描述】
数据库用命令行的方式可以正常启动。
用 dmdba 的用户在 tool 目录下运行./manager 或者./dts 会报错:/usr/share/themes/kylin-black-theme/gtk-2.0/gtkrc:817: 找不到包含文件:“apps/caja.rc”
【问题解决】
这个是图形化界面打不开的问题,建议咨询操作系统技术人员。或者改用命令行方式进行数据库操作。
使用管理工具和 ddl 脚本修改表的注释之后,注释在管理工具中不显示
- 在管理工具中修改表的注释,如图所示:
- 如果使用 SQL 脚本修改表的注释,执行结束后需要执行 commit 提交操作:
也可以设置管理工具的菜单:窗口--> 选项--> 查询分析器--> 自动提交 进行勾选。如下图:
注意修改后需要在管理工具的对应表的上级节点上进行刷新操作。
![]()
表插入数据以后,重启服务或停止服务后开启服务,表里面的数据丢失
默认是手动提交的方式,执行数据插入语句后,需要执行 commit 进行提交,否则会回滚。类似问题请参考 执行插入语句提示成功但数据并没有真正保存
用户名密码错误
- 注意大小写敏感
修改密码语句中密码未加双引号,登录需要把小写字母全部改为大写; - 注意不要用操作系统的用户名和密码输入,用数据库的用户名密码登录;
- 注意登录端口是否正确,可以试着添加 IP 和端口号来登录;
- 如果是全库备份还原,注意在目的库上,再次登录的时候,用户名密码要用源库的。
linux 系统中,打开管理工具乱码
回答:可能是因为操作系统缺少中文字库,确保操作系统、数据库的字符集一致。
DM 集群中,通过 disql 无法连接数据库,manager 工具可以连
【问题说明】
主备集群中,通过 disql 无法连接数据库,manager 工具可以连。报没有匹配的可登录服务器。查看 dm_svc.conf 如下:
TIME_ZONE=(480)
LANGUAGE=(cn)
OA=(192.168.xx.xx:5236,192.168.xx.xx:5236)
LOGIN_MODE=(1)
【问题解决】
服务名中配置的 LOGIN_MODE 为全局模式,需要把 LOGIN_MODE 配置在 OA 服务名下,如下:
TIME_ZONE=(480)
LANGUAGE=(cn)
OA=(192.168.xx.xx:5236,192.168.xx.xx:5236)
[OA]
LOGIN_MODE=(1)
访问达梦数据库报错:无效的 ip
- 检查防火墙状态,关闭防火墙
systemctl status firewalld
service iptables status
- 查看用户和用户状态
select username,ACCOUNT_STATUS from dba_users;
- 查看用户 访问 ip 限制和资源限制,看 IP 是否设置在资源限制里。
select id,failed_num,allow_addr from sysusers;
- 修改用户 资源限制条件
alter user 用户 limit allow_ip null;
在达梦管理工具上怎么修改结果集?
单表结果集能修改,多表结果集不能修改。
修改方法:将结果集右下方的小锁解开
密码非明文登录 DISQL 方法
默认 DISQL 登录数据库密码是明文,以下登录方式可以不显示密码:
./disql /nolog 登录 DISQL 后,输入 login 登录数据库,按照提示填写 IP 号、用户名、密码、端口号等选项;
如果想要不用每次登录都输入端口,可以在配置文件 dm_svc.conf 中配置
指定 dm_svc.conf 非默认位置
dm8.1.1.144 版本之后 jdbc 的 url 参数增加 dmsvcconf,实现读取指定 url 属性配置文件所在路径
用法:
jdbc:dm://dm?dmsvcconf=此处为dm_svc.conf的文件位置
数据库设置手动提交模式,但执行新建表后,发现之前未提交事务已被自动提交
【问题描述】
在 MANAGER 管理平台执行完一些新增记录事务后未提交,后面新建表后,发现之前的未提交事务已被自动提交。例如:在同一会话中依次执行以下 3 条语句,且均不提交:
create table SYSDBA.TEST (a int);
insert into SYSDBA.TEST values(1);
create table SYSDBA.TEST2 (a int);
在另一会话中查询 SYSDBA.TEST 表,得到如下结果
发现可以查到会话 1 插入的语句,说明 insert 语句已经提交。
【问题解决】
在手动提交模式下,当遇到 DDL 语句时,DM 数据库会自动提交前面的事务,然后开始一个新的事务执行 DDL 语句,这种事务提交被称为隐式提交。DM 数据库在遇到以下 SQL 语句时会自动提交前面的事务:
- CREATE;
- ALTER;
- TRUNCATE;
- DROP;
- GRANT;
- REVOKE;
- 审计设置语句。
DM8 创建链接访问 Oracle 数据库报错:DBLINK 加载库文件失败
【问题描述】:
使用 DBLINK 访问 Oracle 目的端报错"DBLINK 加载库文件失败" 。
报错信息为:[-2245]:Error in line: 1 DBLINK load library fail.
【问题解决】:
第一种情况:DM DBLINK 使用的是 ODBC 方式创建,一般是由于 Oracle odbc 驱动包缺少依赖库文件导致。
解决办法:首先,使用 ldd 命令检查 Oracle odbc 驱动包是否缺少依赖库文件。如下:
[root@localhost instantclient_19_13]# ldd libsqora.so.19.1
linux-vdso.so.1 => (0x00007ffeef3cd000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ffafac45000)
libm.so.6 => /lib64/libm.so.6 (0x00007ffafa943000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ffafa727000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00007ffafa50d000)
librt.so.1 => /lib64/librt.so.1 (0x00007ffafa305000)
libaio.so.1 => /lib64/libaio.so.1 (0x00007ffafa103000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007ffaf9ee9000)
libclntsh.so.19.1 => /opt/oracle/instantclient_19_13/libclntsh.so.19.1 (0x00007ffaf5d76000)
libclntshcore.so.19.1 => /opt/oracle/instantclient_19_13/libclntshcore.so.19.1 (0x00007ffaf57d2000)
libodbcinst.so.2 => not found ###这里缺少依赖
libc.so.6 => /lib64/libc.so.6 (0x00007ffaf5404000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffafb103000)
libnnz19.so => /opt/oracle/instantclient_19_13/libnnz19.so (0x00007ffaf4d92000)
然后,使用 find 命令查找系统上对应的动态库文件,查找到之后加入到 LD_LIBRARY_PATH 系统环境变量,或者添加到 /etc/ld.so.conf.d 目录下指定的配置文件中。如下:
[root@localhost ~]# echo /usr/local/lib > /etc/ld.so.conf.d/libodbc.conf
[root@localhost ~]# ldconfig
第二种情况:DM DBLINK 使用的是 Oracle OCI 方式创建,一般是由于 DM 数据库未加载 Oracle OCI 驱动。
解决办法:首先配置 Oracle oci 客户端,在 Oracle 官网下载 oci 包,根据达梦服务器的系统下载 oracle 相应系统的安装包 instantclient,例如下载的是 instantclient-basic-linux.x64-12.2.0.1.0 包,解压后创建软连接:
ln -s libclntsh.so.12.1 libclntsh.so
然后需要重启 DM 数据库(前提是 LD_LIBRARY_PATH 或者 ldconfig 配置正确),重启服务后数据库会加载 Oracle OCI 驱动,之后就可以正常使用 DBLINK 访问 Oracle 数据库。
--达梦 8 创建 Oracle 的链接服务
create link LINK1 connect 'ORACLE' with "test" identified by "******" using '192.168.80.140/orcl';
--通过链接访问 Oracle 表 CITY
select * from CITY@LINK1;
使用 xmanger 等工具打开远程服务器上的管理工具报错
【问题描述】
使用 xmanger 等工具打开远程服务器上的 manager 图形工具报错,如下图:
依据提示查看 ../workspace/manager/.metadata/.log 日志文件,提示缺少库文件 libgtk-x11-2.0.so.0,而无法打开图形窗口,如下图:
【问题解决】
使用 yum 命令查找提供这个库文件的软件包,如下图:
安装 gtk2 这个软件包:
Yum install gtk2* -y
Manager 管理工具连接后没有模式等相关信息
【问题分析】
出现这种情况一般有如下两种原因:
- 检查数据库启动状态,若是以 mount 方式启动,修改为 open 状态即可。
- 客户端版本和数据库服务的版本相差太多的问题,请使用服务版本下客户端,或者重新下载对应的安装包安装对应版本客户端。
使用 disql 连接数据库报错:没有匹配的可登录服务器
【问题描述】
数据库服务处于启动状态,通过数据库服务本地登录 disql 登录数据库用户,显示报错:-70019:没有匹配的可登录服务器。
【问题分析】
出现该报错可能是由于以下几种原因:
- 数据库连接会话数超过 MAX_SESSIONS 设定值。
- 因为 Linux 环境中 ulimit 配置中的 max open files 参数配置过小或者配置未生效。
- dm_svc.conf 配置了全局的 login_mode 参数。
【问题解决】
可根据以下思路进行排查:
- 明确数据库服务处于启动状态,通过如下命令查看进程是否存在。
ps -ef|grep dmserver
- 检查 disql 连接数据库的端口是否正确,可以通过命令
netstat -ntlp | grep dmsever
或者cat dm.ini | grep PORT_NUM
查看,参考登录命令:./disql 用户名/密码 @IP:端口号 。 - 检查是否由数据库连接会话数超过 MAX_SESSIONS 设定值引发。检查方法有两种:
(1)排查数据库服务本地日志中是否存在类似于“Reached the max session limit” 的 ERROR 错误,如果存在,则说明数据库连接的会话数超过了 MAX_SESSIONS 设定值。可以调整 dm.ini 中的 MAX_SESSIONS 参数值,重启数据库服务生效(MAX_SESSIONS 原则上应综合考虑数据库架构、业务需求、应用代码层数据库连接设计逻辑等方面进行设置)。
(2)通过 dmserver 服务的线程连接情况判断,比如:通过 ps -ef | grep dmserver
获取 dmserver 的进程号,比如为 5009,然后通过命令:ps -T -p 5009 | wc -l
查看达梦服务的线程数是否超过 MAX_SESSIONS 的值。
- 排查日志是否存在报错:“warning: Couldn't set socket option for set timeout: 5000, err_code: 88, which:0,r:-1”。如果存在该报错则是因为 Linux 环境中 ulimit 配置中的 max open files 参数过小或者配置未生效导致。重新配置 max open files 参数为 65536,然后重启数据库服务即可。可参考如下方法处理:
(1)通过如下命令获取数据库服务进程 PID 值:
ps -ef | grep dmserver
(2)通过如下命令查看当前服务进程的 ulimit 资源限制情况:
cat /proc/数据库 PID/limits
(3)通过命令 ulimit -a 查看当前操作系统配置的 ulimit 资源限制情况,如果配置不对可参考如下命令单独修改 ulimit 配置:
[root@~]# echo "* soft nofile 65536" >> /etc/security/limits.conf
[root@~]# echo "* hard nofile 65536" >> /etc/security/limits.conf
[root@~]# echo "ulimit -n 65536" >> /etc/profile
(4)修改完后可通过如下命令查看当前进程 open files 数量:
ls /proc/2165/fd | wc -l
(5)确认无误后,重启数据库服务,让新的进程按照配置后的 ulimit 资源限制情况生效即可,重启后复核进程的资源限制情况。
- 检查 dm_svc.conf,是否配置了全局的 login_mode 参数,如果是,删除全局的 login_mode 参数,配置为局部参数。
应用通过私网 IP 连接数据报错:网络通信异常
【问题描述】
应用和数据分别部署在两台虚拟机上,但应用通过虚拟机配置的私网 IP 连接报网络通信异常,且实际用私网 IP 可以 ping 通。
【问题解决】
考虑将私网 IP 改为绑定的弹性 IP 进行连接。在虚拟环境下,可能网络需要进行多次测试。
Manager 管理工具无法修改表、更新统计信息以及查看表属性
【问题分析】
考虑是否因为在 dm.ini 中屏蔽了一部分关键字导致管理工具的部分功能不能正常运行,去掉关键字进行排查。
建议关键字放在 dm_svc.conf 文件的 keywords 中来屏蔽。
使用 DM 客户端管理工具进行某些操作时,弹框报错:Java heap space
【问题解决】
考虑是否是客户端版本与连接的数据库服务端版本时间跨度太大,建议使用与 DM 服务端版本一致的客户端重新安装。查看数据库版本方法:
select * from v$license; ---DM7 版本
select id_code; ---DM8 版本
manager 工具关闭了对象导航栏后如何重新打开
【问题解决】
在管理工具上方导航栏中,选择:窗口--> 视图--> 对象导航,即可重新开启对象导航栏。
在 linux 环境下打开 SQL 命令行工具,按“Backspace”无法正常删除
【问题描述】
利用 disql 打开 SQL 命令行工具,在输入 SQL 命令时,发现按“Backspace”无法正常删除,如下图所示:
【问题解决】
- 方法一:在 dmdba 用户的 .bash_profile 文件中添加 stty erase ^h,再执行 source .bash_profile 使修改生效。如下图:
- 方法二:按住 Ctrl + Backspace 进行删除。
达梦如何设置某用户某些 IP 远程访问
【问题解决】
方法 1:通过达梦客户端 manager 工具进行设置,如下图所示:
方法 2:通过 sql 语句修改。相关语法参考以下 sql:
---修改用户的开放 IP(设置 IP 白名单)
alter user 用户名 allow_ip "允许登录的 IP1","允许登录的 IP2";
---通过以下系统表查看用户的开放 IP
select b.name,'"'||replace(a.allow_addr,'|','","')||'"' as allow_ip_list
from SYSUSERS a join SYSOBJECTS b on a.id=B.ID
where b.name='用户名'
---设置 IP 黑名单
alter user "用户名" not_allow_ip "192.168.1.1" ,"192.168.1.2","192.168.1.3";
---设置允许访问的具体时间段
alter user "用户名" allow_datetime "2022-10-10" "10:10:10" to "2022-12-12" "12:12:12";
---设置不允许访问的规则时间段
alter user "用户名" not_allow_datetime "FRI" "00:00:00" to "SAT" "23:59:59";
注意修改用户的开放 IP 时,多个 IP 之间要用逗号隔开,当已经存在某些开放 IP 的情况下再新增开放 IP,一定要把之前的 IP 带上,否则将会丢失之前的 IP 信息。
DM 数据库使用 ODBC 方式创建 DBLINK 访问 Oracle 时报错 "[-70037]:字符串不完整" 或者中文显示为问号
【问题描述】
有如下两种情况:
情况一:DBLINK 使用 ODBC 方式访问目的表时,中文显示为问号。如下图:
isql 直接访问:
情况二:DBLINK 使用 ODBC 方式创建,重启数据库之后,访问目的端表报错 "[-70037]:字符串不完整"。
【问题原因】
出现以上两种情况的报错均与配置 NLS_LANG 环境变量有关,以下方法以情况一为例,但同样适用于解决情况二的报错。
可以看到上面,isql 直接访问 Oracle ,以及达梦通过 ODBC 数据源访问创建 DBLINK 访问 Oracle 时,中文会显示乱码,一般是与客户端字符集环境有关,可以通过设置 NLS_LANG 环境变量指定客户端字符集。如下:
- 配置与 Oracle 数据库相同的 NLS 环境
- 配置 NLS_LANG 环境变量,添加到.bash_profile 中
[dmdba@localhost bin]$ vim ~/.bash_profile ---添加下面内容
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
[dmdba@localhost bin]$ source ~/.bash_profile
[dmdba@localhost bin]$ env|grep NLS_LANG
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
- 生效后,再次使用 isql 进行查询正常,但是 DBLINK 中还是乱码,
这是由于 DM 数据库启动时未将 NLS_LANG 环境变量加载导致。
如果在 DM 数据库启动时未加载到 NLS_LANG 环境变量,即使是 disql 窗口配置了 NLS_LANG 环境变量并生效也是无法正常显示中文的,所以在配置 NLS_LANG 环境变量生效后,需要在当前会话窗口重启 DM 数据库后才能正常显示中文。 - 此时可能会出现两种异常情况:
1.配置 NLS_LANG 生效后启动 DM 数据库,然后 disql 窗口未配置 NLS_LANG,isql 查询中文显示问号,disql 查询结果正常;
2.DM 数据库启动会话窗口未配置 NLS_LANG,disql 窗口配置了 NLS_LANG 之后,isql 查询正常看,disql 查询中文显示问号。 - 以上异常情况有两种解决办法:
方法 1:使用 Oracle OCI 的方式创建 DBLINK。如果数据库启动时未加载 Oracle OCI 驱动,需要重启数据库加载 Oracle OCI 驱动。
方法 2:配置好 NLS_LANG 环境变量并生效后,在当前窗口重启 DM 数据库服务。
达梦数据库如何使用 IPV6 连接
【问题解决】
达梦数据库支持使用 IPv6 的地址访问数据库。与使用 IPv4 相比,在连接时需要指定相应的格式:
1.使用 JDBC 连接时,若使用 ipv6 地址,需要用 [] 指明是 ipv6 地址,即 ipv6 的地址需要包含在 [] 中。
例如:达梦管理工具使用 IPV6 地址 fe80::1a2d:8be9:91f6:6b51,那么主机名那里则为 [fe80::1a2d:8be9:91f6:6b51]。
2.disql 工具使用 ipv6 地址连接时,本地测试在 Linux 上与在 Windows 上的主要区别如下:
(1)Linux 上使用 disql 采用 ipv6 地址访问,需要使用方括号 [] 将 ipv6 地址 加 % 与 disql 机器的网络接口名整个包起来,如:ipv6 地址为 fe80::1a2d:8be9:91f6:6b51,ens33 为 disql 机器对应的网络接口名称,则 disql 连接串 host 地址为[fe80::1a2d:8be9:91f6:6b51%ens33]。
(2)Windows 上使用 disql 采用 ipv6 地址访问配置和 JDBC 使用 ipv6 访问一样,使用方括号 [] 将 ipv6 地址包起来即可。
可参考《DM 程序员手册》和《DM disql 使用手册》等,手册位于数据库安装路径 /dmdbms/doc
文件夹。
以下提供方法演示:
- 检查 IPv6 是否启用
默认 Centos 7 启用了 IPv6,Windows(win10 win11)也默认启用了 IPv6。简单查看系统是否启用 IPv6:
---Linux7:
[root@localhost ~]# sysctl -a|grep ipv6|grep disable
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.ens32.disable_ipv6 = 0
---上面为 0,则表示未禁用 ipv6(默认)
[root@localhost ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.15.71 netmask 255.255.255.0 broadcast 192.168.15.255
inet6 fe80::1a2d:8be9:91f6:6b51 prefixlen 64 scopeid 0x20<link>
inet6 fd15:4ba5:5a2b:1008:9ef5:bef9:de64:c30a prefixlen 64 scopeid 0x0<global>
ether 00:0c:29:89:30:0d txqueuelen 1000 (Ethernet)
RX packets 796502 bytes 872721471 (832.2 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1028073 bytes 2448756974 (2.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
---上面 inet6 表示启用了 ipv6
---Windows:
ipconfig [-all]
---可以看到显示 IPv6 地址,则表示启用
- 测试机器之间 IPv6 地址是否能正常通信
假如 Linux 数据库服务器为 A 机,Linux 客户端机器为 B 机,Windows 客户端机器为 C 机
B 机 telnet A 机:telnet -6 A 机 ipv6 地址 %B 机使用的网络接口名称 端口号 (Linux-Linux,网络接口名称比如 ens32)
C 机 telnet A 机:telnet A 机 ipv6 地址 %C 机对应地址的 scopeid 端口号 (Windows-Linux,scopeid 为 Windows IPv6 地址那里显示的"ipv6 地址 %scopeid"中的 scopeid)
例如:Linux 数据库服务器的 IPv6 地址为 fe80::1a2d:8be9:91f6:6b51 , IPv4 地址为:192.168.15.71。客户端机器地址:为 fe80::89b7:a6c4:d5cc:d905,测试结果如下图表示测试结果正常:
- 使用 disql 进行连接测试
1.Linux 客户机使用 disql 连接
###ipv4 连接测试成功
[dmdba@localhost bin]$ ./disql SYSDBA/*****@192.168.15.71:5236
服务器[192.168.15.71:5236]:处于普通打开状态
登录使用时间 : 31.898(ms)
disql V8
###IPV6——disql 连接串 host 不加网络接口名称,连接失败
[dmdba@localhost bin]$ ./disql SYSDBA/*****@[fe80::1a2d:8be9:91f6:6b51]:5236
[-70028]:创建SOCKET连接失败.
disql V8
用户名:
密码:
[-70028]:创建SOCKET连接失败.
####IPV6——disql 连接串 host 加上网络接口名称,连接正常
[dmdba@localhost bin]$ ./disql SYSDBA/*****@[fe80::1a2d:8be9:91f6:6b51%ens33]:5236
服务器[fe80::1a2d:8be9:91f6:6b51%ens33:5236]:处于普通打开状态
登录使用时间 : 5.810(ms)
disql V8
2.Windows 客户机使用 disql 连接
###ipv4 连接成功
E:\dmdbms270\bin>disql SYSDBA/*****@192.168.15.71:5236
服务器[192.168.15.71:5236]:处于普通打开状态
登录使用时间 : 15.842(ms)
disql V8
###IPV6——disql连接串 host 不加 scopeid,连接成功
E:\dmdbms270\bin>disql SYSDBA/*****@[fe80::1a2d:8be9:91f6:6b51]:5236
服务器[fe80::1a2d:8be9:91f6:6b51:5236]:处于普通打开状态
登录使用时间 : 17.334(ms)
disql V8
###IPV6——disql连接串 host 加 scopeid,也可连接成功
E:\dmdbms270\bin>disql SYSDBA/*****@[fe80::1a2d:8be9:91f6:6b51%20]:5236
服务器[fe80::1a2d:8be9:91f6:6b51%20:5236]:处于普通打开状态
登录使用时间 : 3.872(ms)
disql V8
- 使用 DM 管理工具进行连接测试
Linux 客户机和 Windows 客户机使用 DM 管理工具进行连接方法相同,如下图所示:
- 使用 dm_svc.conf 中服务名方式连接测试
dm_svc.conf 文件配置内容如下:
TIME_ZONE=(480)
LANGUAGE=(cn)
IPV6=([fe80::1a2d:8be9:91f6:6b51]:5236)
IPV6_2=([fe80::1a2d:8be9:91f6:6b51%ens33]:5236)
1.disql 测试服务名方式
(1)Linux 环境
(2)Windows 环境
2.DM 管理工具测试
利用 IPV6 和 IPV6_2 服务名均可连接成功
- 简单的 JAVA 代码测试
1.直接使用 IPv6 地址连接,操作数据库成功
2.使用 dm_svc.conf 中的服务名连接,操作数据库正常
登录数据库使用 127.0.0.1 或者 localhost 能在本服务器登录,不写则报创建 SOCKET 连接失败
【问题描述】
disql 登录数据库出现:使用 127.0.0.1 或者 localhost 能在本服务器登录,不写则报创建 SOCKET 连接失败。如下图:
【问题解决】
请检查 /etc/hosts 配置,配置 127.0.0.1 的主机名配置,如下所示:
dm 通过 dblink 查询 Oracle 表,报错:字符串截断
【问题描述】
- 环境描述
DM 端:Win 10 操作系统,数据库版本为 V8-1-2-70,初始化参数:字符集 UTF-8、大小写不敏感、页大小 32、簇大小 32。
Oracle 端:Linux 操作系统,数据库版本 Oracle Database 11g Enterprise 11.2.0.3.0,初始化参数:字符集 GBK,其他参数默认。
- 问题重现
(1)在 Oracle 端创建用户、建表和插入数据语句如下:
Create user DM idtified by 123456;
Conn DM/123456
-- Create table
create table TEST(name VARCHAR2(50));
-- Insert data
insert into TEST (NAME)
values ('方正证券-执行委员会委员、副总裁、首席人才官(CHO)');
commit;
(2)在 win 平台使用管理工具 SYSDBA 登录,创建 dblink,并通过 dblink 查询 Oracle 端数据,报“字符串截断”(没有放 Oracle 的 oci 可以直接创建 oracle 的 dblink,也可以直接替换掉附件中的 bin 目录升级到 70 版本)。
create public link "LINK2" connect 'ORACLE' with "DM" identified by "123456" using '192.168.1.7/orcl';
select * from DM.TEST@LINK2
【问题解决】
尝试修改 dm 端字符集为 GB18030 后,查询 dblink 正常。初始化参数 Utf-8 时,尝试初始化参数选择以字符为单位,仍然字符串截断的错误。
总结:dm 通过 dblink 查询 Oracle 表时,需要与 Oracle 字符集保持一致。如果 Oracle 端字符集为 GB,dm 端为 UTF-8,则会报字符串截断问题。
LINUX/UOS 环境,使用非 ROOT 用户启动管理工具时失败并报错:GLib-Gobject-Warming**: 时间日期: invalid (NULL) pointer instance
【问题描述】
LINUX/UOS 环境安装了达梦客户端工具,使用非 ROOT 用户启动 DM 管理工具时失败,提示"GLib-Gobject-Warming**: 时间日期: invalid (NULL) pointer instance……"。
【问题解决】
原因:该报错主要是图形化显示指向问题,可以通过 echo $DISPLAY 命令查看相关变量的值为空。
解决方法:
方法一:从系统登录界面,直接用 root 用户登录一般可以避免这个问题;
方法二:如果没有 root 用户,那么在当前用户下使用以下命令临时赋值 DISPLAY 变量值:
export DISPLAY=:0.0
xhost +
echo $DISPLAY
变量赋值后,重新启动 DM 管理工具即可。
方法三:永久解决所有用户在本地启动图形化工具的显示问题,可以通过在/etc/profile 文件最后一行添加赋值语句:
export DISPLAY=:0.0
普通用户开启操作系统认证,用 root 用户登录数据库报错:未经授权的用户
【问题描述】
Windows 环境下操作系统用户 dameng 基于 OS 的身份验证登录数据库。普通用户开启操作系统认证,用 root 登录数据库报错:未经授权的用户。详情如下:
1、在数据库中创建一个操作系统的同名用户,并修改 INI 参数。
CREATE USER dameng IDENTIFIED BY "Dameng@12345";
SP_SET_PARA_VALUE(2,'ENABLE_LOCAL_OSAUTH',1);
2、重启数据库后,参数生效。
select * from v$dm_ini where PARA_NAME='ENABLE_LOCAL_OSAUTH';
3、在操作系统中创建 dmusers 用户组,并将操作系统用户 dameng 添加到 dmusers 用户组。
C:\Windows\system32>net localgroup dmusers /add
C:\Windows\system32>net user dameng 123456 /add
C:\Windows\system32>net localgroup dmusers dameng /add
4、操作系统用户 dameng 基于 OS 的身份验证登录数据库,报错:“未经授权的用户”。
E:\dameng\dmdbms8\bin>disql.exe /@localhost:5236 as users
【问题解决】
1、电脑切换到 dameng 用户下。
点击当前用户,切换到 dameng 用户。
2、打开 cmd 重新登录。
管理工具连接单机数据库时报错:服务器模式不匹配
【问题分析】
此类错误往往因为 dm_svc.conf 配置出错导致。
【问题解决】
- 检查是否配置了不存在的参数,或者其他参数配置有误;
- 检查集群相关参数是否配置成全局,如 LOGIN_MODE 参数。
dm_svc.conf 正确配置如下:
##全局服务配置
TIME_ZONE=(480)
LANGUAGE=(cn)
##局部配置
[DMRW]
LOGIN_MODE=(1)
RW_SEPARATE=(1)
RW_PERCENT=(25)
SWITCH_TIME=(3000)
SWITCH_INTERVAL=(200)
dm_svc.conf 部分参数说明:
参数 | 缺省值 | 描述 |
---|---|---|
TIME_ZONE | 操作系统当前时区 | 指明客户端的默认时区,设置范围为:-779~840M,如 60 对应 +1:00 时区。 |
LANGUAGE | 操作系统语言 | 当前数据库服务器使用的语言,会影响帮助信息错误和提示信息。支 持的选项为:CN(表示中文)和 EN(表示英文)。可以不指定,若 不指定,系统会读取操作系统信息获得语言信息,建议有需要才指定。 |
LOGIN_MODE | 4 | 指定优先登录的服务器模式。0:优先连接 PRIMARY 模式的库, NORMAL 模式次之,最后选择 STANTBY 模式;1:只连接主库; 2:只连接备库;3:优先连接 STANDBY 模式的库,PRIMARY 模式 次之,最后选择 NORMAL 模式;4:优先连接 NORMAL 模式的库, PRIMARY 模式次之,最后选择 STANDBY 模式。 |
RW_SEPARATE | 0 | 是否启用读写分离。0:不启用;1:启用;2:启用,备库由客户端 进行选择,且只会选择服务名中配置的节点。 |
RW_PERCENT | 25 | 读写分离分发比例,有效值范围 0~100。 |
SWITCH_TIMES | 1 | 以服务名连接数据库时,若未找到符合条件的库成功建立连接, 将尝试遍历服务名中库列表的次数。有效值范围: 1~9223372036854775807。 |
SWITCH_INTERVAL | 200 | 在服务器之间切换的时间间隔,单位为毫秒,有效值范围: 1~9223372036854775807。 |
此外在全局服务中还可以配置服务名,用于数据库登录。例如:在全局服务配置中配置服务名为 DMRW 的服务
DMRW=(10.10.20.3:5236,110.10.20.4:5236,10.10.20.5.103:5236)
名词解释:
服务名:用于连接的服务名,参数值格式为:服务名=(IP[:PORT],IP[:PORT],......)。IP 为数据库所在的 IP 地址,如果是 IPV6 地址,为了区分端口,需要用[]封闭 IP 地址。PORT 为数据库使用的 TCP 连接端口,可选配置,不配置则使用默认的端口。
注意若配置服务名时没有指定端口,后续在工具或接口的命令中使用服务名时,在服务名后增加的―:XXXX‖端口号会被忽略,这样指定的端口号是无效的。
更多详细参数说明请参考数据库安装目录的 doc 下《DM8 系统管理员手册》。
打开 manage 客户端工具无响应
【问题描述】
manage 客户端工具,前期打开了某个大文件导致卡死,任务管理器中结束后重新打开或者重启电脑打开后仍然无响应。
【问题解决】
删除 manage 工具元数据中缓存文件即可,如:C:\bigprogram\dmdbms\tool\workspace\data\manager\.metadata\.plugins,删除该路径中所有文件后重新打开后即可恢复。对于 manage 客户端界面位置调整混乱后需要恢复默认界面的,该方式也适用。
采用 GM 算法进行通信加密。
【问题描述】
如何采用 GM 算法进行通信加密?
【问题解决】
可以采用基于应用层消息包的方式开启 GM 算法的通信加密,具体方法如下:
- 通过以下命令修改数据库参数。
SP_SET_PARA_STRING_VALUE(2,'COMM_ENCRYPT_NAME','OPENSSL_SM4_ECB');
- 重启数据库。
- 应用服务器创建自定义路径如:D:\\dmdbms_94\dm8_20230719_x86_win_64\source\ssl。
- 拷贝数据库 bin/external_crypto_libs/openssl1.1.1_crypto.dll(Windows 操作系统)或 libopenssl_crypto.so (Linux 操作系统),bin/cyt_java.dll(Windows 操作系统)或 bin/libcyt_java.so(Linux 操作系统)至应用服务器自定义的路径 D:\\dmdbms_94\dm8_20230719_x86_win_64\source\ssl 下。
- 调整 url 连接串,添加参数 cipherPath
cipherPath :第三方加密算法动态链接库位置。
- 应用配置 VM option,加载动态库。
至此基于应用层消息包的方式开启 GM 算法的通信加密配置完成。
mpp 集群全局登录失败报错:”[-6024]:Remote node global login failed.”
【问题描述】
mpp 集群本地登录正常,但是全局登录失败报错:“[-6024]:Remote node global login failed.”
dmdba@ecs-e9ef-0913401 bin]$ /opt/dmdbms/bin/disql SYSDBA/用户密码*local@127.0.0.1:5236
Server[29.1.254.47:05236]:mode is normal, state is open
login used time : 2.951(ms)
disql V8
SQL> ^C^
[dmdba@ecs-e9ef-0913401 bin]$ /opt/dmdbms/bin/disql SYSDBA/用户密码*global@127.0.0.1:5236
[-6024]:Remote node global login failed.
disql V8
username:^C
【问题解决】
需要检查 mpp 集群中每个节点的运行情况,若存在某一个节点服务异常无法访问的情况,mpp 集群将无法全局模式登录。
disql 连接数据库报错 Segmentation fault (core dumped)
【问题描述】
disql 一直登录数据库正常,升级 ssh 服务后,执行 disql 报错:“Segmentation fault (core dumped)”。
【问题分析】
- disql 依赖分析,通过 ldd disql 查看是否有依赖包缺失,和正常机器的 ldd disql 进行对比,对比发现没有缺依赖。
- 通过 strace 命令追踪程序调用,并将结果输出到文件,分析文件里面存在报错。
[dmdba@dm bin]$ strace -f -s 1000 -o strace.txt ./disql SYSDBA/*****
[dmdba@dm bin]$ more strace.txt
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=95712, ...}) = 0
mmap(NULL, 95712, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fed7b9ec000
close(3) = 0
open("/lib64/tls/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/lib64/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
open("/usr/lib64/tls/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libcrypto.so.1.1", O_RDONLY|O_CLOEXEC) = -1 EACCES (Permission denied)
munmap(0x7fed7b9ec000, 95712) = 0
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x1d896} ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)
从上面可以看到调用 /usr/lib64/libcrypto.so.1.1 报错权限拒绝。
【问题解决】
授予 /usr/lib64/libcrypto.so.1.1 755 权限。
chmod 755 /usr/lib64/libcrypto.so.1.1
授权后,disql 登录数据库正常。
Linux 如何设置别名来快速访问达梦数据库
【问题解决】
可通过设置环境变量来实现:
- 配置环境变量。
[dmdba@localhost ~]$ vim ~/.bash_profile
##添加如下命令,其中disql路径、用户名、密码、IP、端口需按照实际情况设置:
alias dmsql="/home/dmdba/dmdbms/bin/disql SYSDBA/*****@localhost:5236"
- 使环境变量生效。
[dmdba@localhost ~]$ source ~/.bash_profile
- 验证别名。
[dmdba@localhost ~]$ dmsql
如何实现使用 DM 保留字作为对象名
【问题描述】
可通过在 dm_svc.conf 文件中增加 keywords 参数来标识。
【问题解决】
以使用关键字 select 作为对象名来举例:
修改 dm_svc.conf 文件,增加 keyword 参数。
[TEST]
SWITCH_TIME=(300)
KEYWORDS=(SELECT)
创建表 select。
注意:
Keywords 后的列表,需要用英文括号包起来,并且多个值之间使用英文逗号分隔,否则配置无法生效,Keywords 正确配置如下:
[TEST]
SWITCH_TIME=(300)
KEYWORDS=(UPDATE,SELECT)
Keywords 参数说明:标识用户关键字,所有在列表中的字符串,如果以单词的形式出现在 sql 语句中,则这个单词会被加上双引号。该参数主要用来解决用户需要使用 DM8 中的保留字作为对象名使用的状况。
忘记密码怎么办?
如果是系统用户 SYSDBA、SYSSSO 忘记密码,是没有办法找回来的。
温馨提示
- 用户在数据库初始化实例时,需设置数据库系统用户的密码,并保证密码强度,以保障数据安全性。
- 如果数据库中还有其它的用户,可以尝试在数据迁移工具 DTS 中使用其它用户登录,把数据库中相关用户的数据迁移到新的实例对应的用户中。
- 如果库里面没有业务数据或者数据不重要,则可以考虑卸载重装。
密码中含有 @/等特殊字符怎么办?
需要通过转义符来处理。disql 转义符使用如下:
linux 环境,需要使用双引号将密码包含进来,同时外层再使用单引号进行转义,具体例子如下: