故障排查Troubleshooting

1.常见问题

  无论是在服务器初始配置过程中还是生产过程中,系统管理员可能会遇到的若干常见问题。以下是最常要检查的问题:

  • 未能恰当的配置 UNIX 内核以为数据库服务器提供资源。

  • 分配给数据库服务器的共享内存不足。

  • chunk设备的权限和所有权不正确。

  • 服务器系统中临时空间未被创建或未指定或分配的空间不足。

  • 由于不正确的 sqlhosts 文件条目或不受支持的网络类型,用户无法连接到数据库服务器。

  • 长事务导致数据库服务器在回滚过程中被阻塞。

  • 因为所有的逻辑日志已满或不能重复使用,导致系统挂起。

  • 发生内部一致性检查错误。

2. 配置内核资源

12:30:58 Checkpoint Completed: duration was 1 seconds
12:30:58 Continuing Long Transaction (for COMMIT):tx 0x80b3d8
username:informix uid:200
12:32:52 Logical Log 20 Complete
12:34:53 Checkpoint Completed: duration was 0 seconds
12:35:27 dynamically allocated new shared memory segment (size 8388608)
12:37:07 Checkpoint Completed: duration was 3 seconds
12:40:36 Checkpoint Completed: duration was 0 seconds
12:41:19 asf_shm_be.c,line 1949,thread 23, failure, system out of semaphores.
12:41:19 PANIC:Attempting to bring system down
12:42:07 INFORMIX-OnLine Initialized – Shared Memory Initialized 12:42:07 Physical Recovery Started
12:42:07 Physical Recovery Complete:0 Pages Restored
12:42:07 Logical Recovery Started
12:42:07 Logical Recovery allocating 3 worker threads (‘OFF_RECVRY_THREADS’).
12:42:12 Logical Recovery Complete

  配置内核以便数据库服务器可以使用资源至关重要。如果内核配置不当,可能会对数据库服务器的性能产生负面影响。内核配置指南和特定于计算机的说明在 $SINODBMSDIR/etc/release 中。
  配置内核时,需特别留意影响共享内存和信号量使用的参数,如下所示:

参数 说明
SHMMAX 此值应设置为服务器所需初始共享内存段的最大值(以驻留区或虚拟区中较大者为准)。目的是当需要分配段时,分配一整个的物理共享内存段,而不是若干较小的段。
SHMSEG 决策查询需大量的内存支持。服务器将位于共享内存的虚拟段分配出去以支持这些查询。随着内存需求的增加,服务器动态给虚拟段分配额外的共享内存段。通常情况下,一条查询会使用部分共享内存段。
SEMMLS 服务器内,每组初始化后的 100 VPs 需要一组信号量。每个动态添加的 VP 都需要一组信号量。且 100 个共享内存连接为一组,每组需要一组信号量。SEMMSL 应大于或等于 100。

2.分配共享内存

onconfig文件中配置如下:

SHMVIRTSIZE 1024000
SHMADD 81920
SHMTOTAL 0

使用onstat命令查看配置结果,如下所示:

$ onstat -g seg

Sinoregal SinoDB Dynamic Server Version 16.8.FC8U0X3 -- On-Line -- Up 19 days 16:31:37 -- 1355616 Kbytes

Segment Summary:
id         key        addr             size             ovhd     class blkused  blkfree 
9535517    52564801   44000000         16449536         631048   R     4016     0       
9568286    52564802   44fb0000         1048576000       12289752 V     12895    243105  
9601055    52564803   837b0000         113287168        1        B     27658    0       
9633824    52564804   8a3ba000         43479040         1        B     10615    0       
9666593    52564805   8cd31000         166359040        1        B     40615    0       
Total:     -          -                1388150784       -        -     95799    243105  

   (* segment locked in memory)
No reserve memory is allocated

  为服务器合理分配共享内存是至关重要的。尝试分配所有服务器系统可用且不超过系统限制的共享内存。您在服务器中分配的共享内存如下所示︰

  • 驻留段(resident portion)包含逻辑日志缓冲区,物理日志缓冲区,锁信息等。

  • 虚拟段(virtual portion)包含会话和线程使用的不同内存池。决策支持查询频繁使用虚拟区内的会话、 线程和排序池。OLTP 查询需要占用虚拟区的部分内存,但通常情况下,占用的内存总量并不多。根据所需(SHMADD),动态分配额外的虚拟内存段,分配的上限由您指定 (SHMTOTAL)。

  • 缓存区(buffer potion)包含不同的页大小的缓冲池。在 OLTP 环境中,您可以通过增加缓冲区的数量来缓存页以此来提高性能。但是在 DSS 环境中,往往按顺序扫描表,且一条查询可以用单个表的页填满缓冲池,或者交换出其他并发查询换出所需的页。

2.1 为PDQ分配共享内存

  决策支持查询使用共享内存虚拟区的大量内存,执行联接(join)、排序(sort)和分组(group)操作。考虑系统上可用的虚拟共享内存,您必须决定哪一部分用于 PDQ。

OLTP 和 DSS

  如果您必须平衡 OLTP 和 DSS 环境下的资源,请使用 DS_TOTAL_MEMORY 配置参数限制可用于决策支持查询的虚拟共享内存。监测 OLTP 查询所使用的虚拟共享内存。如果确定 OLTP 查询没有充分利用所分配的虚拟区内存,那么您可以考虑配置共享内存给 DSS 查询。

DSS

  通过使用 onmode 命令,可以动态更新由DS_TOTAL_MEMORY 配置的最大决策支持内存大小︰

onmode -M kbytes

3.chunk权限和所有权

raw device:

$ ln /dev/rxy0f /dev/ifmx-raw-001
$ chmod 660 /dev/ifmx-raw-001
$ chgrp sinodbms /ifmx-raw-001
$ chown sinodbms /dev/ifmx-raw-001
$ ls -lg /dev/ifmx-raw-001
crw-rw---- 2 sinodbms sinodbms 9,5 Jan 1 2:00 /ifmx-raw-001

UNIX文件:

$ touch /usr/ifmx-cook-001
$ chmod 660 /usr/ifmx-cook-001
$ chgrp sinodbms /usr/ifmx-cook-001
$ chown sinodbms /usr/ifmx-cook-001
$ ls -lg /usr/ifmx-cook-001
-rw-rw---- 1 sinodbms sinodbms 0 Jan 1 2:00 /usr/ifmx-cook-001

  一个常见的错误是未能合理设置chunk权限和所有权。在创建每个原始设备(raw device)或 UNIX 文件之后,需要按以上所示的步骤设置权限、所有权和组。当重新启动系统时,一些操作系统会自动将原始设备的所有权恢复到 root 。如果在您的系统中发生这种情况,确保在启动服务器前把所有权更改回sinodbms (可以将其添加到系统启动文件中)。

  注意:当使用原始设备的chunk时,在 UNIX 中使用ln 命令为该设备分配一个更具描述性的名称(例如/dev/chunk1,/dev/chunk2, 等)。这样,如果在设备故障后需要恢复,可以更轻松地替换设备。。

4.临时Dbspace

  • 使用onspaces -t 选项创建临时 dbspaces 或 sbspaces。 临时 dbspace 或 sbspace 事务是︰
    — 未记录
    — 未存档

  • 指定临时 dbspaces
    DBSPACETEMP 配置参数
    DBSPACETEMP 环境变量

  服务器中的临时文件会被自动路由到专门为临时文件创建的 dbspaces。您指定的 dbspaces 必须有足够的磁盘空间来保存临时表和文件。若没有,那么您的操作可能会失败。

  当为临时文件创建dbspaces时,必须使用onspaces -t 选项显式 创建临时 dbspaces。

  临时 dbspaces 的优点是,它们的事务未被记录或存档。在 DBSPACETEMP 配置参数中或通过使用 DBSPACETEMP 环境变量来指定临时 dbspaces。

5. 解析服务器名称

  由于未能正确设置SINODBMSSERVER 环境变量或未能正确配置sqlhosts 文件,可能会出现服务器连接问题。一定要验证以下各项。

  需要SINODBMSSERVER 环境变量,而且必须将其设置为sqlhosts 文件条目中的一个有效的 dbservername (第一列)。

  sqlhosts 条目中的dbservername 对应 onconfig 的 DBSERVERNAME 或 DBSERVERALIASES 配置参数。DBSERVERNAME 只能包含一个条目,DBSERVERALIASES可包含多个条目。

5.1 sqlhosts文件中的nettype字段


  另一个连接时常出现的错误是sqlhosts 条目中nettype 的值(第二列)不正确。nettype 列包含关于数据库服务器的连接类型以及如何进行连接的关键信息。要找出您的硬件平台支持哪个协议,请参阅 $SINODBMSDIR/release 目录下的发行说明。

5.2 NETTYPE配置参数

  另一个连接时常出现的错误是onconfig文件中NETTYPE配置参数不正确。在NETTYPE配置参数中有四个字段︰

 参数 说明
Protocol 该字段指定用于连接服务器的网络协议类型。可能的值是ipcshmsoctcptlitcptlispx 。该字段应包含 sqlhosts 文件中nettype列列出的相同格式的六位字母的协议。若要确定您的系统上支持哪些协议,请参阅$SINODBMSDIR/release 目录。
Threads 该字段指定为指定协议而启动的轮询线程数量。
Users 该字段指定使用指定协议的连接数量。
VP-class VP-class指定轮询线程运行在何种类型的VP上(指定 CPU 或 NET)。CPU类通常是轮询线程的最佳位置。但是每个CPU VP只能运行一个轮询线程。

6. 长事务

1696747189058

LTXHWM:长事务
  如果一个事务贯穿所有可用的逻辑日志,则会出现问题。为了事务继续执行,需要更多的逻辑日志空间。当一个事务达到长事务高水位线 (long-transaction high-watermark,LTXHWM) 时,则被称为一个长事务 。长事务会自动回滚。

LTXEHWM:独占访问
  回滚一个长事务会导致新事务被写入到逻辑日志文件,并可能填满其余可用日志空间。为避免此问题,逻辑日志只能在长事务 到达高水位线 (LTXEHMW)时,保持其对逻辑日志的独占访问 。此时,只允许长事务回滚继续;所有其他交易均被挂起,直到长事务回滚完成。如果最后一个日志中没有足够的空间来完成回滚,那么将阻止服务器进行任何其他数据库活动。可以更改配置文件中的 LTXHWM 和 LTXEHWM 参数。缺省的百分比配置如下︰

LTHHWM 50 percent
LTXEHWM 60 percent

  如果您发现有长事务发生︰

  • 添加更多的逻辑日志。

  • 识别创建长事务的 SQL 语句与会话。如果需要,请分析并更改应用程序。

  • 关闭日志记录。

  • 在应用级别通过更频繁地提交和设置更好的事务边界来处理长事务。

7.释放逻辑日志

  为了释放逻辑日志以便重新使用,必须先备份它们。如果没有可用的日志,服务器将被阻塞。在 OLTP 环境下,推荐执行连续的逻辑日志备份。如果不能执行连续的备份(因为磁带设备排他性),那么应该尽可能执行频繁地自动备份。

活动事务

  只要仍需使用逻辑日志文件中的任何内容来完成事务回滚或快速恢复,该逻辑日志文件就不能被释放。如果一个日志包含了一个仍处于活动状态的事务的记录,则被认为在使用中 ,因此不能被释放。

最后一个检查点记录

  如果一个日志包含了最后一个检查点的记录,该日志以及随后的所有日志都会被认为在使用中,因此不能被释放。当一个新的检查点记录写入时,从包含之前的检查点记录的日志到包含最新的检查点记录的日志文件都不再需要用来做快速恢复;除非它们包含活动事务的记录,否则不再被认为是在使用中,且如果它们已被备份到磁带,那么就可以被释放了。

  一旦逻辑日志中的所有事务都完成了,如果该日志已经备份且不需要用于快速恢复,则可以释放该日志。释放逻辑日志文件也会释放由该日志中的事务删除或更新的任何 blobspace blobpages。

8. 用oncheck验证数据的一致性

  oncheck 实用程序检查磁盘上的数据结构,被用于定位和修复索引和数据页损坏。许多选项都需要在它正在检查的表上锁定表。通常,您可以使用以下选项来执行一致性检查:

选项 说明
数据检查 使用 -cD 或 -cd 选项。检查期间受影响的表被锁定。
索引检查 使用 -cI 或 -ci 选项。检查期间受影响的表被锁定。
数据和索引检查 使用 -cDI 或 -cdi 选项。检查期间受影响的表被锁定。
保留页检查 使用 -cr 选项。可在系统联机或脱机时运行该选项。
系统目录检查 使用 -cc 选项。选项在系统目录上放置一个共享锁。

8.1内部一致性错误检查

13:58:20Assert Failed: newmode
13:58:20 Who:Session(29, informix@dingo, 9363, 6)
Thread(39, sqlexec, 808120, 1)
13:58:20 Results:Internally corrected
13:58:20 See Also:/tmp/af.3108, shmem.3108.0
13:58:23Assert Failed:Page Check Error in bfput
13:58:23 Who:Session(29, informix@dingo, 9363, 6)
Thread(39, sqlexec, 808120, 1)
13:58:23 Results:Possible inconsistencies in ’sysmaster:“informix”.sysaudit’
13:58:23 Action**:Run ’oncheck -cDI 1048641’**
13:58:23 See Also:/tmp/af.3108, shmem.3108.1
13:58:24rsbuff.c, line 1896, thread 39, proc id 7536, Dynamic
Server must abort.
13:58:24 PANIC:Attempting to bring system down

  为了防止系统其他部分的数据损坏,无论何时在共享内存中操作数据,服务器都会在数据上执行自动的一致性检查。服务器将执行几种不同的一致性检查。当页面未通过一致性检查或检测到索引问题时,将向日志写入一条消息日志详细说明问题,并建议您使用适当的选项运行oncheck。

  另外,导致页被访问的应用程序将接收到一个错误代码。当一致性检查失败时,错误代码的 ISAM 选项总为 -105

  如果您接收到一条失败的一致性检查消息:

  • 如果可以,关闭服务器。损坏的页可能没有被复制到磁盘。

  • 按照消息的指示,使用合适的选项运行 oncheck

  • 如果 oncheck 无法修复损坏,尝试卸载并重新加载表。如果损坏发生在一条索引中,尝试删除并重新构建该索引。

  • 如果这些步骤都无法修复损坏,从备份中恢复服务器。

9. 咨询SinoDB数据库技术支持

  假如您需要咨询SinoDB数据库技术支持,应该在咨询前准备几个信息。提供的信息越多,就能够越好地分析和诊断问题,也能越快地解决问题。您应该准备好以下信息:

  • 序列号和服务器产品的版本。序列号帮助技术支持代表识别您的SinoDB数据库产品的平台。
    如果初始化了共享内存,可以运行 onstat -V 命令获取版本信息。可以保留该信息的一个打印记录,以防无法初始化共享内存。

  • 机器类型和操作系统版本

  • onconfig配置文件副本

  • 如果共享内存初始化,提供onstat –a 的输出

  • 如果共享内存未初始化,提供oncheck -pr 的输出

  • 包含任何错误信息的消息日志

  • 应用程序错误和描述,如果有的话