数据库访问问题

无法连接数据库:网络通信异常/创建 socket 连接失败/Create SOCKET connection failure

【问题描述】

连接数据库时出现报错:登录服务器失败。

  • 管理工具连接数据库报错:错误号 6001,错误消息:网络通信异常。如下图所示:

管理工具连接报错信息

  • 命令行连接数据库报错:socket 连接失败或 Create SOCKET connection failure。如下图所示:

命令行连接报错信息

【问题分析】

具体解决办法可参考 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 树中。

目前,仅堆表的水平分区表支持 GLOBAL 索引。堆表上的 primary key 会自动变为全局索引。非堆表目前暂不支持 global 索引。

详见《DM 系统管理员手册》第 16.4 章节内容。(手册位于数据库安装路径 /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;

创建用户失败要怎么解决

创建用户失败的原因可能有多,具体问题要具体分析,遇到错误时首先查看报错的详细信息,这样才能快速的定位和解决问题,下面列举几种常见的错误:

  • 用户名已经存在该用户

用户已存在

  • 密码复杂度不符合要求

密码策略: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 参数,如下图所示:

复杂度不符合

  • 授权不正确,如下授权,选择的是【ALL】,有些权限是不能分配给普通用户的,如下图所示:

权限分配

快速获取表定义、详细信息的 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,如下图所示:

描述信息

使用图形界面创建作业

首次使用时,需要先创建代理环境,如下图,在代理上右键,选择【创建代理环境】,如下图所示:

启动代理

然后在作业上右键新建作业,出现右边的方框中选择【添加】,如下图所示:

新建作业

常规设置

选择作业调度之后,在右下方选择【新建】,然后出现调度频率和时间的选项。

数据库登陆密码问题

  • 忘记密码怎么办?

如果是系统用户 SYSDBA、SYSSSO 忘记密码,是没有办法找回来的。

温馨提示

1. 数据库管理员 SYSDBA 的密码不要随便修改,默认密码为 SYSDBA(密码严格区分大小写)。如果出于安全方面的考虑非得修改,请一定要做好备案工作。
2. 如果数据库中还有其它的用户,可以尝试在数据迁移工具 DTS 中使用其它用户登录,把数据库中相关用户的数据迁移到新的实例对应的用户中。
3. 如果库里面没有业务数据或者数据不重要,则可以考虑卸载重装。

如果是自定义的用户密码丢失了,可以通过 SYSDBA 来更改密码。

  • 数据库是否有默认密码/用户口令?

DM 数据库密码默认是和用户一样的,大写 SYSDBA。

  • 密码中含有 @/等特殊字符怎么办?

需要通过转义符来处理。disql 转义符使用如下:

linux 环境,需要使用双引号将密码包含进来,同时外层再使用单引号进行转义,具体例子如下:

./disql SYSDBA/' "abcd@efgh" '@localhost

windows 环境,需要使用双引号将密码包含进来,同时对双引号使用\进行转义,具体例子如下:

disql SYSDBA/\"abcd@efgh\"@localhost
  • Manager 客户端登录保存密码为什么还是需要输入密码?

需要注册连接。

  • SYS 用户密码是多少,SYS 能登陆吗?

SYS 是不能登陆的?

  • 数据库更改密码策略,对以前建立的用户不生效?

删除重建。

  • SYSSSO 用户密码是多少?

DM 数据库初始化时设置 SYSSSO 的密码,默认为 SYSSSO,仅在安全版本下可见和可设置。

  • 用户密码过期及修改用户登录失败次数超过限制怎么办?

用 SYSDBA 登录来修改用户的配置,先修改密码再修改资源。

alter user "SYSDBA" limit password_life_time unlimited;
  • DM 数据库的密码策略是什么?

通过 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 文件夹下)

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 输入对应的用户名和密码即可访问数据库。

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/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,处理方法同样需要前后各加 3 个双引号双引号,disql 要求对双引号需要使用双引号括起来,同时双引号需要转义"aaaa""aaaa";操作系统要求再对双引号转义和最外层加双引号"""aaaa""""aaaa"""。

例如:用户名为 user01,密码为 aaaa"aaaa ,那么连接串要写成:

disqluser01/"""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/SYSDBA `D:\test.sql

启动 disql 之后,运行脚本如下:

start D:\test.sql;
  • Linux 环境
./disql SYSDBA/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。
    jar 包打包
    (2)指定好主类。
    jar 包打包
    (3)左上角菜单栏 构建---> 构建工件,即可完成多主类 jar 包的打包。
    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();

查询时如何忽略值的大小写

  1. 初始化数据库实例的时候,“大小写敏感”参数设置成“N”。
  2. 用函数进行查询。

管理工具连接达梦数据库报错: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 文件夹。

如何和 Oracle 一样 nvl 函数处理值

【问题描述】

Oracle 中 nvl 函数处理的值,达梦数据库用 ifnull/isnull/nvl 处理,我看数据库值是 NULL 才处理了,’’就不能处理,怎么和 Oracle 一样处理?

【解决方法】

将 dm.ini 的参数 COMPATIBLE_MODE 改成 2,处理 NULL 的方式就和 Oracle 一样了。

DM 如何将空字符串自动转换为 NULL

将 dm.ini 的参数 COMPATIBLE_MODE 改成 2。

如何在工具里可视化插入一条数据

在 DM 管理工具中,右键点击【表】,浏览数据:

浏览数据

直接在结果集进行编辑,然后点击右键选择【保存】:

修改、保存数据

存储过程使用动态数组报错:标识符长度非法

检查 dm.ini 参数 COMPATIBLE_MODE,如果值为 3,达梦数据库为兼容 SQL Server 的模式,则不支持数组,可以选择改变兼容模式或使用动态表改写。

当指定列列表,且 SET IDENTITY_INSERT 为 ON 时,才能对自增列赋值

这个是会话级的,而且同一会话只能有一个表 set,当插入数据并且要指定自增列的值时,必须要通过语句将 IDENTITY_INSERT 设置为 ON 时,插入语句中必须指定“PERSON_ TYPEID ”(举例)中要插入的列。对自增列插入指定数据时候,先执行一下 SET IDENTITY xxx 就行了。

一般情况下,当数据表中,某一列被设置成了标识列之后,是无法向标识列中手动的去插入标识列的显示值。但是,可以通过设置 SET IDENTITY_INSERT 属性来实现对标识列中显示值的手动插入。
语法:

  1. .SET IDENTITY_INSERT 表名 ON :表示开启对标识列显示值插入模式,允许对标识列显示值进行手动插入数据。
  2. .SET IDENTITY_INSERT 表名 OFF:表示关闭对标识列显示值的插入操作,标识列不允许手动插入显示值。
注意

IDENTITY_INSERT 的开启 ON 和关闭 OFF 是成对出现的,所以,在执行完手动插入操作之后,记得一定要把 IDENTITY_INSERT 设置为OFF,否则下次的自动插入数据会插入失败。

用户账户锁定了,怎么解锁

使用系统管理员登录执行:

alter user '用户名' account unlock;

也可以使用管理工具进行可视化处理:

浏览数据

浏览数据

是否支持开启 cdc 或者类似 binlog 功能,提供实时监控采集数据到外部的功能么?比如实时到 kafka

可通过达梦数据实时同步软件 DMHS,来进行处理同步推送。

DM8 是否支持 OLEDB 驱动

DM8 不支持 OLEDB 驱动,请用达梦的 ODBC 驱动代替。

服务启动后使用管理工具登录时会报系统错误

  1. 重启下数据库,看问题是否解决。若重启后解决,可能是旧版本 BUG,建议升级数据库版本彻底解决此问题,或者定期重启数据库。
  2. 如果重启数据库后还是报错,可能是客户端与数据库版本不匹配导致的,需要将客户端和服务端版本换成一致的。

管理工具执行 SQL 文件,出现乱码

需要确保操作系统、数据库、SQL 文本三者字符集一致,避免出现乱码。

前台启动数据库显示乱码

更改连接工具字符集,确保同服务器字符集一致。

达梦事务/SQL 自动提交设置

  1. 默认非自动提交
  2. 管理工具设置自动提交方式:窗口-选项-查询分析器-自动提交,请参考执行插入语句提示成功但数据并没有真正保存

如何调出达梦的可视化管理工具

进入到安装目录的 tool 目录下:

  • Windows 系统:可以直接双击运行
  • Linux 系统:./manager

报错:没有[V$CIPHERS]对象的查询权限

修改用户所属角色,勾选授予 VTI 权限,或者用 sysdba 给账号权限:

grant select on XXX to XXX;

达梦管理工具打开报错:faild to create the java virtual machine

  1. 可能是和其他软件冲突了。先关闭掉其他软件,再打开管理工具试试。
  2. 服务器内存不够。

DISQL 中设置了 set autocommit on; 但 manager 工具还是需要 commit, 数据才能入库

需要设置选择管理工具-窗口-选项-查询分析器-自动提交。请参考执行插入语句提示成功但数据并没有真正保存

客户端执行脚本时报错内存不足

  1. 分段执行 SQL 脚本;
  2. 点击客户端右下角垃圾收集,缩小堆大小,释放空间。

垃圾收集

执行 SQL 脚本,报错 invalid file path 错误

  1. 检查 SQL 脚本路径是否正确,要脚本的绝对路径。
  2. 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 脚本修改表的注释之后,注释在管理工具中不显示

  1. 在管理工具中修改表的注释,如图所示:

修改注释

  1. 如果使用 SQL 脚本修改表的注释,执行结束后需要执行 commit 提交操作:

SQL 语句修改注释

也可以设置管理工具的菜单:窗口--> 选项--> 查询分析器--> 自动提交 进行勾选。如下图:

自动提交

注意

修改后需要在管理工具的对应表的上级节点上进行刷新操作。 刷新节点

表插入数据以后,重启服务或停止服务后开启服务,表里面的数据丢失

默认是手动提交的方式,执行数据插入语句后,需要执行 commit 进行提交,否则会回滚。类似问题请参考 执行插入语句提示成功但数据并没有真正保存

用户名密码错误

  1. 注意大小写敏感
    修改密码语句中密码未加双引号,登陆需要把小写字母全部改为大写;
  2. 注意不要用操作系统的用户名和密码输入,用数据库的用户名密码登陆 ,默认是 SYSDBA/SYSDBA;
  3. 注意登陆端口是否正确,可以试着添加 IP 和端口号来登陆;
  4. 如果是全库备份还原,注意在目的库上,再次登陆的时候,用户名密码要用源库的。

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 号、用户名、密码、端口号等选项;

DISQL 登录

如果想要不用每次登录都输入端口,可以在配置文件 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 表,得到如下结果

查询 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,而无法打开图形窗口,如下图:

.log 日志报错信息

【问题解决】

使用 yum 命令查找提供这个库文件的软件包,如下图:

查找软件包

安装 gtk2 这个软件包:

Yum install gtk2* -y

Manager 管理工具连接后没有模式等相关信息

【问题分析】

出现这种情况一般有如下两种原因:

  • 检查数据库启动状态,若是以 mount 方式启动,修改为 open 状态即可。
  • 客户端版本和数据库服务的版本相差太多的问题,请使用服务版本下客户端,或者重新下载对应的安装包安装对应版本客户端。

使用 disql 连接数据库报错:没有匹配的可登陆服务器

【问题描述】:

数据库服务处于启动状态,通过数据库服务本地登录 disql 登录数据库用户,显示报错:-70019:没有匹配的可登录服务器。

【问题解决】

出现如上报错,可根据以下思路进行排查:

  1. 明确数据库服务处于启动状态,通过 ps -ef|grep dmserver 查看进程。

  2. 检查 disql 连接数据库的端口是否正确,可以通过 netstat -ntlp | grep dmsever 或者 cat dm.ini | grep PORT_NUM 查看,参考登录命令:./disql 用户名/密码 @IP:端口号 。

  3. 检查是否由数据库连接会话数超过 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 的值。

  4. 检查 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”无法正常删除,如下图所示:

执行 Backspace 出现 ^H

【问题解决】

  • 方法一:在 dmdba 用户的 .bash_profile 文件中添加 stty erase ^h,再执行 source .bash_profile 使修改生效。如下图:

执行 Backspace 出现 ^H

  • 方法二:按住 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 驱动。

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,测试结果如下图表示测试结果正常:

客户端 IPV6 查询

Linux 间 telnet 测试

  • 使用 disql 进行连接测试
    1.Linux 客户机使用 disql 连接
###ipv4 连接测试成功
[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA@192.168.15.71: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/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/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
  • 使用 DM 管理工具进行连接测试
    Linux 客户机和 Windows 客户机使用 DM 管理工具进行连接方法相同,如下图所示:

DM 管理工具连接

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 环境
disql 测试连接

(2)Windows 环境
disql 测试连接

2.DM 管理工具测试
利用 IPV6 和 IPV6_2 服务名均可连接成功
管理工具测试连接

  • 简单的 JAVA 代码测试
    1.直接使用 IPv6 地址连接,操作数据库成功
    JAVA 测试连接

2.使用 dm_svc.conf 中的服务名连接,操作数据库正常
JAVA 测试连接

登录数据库使用 127.0.0.1 或者 localhost 能在本服务器登录,不写则报创建 SOCKET 连接失败

【问题描述】

disql 登录数据库出现:使用 127.0.0.1 或者 localhost 能在本服务器登录,不写则报创建 SOCKET 连接失败。如下图:

disql 连接数据库

【问题解决】

请检查 /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
微信扫码
分享文档
扫一扫
联系客服