问题跟踪和解决

问题跟踪和解决是最复杂的脑力劳动之一,其复杂主要体现在问题的无法预知性和问题根源的多样性。本章的目的是提供一种相对比较系统的方法来查找并解决使用 DM 数据库过程中可能遇到的各种难以跟踪、定位的问题,为 DBA 分析、解决问题提供帮助。

20.1 问题分析

当系统出现问题,无法及时响应用户/应用请求时,可能的原因是多方面的。一般来说,DBA 应该查看和分析的内容包括:

  1. 网络是否正常

DBA 可以直接使用各种工具/软件来排除网络问题。如果远程操作有问题,但是本地操作没有问题,则有可能是网络出现故障或者网络带宽耗尽。但是如果本地也有问题,不能说明网络一定没有问题,此时还是需要用其他方式确定网络是否有故障,同时进一步分析本地问题产生的原因。

  1. 内存使用量

用户可以通过操作系统提供的内存检测工具/命令来查看数据库占用内存情况,看是否数据库占用了过多内存,并且开始大量使用页面文件(Windows)/交换分区(Linux/UNIX),如果数据库占用内存过多,则需要进一步分析可能的原因:是否数据库的内存相关参数设置错误,是否客户端请求的资源过多并且一直没有释放(如不断打开连接/游标,并且一直不关闭)等等。对于参数设置错误,DBA 可以通过修改参数加以解决。如果是客户端请求资源过多,DBA 可以通过查询运行时动态视图(参考附录 2:动态性能视图)来检查资源使用情况,明确问题产生的原因并予以纠正。若排除其他原因后,发现数据库内存仍在不断增长,此时可以联系达梦公司技术服务人员协助解决。

  1. CPU 使用率

当发现系统响应很慢甚至无法响应时,CPU 的使用率也是一个重要的观察指标。如果 CPU 使用率一直持续 90% 以上,甚至 100%,则说明 CPU 使用率过高,此时需要分析导致 CPU 使用率过高的原因。可能的原因包括:写了错误的存储过程/函数死循环逻辑;某条 SQL 语句执行计划不好导致 CPU 使用率过高(如没有建立合适的索引等);系统内部 SQL 语句都执行正常,只是实际应用负载过大等。针对上述原因,DBA 可以分别考虑改正存储过程/函数的死循环逻辑、建立合适的索引以及提供更高配置的软/硬件环境等措施分别予以解决。

  1. I/0 是否正常

I/O 性能没有满足要求是导致很多系统性能低下的原因。通常情况下,主要是两个方面的原因导致 I/O 性能瓶颈:在系统规划时没有对 I/O 性能进行估算或者估算偏差太大,导致存储的 I/O 性能无法满足要求;其次是没有利用好数据库特性,如没有建立合适的索引,导致经常要做全表扫描,消耗大量 I/O 带宽,这可以通过查看 SQL 语句执行计划来加以分析。

  1. 系统日志和 SQL 日志

最后,DBA 还可以通过查看系统日志来辅助分析问题。在 DM 数据库运行过程中,会将一些关键信息记录到安装目录下一级 log 目录下的名称为 dm*_*实例名_YYYYMM.log 的系统日志文件中,其中 YYYY 表示年份,MM 表示月份。例如,dm_DMSERVER_202102.log。该文件会记录下数据库服务启动/关闭的时间、系统关键错误如打开文件失败等。

另外,如果将 DM 数据库配置文件中的参数 SVR_LOG 设置为打开,则系统还会在刚才的 log 目录下生成名为 dmsql*实例名*日期_时间.log 的 SQL 日志文件。例如,dmsql_DMSERVER_20210226_102712.log。在该文件中记录了启用 SVR_LOG 之后数据库接收到的所有 SQL 语句等信息,DBA 也可以通过分析该文件来帮助解决问题。

20.2 监控系统性能(V$)

在 DM 数据库中,定义了一系列以 V$为前缀的系统动态视图(参考附录 2:动态性能视图),这些表只有表结构信息,没有数据,有时也称之为虚视图。查询动态视图时,服务器动态加载数据。在 DM 数据库运行过程中,系统动态视图提供了大量系统内部信息,便于数据库管理员监视服务器的运行状况,并根据这些信息对数据库进行调优,达到提高数据库性能的目的。用户可以通过普通 SQL 查询语句来查询动态视图信息,也可以通过图形化客户端工具 Monitor 来进行查看。

某些动态性能视图(如 V$SYSSTAT)需要 ENABLE_MONITOR、MONITOR_SQL_EXEC、DSC_ENABLE_MONITOR 参数打开时才会进行相关信息的收集。

20.3 检查数据物理一致性

DM 数据库提供了用于检查数据物理一致性的工具 dmdbchk。在数据库服务器正常关闭的情况下,可以使用 dmdbchk 对数据文件完整性进行校验,包括校验 DM 数据库内部的物理存储结构是否正常,对象信息是否合法等。除此之外,dmdbchk 工具还可以检测并删除操作系统中残留的信号量和共享内存,避免达到操作系统上限后数据库服务无法启动。在检验完毕后,dmdbchk 会在当前目录下生成一个名为 dbchk_err.txt 的检查报告,供用户查看。

dmdbchk 的使用必须指定必要的执行参数,其调用格式为:

./dmdbchk help
dmdbchk V8

version: 03134284311-20240822-240257-10000
格式: ./dmdbchk KEYWORD=value

例程: ./dmdbchk path=/opt/dmdbms/bin/dm.ini

关键字         说明
------------------------------------------------------------------------------
PATH           dm.ini绝对路径或者当前目录的dm.ini
DCR_INI        dmdcr.ini的路径
HELP           打印帮助信息
START_INDEXID  最小检查索引号
END_INDEXID    最大检查索引号
CHECK_SEMA     检查当前系统信号量使用情况(只适用于LINUX,1:只做检查 2:检查并删除残留信号量)
CHECK_SHM      检查当前系统共享内存使用情况(只适用于LINUX,1:只做检查 2:检查并删除残留共享内存)
CHECK_REC      检查数据库中B树叶子节点的记录(0:不做检查 1:检查 2:同时检查BLOB字段 默认为0,仅用于B树索引检测,在FILE_PATH参数下不起作用)
PARALLEL       用于指定检测的过程中所使用的线程数目(1-100, 默认8)
FILE_PATH      单独检测指定的dbf文件的路径地址
TABLESPACEID   单独检测指定的表空间号
FEEDBACK       是否显示检测百分比进度(0:不显示 1:显示 2:只显示简略信息 默认为0)
OUTPUT_FIL     用于指定生成的检测报告的路径(默认为当前目录下的dbchk_err.txt)

dmdbchk 的详细说明可参考《DM8_dmdbchk 使用手册》。

20.4 调整配置参数

在 DM 数据库中,很多参数都是动态的,会自动响应各种负载,但是 DBA 仍然可以调用系统过程来改变 DM 实例的运行参数,从而获得更佳的性能体验。DBA 可以在 DM 数据库运行过程中执行 SF_GET_PARA_VALUE、SF_GET_PARA_DOUBLE_VALUE 和 SF_GET_PARA_STRING_VALUE 这三个函数来获取系统的当前配置参数,并且可以使用 SP_SET_PARA_VALUE、SP_SET_PARA_DOUBLE_VALUE、SF_SET_SYSTEM_PARA_VALUE 和 SP_SET_INI_PARA_VALUE 过程来修改静态/动态配置参数:

  1. SF_GET_PARA_VALUE (scope int, paraname varchar(256))

配置参数的值类型为数值类型时使用该函数来获取当前值。SCOPE 参数为 1 表示获取 INI 文件中配置参数的值,为 2 表示获取内存中配置参数的值。

  1. SF_GET_PARA_DOUBLE_VALUE(scope int, paraname varchar(256))

配置参数的值类型为浮点型时使用该函数来获取当前值。SCOPE 参数为 1 表示获取 INI 文件中配置参数的值,为 2 表示获取内存中配置参数的值。

  1. SF_GET_PARA_STRING_VALUE (scope int, paraname varchar(256))

配置参数的值为字符串类型时用该系统函数来获取当前值。SCOPE 参数为 1 表示获取 INI 文件中配置参数的值,为 2 表示获取内存中配置参数的值。

  1. SP_SET_PARA_VALUE (scope int, paraname varchar(256), value bigint)或 SP_SET_PARA_VALUE(inst_name varchar(128), scope int, paraname varchar(256),value bigint)

该过程用于修改整型静态配置参数和动态配置参数。SCOPE 参数为 0 表示修改内存中的动态配置参数值;参数为 1 表示修改内存和 INI 文件中的动态配置参数值;参数为 2 表示只在 INI 文件中修改配置参数,此时可修改静态配置参数和动态配置参数。当 SCOPE 等于 0 或 1,试图修改静态配置参数时服务器会返回错误信息。只有具有 DBA 角色的用户才有权限调用 SP_SET_PARA_VALUE。

inst_name 用于 DMDPC 环境下指定实例名,表示修改特定实例名下的整型静态配置参数和动态配置参数,此时被修改的配置参数不能是必须同步的参数。

  1. SP_SET_PARA_DOUBLE_VALUE (scope int, paraname varchar(256), value double)或 SP_SET_PARA_DOUBLE_VALUE(inst_name varchar(128), scope int, paraname varchar(256),value double)

该过程用于修改浮点型静态配置参数和动态配置参数。SCOPE 参数为 0 表示修改内存中的动态配置参数值;参数为 1 表示修改内存和 INI 文件中的动态配置参数值;参数为 2 表示只在 INI 文件中修改配置参数,此时可修改静态配置参数和动态配置参数。当 SCOPE 等于 0 或 1,试图修改静态配置参数时服务器会返回错误信息。只有具有 DBA 角色的用户才有权限调用 SP_SET_PARA_DOUBLE_VALUE。

  1. SP_SET_PARA_STRING_VALUE(scope int, paraname varchar(256),value varchar(256))或 SP_SET_PARA_STRING_VALUE(inst_name varchar(128), scope int, paraname varchar(256),value varchar(256))

该过程用于修改字符串类型静态配置参数和动态配置参数。SCOPE 参数为 0 表示修改内存中的动态配置参数值;参数为 1 表示修改内存和 INI 文件中的动态配置参数值;参数为 2 表示只在 INI 文件中修改配置参数,此时可修改静态配置参数和动态配置参数。当 SCOPE 等于 0 或 1,试图修改静态配置参数时服务器会返回错误信息。只有具有 DBA 角色的用户才有权限调用 SP_SET_PARA_DOUBLE_VALUE。

inst_name 用于 DMDPC 环境下指定实例名,表示修改特定实例名下的字符串类型静态配置参数和动态配置参数,此时被修改的配置参数不能是必须同步的参数。

  1. SF_SET_SYSTEM_PARA_VALUE (paraname varchar(256), value bigint\double\varchar(256), deferred int, scope int)或 SF_SET_SYSTEM_PARA_VALUE(inst_name varchar(128),paraname varchar(256), value bigint\double\varchar(256), deferred int, scope int)

该过程用于修改系统整型、double、varchar 的静态配置参数或动态配置参数。DEFERRED 参数,为 0 表示当前 session 修改的参数立即生效,为 1 表示当前 session 不生效,后续再生效,默认为 0。SCOPE 参数为 0 表示修改内存中的动态配置参数值;参数为 1 表示修改内存和 INI 文件中的动态配置参数值;参数为 2 表示只在 INI 文件中修改配置参数,此时可修改静态配置参数和动态配置参数。当 SCOPE 等于 0 或 1,试图修改静态配置参数时服务器会返回错误信息。只有具有 DBA 角色的用户才有权限调用 SF_SET_SYSTEM_PARA_VALUE。

inst_name 用于 DMDPC 环境下指定实例名,表示修改特定实例名下的系统整型、double、varchar 的静态配置参数或动态配置参数,此时被修改的配置参数不能是必须同步的参数。

  1. SP_SET_INI_PARA_VALUE (scope int, paraname varchar(256), value varchar(8187))

该过程用于修改整型,浮点型,字符串静态配置参数和动态配置参数。SCOPE 参数为 0 表示修改内存中的动态配置参数值;参数为 1 表示修改内存和 INI 文件中的动态配置参数值;参数为 2 表示只在 INI 文件中修改配置参数,此时可修改静态配置参数和动态配置参数。当 SCOPE 等于 0 或 1,试图修改静态配置参数时服务器会返回错误信息。只有具有 DBA 角色的用户才有权限调用 SP_SET_INI_PARA_VALUE。

DM 的动态 INI 参数分为系统级和会话级两种级别。会话级参数在服务器运行过程中被修改时,之前创建的会话不受影响,只有当前会话和新创建的会话使用新的参数值。

  1. SF_SET_SESSION_PARA_VALUE (paraname varchar(256), value bigint)

设置某个会话级 INI 参数的值,设置的参数值只对本会话有效。

  1. SP_RESET_SESSION_PARA_VALUE (paraname varchar(256))

重置某个会话级 INI 参数的值,使得这个 INI 参数的值和系统 INI 参数的值保持一致。

  1. SF_GET_SESSION_PARA_VALUE (paraname varchar(256))

获得当前会话的某个会话级 INI 参数的值。

需要注意的是,在对参数进行调整前,DBA 应该深刻理解配置参数中每个参数的含义和对系统的影响,避免由于错误的调整导致影响整个系统对外提供正常服务。对于一些关键业务,在实际调整前,建议在测试系统上先进行试验,验证通过后再在生产系统上进行调整。

20.5 优化数据库布局

数据库的布局直接影响整个系统的 I/O 性能。通常情况下,DBA 应该遵循下述原则:

  1. 日志文件放在独立的物理磁盘上,保持与数据文件分开存储;
  2. 预先估算并分配好磁盘空间,避免运行过程中频繁扩充数据文件;
  3. 系统中不同表空间尽量分布在不同的磁盘上,这样当数据分布在多个表空间时,可以充分利用不同磁盘的并行 I/O 能力;
  4. 对于分区表,尽可能将不同的分区放到不同的表空间;
  5. 对于分析型应用,数据库的页大小和簇大小都可以考虑取最大值,并且在采用列存储的情况下,应该尽可能让每列存放在独立的表
微信扫码
分享文档
扫一扫
联系客服