Informix 系统表监控和优化数据库.docx

上传人:b****4 文档编号:12141488 上传时间:2023-04-17 格式:DOCX 页数:18 大小:328.82KB
下载 相关 举报
Informix 系统表监控和优化数据库.docx_第1页
第1页 / 共18页
Informix 系统表监控和优化数据库.docx_第2页
第2页 / 共18页
Informix 系统表监控和优化数据库.docx_第3页
第3页 / 共18页
Informix 系统表监控和优化数据库.docx_第4页
第4页 / 共18页
Informix 系统表监控和优化数据库.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Informix 系统表监控和优化数据库.docx

《Informix 系统表监控和优化数据库.docx》由会员分享,可在线阅读,更多相关《Informix 系统表监控和优化数据库.docx(18页珍藏版)》请在冰豆网上搜索。

Informix 系统表监控和优化数据库.docx

Informix系统表监控和优化数据库

Informix系统表监控和优化数据库

简介:

大多数Informix使用者都会使用onstat,oncheck等命令的方式来监控Informix数据库的运行情况,从而确定数据库优化方案。

但这种方法存在一些难度,需要多个命令输出综合考虑,才能得出结论。

本文从另外一个角度--SQL语句,通过SQL语句查询系统表的方式,返回综合的、有组织性的、有实际数据根据的信息。

DBA根据本文可以直接找到系统性能问题,从而进行快速有效的优化,同时可以根据这些有效的数据完成数据库优化过程的报告文档。

Informix数据库系统字典表简介

Informix数据库服务器运行时的状态信息是数据库管理员DBA进行系统监控和优化的必需信息来源。

Informix的状态信息在内部以2种方式存在,如图1所示,一部分是存在于Informix运行的共享内存中,这部分信息在数据库关闭后,其信息将自动消失,只是一个内存信息,我们称为内存表,如:

sysbufpool,sysvpprof,sysprofile等。

另外一部分是以Informix物理字典表的方式存储,如:

systables,sysindex。

Informix数据库系统字典表是用来访问这2个部分的内部信息的一个接口,可以通过SQL语句查询Informix系统运行的动态情况。

图1.Informix系统表接口示意图

从另外一个视角来理解Informix系统表,就是从系统的组成数据库来看。

如图2所示,主要包括3个数据库:

sysmaster,sysadmin和用户数据库。

其中sysmaster是最重要的系统数据库,该数据库保存实例(Instance)级别的系统信息,如实例运行的总体信息,所有的表等。

sysadmin是一个管理系统数据库,主要用来管理Informix系统管理相关的信息,如可以通过该数据库可以定义Informix的任务调度器等。

用户数据库,就是用户定义用来存储用户数据的数据库,每个用户数据库都包含有数据库(Database)级别的系统表,如systables等。

图2.Informix系统表数据库组成示意图

Informix系统字典表的结构及含义详细解释:

也可以直接访问IBMInformix在线文档,URL如下:

文档中对每一个系统表的每一个字段的含义有详尽的说明。

回页首

常用系统表监控SQL及查询结果的诊断与分析

本节以Informix数据库监控和优化的方法和分析主题为单位,提供具体访问Informix系统表来监控数据库运行状态的SQL语句,对SQL返回的结果进行分析,提出数据库优化建议。

DBA可以根据本节内容就可以掌握如何使用Informix系统表进行数据库的监控和性能优化。

注意:

本文中所演示用到的用户定义数据库名为demodb,在应用本文提供的SQL语句时,需要将数据库名demodb修改为实际的数据库名。

1.数据库实例基本运行状况

了解数据库实例的运行信息,如统计信息的起始时间,数据库出现长事务的次数。

清单1.查询数据库实例基本运行情况的SQL

dbaccesssysmasterselectdbinfo('UTC_TO_DATETIME',sh_boottime)start_time,currentyeartosecond-dbinfo('UTC_TO_DATETIME',sh_boottime)run_time,sh_maxchunksasmaxchunks,sh_maxdbspacesmaxdbspaces,sh_maxuserthreadsmaxuserthreads,sh_maxtransmaxtrans,sh_maxlockslocks,sh_nlrusbuff_lrus,sh_longtxlongtxs,dbinfo('UTC_TO_DATETIME',sh_pfclrtime)onstat_z_running_timefromsysmaster:

sysshmvals;

图3.数据库实例基本运行情况查询结果

分析:

从如上SQL语句返回的结果可以得到Informix实例如下有用的信息:

上一次运行onstat-z清除统计信息的时间:

onstat_z_running_time,该时间可以帮助DBA确认当前统计的信息的时间长度,而不需要重新启动数据库,可以通过onstat-z来清除统计信息从而确认时间间隔内的数据库运行情况。

数据库出现长事务的次数:

longtxs。

另外,我们可以得到实例所支持的最大chunk和dbspace数量,以及可以运行的线程数量。

还包含有实例的配置参数值:

锁的个数,LRU队列数。

2.数据库实例概要信息

数据库实例的概要信息称为Informix数据库运行的健康检查的“血常规表”,可以从整体上掌握数据库运行的状况,评价数据库是否存在性能问题。

清单2.查询数据库实例概要信息的SQL

dbaccesssysmasterselectname,valuefromsysmaster:

sysprofile;

图4.数据库实例概要信息查询结果

分析:

系统表sysprofile是保存了Informix运行的概要信息,是onstat-p命令的基本信息来源,如上查询结果可以看出,可以获取类似的读/写缓存命中率、锁溢出、锁等待、死锁、顺序扫描次数、事务回滚次数及比例、磁盘排序、内次排序情况、磁盘写情况(onstat-F)等信息。

数据库运行概要信息是整个实例自开机或者上一次运行onstat-z以来的统计信息,反应了数据库实例的总体情况,从各个方面确定数据库实例是否存在性能问题,在DBA进行数据库优化时,对Informix诊断要做的第一件事情就是查看该信息,如发现seqscans值偏大,同时diskread也较大,则表明系统中有很多SQL语句对大表进行顺序扫描方式,可以根据本文后续内容以进一步找到问题原因。

简而言之,该信息是进行数据库优化的一个指南针,也是评价一个系统是否健康的一个“血常规表”。

3.Session的连接情况

通过Session的连接信息,可以分析出数据库系统业务负载情况,来自哪些客户端的任务较多,并且根据Session的空闲情况,判断客户端连接池是否存在过多的连接。

清单3.查询Session的连接情况的SQL

dbaccesssysmasterSELECTs.sid,s.username,s.hostname,q.odb_dbnamedatabase,dbinfo('UTC_TO_DATETIME',s.connected)conection_time,dbinfo('UTC_TO_DATETIME',t.last_run_time)last_run_time,current-dbinfo('UTC_TO_DATETIME',t.last_run_time)idle_timeFROMsyssessionss,systcblstt,sysrstcbr,sysopendbqWHEREt.tid=r.tidANDs.sid=r.sidANDs.sid=q.odb_sessionidORDERBY7DESC;

图5.数据库Session连接情况查询结果

分析:

在数据库监控过程中,我们经常需要监控Session的连接信息,如Session来自哪一个客户端(客户端IP地址或者名称),在客户端的进程ID(-1标识长连接,一些来自java连接池的情况都显示为-1),连接到哪一个数据库。

连接时间,以及多长时间没有执行任务,通过该信息可以确定连接池开启的连接个数是否过多或者过少。

4.Session等待事件

Session是监控应用程序对数据库访问的窗口,通过分析Session的等待事件,可以快速的了解到应用程序客户端数据库请求是否存在性能问题,通过等待事件,我们可以找到性能慢的应用,并加以优化。

清单4.查询Session等待事件的SQL

dbaccesssysmasterselectsid,pid,username,hostnameis_wlatch,--blockedwaitingonalatchis_wlock,--blockedwaitingonalockedrecordortableis_wbuff,--blockedwaitingonabufferis_wckpt,--blockedwaitingonacheckpointis_incrit--sessionisinacriticalsectionoftransactionfromsyssessionsorderbyusername;

图6.数据库Session等待事件查询结果

分析:

可以通过where条件过滤满足特定条件的session,确定是否有锁等待、buff等待的情况。

5.监控正在执行的SQL语句

数据库此时到底在忙什么,我们可以通过数据库当前正在执行的SQL语句进行判断,找到哪些出现频繁的SQL语句,哪些运行慢的SQL语句。

同时,可以用来监控访问特定表的SQL。

清单5.查询Informix正在执行的SQL语句的SQL

dbaccesssysmasterselectusername,sqx_sessionid,sqx_sqlstatementfromsysmaster:

syssqexplain,sysmaster:

sysscblstwheresqx_sessionid=sid--andsqx_sqlstatementlike'%tabname%';

图7.监控正在执行的SQL查询结果

分析:

当需要监控找到符合某一条件的SQL语句时,该方法提供了直接的信息,如要找到正在访问表名为customer的SQL语句有那些,哪只需要通过条件andsqx_sqlstatementlike'%customer%'过滤即可。

6.找到运行最慢的SQL语句

系统中20%的SQL语句占用了80%的系统资源,所以DBA在优化数据库时,找出和优化运行慢的SQL语句至关重要,如何捕获到系统中运行慢的SQL语句对很多DBA来说非常困难,这里介绍两个有效的方法:

当前运行慢的SQL和一段时间内运行慢的SQL语句。

清单6.查询数据库当前运行最慢SQL语句的SQL

dbaccesssysmasterselectfirst25sqx_estcost,sqx_estrows,sqx_sqlstatementfromsysmaster:

syssqexplainwhere1=1orderbysqx_estcostdesc;

图8.监控数据库当前运行最慢SQL语句的查询结果

分析:

通过查询当前正在执行的SQL语句的开销来监控运行慢的SQL语句。

当你的数据库处于非常繁忙的时刻,多次运行该语句,就可以找到那些慢的SQL语句。

如果要找到数据库一段时间以内(比如早上8点到12点)运行慢的SQL语句,那么我们需要利用到Informix11的SQLTRACE功能。

SQLTRACE功能的使用如下:

打开SQLTRACE跟踪SQL:

echo'executefunctiontask("setsqltracingon",100000,"1k","low","demodb");'|dbaccesssysadmin

说明:

∙demodb为跟踪的数据库名;

∙100000为最多跟踪的SQL语句个数,超过这个数字时,将最早跟踪的SQL删除

∙1k为每个SQL占用的内存,对于有特别大的SQL语句,需要设置更大的值,如2k,4k

关闭SQLTRACE功能:

echo'executefunctionsysadmin:

task("SETSQLTRACINGOFF");'|dbaccesssysadmin

说明:

跟踪分析完成后,一定要关闭。

SQL-Tracing开启下将对系统有2%-5%的性能消耗。

另外,关闭后,跟踪的信息(内存)将字典释放,故一定要分析完成后,再关闭,或者定期把捕获的信息转存到自定义的表(创建三个和sql-tracing字典表一致的表即可)中,供进一步分析使用。

结果分析:

我们可以对SQL-Tracing捕获的结果进行分析,

顺序扫描的SQL

selectdistinctsql_statementfromsysmaster:

Syssqltracetinnerjoinsysmaster:

syssqltrace_iteriont.sql_id=i.sql_idwherei.sql_itr_info='SeqScan';

查询速度慢SQL

可以通过不同的指标进行排名

echo"selectfirst20*fromsysmaster:

syssqltraceorderbysql_totaltime"|dbaccessdemodb

7.哪些表使用了最多的锁

锁是数据库中的常见问题,我们通过2.节了解到数据库系统整体上是否存在锁等待、死锁的问题。

我们可以通过监控表的锁使用情况,以进一步确认出现锁问题的原因。

清单7.监控表使用锁的情况的SQL

dbaccesssysmasterselectdbsnamedatabanse,tabname,sum(pf_rqlock)aslocks,sum(pf_wtlock)aslockwaits,sum(pf_deadlk)asdeadlocksfromsysactptnhdr,systabnameswheresystabnames.partnum=sysactptnhdr.partnum--andpf_wtlock>=0andpf_rqlock>=0groupbydbsname,tabnameorderbylockwaitsdesc;

图9.表使用锁情况的查询结果

分析:

当数据库出现锁问题时,首先我们需要找到哪些表消耗了最多的锁资源,哪些表出现了锁等待和死锁情况。

从而我们可以进一步确定需要监控的对象和有针对性的优化,可以分析表的锁模式:

页级锁还是行级锁,还需要监控访问表的SQL语句是否发生了顺序扫描和采用的隔离级别。

8.锁等待监控

当出现锁冲突时,如何找到锁的占用者以及导致了哪些Session等待,是进行锁优化的关键。

清单8.监控锁等待情况的SQL

dbaccesssysmasterselectdbsnamedatabanse,tabname,sum(pf_rqlock)aslocks,sum(pf_wtlock)aslockwaits,sum(pf_deadlk)asdeadlocksfromsysactptnhdr,systabnameswheresystabnames.partnum=sysactptnhdr.partnum--andpf_wtlock>=0andpf_rqlock>=0groupbydbsname,tabnameorderbylockwaitsdesc;

图10.数据库锁等待查询结果

分析:

当发现数据库中有锁等待的情况,即使用本文2.2节查询的结果lockwts值比较大时,或者通过2.4发现Session有锁等待情况,或者我们发现表被锁的情况,我们可以通过该SQL去找到锁的使用情况,及该锁是否造成了其他使用者的等待。

9.DBSpace监控

我们可以通过onstat-d了解到Informix的DBSpace的使用情况,剩余空间情况等。

但是输出格式不是很友好,通过该SQL可以得到dbspace的全面、友好的信息。

清单9.监控DBSpace空间使用情况的SQL

dbaccesssysmasterSELECTA.dbsnumasNo,trim(B.name)asname,CASEWHEN(bitval(B.flags,'0x10')>0ANDbitval(B.flags,'0x2')>0)THEN'MirroredBlobspace'WHENbitval(B.flags,'0x10')>0THEN'Blobspace'WHENbitval(B.flags,'0x2000')>0ANDbitval(B.flags,'0x8000')>0THEN'TempSbspace'WHENbitval(B.flags,'0x2000')>0THEN'TempDbspace'WHEN(bitval(B.flags,'0x8000')>0ANDbitval(B.flags,'0x2')>0)THEN'MirroredSbspace'WHENbitval(B.flags,'0x8000')>0THEN'SmartBlobspace'WHENbitval(B.flags,'0x2')>0THEN'MirroredDbspace'ELSE'Dbspace'ENDasdbstype,CASEWHENbitval(B.flags,'0x4')>0THEN'Disabled'WHENbitand(B.flags,3584)>0THEN'Recovering'ELSE'Operational'ENDasdbsstatus,format_units(sum(chksize),max(A.pagesize))asDBS_SIZE,format_units(sum(decode(mdsize,-1,nfree,udfree)),max(A.pagesize))asfree_size,TRUNC(100-sum(decode(mdsize,-1,nfree,udfree))*100/sum(chksize),2)||'%'asused,TRUNC(MAX(A.pagesize/1024))aspgsize,MAX(B.nchunks)asnchunksFROMsyschktabA,sysdbstabBWHEREA.dbsnum=B.dbsnumGROUPBYA.dbsnum,name,3,4ORDERBYA.dbsnum;

图11.数据库DBspace空间查询结果

分析:

Dbspace的chunk数量、类型、状态(Operational为正常状态),空间的大小、已用空间及已用空间的百分比。

及时发现空间即将使用完的情况,提前增加空间。

10.ChunksI/O监控

Chunk的I/O是否均衡,是从Chunk角度判断数据库存储规划是否存在问题的出发点。

清单10.监控ChunkI/O情况的SQL

dbaccesssysmasterselectd.namedbspace,fname[1,125]chunk_name,readsread_count,writeswrite_count,reads+writestotal_count,pagesread,pageswritten,pagesread+pageswrittentotal_pgfromsysmaster:

syschkioc,sysmaster:

syschunksk,sysmaster:

sysdbspacesdwhered.dbsnum=k.dbsnumandk.chknum=c.chunknum--#c.chknumorderby8desc;

图12.Chunks读写情况查询结果

分析:

通过查看Chunk的I/O情况,可以判定数据库系统的I/O是否均衡,如果出现不均衡的情况容易出现I/O冲突,性能下降。

为了充分利用所有的磁盘设备,我们需要尽量均衡I/O到不同的设备。

对于I/O比较集中的Chunk,需要根据本文后面的内容找到相应的表及索引,通过把表存储在不同的DBSpace上,及分片方式进行均衡I/O。

11.临时表空间监控

临时表是否使用正确,是否存在磁盘排序?

可以通过临时表空间的使用情况得到答案。

以及是否存在大量的磁盘排序情况。

清单11.监控临时表空间使用情况况的SQL

dbaccesssysmasterselecttrim(n.dbsname)tab_type,trim(n.owner)users,trim(n.tabname)tab_name,dbinfo('UTC_TO_DATETIME',i.ti_created)index_createtime,trim(dbinfo('DBSPACE',i.ti_partnum))dbspace,format_units(i.ti_nptotal,i.ti_pagesize)total_size,i.ti_nrowsFROMsysmaster:

systabnamesn,sysmaster:

systabinfoiWHERE(sysmaster:

bitval(i.ti_flags,32)=1ORsysmaster:

bitval(i.ti_flags,64)=1ORsysmaster:

bitval(i.ti_flags,128)=1)ANDi.ti_partnum=n.partnumorderby1,3;

图13.临时表空间使用情况查询结果

分析:

SortTEMP是用来排序用的临时空间,合理调整参数:

DS_NONPDQ_QUERY_MEM,减少磁盘排序onmode-wfDS_NONPDQ_QUERY_MEM=2048。

确定是否有临时表存储的dbspace不是临时表空间的情况,那可能由于没有正确配置好临时表空间,或者没有在创建临时表时使用withnolog选项。

Informix11及以上版本可以通过该参数TEMPTAB_NOLOG让应用程序中遗忘使用withnolog的情况正

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1