我已使用以下命令删除队列管理器中集群中的所有队列
echo "ALTER QLOCAL(*) CLUSTER('') CLUSNL('')" | runmqsc ${qmgr}
。
我收到了错误
1 : ALTER QLOCAL(*) CLUSTER('') CLUSNL('')
AMQ8147: WebSphere MQ object * not found.
One MQSC command read.
No commands have a syntax error.
One valid MQSC command could not be processed.
我需要删除队列管理器中集群中的所有队列。提前致谢
答案 0 :(得分:2)
更改MQ对象时,不能使用通配符(*)。相反,您必须指定要更改的确切对象,并且该对象必须存在。这就是你的命令失败的原因(因为它正在寻找一个名为*
的对象,它不存在。
如果要更改多个对象,则必须使用支持此功能的第三方工具,或者必须以编程方式执行此操作。如果您选择以编程方式执行此操作,则您的程序必须执行以下操作
echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME>
上述命令只应显示指定群集中的队列,而-e选项意味着您不会在输出中看到1 : DISPLAY QLOCAL(*) CLUSTER(<cluster name>)
。但是,如果该命令返回任何对象,您将得到类似的输出,并且您将得到返回代码0:
5724-H72 (C) Copyright IBM Corp. 1994, 2016.
Starting MQSC for queue manager ROB.
AMQ8409: Display Queue details.
QUEUE(LOCAL) TYPE(QLOCAL)
CLUSTER(<cluster name>)
AMQ8409: Display Queue details.
QUEUE(QL) TYPE(QLOCAL)
CLUSTER(<cluster name>)
如果命令找不到任何队列但是你会看到以下错误,你会得到一个0的返回码:
5724-H72 (C) Copyright IBM Corp. 1994, 2015.
Starting MQSC for queue manager QMROB.
AMQ8147: WebSphere MQ object * not found.
One MQSC command read.
No commands have a syntax error.
One valid MQSC command could not be processed.
因此,在将队列名称重新导入runmqsc
之前,您必须获取原始队列名称
修剪输出以删除除Q名称以外的所有内容。这可以通过多种方式完成,但我个人会使用grep和sed。首先我们只想要有QUEUE
的行,所以我们使用grep除了在QUEUE之后的圆括号(及其内容)之外的所有内容。然后我们使用sed删除圆括号。你最终得到这样的东西:
grep -o -P&#34;(?&lt; = QUEUE)(。+?)&#34; | sed -e&#39; s / [(|)] // g
如果我们在上一个命令中添加它,我们得到:
echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME> | grep -o -P "(?<=QUEUE)\(.+?\)" | sed -e 's/[(|)]//g
给出了输出:
LOCAL
QL
最后,我们要将其推回runmqsc
以根据需要更改所有队列,我们可以使用xargs执行此操作。我们希望通过xargs将其推送两次,因为第一个将确保每个队列名称作为由第二个执行的单个命令执行:
xargs -n 1 | xargs -I {} echo "ALTER QUEUE({}) CLUSTER('') CLUSNL('')" | runmqsc <QM Name>
将整个事情放在一起应该会得到类似的东西:
echo "DISPLAY QLOCAL(*) CLUSTER(<cluster name>)" | runmqsc -e <QMNAME> | grep -o -P "(?<=QUEUE)\(.+?\)" | sed -e 's/[(|)]//g | xargs -n 1 | xargs -I {} echo "ALTER QUEUE({}) CLUSTER('') CLUSNL('')" | runmqsc <QM Name>
当然上面只是一个例子,说明如何在一行中完成它,但是通过shell脚本更好地做到这一点,你可以在每个步骤之间添加检查以确保你能够做到这一点。不要对你不想做的队列做些什么。
在测试时,您可以使用-v
上的runmqsc
标记,因为这将验证命令而不执行操作 - 因此您可以看到输出和runmqsc将告诉您是否存在任何问题,不要马上做。