遷移 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…