【问题描述】:
连接数据库时出现报错:登录服务器失败。
【问题分析】:
使用 DM 数据库时,有时会碰到登录失败的情况。根据使用的连接工具不同,问题具体可能表现为网络通信异常或者 socket 连接失败。
当出现网络通信异常报错时,先考虑客户端与数据库服务器之间网络通信问题;如果客户端与数据库服务器之间网络通信正常,则考虑数据库服务器是否已正常启动。如果网络和数据库服务都正常,则考虑数据库相关连接配置等。
具体解决办法可参考DM数据库登录失败的排查方法。
此外,若是登录时用户名和密码填写错误,也会出现连接失败,但会提示:用户名或密码错误。
详情解决办法请参照:达梦数据库密码含特殊字符怎么使用disql登录
关于最大连接数,可参考《DM 系统管理员手册》dm.ini 章节(手册位于数据库安装路径 /dmdbms/doc
文件夹下),最大连接数参数如下:
MAX_SESSIONS
的值,根据用户自行赋值。建议值大小如下:以主机 CPU 4 路 8 核内存 64 GB 为例,建议值大小如下:
max_session=500~1000
max_session_statnment=2000
修改参数在数据库实例路径下的 dm.ini 文件,修改完成后,重启数据库才生效。
新建实例,修改 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 用户登陆,登录成功,如下图所示:
其原因很有可能就是连接池没有做好相关配置,或者配置了却设置的值不对,那么超时的原因大概有以下几点:
对于出现的 3 种问题,可以试试下面的解决方法:
Db.SetMaxOpenConns()
设置值(小于数据库配置的最大连接)。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 条件。
可能与大小写敏感的设置有关:
大小写设置方法:
大小写敏感设置在初始化实例中可以设置大小写敏感参数。
查看大小写敏感的方式:
select para_name,case para_value when 1 then 'y' else 'n' end from v$dm_ini where para_name= 'GLOBAL_STR_CASE_SENSITIVE';
DM 数据库支持对水平分区表建立普通索引、唯一索引、聚集索引和函数索引。创建索引时若未指定 GLOBAL 关键字则建立的索引是局部索引,即每一个表分区都有一个索引分区,并且只索引该分区上的数据。如果指定了 GLOBAL 关键字则建立的索引是全局索引,即每个表分区的数据都被索引在同一个 B 树中。
目前,仅堆表的水平分区表支持 GLOBAL 索引。堆表上的 primary key 会自动变为全局索引。非堆表目前暂不支持 global 索引。
详见《DM 系统管理员手册》第 16.4 章节内容。(手册位于数据库安装路径 /dmdbms/doc
文件夹下)
DmJobMonitor 是监控作业的服务,监控作业是否正常,一般是在 DM 管理工具里点击【作业】-【查看历史作业信息】即可获取作业的运行情况。
遇到 DM 数据库主键索引无法删除的情况不要着急,可以先将表的主键约束去除,再执行删除即可。
用户查询报错:
【解决方法】:
grant VTI to user123;
grant select on v$dm_ini to user123;
创建用户失败的原因可能有多,具体问题要具体分析,遇到错误时首先查看报错的详细信息,这样才能快速的定位和解决问题,下面列举几种常见的错误:
密码策略:PWD_POLICY
设置系统默认口令策略。
0: 无策略;
1: 禁止与用户名相同;
2: 口令长度不小于 9;
4: 至少包含一个大写字母(A-Z);
8 :至少包含一个数字(0-9);
16:至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符 号;若为其他数字,则表示配置值的和,如 3=1+2,表示同时启用第 1 项 和第 2 项策略。当 COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均 为 0
解决方法:
可修改 PWD_POLICY 参数,如下图所示:
如果是在 windows 操作界面,可以直接用管理工具-单击表然后右键查看。
如果是在 Linux 界面可通过以下方法查看。
调用 DM 存储系统过程 SP_TABLEDEF
,获得表的定义,如下图所示:
参数说明:
schname:模式名
tablename:表名
这个存储过程,直接 call 调用或者写在匿名块中调用均可。
比如,查询 DMHR 模式下 EMPLOYEE 表定义:
call sp_tabledef('DMHR','EMPLOYEE');
这个存储过程是 DM 数据库独有的,Oracle 并没有这个存储过程。但是它存在一个缺点,只能查询表,不能查询其他类型的对象。
所以这里推荐第二种方法,也是笔者最常用的查询表定义的方法。
DBMS_METADATA.GET_DDL
,DBMS_METADATA 系统包包含了许多实用的函数,有兴趣可以查看 DM 官方文档慢慢了解,这里就不一一赘述了,介绍一下 GET_DDL,如下图所示:
我们再测试一下这个包:
GET_DDL 功能非常强大,可以用于获取数据库对表、视图、索引、全文索引、存储过程、函数、包、序列、同义词、约束、触发器等的 DDL 语句。
无效的用户名
,检查一下 DMDCR_CFG.INI 里面的 dcr_seqno
,如下图所示:首次使用时,需要先创建代理环境,如下图,在代理上右键,选择【创建代理环境】,如下图所示:
然后在作业上右键新建作业,出现右边的方框中选择【添加】,如下图所示:
选择作业调度之后,在右下方选择【新建】,然后出现调度频率和时间的选项。
如果是系统用户 SYSDBA、SYSSSO 忘记密码,是没有办法找回来的。
温馨提示1. 数据库管理员 SYSDBA 的密码不要随便修改,默认密码为 SYSDBA(密码严格区分大小写)。如果出于安全方面的考虑非得修改,请一定要做好备案工作。
2. 如果数据库中还有其它的用户,可以尝试在数据迁移工具 DTS 中使用其它用户登录,把数据库中相关用户的数据迁移到新的实例对应的用户中。
3. 如果库里面没有业务数据或者数据不重要,则可以考虑卸载重装。
如果是自定义的用户密码丢失了,可以通过 SYSDBA 来更改密码。
DM 数据库密码默认是和用户一样的,大写 SYSDBA。
需要通过转义符来处理。disql 转义符使用如下:
linux 环境,需要使用双引号将密码包含进来,同时外层再使用单引号进行转义,具体例子如下:
./disql SYSDBA/' "abcd@efgh" '@localhost
windows 环境,需要使用双引号将密码包含进来,同时对双引号使用\进行转义,具体例子如下:
disql SYSDBA/\"abcd@efgh\"@localhost
需要注册连接。
SYS 是不能登陆的?
删除重建。
DM 数据库初始化时设置 SYSSSO 的密码,默认为 SYSSSO,仅在安全版本下可见和可设置。
用 SYSDBA 登录来修改用户的配置,先修改密码再修改资源。
alter user "SYSDBA" limit password_life_time unlimited;
通过 DM.INI 里的参数:PWD_POLICY
设置系统默认口令策略。
0:无策略;
1:禁止与用户名相同;
2:口令长度不小于 9;
4:至少包含一个大写字母 (A-Z);
8:至少包含一个数字 (0-9);
16:至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号);
若为其他数字,则表示配置值的和,如 3=1+2,表示同时启用第 1 项和第 2 项策略。
当 INI 参数 COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均为 0。
可以通过如下视图查询系统策略情况:
SELECT * FROM V$PARAMETER WHERE NAME= 'PWD_POLICY';
通过如下命令设置系统密码策略,该参数为动态参数,修改后即时生效,不需要重启数据库。
SP_SET_PARA_VALUE(1, 'PWD_POLICY',8);
设置策略成功后,对新创建的用户有效。原来的用户需要通过 alter user 修改用户的密码策略:
alter user 用户名 PASSWORD_POLICY 8;
更多关于设置密码相关问题,请参考《DM_SQL 语言使用手册》管理用户-用户定义语句。(手册位于数据库安装路径 /dmdbms/doc
文件夹下)
Navicat 工具暂不支持 DM 数据库,DM 数据库的连接可以使用数据库自身的 DM 管理工具进行连接。
DM 数据库管理工具存放在安装目录 dmdbms 下的 tool 文件夹中打开 manager.exe 进行连接即可。
DM 管理工具 MANAGER,在打开以后,可以通过注册连接按钮新建连接,该方新建的连接会保存到左侧的连接导航栏中。
DM 管理工具 MANAGER,在登录以后,右侧 SQL 窗口输入 SQL 语句后,可以点击工具栏上对应的绿色三角按钮执行,完成后需要点击后面的【提交】或者【回滚】按钮完成事务的提交和回滚。
会影响使用语句块进行批量循环 PRINT 信息,需要调大。如果过小,消息区显示的 SQL 内容不全,PRINT 的信息也显示不全。
如果不是必须大小写敏感,建议将管理工具上保持大小写敏感配置取消,这样后台全部转换成大写,就不会造成表名、字段名等由于大小写缘故出现无效的字段或者表名之类的错误。
生产环境要关闭自动提交和出错后继续运行的配置,避免出现错误后,无法挽回。
DM 数据库中可以模糊提示表名,在 DM 管理工具中右键【选项】,把编辑器中需要的选项全部勾选上。
根据需要勾选好就可以达到自己想要的设置了。
DM 支持 INT 和 BIGINT 两种数据类型的自增列,并提供以下函数查看表上自增列的当前值、种子和增量等信息:
IDENT_CURRENT:获得表上自增列的当前值;
IDENT_SEED:获得表上自增列的种子信息;
IDENT_INCR:获得表上自增列的增量信息。
在新建表的时候,选中表-修改-把对应列设置为自增列。
登录用户,找到【模式】,找到相关的表,点击右键,选择【浏览数据】,将列表中的数据拉到最底下,点击【not null】输入数据,然后点击保存。
管理工具默认是非自动提交的(窗口—选项),在执行 insert、update 等对数据进行修改的语句以后,需要执行 commit 命令进行提交。
如需修改成自动提交模式,可以在管理工具的对应选项中进行勾选,如下图所示:
使用 DM 管理工具访问 DM 数据库,在使用图形化工具查看数据库对象时,报错:非法的基类名/无效的列名等。
非法的基类名 DBMS_SQL
,启动相应的系统包,具体方法参考《DM 系统包使用手册》(手册位于数据库安装路径 /dmdbms/doc/special
文件夹下)。数据库 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
数据库重演工具 dreplay
解析日志工具 dmlcvt
DM 数据库提供了类似于 Oracle 的 sqlplus 的终端工具,即 DM 命令行客户端工具 disql,工具的路径在安装路径下的 ../dmdbms/bin/ 下,格式: disql 用户名/密码@IP:端口号
Linux 环境基本使用方法如下(路径以实际环境为准):
$ cd /home/dmdba/dmdbms/bin
$ ./disql SYSDBA/[email protected]:5236
当密码后面不跟 @ip:port
时,则默认为 @127.0.0.1:5236
。
更多功能的详细使用方法请参考《DM_disql 使用手册》。(手册位于数据库安装路径 /dmdbms/doc/special
文件夹下)。
启动 disql 时,运行脚本如下:
disql SYSDBA/SYSDBA `D:\test.sql
启动 disql 之后,运行脚本如下:
start D:\test.sql;
./disql SYSDBA/SYSDBA\ `/dev/test.sql**
具体使用方式,参考《DM_Disql 使用手册》第 5 章节-如何在 Disql 中使用脚本。(手册位于数据库安装路径 /dmdbms/doc/special
文件夹下)。
SYSDBA 是超级管理员,无法修改。
##
的表不可以删除此为系统表,一般有两张,##HISTOGRAMS_TABLE 、##PLAN_TABLE
。不可删除。
【问题描述】:
执行创建外部 Java 函数的操作,提示没有权限/没有创建函数的权限/"外部函数共享库加载失败"
【解决方法】:
根据以下步骤进行排查:
ENABLE_EXTERNAL_CALL = 1
重启数据库服务才能创建外部函数。
/dmdbms/doc
文件夹下)。【问题描述】:
在安全版数据库中,使用 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 加密的情况下,有以下几种可能的原因:
对应的处理方法为:
TCP/IP 协议,可以通过 SSL 加密。
如果想拥有审计 SQL 语句的功能,建议通过 sp_set_para_value(1,’SVR_LOG’,1)
,配合修改 sqllog.ini 生成 SQL 日志(详见《DM 系统管理员手册》-2.1.1 章节,手册位于数据库安装路径 /dmdbms/doc
文件夹下),对生成的日志文件进行审计。如果是希望在网络层通过截取消息包进行解析,从而获取 SQL,建议通过商务联系,进行产品适配。
使用 DM 数据库客户端工具可以实现在 Windows 上连接 Linux 服务器。
使用 guid() 函数查询:
SELECT SYS_GUID();
SELECT GUID();
客户端和服务端版本不匹配,比如高版本连接低版本等。
使用快捷键 crtl+shift+F
或使用右键菜单-->SQL 脚本--> 格式化
数据库日志有这个错误,批量执行任务的时候,执行几句就报错:Database P0000024537 main_thread cmd 13 validate error
可以把 dm.ini 参数配置文件里面的参数 COMM_VALIDATE(是否对消息进行校验。0:不检验;1:检验) 设置成 0。
这是通信中产生的告警信息,错误代码是操作系统返回的,107 Transport endpoint 传输终点没有连接,在系统繁忙的时候会刷这个,通常可以忽略。
SP_CREATE_SYSTEM_PACKAGES(1);--启动
SP_CREATE_SYSTEM_PACKAGES(0);--删除
/dmdbms/doc/special
文件夹。【问题描述】:
Oracle 中 nvl 函数处理的值,达梦数据库用 ifnull/isnull/nvl 处理,我看数据库值是 NULL 才处理了,’’就不能处理,怎么和 Oracle 一样处理?
【解决方法】:
将 dm.ini 的参数 COMPATIBLE_MODE 改成 2,处理 NULL 的方式就和 Oracle 一样了。
将 dm.ini 的参数 COMPATIBLE_MODE 改成 2。
在 DM 管理工具中,右键点击【表】,浏览数据:
直接在结果集进行编辑,然后点击右键选择【保存】:
检查 dm.ini 参数 COMPATIBLE_MODE,如果值为 3,达梦数据库为兼容 SQL Server 的模式,则不支持数组,可以选择改变兼容模式或使用动态表改写。
这个是会话级的,而且同一会话只能有一个表 set,当插入数据并且要指定自增列的值时,必须要通过语句将 IDENTITY_INSERT 设置为 ON 时,插入语句中必须指定“PERSON_ TYPEID ”(举例)中要插入的列。对自增列插入指定数据时候,先执行一下 SET IDENTITY xxx 就行了。
一般情况下,当数据表中,某一列被设置成了标识列之后,是无法向标识列中手动的去插入标识列的显示值。但是,可以通过设置 SET IDENTITY_INSERT 属性来实现对标识列中显示值的手动插入。
语法:
注意IDENTITY_INSERT 的开启 ON 和关闭 OFF 是成对出现的,所以,在执行完手动插入操作之后,记得一定要把 IDENTITY_INSERT 设置为OFF,否则下次的自动插入数据会插入失败。
使用系统管理员登录执行:
alter user '用户名' account unlock;
也可以使用管理工具进行可视化处理:
可通过达梦数据实时同步软件 DMHS,来进行处理同步推送。
DM8 不支持 OLEDB 驱动,请用达梦的 ODBC 驱动代替。
需要确保操作系统、数据库、SQL 文本三者字符集一致,避免出现乱码。
更改连接工具字符集,确保同服务器字符集一致。
进入到安装目录的 tool 目录下:
修改用户所属角色,勾选授予 VTI 权限,或者用 sysdba 给账号权限:
grant select on XXX to XXX;
需要设置选择管理工具-窗口-选项-查询分析器-自动提交
可以设置 dm.ini 参数:DEL_HP_OPT_FLAG 取值为 4,允许语句块中的间隔分区表自动扩展。
执行下列语句:
create unique index "index_02" on "USER01"."TABLE_1"("COLUMN_1");
错误号: -2683
错误消息: 第 1 行附近出现错误:局部唯一索引必须包含全部分区列
如果不关闭防火墙的话 要把相关端口加入到策略里。
【问题描述】:
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.
【问题解答】:
这个是图形化界面打不开的问题,建议咨询操作系统技术人员。或者改用命令行方式进行数据库操作。
【问题描述】:
数据库用命令行的方式可以正常启动。
用 dmdba 的用户在 tool 目录下运行./manager 或者./dts 会报错:/usr/share/themes/kylin-black-theme/gtk-2.0/gtkrc:817: 找不到包含文件:“apps/caja.rc”
【问题解答】:
这个是图形化界面打不开的问题,建议咨询操作系统技术人员。或者改用命令行方式进行数据库操作。
1.在管理工具中修改表的注释,如图所示:
2.如果使用 SQL 脚本修改表的注释,执行结束后需要执行 commit 提交操作:
也可以设置管理工具的菜单:窗口--> 选项--> 查询分析器--> 自动提交 进行勾选。如下图:
注意修改后需要在管理工具的对应表的上级节点上进行刷新操作。
默认是手动提交的方式,执行数据插入语句后,需要执行 commit 进行提交,否则会回滚。
回答:可能是因为操作系统缺少中文字库,确保操作系统、数据库的字符集一致。
【问题说明】:
主备集群中,通过 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)
systemctl status firewalld
service iptables status
select username,ACCOUNT_STATUS from dba_users;
select id,failed_num,allow_addr from sysusers;
alter user 用户 limit allow_ip null;
单表结果集能修改,多表结果集不能修改。
修改方法:将结果集右下方的小锁解开
默认 DISQL 登录数据库密码是明文,以下登录方式可以不显示密码:
./disql /nolog 登录 DISQL 后,输入 login 登录数据库,按照提示填写 IP 号、用户名、密码、端口号等选项;
如果想要不用每次登录都输入端口,可以在配置文件 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 语句时会自动提交前面的事务:
【问题描述】:
使用 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 等工具打开远程服务器上的 manager 图形工具报错,如下图:
依据提示查看 ../workspace/manager/.metadata/.log 日志文件,提示缺少库文件 libgtk-x11-2.0.so.0,而无法打开图形窗口,如下图:
【问题解决】:
使用 yum 命令查找提供这个库文件的软件包,如下图:
安装 gtk2 这个软件包:
Yum install gtk2* -y
【问题分析】:
出现这种情况一般有如下两种原因:
【问题描述】:
数据库服务处于启动状态,通过数据库服务本地登录 disql 登录数据库用户,显示报错:-70019:没有匹配的可登录服务器。
【问题解决】:
出现如上报错,可根据以下思路进行排查:
明确数据库服务处于启动状态,通过 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 的值。
检查 dm_svc.conf,是否配置了全局的 login_mode 参数,如果是,删除全局的 login_mode 参数,配置为局部参数。
【问题描述】:
应用和数据分别部署在两台虚拟机上,但应用通过虚拟机配置的私网 IP 连接报网络通信异常,且实际用私网 IP 可以 ping 通。
【问题解决】:
考虑将私网 IP 改为绑定的弹性 IP 进行连接。在虚拟环境下,可能网络需要进行多次测试。
【问题分析】:
考虑是否因为在 dm.ini 中屏蔽了一部分关键字导致管理工具的部分功能不能正常运行,去掉关键字进行排查。
建议关键字放在 dm_svc.conf 文件的 keywords 中来屏蔽。
【问题解决】:
考虑是否是客户端版本与连接的数据库服务端版本时间跨度太大,建议使用与 DM 服务端版本一致的客户端重新安装。查看数据库版本方法:
select * from v$license; ---DM7 版本
select id_code; ---DM8 版本
【问题解决】:
在管理工具上方导航栏中,选择:窗口--> 视图--> 对象导航,即可重新开启对象导航栏。
【问题描述】:
利用 disql 打开 SQL 命令行工具,在输入 SQL 命令时,发现按“Backspace”无法正常删除,如下图所示:
【问题解决】:
【问题解决】:
方法 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 信息。
【问题描述】:
有如下两种情况:
情况一:DBLINK 使用 ODBC 方式访问目的表时,中文显示为问号。如下图:
isql 直接访问:
情况二:DBLINK 使用 ODBC 方式创建,重启数据库之后,访问目的端表报错 "[-70037]:字符串不完整"。
【问题原因】:
出现以上两种情况的报错均与配置 NLS_LANG 环境变量有关,以下方法以情况一为例,但同样适用于解决情况二的报错。
可以看到上面,isql 直接访问 Oracle ,以及达梦通过 ODBC 数据源访问创建 DBLINK 访问 Oracle 时,中文会显示乱码,一般是与客户端字符集环境有关,可以通过设置 NLS_LANG 环境变量指定客户端字符集。如下:
[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 的地址访问数据库。与使用 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
文件夹。
以下提供方法演示:
---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 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
inet6 fd15:4ba5:5a2b:1008:9ef5:bef9:de64:c30a prefixlen 64 scopeid 0x0
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 地址,则表示启用
###ipv4 连接测试成功
[dmdba@localhost bin]$ ./disql SYSDBA/[email protected]:5236
服务器[192.168.15.71:5236]:处于普通打开状态
登录使用时间 : 31.898(ms)
disql V8
###IPV6——disql 连接串 host 不加网络接口名称,连接失败
[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA@[fe80::1a2d:8be9:91f6:6b51]:5236
[-70028]:创建SOCKET连接失败.
disql V8
用户名:
密码:
[-70028]:创建SOCKET连接失败.
####IPV6——disql 连接串 host 加上网络接口名称,连接正常
[dmdba@localhost bin]$ ./disql SYSDBA/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/[email protected]:5236
服务器[192.168.15.71:5236]:处于普通打开状态
登录使用时间 : 15.842(ms)
disql V8
###IPV6——disql连接串 host 不加 scopeid,连接成功
E:\dmdbms270\bin>disql SYSDBA/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/SYSDBA@[fe80::1a2d:8be9:91f6:6b51%20]:5236
服务器[fe80::1a2d:8be9:91f6:6b51%20:5236]:处于普通打开状态
登录使用时间 : 3.872(ms)
disql V8
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 服务名均可连接成功
1.直接使用 IPv6 地址连接,操作数据库成功
2.使用 dm_svc.conf 中的服务名连接,操作数据库正常
【问题描述】:
disql 登录数据库出现:使用 127.0.0.1 或者 localhost 能在本服务器登录,不写则报创建 SOCKET 连接失败。如下图:
【问题解决】:
请检查 /etc/hosts 配置,配置 127.0.0.1 的主机名配置,如下所示:
【问题描述】:
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 用户启动 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
【问题描述】:
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 重新登录。
欢迎关注个人博客Jackin's Blog