数据库故障时,问题跟踪和解决

二、问题跟踪和解决

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

一、 问题分析

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

1.网络是否正常

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

2.内存使用量

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

3.CPU使用率

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

4.I/0是否正常

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

5.系统日志和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也可以通过分析该文件来帮助解决问题。

二、监控系统性能(V$)

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

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

三、 数据库重演(REPLAY)

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

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

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

格式:DREPLAY KEYWORD=value

例程:DREPLAY SERVER=LOCALHOST:5236 FILE=.\test.cpt

必选参数:FILE

--如果需要获取帮助信息,可以调用dreplay help,屏幕将显示如下信息:

关键字 说明(默认)

-------------------------------------------------------------

SERVER 需要连接的服务器格式SERVER:PORT(LOCALHOST:5236)

FILE 捕获文件及路径

HELP 打印帮助信息

 四、检查数据物理一致性

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

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

格式: dmdbchk.exe KEYWORD=value

例程: dmdbchk.exe path=d:\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:检查并删除残留共享内存)

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

五、调整配置参数

在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过程来修改静态/动态配置参数:

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

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

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

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

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

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

  1. SP_SET_PARA_VALUE (scope int, paraname varchar(256), value int64)

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

  1. SP_SET_PARA_DOUBLE_VALUE (scope int, paraname varchar(8187), alue double)

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

  1. SF_SET_SYSTEM_PARA_VALUE (paraname varchar(256), value int64\double\varchar(256), deferred int, scope int64)

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

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

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

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

  1. SP_RESET_SESSION_PARA_VALUE (paraname varchar(8187))

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

  1. SF_GET_SESSION_PARA_VALUE (paraname varchar(8187))

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

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

六、 优化数据库布局

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

  1. 日志文件放在独立的物理磁盘上,保持与数据文件分开存储;

  2. 预先估算并分配好磁盘空间,避免运行过程中频繁扩充数据文件;

  3. 系统中不同表空间尽量分布在不同的磁盘上,这样当数据分布在多个表空间时,可以充分利用不同磁盘的并行I/O能力;

  4. 对于分区表,尽可能将不同的分区放到不同的表空间;

  5. 对于分析型应用,数据库的页大小和簇大小都可以考虑取最大值,并且在采用列存储的情况下,应该尽可能让每列存放在独立的表。

(达梦云适配技术社区的网址:https://eco.dameng.com )

上一篇:Netbackup 命令之bplist


下一篇:【dmmonitor启动异常总结】