迁移 WebSphere MQ 队列管理器的一些办法

迁移 WebSphere MQ 队列管理器的一些办法

MQ 队列管理器迁移概述

通常来说,有两种方式可以对 MQ 队列管理器进行迁移。一种是基于相同平台的文件复制(或者称为克隆),另一种是使用 MQ 提供的命令行。两种方式各有优缺点。

文件复制方式,它的好处是快速,可以批量。但缺点是只支持同种类型的操作系统间的复制,无法实现跨平台复制,并且在目标队列管理器上要使用相同的用户名。比如,在 Linux 上复制的队列管理器对象无法还原到 Windows 的 队列管理器上,在 32 位队列管理器对象无法在 64 位的队列管理器上使用。简单来说,源系统和目标系统必须是完全一样的两台机器。这样的迁移更像是克隆出一个新的 MQ 队列管理器,除了队列管理器对象定义被克隆之外(其中包括队列,通道,监听器等),队列管理器本身的属性值也会被克隆,同时持久化队列的消息也会被克隆。

MQ 命令行方式 使用 MQ 命令进行队列管理器对象复制或备份,不同的 MQ 版本提供不同的命令。 在 MQ v6 和 MQ v7.0 版本下,需要预先安装 MS03 SupportPac,安装后使用 saveqmgr命令。在 MQ v7.1 和 MQ v7.5 中,使用 MQ 内置的 dmpmqcfg命令,它替代了 MS03 SupportPac,无需额外安装。使用基于 MQ 命令行提供的对象复制好处有很多:

第一,它可以支持跨平台对象导入和导出。比如,在 Windows 上导出的队列管理器对象可以很方便的在 Linux/Unix 上导入。

第二,方便问题重现。导出的文件包含对象列表和权限列表,前者可以直接做为 runmqsc命令的输入参数,后者可以做为脚本直接运行,这大大方便了 IBM 技术支持工程师在实验室重现客户环境,快速解决问题。

第三,可用于本地队列管理器重建。即使不用于远程恢复,导出的对象列表也可以在本地重建 (re-play)。这种情况适用于多版本 MQ 安装时的情况。用户可从某一个版本的队列管理器中将对象导出,在另一个版本的队列管理器中重建相同的对象列表。

相比文件复制法,使用命令需注意如下几点:

第一,在不同平台间复制队列管理器对象时,尽管绝大多数的队列管理器对象并没有平台特定的信息,但个别参数仍然需要经过修改(比如队列管理器的 SSLKEYR 属性,指定了本地的 SSL/TLS 存储库的路径)。在还原到目标队列管理器前,最好仔细检查所有对象定义命令,确保无误。

第二,队列中的消息无法复制。无论是持久化队列或者非持久化队列,其中的消息均无法得到复制。

使用文件复制方式建立队列管理器对象

如前所述,使用文件复制方式需要保证源队列管理器和目标队列管理器使用同一种架构平台。 需要复制的文件和目录包括队列管理器配置文件 mqs.ini, 队列管理器日志文件和队列管理器数据目录。需要注意的是,复制时需最好停止队列管理器,以确保新旧队列管理器的队列中的消息保持一致。

以下是使用文件复制方式建立队列管理器对象的步骤:

在 Linux 平台创建队列管理器 test.queue.manager, 导入测试对象后将队列管理器停止,将其日志文件和数据文件打包,连同 MQ 配置文件 mqs.ini 复制到目标机器部署,完成复制过程。

源队列管理器端 (Linux)

清单 1.创建测试队列管理器并导入测试对象

-bash-4.1$ crtmqm test.queue.manager

-bash-4.1$ strmqm test.queue.manager

-bash-4.1$ runmqsc test.queue.manager < objects.tst

清单 2.备份队列管理器日志,数据文件和配置文件

-bash-4.1$ endmqm -i test.queue.manager

-bash-4.1$ cd /tmp

-bash-4.1$ tar -cvf test.queue.manager.log.tar /var/mqm/log/test!queue!manager/

-bash-4.1$ tar -cvf test.queue.manager.data.tar /var/mqm/qmgrs/test!queue!manager/

-bash-4.1$ cp /var/mqm/mqs.ini /tmp

目标队列管理器端 (Linux)

清单 3.解压队列管理器数据文件和日志文件

-bash-4.1$ crtmqm test.queue.manager

-bash-4.1$ cp /tmp/mqs.ini /var/mqm/

-bash-4.1$ tar -xvf test.queue.manager.log.tar -C /var/mqm/log

-bash-4.1$ tar -xvf test.queue.manager.data.tar -C /var/mqm/qmgrs

手工查看 /var/mqm/mqs.ini文件和 /tmp/mqs.ini文件,将新队列管理器信息加入到 QueueManager 配置项下:

QueueManager:

Name=test.queue.manager

Prefix=/var/mqm

Directory=test!queue!manager

InstallationName=Installation1

清单 4.检查队列管理器配置信息和对象是否存在

-bash-4.1$ strmqm test.queue.manager

-bash-4.1$ runmqsc test.queue.manager

dis qlocal(*)

队列管理器恢复成功。

值得一提的是,持久化队列的消息在队列管理器停止时是可以保存的,因此消息也可以一起被复制到新的队列管理器的队列上。如果是非持久化队列(默认情况),队列管理器停止时消息不会被保存,因此也不会被克隆。如果希望队列管理器中的消息随着队列管理器一起被克隆,则需要将队列属性 defpsist 更改为 YES,请参考附录 1:”持久化信息存储”文章。

另外,在目标系统中,如果新系统的 MQ 是新安装的,则可以直接将源系统的 mqs.ini 文件复制替换旧的文件。如果新系统中已经存在任何队列管理器,在克隆时要谨慎,需要按照目标队列管理器中第四步手工将复制的队列管理器信息添加到目标队列管理器中,不能直接覆盖,否则会导致其他队列管理器无法启动的问题。在这种情况下,另一个推荐做法是使用命令法导入队列管理器的对象。

使用 saveqmgr 命令保存队列管理器对象

如前所述,MQ 6.0 和 7.0 版本提供了 SupportPac MS03,安装后可以使用 saveqmgr命令来保存队列管理器对象的属性。对于 MQ 7.1 和 7.5, 请使用 dmpmqcfg命令,这在下面的章节有介绍。关于 MS03 的下载地址,请参考附录 2。以下介绍一个例子,使用 saveqmgr命令将 Linux 端的源队列管理器中的对象导出,在 Windows 的目标队列管理器中导入。

源队列管理器端 (Linux)

假设将下载好的 SupportPac MS03 放在源队列管理器的 /tmp 目录下,安装 SupportPac MS03

清单 5.解压缩安装 SupportPac MS03

-bash-4.1$ cd /tmp

-bash-4.1$ tar -zxvf ms03_unix.tar.Z

清单 6.saveqmgr 命令导出队列管理器对象定义

-bash-4.1$ crtmqm mq701.queue.manager

-bash-4.1$ strmqm mq701.queue.manager

-bash-4.1$ runmqsc mq701.queue.manager < objects.tst

-bash-4.1$ ./saveqmgr.linux –localQMgr mq701.queue.manager

– outputFile /tmp/mq701.queue.manager.mqsc –saveSecurity /tmp/mq701.queue.manager.bat

输出:

Compiled for Websphere MQ V7.0.1.0 on Oct  9 2011

SAVEQMGR V6.1.4.0

Requesting attributes of the queue manager…

Writing Queue Manager definition to /tmp/mq701.queue.manager.mqsc.

Generating attributes for Websphere MQ Release 7.0.1

Generating code for platform UNIX

Requesting attributes of all authinfo objects…

Requesting attributes of all queues…

Requesting attributes of all channels…

Requesting attributes of all processes…

Requesting attributes of all namelists…

Requesting attributes of all listeners…

Requesting attributes of all services…

Requesting attributes of all OAM classes…

Requesting attributes of all topics…

Requesting attributes of all subscriptions…

Writing AuthInfo definitions to /tmp/mq701.queue.manager.mqsc.

Writing Queue definitions to /tmp/mq701.queue.manager.mqsc.

Skipping dynamic queue SAVEQMGR.51B468B120033602

Writing Channel definitions to /tmp/mq701.queue.manager.mqsc.

Writing Process definitions to /tmp/mq701.queue.manager.mqsc.

Writing Namelist definitions to /tmp/mq701.queue.manager.mqsc.

Writing Listener definitions to /tmp/mq701.queue.manager.mqsc.

Writing Service definitions to /tmp/mq701.queue.manager.mqsc.

Writing OAM definitions to /tmp/mq701.queue.manager.aut.

Writing Topic definitions to /tmp/mq701.queue.manager.mqsc.

Writing Subscription definitions to /tmp/mq701.queue.manager.mqsc.

命令选项含义:

–localQmgr:连接的本地队列管理器名称

–outputFile:生成的包含队列管理器对象定义的文件名

–saveSecurity:生成的包含队列管理器对象安全定义的脚本

注意:

在 Linux/Unix 上,请使用具有 MQ 管理员权限用户(默认为 mqm)执行 saveqmgr命令, 并保证用户对 ms03 目录具有相应的读写权限,必要时需使用 chmod命令赋予相应读写权限

队列管理器必须在运行状态下

使用 –saveSecurity参数可以将队列管理器的每个对象的权限属性一起导出来,它们是 setmqaut命令集,可以直接运行在目标机 MQ 命令行

64 位的队列管理器下请使用 saveqmgr64.linux

关于 saveqmgr命令的详细用法,请参考 readme 文件或使用 -h 参数以获得帮助。

目标队列管理器端 (Windows)

将生成的对象定义文件和权限定义文件复制到目标 MQ 队列管理器端。

打开 Windows 命令提示符,输入以下命令执行:

清单 7.目标端导入对象定义

1 runmqsc mq701.queue.manager < mq701.queue.manager.mqsc

打开 Windows 命令提示符,执行:

mq701.queue.manager.bat

-bash-4.1$ runmqsc test.queue.manager

dis qlocal(*)

使用与清单 4 相同的方式检查对象是否导入成功。

注意事项:

目标队列管理器端需要手工创建同名的队列管理器,并处在运行状态。

本例的导出端和导入端在不同平台,建议导入前打开生成的对象定义文件,逐一检查每条命令中是否含有路径的属性,避免一些带有 Linux 的路径的属性在 Windows 上无法识别而出错。

本例在测试中发现,在 Linux 下生成的对象权限脚本的对象名 (-n) 后默认带有单引号。这有可能会造成在 Windows 导入时找不到对象名称。此时简单的方法就是去掉单引号即可。比如:将如下命令:

清单 8.示例 setmqaut 命令

setmqaut -m mq701.queue.manager -n ‘GSYHQ1’ -t queue -g mqm

+browse +chg +clr +dlt +dsp +get +inq +put +passall +passid +set +setall +setid

修改为:

清单 9.修改后的 setmqaut 命令

setmqaut -m mq701.queue.manager -n GSYHQ1 -t queue -g mqm

+browse +chg +clr +dlt +dsp +get +inq +put +passall +passid +set +setall +setid

使用 dmpmqcfg 命令保存队列管理器对象

在 MQ 7.1 和 MQ 7.5 版本中,使用 MQ 内置的 dmpmqcfg命令来导出队列管理器的对象定义,它是 saveqmgr命令的替换版本。它不用额外安装,MQ 安装完成后即可使用。以下使用一个简单的例子描述使用 saveqmgr命令在源队列管理器端生成对象定义文件和权限信息文件,然后在目标队列管理器中导入对象定义文件和权限信息文件,完成队列管理器的复制。

源队列管理器端 (Linux)

清单 10.dmpmqcfg 导出队列管理器对象定义

-bash-4.1$ dmpmqcfg -m test.queue.manager -a > test.queue.manager.dump

清单 11.dmpmqcfg 导出队列管理器对象权限定义

-bash-4.1$ dmpmqcfg -m test.queue.manager -o setmqaut > test.queue.manager.aut

目标队列管理器端 (Linux)

将生成的 .dump 文件和 .auth 文件复制到目标机器,更改文件的属主和执行权限,确保文件在目标机上可以执行,使用 MQ 管理员用户 (mqm) 建立并启动新的同名队列管理器,使用 runmqsc命令导入对象,并执行赋予权限,此处步骤和清单 7 和清单 8 相同,不再赘述。然后使用和清单 4 相同的方式检查对象和权限是否正确导入。

总结

本文介绍了使用文件复制和 MQ 命令行方式复制队列管理器对象的技术,这两种方法分别有适用的场景。使用 MQ 命令行方法,如果一旦出现问题,IBM 技术支持部门会更方便的重现和定位迁移过程中出现的问题,有利于问题的快速定位和解决,希望本文能够对迁移 MQ 队列管理器感兴趣的读者起到一些帮助作用。

以下文章点击率最高

Loading…

发表评论