分享
 
 
 

浅谈DB2数据库的故障处理及最佳实践(1)

王朝other·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

当你在使用数据库时,可能会碰到各种不同的问题。我认为解决问题的要害在于分清问题的种类,并清楚每种问题的解决办法。另外很多的数据库的问题都是由于错误的操作,错误的配置引起的,所以本文在解释如何处理问题时也会给出一些好的建议,来避免产生问题。本文重点介绍实用的方法。对问题的分类有很多种方法,在本文中我我采用了两种分类方案。第一种方案是是否有错误码。即发生错误时是否同时返回了错误码,错误码既包括执行命令的返回码,也包扩应用程序的返回码。有返回码的错误解决方案是,在db2 CLP中运行 db2 ? SQLXXXX,然后根据对该问题的解释采取相应的解决方案。对没有错误码的问题,如数据库hang,CPU使用率过高等问题,解决问题的经验将非常重要,在本文中会有具体的说明。根据错误码解决问题举例(在下文中,再出现需要用这种方法解决问题时将不再重复):如在连接数据库时发生错误db2 connect to sample

SQL0332NThere 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

123456下一页

就可以成功连接了。第二种分类方案是按照问题的范围和性质进行分类。分类如下:1.数据库实例问题2.数据库问题3.数据库性能问题4.应用开发与数据库有关的问题下面对每一类问题进行具体说明。一、数据库实例的问题数据库实例问题可以分为两种情况1.实例无法启动,运行db2start后,直接返回错误码,如SQL1042C。假如根据错误码信息无法解决,可以尝试如下方案:重新更新该实例,以root身份登录,cd /usr/opt/db2_08_01/instance/

./db2iupdt <inst_name>Tip:常见的产生实例无法启动的原因数据库安装了新的补丁后没有运行db2iupdt数据库文件的权限被改成了777,数据库文件的权限是有要求的,所以不能将所有的文件都改成777的权限数据库实例文件被删除或损坏主机名与db2nodes.cfg里记录的不一致2.运行db2start时,hang在那里,既不报错,也无法启动实例这种情况一般是由于实例没有正常的停止造成的,一般运行下列命令可以解决:su - <inst_owner>

db2_kill

ipclean

su – root(将所有的与该实例有关的db2进程杀死 kill -9 )然后重新启动实例。3.数据库实例崩溃问题碰到实例崩溃的问题,首先查看db2diag.log,根据里面的信息来分析数据库宕机的原因。再看db2dump目录中是否有trap文件。可以根据这些信息来分析原因,一般这类问题都需要IBM工程师协助解决。宕机的原因可以分为两类,一类是数据库的BUG,即数据库的缺陷引起的,一般假如碰到了数据库的缺陷,都有临时的解决方案,或者通过安装最新的补丁来解决,对某些问题IBM也提供临时的修订来解决(需要付费)。另一类是操作系统,误操作等非产品问题导致的,对非产品问题导致的宕机尽量要避免。

上一页123456下一页

Tip:常见的数据库宕机原因系统的交换空间(paging space)用尽数据库的某个进程被kill二、数据库问题1.数据连接问题无法连接数据库,常见的错误有代码页错误,通讯协议错误,数据库状态错误等。对代码页类错误,可以通过设置db2codepage,db2country来解决,这两个变量需要用db2set 设置成与数据库一致的值。当发生通讯类错误时,首先要要检查环境变量DB2COMM=TCPIP是否已经设置,然后要检查dbm cfg的SVCENAME,该变量可以直接设置成端口号,或者设置成服务名,该服务名要在services文件中设置成对应的端口号。要检查该端口号是否已经被其他服务占用。在启动数据库后,可以运行netstat –an |grep ,来查看该端口处于的状态。TCP0.0.0.0:500000.0.0.0:0LISTENING还有一种情况,当连接数据库时,数据库处于backup pending 状态,无法连接。这是只要对数据库做一个备份就可以了。Tip:通常导致数据库处于备份赞挂的原因当一个数据库从循环日志改成归档日志时,数据库要求进行一次脱机备份,在重新启动数据库后,数据库就处于备份赞挂的状态对于一个使用线形日志的数据库,当做load时,表空间会处于备份赞挂的状态,为了避免这种情况,load命令需要使用copy yes,或者nonrecoverable参数。2.数据库损坏数据库最严重的问题莫过于数据库损坏,那么当数据库损坏时,最好的办法是从备份恢复数据库。假如无法从备份恢复,可以根据损坏的原因尝试相应的解决方案。由于存储问题导致部分数据文件损坏,但是数据库还可以连接,这种情况可以采用导出数据库的表结果和数据的方法来恢复数据库。当然对损坏的表,导出是无法完成的,这是可以使用db2dart的导出数据功能来导出这些损坏的表的数据。

上一页123456下一页

假如数据库损坏到已经无法连接的程度,那么除了从备份恢复,唯一的办法是使用db2dart来导出所有的数据了。Tip:如何使用db2dart来导出数据运行命令db2dart <dbname> /DDEL

# Table object data formatting start.

# Please enter

# Table ID or name, tablespace ID, first page, num of pages:

# (suffic page number with 'p' for pool relative),按照提示输入表名,表空间id,起始页数,需要导出的页数3.数据库的活动日志被删除这个问题经常会碰到。也属于数据库损坏的一种情况。并且数据库无法连接。首先考虑是否有可以恢复的备份,假如有,可以从备份恢复,然后前滚到日志的末尾,可以完全恢复该数据库。假如没有可用的备份来恢复,可以通过IBM的技术支持中心来协助解决。假如想自己解决那只有使用db2dart工具了。Tip:如何避免数据库的活动日志被删除启用数据库的镜像日志功能启用数据库的日志出口程序,这样可以避免手工来删除活动日志目录中的日志当一定要手工删除活动日志目录中的归档日志时,使用命令PRUNE LOGFILE PRIOR TO log-file-name,]可以避免失误将活动日志删除三、数据库性能问题数据库的性能问题一般不属于故障,但是当性能问题变得很严重时,就变成了故障。解决数据库的性能问题,可以从以下方面入手,检查数据库的配置,如缓冲池,排序堆等是否合理;检查数据库是否收集过统计信息,准确的统计信息对语句优化起着重要的左右;对sql语句进行优化;查看是否有系统资源瓶颈。确认性能问题首先要从系统的资源消耗来分析,一般可以借助操作系统的工具,如aix的topas命令。数据库的性能问题一般的表现是应用变慢,甚至没有响应。

上一页123456下一页

Tip:如何快速定位问题假如系统的CPU利用很高,IO很少,那么数据库的排序较多假如系统的IO繁忙,CPU很多是wait,那么说明数据库有过多的IO假如系统CPU,IO都很空闲,那么说明可以是有锁的问题假如系统IO,CPU都非常忙,说明有执行代价非常高的sql在执行数据库一般有三类的性能问题,一是CPU占用过多,二是IO过于繁忙,三是有锁等待。1.快速找到执行成本较高的sql首先要打开监视器的开关db2 update monitor switches using bufferpool on lock on sort on statement on table on uow on在系统最繁忙的时候,运行db2 get snapshot for all applications > app.out然后在该文件中查找处于Executing状态的应用,找到执行的对应的sql语句。假如用这种方法找不到,可以收集sql的快照db2 get snapshot for dynamic sql on <dbname> > sql.out这个快照记录了动态语句的快照信息,可以根据Total execution time (sec.ms)= 0.000000

Total user cpu time (sec.ms) = 0.000000

Total system cpu time (sec.ms) = 0.000000这些信息来找到最耗时的语句。2.如何优化sql语句DB2提供了很好的工具来做sql语句优化。首先要对找到的sql语句进行分析,看是否是该语句引起了性能问题。我们可以使用db2expln来查看sql语句的访问计划和执行成本。首先将找到的sql语句写到一个文本文件中sql.in,以“;”结尾,然后运行db2expln –d <dbname> -f <sql.in> -z “;” –g –o sql.exp

上一页123456下一页

查看 sql.exp可以看到这个sql语句的执行成本。假如确认该语句有问题,可以使用db2advis来通过建索引的方法来优化该语句db2advis –d <dbname> -i sql.in假如通过创建索引无法优化该语句,一般只能从业务角度优化。3.假如发生锁的问题如何处理发生锁的问题,一般有两种情况,一是锁等待,二是死锁。首先检查数据库配置参数locktimeout,该参数一定不能设为-1,因为会引起某些应用无限期的等待。可以通过快照来确定数据库发生的问题是哪一种。db2 get snapshot for db on <dbname>查看输出中的下列内容:Deadlocks detected = 0

Lock Timeouts= 0假如发生了死锁,可以通过创建死锁监视器来分析产生死锁的原因,命令如下:mkdir /tmp/dlmon

db2 connect to <db>

db2 create event monitor dlmon for deadlocks with detail write to file ‘/tmp/dlmon’ replace

db2 set event monitor dlmon state 1

…..等有死锁发生后

db2 set event monitor dlmon state 0

db2evmon –d /tmp/dlmon >/tmp/dlmon.out分析/tmp/dlmon.out文件就可以找到造成死锁的信息,结合应用就可以找到造成死锁的原因了。四、应用开发与数据库有关的问题1.与64位实例数据库问题目前随着硬件的升级,64位实例数据库开始广泛使用。有些人担心数据库使用64位以后,对程序的运行很大,因此不愿意使用64位的数据库,实际上64位数据库对客户的应用影响非常小,所以建议假如资源充足,尽量使用64位实例的数据库。可以通过创建一个32位实例的客户端,然后通过客户端来使用64位实例数据库的方法来将64位的问题完全忽略。假如使用java 存储过程或自定义函数,64位实例数据库需要安装64位的JDK。2.从DB2 V7移植程序到V8有关问题sqlc的应用程序中,数据类型long在V8中需要改成sqlint32,否则编译无法通过。假如确定long类型的数据长度与平台无关,也可以在编译时,指定LONGERROR NO选项。在编译sqlc程序时可能会碰到sql20230的错误,原因是在V8中不答应在call中使用主机变量,将执行语句改成动态sql后,可以解决该问题。在执行存储过程时,碰到sql0433的错误,原因同上,将call 存储过程的语句改成动态调用即可。3.Java程序问题编写良好的程序是避免产生问题的要害。对JAVA程序有如下建议,一定要用数据库的连接池;在执行大量的sql语句时使用prepared statement。结束语本文描述常见的数据库故障,并给出了简单有效的解决方案。对某些技术问题,如命令的使用没有具体介绍,当需要时可以查阅DB2相关的文档。

上一页123456

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有