lihq122
作者lihq122·2011-06-03 17:47
系统工程师·招行软件中心

MQ系列之二、维护MQ

字数 2177阅读 10568评论 0赞 2
一、命令是开始
维护MQ,就必须要了解MQ的作用和其相关命令。
MQ作为通信中间件,其通讯方式有两种:MQ之间进行通讯、开发的程序和mq之间的通讯。
MQ之间进行通讯:通过发送接收通道建立tcp连接进行消息传输,称为server对server
开发的程序和MQ之间的通讯:通过服务器连接通道进行传输,client对server。
MQ有很多有用的命令,以下是一些常用命令:
$dspmq   /*列出现有队列*/
$strmqm  TEST  /*启动队列管理器*/
$runmqsc TEST  /*定义管理器资源*/
end             /*退出*/
$runmqlsr -t tcp -m TEST -p 1442               /*启动侦听器*/
$endmqm TEST                         /*停止MQ服务*/
$display q(QTEST) all  /*显示队列的所有属性*/
$display q(QTEST) /*显示队列的所有属性*/
$display q(QTEST) maxdepth curdepth   /*显示队列的所选属性*/
$dis qmgr all   /*显示队列管理器的所有属性*/
MQ有很强大的命令输入帮助,当你对命令不熟悉或是不确定时,可以输入部分命令来查询;MQ还支持很多的简写,熟悉之后可以很大程度的提高效率。
二、故障是历练
MQ作为通信中间件,可能涉及不止一个平台,故障也就多种多样。无论是什么维护,学会看日志总是一个好的开始,MQ的错误日志存放在$mq/qmgrs/$qm_name/errors下,日志是轮流写入的,要注意看对日志。mq的日志比较详尽,具体怎么看我就不累述了。下面列举几个常见问题的恢复方法:
1、无法将消息数据放到队列中
一般这种情况应该大部分是远程队列中的传输队列那个参数配置的不正确,还有可能是队列的允许放入这个参数设置成了禁止或是队列堵塞了。
a、检查队列属性的CURDEPTH达到MAXDEPTH值,如果CURDEPTH达到MAXDEPTH,表明队列深度已经达到最大值,这样就导致新的消息数据无法放入。
$display queue(q_name)maxdepth curdepth
b、检查队列属性PUT是否为ENABLED,如果不是则说明队列不允许放入消息,可以用下面命令修改
$alter qlocal(q_name) get (ENABLED)
c、检查队列属性MAXMSGL的值(默认4M),如果准备放入消息的大小大于队列这个值,则需要修改队列的MAXMSGL属性值,并将该值相应扩大。
注意:修改该属性值时也要同时修改远端对应的队列的值以及对应的通道的值,否则即便是消息能放入该对列,也无法传输到远端对应的队列中。
 
2、发送通道和接收通道的状态不是running
a、首先检查网络是否正常
我们可以执行mq中的一个命令来查看通道是不是正常
runmqsc QM1
ping chl(QM1.QM2)
ping操作来查看两边的通道是不是正常,如果正常会返回ping完成。
b、停止通道,然后复位两端通道 RESET CHANNEL(channel_name) [ SEQNUM( 1 | integer) ]。复位完成后,启动通道。
c、如果还是不行,可以执行RESOLVE CHANNEL(channel_name) ACTION (BACKOUT)进行回退,ACTION有两个参数 BACKOUT和Commit,BACKOUT 将把可疑消息恢复到传输队列,而Commit将丢弃可疑消息。通常选择使用BACKOUT。

3、MQ异常终止产生残留的信号灯和共享内存处理方法。
a、MQ异常停止会产生残留的信号灯和共享内存,导致MQ无法正常启动和开启队列管理器。
$dspmq
QMNAME(TEST)     STATUS(Quiescing)
$strmqm TEST
WebSphere MQ queue manager 'TEST' ending.
b、可以执行$ipcs -a | grep mq列出相应的信号灯和内存
如果有,使用ipcrm命令清除:
ipcrm -s <semphore id>
ipcrm -m <shared memory id >
c、再次启动MQ队列管理器即可正常。
 

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

2

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广