暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DM8达梦数据库检查常见问题

原创 达梦 2021-01-31
4491

动态级参数在 dm.ini 里修改后重启应用不生效吗

数据库的配置文件 dm.ini 中参数属性分为三种:静态、动态和手动。

  • 静态,可以被动态修改,修改后重启服务器才能生效。
  • 动态,可以被动态修改,修改后即时生效。
  • 手动,不能被动态修改,必须手动修改 dm.ini 参数文件,然后重启才能生效。

动态参数又分为会话级和系统级两种。

  • 会话级参数被修改后,新参数值只会影响新创建的会话,之前创建的会话不受影响。
  • 系统级参数的修改则会影响所有的会话。

dmsql_数据库实例名.log,这个日志怎么关掉

dmsql_数据库实例名.log 类型命名的文件为跟踪日志文件,跟踪日志内容包含系统各会话执行的 SQL 语句、参数信息、错误信息等。跟踪日志主要用于分析错误和分析性能问题,比如,可以快速定位系统目前执行速度较慢的 SQL 语句,进而对其进行优化。

打开跟踪日志对系统的性能有较大影响,一般用于查错和调优的时候才会打开,默认情况下系统是关闭跟踪日志的。当把 dm.ini 参数 SVR_LOG 设置为 1,才会打开 SQL 日志,若需要跟踪日志但对日志的实时性没有严格的要求,又希望系统有较高的效率,可以设置参数 SQL_TRACE_MASKSVR_LOG_MIN_EXEC_TIME 只记录关注的相关记录。

在记录完成后,可执行: SP_SET_PARA_VALUE(1, 'SVR_LOG', 0); 进行关闭跟踪日志。

配置文件 dm.ini 中各参数的含义可参考《DM 系统管理员手册》第二章 2.1 节内容,手册位于数据库安装路径 /dmdbms/doc 文件夹下。

DM 数据库怎么查大小写是否敏感

方法 1:

SELECT CASE_SENSITIVE

方法 2:

select * from v$dm_ini where "V$DM_INI".PARA_NAME like '%CASE_SENSITIVE';

方法 3:

打开 Manager 客户端–右键选中数据库–管理服务器,即可查看,如下图所示:

管理服务器

方法 4:

SELECT  SF_GET_CASE_SENSITIVE_FLAG();

查看数据库实例是否设置大小写敏感,如果是,则查询时数据需加单引号。

DM 数据库管理常用 SQL 命令

--查询数据库版本
select * from v$version;

--查询授权信息
select * from v$license;

--查询服务器信息
select * from V$SYSTEMINFO;

--查询会话连接信息
select * from v$sessions;

select count(*),state from v$sessions group by state;
select count(*),clnt_ip from v$sessions group by clnt_ip;

--查看数据库服务器配置参数
select * from v$dm_ini;

--查询最近的 SQL 执行记录
select * from v$sql_history;

--查询某个用户下所有的表
select * from user_tables; --查询当前用户下所有的表
select * from all_tables where owner=’TEST’; --dba 用户查询某个模式下的所有表

--查询某个用户下所有表字段
select * from all_tab_cols where owner=’TEST’;

--查看表注释
select * from ALL_TAB_COMMENTS where ower=’TEST’;

--查看字段注释
select * from ALL_COL_COMMENTS where ower=’TEST’;

select '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 FROM v$instance union all

select '数据库版本',substr(svr_version,instr(svr_version,'('))
FROM v$instance union all SELECT '字符集',CASE SF_GET_UNICODE_FLAG()
WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' when '2' then 'EUC-KR' end union all

SELECT '页大小',cast(PAGE()/1024 as varchar) union all SELECT '簇大小',cast(SF_GET_EXTENT_SIZE() as varchar) union all

SELECT '大小写敏感',cast(SF_GET_CASE_SENSITIVE_FLAG() as varchar) union all

select '数据库模式',MODE$ from v$instance union all

select '唯一魔数',cast(permanent_magic as varchar) union all

select 'LSN',cast(cur_lsn as varchar) from v$rlog;

报错日志、系统日志

DM 数据库有相应的错误日志,存放在 DM 数据库安装目录的 log 文件目录下,会有相应对应的实例名日期 .log 文件,打开相应的文件,如果里面有 ERROR 的错误信息,则可以查看具体的报错来进行修改。

DM 内存泄漏/异常检查

DM 运行过程中,如果发现内存突然飙升,或者占用过大,或者操作系统反复 OOM 时,需要考虑是否是服务器存在内存泄漏问题,按照 DM 的动态视图所能提供的信息,需要获取以下内容:

  • 数据库的内存使用情况

操作系统级别的命令判断:TOP、WINDOWS 资源管理器等,查看数据占用多少内存。

数据库级别的判断:数据库使用的内存大致等于 BUFFER_SIZE + POOL_SIZE,对应的 SQL 语句如下:

select (select sum(n_pages * page_size) 
from v$bufferpool) + (select sum(total_size) from v$mem_pool) from dual;

一般来说,发生内存泄漏的都在 mem_pool 上,比如操作系统上看到内存占用 60 GB,但 BUFFER 已经占用到 50 GB,实际上发生泄漏的概率较小,应该适当调小 BUF,空出内存给内存池使用。

  • 是否存在使用内存过多的 SQL

较新版本的 DM 服务器提供会话及语句资源监控视图 ENABLE_MONITOR=1 生效 V$SESSION_STAT V$SQL_STAT 视图上字段比较丰富,我们这里主要关注 MAX_MEM_USED 字段。一般来讲,如果是某条或者特定的几条 SQL 导致内存增长过多,可以通过这两个视图查询出来。

执行以下语句:

SELECT MAX_MEM_USED,SQL_TEXT FROM V$SQL_STAT order by MAX_MEM_USED DESC;

可以确定使用内存较大的 SQL,可以针对行的优化(消除 HASH,SORT,DISTINCT 等),需要注意的是该查询只能查询当前活动 STMT 上的语句消耗情况,历史情况需要查询 V$SQL_STAT_HISTORY,该视图上保留 1 万行 SQLSTAT 历史信息。

以上 MAX_MEM_USED 列的单位均为千。

  • 是否存在扩展过大的内存池

前面介绍过,正常使用过程中,内存池的大小一般会维持在 TARGET_SIZE 左右,不会发生太大的差距,如果发生非常多次计划外的扩展,需要考虑该池是否发生内存泄漏,与之相关的系统视图和系统视图字段为:v$mem_pool 上的 N_EXTEND_EXCLUSIVE 字段。查询语句如下:

Select * from v$mem_pool where n_extend_exclusive  0;

确认池后,通过 MEM_POOL 的 CREATOR 也就是创建这个池的线程号,在 V$SESSIONS 或者 V$SESSIONS_HISTORY 里面确认会话号,然后去 V$SQL_STAT_HISTORY 或者 V$SESSION_STAT_HISTORY 中寻找内存消耗大的 SQL 即可。

查看存在超出计划大小扩展的内存池、计划外扩展次数以及大小,如果池大小为可以通过 INI 调整(如 VM_POOL_TARGET、SESS_POOL_TARGET,但这两个参数慎用,调整过大对并发影响较大),可以适当放大计划大小,再运行观察计划外扩展情况是否有改善,如果仍然存在大量的计划外扩展则需要继续跟进内存使用情况。

  • 确认内存的详细使用情况

详细的内存使用情况需要视图 v$mem_reginfo,该视图在 INI 参数 MEM_LEAK_CHECK = 1 时有效,可动态开启,开启后登记数据库中所有内存的申请释放信息。查询语句如下:

Select sum(reserved_size),fname,lineno
from v$mem_reginfo group by fname,lineno order by sum(reserved_size) desc;

按照大小降序,或者根据文件名、行号分组,查看是否存在大量某文件某行使用内存未释放的情况,转交研发处理。

  • 内存异常的检查

DM 提供自动的内存异常检查,检查参数为 INI 中的 MEMORY_MAGIC_CHECK,默认值为 2,检查原理如下:

在每次申请内存时,返回的内存块中包含:返回内存的管理结构大小+申请长度+一个 ULINT_SIZE 大小的内存块。(其中首部用于存放管理这块内存结构的结构,实际使用的内存为第二段,最后一段填入一个校验码)

校验码为一个固定魔术和该内存管理结构的首地址计算出来的一个常数。每当需要释放内存时,如果 MEMORY_MAGIC_CHECK 为 1 则会根据需要释放内存的地址计算出一个校验码,与该内存结构尾部的校验码比较,若不相等,则说明该片内存可能出现过写溢出,数据库会 HALT 掉。

如果 MEMORY_MAGIC_CHECK 配置为 2 则会在 1 的检查基础上,由于申请内存长度可能是大于需求长度的(因为申请时要求 申请大小为 2 的 N 次幂,会在大于需求长度后面的每一位上都添加上特殊校验码,释放时每一位都回检查,检查失败也会 HALT。

如果实际生产中发现 CHECK 为 2 比较慢,则可以将 MAGIC_CHECK 改为 1。

扩展数据库的 redo 日志

调整数据库 redo 日志的大小,如将 2 个 redo 日志都扩展到 2 GB(注意 redo 日志的实际路径)。

使用 SYSDBA 用户登录,然后执行如下脚本:

alter database resize logfile 'D:\dmdbms\data\DAMENG\DAMENG01.log' to 2048;
alter database resize logfile 'D:\dmdbms\data\DAMENG\DAMENG02.log' to 2048;

DEM 工具及使用方法示例

​DEM 工具存放在数据库安装目录 dmdbms 下的 web 文件夹中,如下图所示:

web目录

​DEM 配置示例(以 Windows 为例)。

​JDK 目录如下所示:

JDK目录

​Tomact 目录如下所示:

Tomcat目录

​DEM 目录如下所示:

Dem目录

​Dmagent 目录如下所示:

Dmagent目录

​配置环境变量如下所示:

用户变量-java

用户变量-tomcat

系统变量path

系统变量path

​cmd 启动 tomcat (E:\tomcat\bin\startup.bat),会自动将 ​DEM 解压到相同目录,如下图所示:

启动tomcat

​在数据库中新建 ​DEM 用户,并用 ​DEM 用户执行 dem_init.sql 脚本 (E:\dmdbms\web\dem_init.sql)。

执行sql脚本

​更改 db.xml (E:\tomcat\webapps\dem\WEB-INF\db.xml) 中 ​DEM 监控连接后台数据库的 ip/账号/密码/端口号

修改配置文件

​在 server.xml (E:\tomcat\conf\server.xml) 的 host 节点中补全以下内容:

修改host文件

​在 catalina.bat (E:\tomcat\bin\catalina.bat) 的最后添加以下内容:

修改bat文件

启动 tomcat 服务,并启动 ​DEM http://127.0.0.1:8080/dem,账号/密码:admin/888888

界面展示

MANAGER 如何查看数据库配置信息

双击打开 DM 管理工具 MANAGER,连接数据库后,右键-管理服务器,打开管理服务器窗口,系统概览里面展示的是数据库配置信息。

管理工具

管理服务器

MANAGER 查看外键

在模式中找到对应的【模式】,点击打开【表】,找到想要查看的表,点击打开【键】,如下图所示:

外键

如图片所示就是需要查看的外键信息,如果想要继续查看具体的信息,右键点击【外键】,选择自己需要查看的选项。

控制台工具查看不到试用截止日期

DM 控制台工具查看不到试用截止日期,如下图所示:

控制台工具

【解决方法】

通过管理工具登陆数据库执行select * from SYS."V$LICENSE";语句即可查找出有效时间。

执行结果

V$license 字段信息可在《DM 系统管理员手册》中查找,手册位于数据库安装路径 /dmdbms/doc 文件夹下。

数据库完整性校验

DM 数据库提供了 dmdbchk 工具用于检查数据库完整性、正确性的命令行工具。在服务器正常关闭后的脱机情况下,用户可以使用 dmdbchk 对数据库进行校验,包括校验 DM 数据库内部的物理存储结构是否正常,对象信息是否合法等。检验的内容具体包括三方面:

  • 数据文件合法性检验

​数据文件校验只校验数据文件大小。如果数据库文件实际大小大于或等于文件头中记录的大小,则合法。

  • 索引正确性校验

​索引检验包括:普通表 B 树索引校验、LIST 表扁平 B 树索引校验、列存储表索引校验。校验内容具体包括:B 树的层次、层次关系,每层的内部页、叶子页以及页之间的前后链接关系,每个页的页头信息(如页类型等)等。

  • 对象 ID 合法性校验

​对象 ID 校验包括数据库内的所有对象的 ID 检验。对象包括:索引、表、约束、存储过程、模式、同义词、用户等。如果从系统表中查出的对象 ID 小于库的 ID 预留页中记录的该类型对象的下一分配 ID,则合法。因为库的 ID 预留页中记录的是各类型对象下一个新分配对象将使用的 ID,因此若系统表中的对象 ID 大于或等于该 ID,说明库已损坏。

注意

dmdbchk 并不能检查出用户实际数据的正确性,如果数据文件被手动人为修改,正好修改到的是用户数据部分,是检查不出来的。

DM 数据库校验工具的使用

DM 数据库校验需要在数据库服务正常关闭后进行,进入数据库程序目录 bin,输入 ./dmdbchk path=dm.ini 路径,例如数据文件目录为 /opt/dmdbms/data,则应该输入 ./dmdbchk path=/opt/dmdbms/data/DAMENG/dm.ini,校验完毕后,dmdbchk 会在当前目录下(dmdbchk 所在目录)生成一个名为 dbchk_err.txt 的检查报告,供用户查看。

更多使用和解析请参考《DM_dmdbchk 使用手册》,手册位于数据库安装路径 /dmdbms/doc/special 文件夹下。

数据库重演工具的使用

数据库重演 (Database Replay) 是 DM 数据库用来重现、定位和分析问题的一个重要手段,其基本原理是在数据库系统上捕获所有负载(记录外部客户端对服务器的请求),保存到二进制捕获文件,然后通过 DM 提供的数据库重演工具将捕获文件中的请求发送给捕获前由原始数据库备份恢复而来的重演测试系统上,从而帮助重现当时的场景。

使用方法如下:

用户可以调用系统过程 sp_start_capture (path varchar (256), duration int) 来启动捕获发往数据库的所有负载,并将该阶段收到的所有请求保存到二进制捕获文件中,然后使用 DM 数据库重演客户端工具重放二进制捕获文件,再现当时真实环境的负载及运行情况,帮助进行问题跟踪和诊断。使用系统过程 sp_stop_capture() 可以停止捕获。

Replay 的使用必须指定必要的执行参数,其调用格式如下:DREPLAY SERVER=LOCALHOST:5236 FILE=.\test.cpt

例如:我们设置 d:\ 捕获文件 test.cpt,-1 表示持续时间为无限制,即需要手动停止捕获或磁盘空间满为止。

call sp_start_capture('d:\test.cpt',-1) ; --开始捕获
create table t10(id int);
insert into t10 values(10);
commit;
call sp_stop_capture ; --停止捕获`

结束后我们可以在 d:\ 看到捕获文件 test.cpt,开始进行重演 dreplay.exe server=127.0.0.1:5236 file=d:\test.cpt

信息

成功信息

最终可以看到重演成功,而我们在捕获过程中数据库收到的所有请求都已经重演完成。

字符串比较大小写敏感

关于字符串比较大小写敏感主要涉及到两个方面的内容:

  1. 对字段的值比较而言

假如表 Test 中有如下两条记录:

c1   c2
1 a
2 A

同样的查询语句:select * from Test where c2 = 'a';

在大小写不敏感的库中会查出如下的两条记录:

c1   c2
1 a
2 A

而在大小写敏感的库中则只会查出如下的一条记录:

C1   C2
1 a
  1. 对于表名、字段名而言

在设置为大小写敏感的库中进行查询的时候,可能经常会遇到无效的表名或列名的问题,下面针对这种情况进行说明。

  • 如果使用 DM 管理工具图形界面建表的话建议表名和字段名都使用大写。因为使用图形界面建表相当于使用语句建表的时候加了双引号的,会固定住大小写。如果写成小写,那么就是小写了,在查询的时候也需要加双引号,否则就有可能报无效的表名或列名的问题,比较麻烦。
  • 如果使用脚本建表的话,如果表名和字段名没有加双引号的话都会被系统自动转换成大写。

如:create table test(a int);系统会自动把表名 test,字段名 a 转换成大写,处理方式与 Oracle 数据库一致。所以针对大小写敏感的库,在使用建表脚本或者通过查询脚本进行查询的时候建议统一不要写双引号,让系统统一自动都转化为大写。

  • 以上两点主要针对大小写敏感的库而言,大小写不敏感的库则不存在上述问题。

总结:基于以上两点,在初始化数据库的过程中就可以对字符串比较大小写敏感这个参数做出合理的选择了。

查询 DM 数据库关键字列表/保留字

如何 DM 数据库关键字列表/保留字?如何屏蔽保留字/关键字?

【解决方法】

DM 数据库的关键字/保留字可以在《DM_SQL 语言使用手册》附录 1 中查询,手册位于数据库安装路径 /dmdbms/doc 文件夹下。

下面是处理表语句和关键字或者保留字冲突的方法:

  • 方法一:双引号法

这个一般可以用来处理建表语句中的保留字冲突,如表名或者字段名是 DM 的保留字。这种方法一般可以快速地绕过问题,但是对于大小写敏感的库,这种用双引号的方法会固定死字段大小写,对于小写的字段,可能会带来无效的表名或者列名的问题。

  • 方法二:dm.ini 中的参数设置

在 dm.ini 中有个参数 EXCLUDE_RESERVED_WORDS,这个参数可以用来屏蔽保留字,将需要屏蔽的保留字写在 = 号后面,然后以逗号分隔。

设置在 dm.ini 中的好处就是一旦设置,永久生效而且对所有客户端都有效,这样就不需要在所有客户端系统中进行专门配置。但是设置在 dm.ini 中之后,这个保留字就永久性失效了,哪怕你想通过 Manager 客户端工具在本地连接也没用了。而且该方式还存在一个隐患就是由于屏蔽掉了一些系统的保留字,所以可能会导致系统的一些功能无法正常使用。

不建议用这个参数,会有严重的副作用,并且比较隐蔽;在不改表的字段的情况下,最好的方案是改名字,次之给对象名加双引号。

建议

在移植过程中遇到 DM 数据库的保留字,最好的处理方式还是对这些保留字进行修改,尽量不要使用 DM 数据库的保留字。

[-5567] 授权者没有此授权权限

创建用户后,给用户赋予系统权限 Any 的时候报错。错误号: -5567,错误消息:第 1 行附近出现错误,授权者没有此授权权限。

【解决方法】

修改 dm.ini 文件里的参数:ENABLE_DDL_ANY_PRIV 改为 1

多版本操作冲突过多

数据操作报错:多版本操作冲突过多。

【解决方法】

多版本是对一张表修改时,并发量较大导致的。修改 dm.ini 文件里的参数:MVCC_RETRY_TIMES 数据调大,然后重启数据库。

[-2148]: 标记不匹配

【解决方法】

  1. 将配置文件 dm.ini 里面的参数 ENABLE_ENCRYPT=1 改成 0
  2. 检查数据库服务器版本/客户端版本/dm.key 版本。若企业版数据库使用了安全版的 key 文件或者相反,也会报这个错误。

DM 数据库如何开启日志

需要配置文件:sqllog.ini。

  • 开启 SQL 日志: SP_SET_PARA_VALUE(1, ‘SVR_LOG’, 1);
  • 关闭 SQL 日志: SP_SET_PARA_VALUE(1, ‘SVR_LOG’, 0);
注意

需关闭或者配置日志文件大小限制,不然磁盘会撑爆。

修改数据库实例的字符集

字符集设置是在初始化实例的时候设置的,一旦设置完成就不能修改,只能重新初始化实例。

修改数据库实例的端口号

修改 dm.ini 中的 port_num,修改后需要重启数据库。

删除模式报错

删除模式的时候报错:试图删除用户[****]的默认模式。

通常一个用户对应一个模式,要删除用户的同名模式,需要级联删除,或者直接删除对应用户。ZYJ 需要先删除对应模式下面的所有对象

DM 数据库错误码汇总

可以使用以下语句进行查询:

select * from v$err_info;

也可以查看《DM 程序员手册》附录 1 章节-错误码汇编,手册位于数据库安装路径 /dmdbms/doc 文件夹下。

空间数据类型

DM 数据库之间支持空间数据库的迁移/空间/地理空间/GEOMETRY/几何类型查询吗?

【解决方法】

支持,请参考《DM 系统包使用手册》-DMGEO 包章节,手册位于数据库安装路径 /dmdbms/doc 文件夹下。

如何查询数据库版本

可以执行以下命令获取数据库版本信息:

select * from v$version;

报错:对象处于无效状态

  1. 查看是不是触发器导致的。
  2. 如果和视图/存储过程/函数相关,基表可能没有了,重新创建表和数据对象。

设置插

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论