对DB2故障处理及最佳实践的浅析

日期: 2010-10-17 作者:佚名 来源:TechTarget中国

  本文在解释如何DB2故障处理问题时也会相应给出一些建议,来避免产生问题。当你在使用数据库时,可能会遇到各种不同的问题。我个人认为解决问题最为关键的是在于分清问题的种类,并清楚每种问题的解决办法。

  另外很多的数据库的问题都是由于错误的操作,错误的配置引起的,所以本文在解释如何DB2故障处理问题时也会给出一些好的建议,来避免产生问题。本文重点介绍实用的方法。

  对问题的分类有很多种方法,在本文中我我采用了两种分类方案。

  第一种方案是是否有错误码。即发生错误时是否同时返回了错误码,错误码既包括执行命令的返回码,也包扩应用程序的返回码。

  有返回码的错误解决方案是,在db2 CLP中运行 db2 ? SQLXXXX,然后根据对该问题的解释采取相应的解决方案。对没有错误码的问题,如数据库hang,CPU使用率过高等问题,解决问题的经验将非常重要,在本文中会有详细的说明。

  根据错误码解决问题举例(在下文中,再出现需要用这种方法解决问题时将不再重复):

  如在连接数据库时发生错误

  db2 connect to sample

  SQL0332N There is no available conversion for the source code page “1386” to

  the target code page “819”. Reason Code “1”. SQLSTATE=57017

  错误码分为返回码(SQL0332N)和原因码(Reason Code “1”),针对不同的原因码有不同的解决方案

  运行db2 ? sql0332

  从输出种可以看到对于 reason code 1的解释是

  ……

  1 source and target code page combination is not supported by the database manager.

  ……

  所以可以通过设置代码页来解决这个问题

  db2set db2codepage=1386

  db2 terminate

  db2 connect to sample

  就可以成功连接了。

  第二种分类方案是按照问题的范围和性质进行分类。分类如下:

  1.数据库实例问题

  2.数据库问题

  3.数据库性能问题

  4.应用开发与数据库有关的问题

  浅谈DB2故障处理及最佳实践,下面对每一类问题进行详细说明。

  一、数据库实例的问题

  数据库实例问题可以分为两种情况

  1实例无法启动,运行db2start后,直接返回错误码,如SQL1042C。

  如果根据错误码信息无法解决,可以尝试如下方案:

  重新更新该实例,以root身份登录,

  cd /usr/opt/db2_08_01/instance/

  ./db2iupdt

  Tip:常见的产生实例无法启动的原因

  数据库安装了新的补丁后没有运行db2iupdt

  数据库文件的权限被改成了777,数据库文件的权限是有要求的,所以不能将所有的文件都改成777的权限

  数据库实例文件被删除或损坏

  主机名与db2nodes.cfg里记录的不一致

  2.运行db2start时,hang在那里,既不报错,也无法启动实例

  这种情况一般是由于实例没有正常的停止造成的,一般运行下列命令可以解决:

  su –

  db2_kill

  ipclean

  su – root

  (将所有的与该实例有关的db2进程杀死 kill -9 )

  然后重新启动实例。

  3.数据库实例崩溃问题

  遇到实例崩溃的问题,首先查看db2diag.log,根据里面的信息来分析数据库宕机的原因。再看db2dump目录中是否有trap文件。可以根据这些信息来分析原因,一般这类问题都需要IBM工程师协助解决。

  宕机的原因可以分为两类,一类是数据库的BUG,即数据库的缺陷引起的,一般如果遇到了数据库的缺陷,都有临时的解决方案,或者通过安装最新的补丁来解决,对某些问题IBM也提供临时的修订来解决(需要付费)。另一类是操作系统,误操作等非产品问题导致的,对非产品问题导致的宕机尽量要避免。

  Tip:常见的数据库宕机原因

  系统的交换空间(paging space)用尽

  数据库的某个进程被kill

  二、数据库问题

  1.数据连接问题

  无法连接数据库,常见的错误有代码页错误,通讯协议错误,数据库状态错误等。

  对代码页类错误,可以通过设置db2codepage,db2country来解决,这两个变量需要用db2set 设置成与数据库一致的值。

  当发生通讯类错误时,首先要要检查环境变量DB2COMM=TCPIP是否已经设置,然后要检查dbm cfg的SVCENAME,该变量可以直接设置成端口号,或者设置成服务名,该服务名要在services文件中设置成对应的端口号。要检查该端口号是否已经被其他服务占用。在启动数据库后,可以运行netstat –an |grep ,来查看该端口处于的状态。

  TCP 0.0.0.0:50000 0.0.0.0:0 LISTENING

  还有一种情况,当连接数据库时,数据库处于backup pending 状态,无法连接。这是只要对数据库做一个备份就可以了。

  Tip:通常导致数据库处于备份赞挂的原因

  当一个数据库从循环日志改成归档日志时,数据库要求进行一次脱机备份,在重新启动数据库后,数据库就处于备份赞挂的状态

  对于一个使用线形日志的数据库,当做load时,表空间会处于备份赞挂的状态,为了避免这种情况,load命令需要使用copy yes,或者nonrecoverable参数。

  2.数据库损坏

  数据库最严重的问题莫过于数据库损坏,那么当数据库损坏时,最好的办法是从备份恢复数据库。

  如果无法从备份恢复,可以根据损坏的原因尝试相应的解决方案。

  由于存储问题导致部分数据文件损坏,但是数据库还可以连接,这种情况可以采用导出数据库的表结果和数据的方法来恢复数据库。当然对损坏的表,导出是无法完成的,这是可以使用db2dart的导出数据功能来导出这些损坏的表的数据。

  如果数据库损坏到已经无法连接的程度,那么除了从备份恢复,唯一的办法是使用db2dart来导出所有的数据了。

  以上的相关内容就是对浅谈DB2故障处理及最佳实践的介绍,望你能有所收获。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

作者

佚名
佚名

相关推荐