DB2 + IBM MQ; enable_MQFunctions =错误-连接数据库时 [英] DB2+IBM MQ; enable_MQFunctions = Error -- while connecting to database

查看:119
本文介绍了DB2 + IBM MQ; enable_MQFunctions =错误-连接数据库时的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我构建包含IBM MQ 9.1,DB2express-c 9.7 + ubuntu 16.04 64bit的docker映像。

我想在我的Db2数据库上启用MQ函数(将msg发送到队列中)。

但是当我使用 enable_MQFunctions 时,我得到了以下错误:

I build docker's image containing IBM MQ 9.1, DB2express-c 9.7 + ubuntu 16.04 64bit.
I want to enable MQ functions(sending msg to queue) on my Db2 database.
But when I used enable_MQFunctions than I got this error:

 *** Error -- while connecting to TEST  
      Make sure that user(db2inst1) and password(pass) are valid and that the DB2 instance has started.  
 *** enable_MQFunction finished with error  

数据库,用户,传递都是正确的。而且我不比以前更不了解此命令,而没有连接到数据库的问题

Database, user, pass are all okey. And i Don't understand than before this command w/o problems connected to my database

我今天使用的Dockerfile(仅具有DB2和IBM MQ,而没有IIB) :

Dockerfile I today used(with only DB2 and IBM MQ, w/o IIB):

# © Copyright IBM Corporation 2015, 2017
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#==============================





#========================
#FROM centos:7
FROM ubuntu:16.04
#FROM ubuntu:17.10


#LABEL maintainer "Arthur Barr <arthur.barr@uk.ibm.com>, Rob Parker <PARROBE@uk.ibm.com>"

#LABEL "ProductID"="98102d16795c4263ad9ca075190a2d4d" \
#      "ProductName"="IBM MQ Advanced for Developers" \
 #     "ProductVersion"="9.0.4"

# The URL to download the MQ installer from in tar.gz format
#oryginal ARG MQ_URL=https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev904_ubuntu_x86-64.tar.gz
ARG MQ_URL=http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev910_ubuntu_x86-64.tar.gz
#ARG MQ_URL=http://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/messaging/mqadv/mqadv_dev80_linux_x86-64.tar.gz
#ARG MQ_URL=\\172.29.5.249\mqadv_dev910_ubuntu_x86-64.tar.gz

# The MQ packages to install
ARG MQ_PACKAGES="ibmmq-server ibmmq-java ibmmq-jre ibmmq-gskit ibmmq-web ibmmq-msg-.*"

#RUN rm /var/lib/apt/lists/*

RUN apt-get clean -y 
RUN apt-get autoclean -y 

RUN export DEBIAN_FRONTEND=noninteractive \
  # Install additional packages required by MQ, this install process and the runtime scripts  
  && apt-get update -y \
  && apt-get install -y --no-install-recommends \
  # && yum update -y \
 #  && yum install -y \
    bash \
    bc \
    ca-certificates \
    coreutils \
    curl \
    debianutils \
    file \
    findutils \
    gawk \
    grep \
    libc-bin \
    lsb-release \
    mount \
    passwd \
    procps \
    sed \
    tar \
    util-linux \
  # Download and extract the MQ installation files
  && export DIR_EXTRACT=/tmp/mq \
  && mkdir -p ${DIR_EXTRACT} \
  && cd ${DIR_EXTRACT} \
  && curl -LO $MQ_URL \
  && tar -zxvf ./*.tar.gz \
  # Recommended: Remove packages only needed by this script
#
  #&& package-cleanup --leaves --all \ <-------moje dodanie
  # Recommended: Create the mqm user ID with a fixed UID and group, so that the file permissions work between different images
  && groupadd --system --gid 990 mqm \
  && useradd --system --uid 990 --gid mqm mqm \
  && usermod -G mqm root \
  # Find directory containing .deb files
  && export DIR_DEB=$(find ${DIR_EXTRACT} -name "*.deb" -printf "%h\n" | sort -u | head -1) \
  # Find location of mqlicense.sh
  && export MQLICENSE=$(find ${DIR_EXTRACT} -name "mqlicense.sh") \
  # Accept the MQ license
  && ${MQLICENSE} -text_only -accept \
  && echo "deb [trusted=yes] file:${DIR_DEB} ./" > /etc/apt/sources.list.d/IBM_MQ.list \
  # Install MQ using the DEB packages
  && apt-get update \
  && apt-get install -y $MQ_PACKAGES \
  # Remove 32-bit libraries from 64-bit container
  && find /opt/mqm /var/mqm -type f -exec file {} \; \
    | awk -F: '/ELF 32-bit/{print $1}' | xargs --no-run-if-empty rm -f \
  # Remove tar.gz files unpacked by RPM postinst scripts
  && find /opt/mqm -name '*.tar.gz' -delete \
  # Recommended: Set the default MQ installation (makes the MQ commands available on the PATH)
  && /opt/mqm/bin/setmqinst -p /opt/mqm -i \
  # Clean up all the downloaded files
  && rm -f /etc/apt/sources.list.d/IBM_MQ.list \
  && rm -rf ${DIR_EXTRACT} \
  # Apply any bug fixes not included in base Ubuntu or MQ image.
  # Don't upgrade everything based on Docker best practices https://docs.docker.com/engine/userguide/eng-image/dockerfile_best-practices/#run
  && apt-get upgrade -y sensible-utils \
  # End of bug fixes
  && rm -rf /var/lib/apt/lists/* \
  # Optional: Update the command prompt with the MQ version
  && echo "mq:$(dspmqver -b -f 2)" > /etc/debian_chroot \
  && rm -rf /var/mqm \
  # Optional: Set these values for the Bluemix Vulnerability Report
  && sed -i 's/PASS_MAX_DAYS\t99999/PASS_MAX_DAYS\t90/' /etc/login.defs \
  && sed -i 's/PASS_MIN_DAYS\t0/PASS_MIN_DAYS\t1/' /etc/login.defs \
  && sed -i 's/password\t\[success=1 default=ignore\]\tpam_unix\.so obscure sha512/password\t[success=1 default=ignore]\tpam_unix.so obscure sha512 minlen=8/' /etc/pam.d/common-password

#==========db2 expres START====
#FROM centos:7

#MAINTAINER Leo Wu <leow@ca.ibm.com>

###############################################################
#
#               System preparation for DB2
#
###############################################################
#********************z iib-mq-db2 git
RUN dpkg --add-architecture i386
RUN export DEBIAN_FRONTEND=noninteractive \
 && apt-get update && \
    apt-get install -y --no-install-recommends \
    curl \
    bash \
    bc \
    coreutils \
    curl \
    debianutils \
    findutils \
    gawk \
    grep \
    libc-bin \
    lsb-release \
    libncurses-dev \
    libstdc++6 \
    gcc \
    binutils \
    make \
    libpam0g:i386 \
    lib32stdc++6 \
    lib32gcc1 \
    libcurl4-gnutls-dev:i386 \
    numactl \
    libaio1 \
    libxml2 \
    mount \
    passwd \
    procps \
    rpm \
    sed \
    tar \
    wget \
    util-linux 

RUN rm -rf /var/lib/apt/lists/*

RUN apt-get dist-upgrade -y
#******************

RUN groupadd db2iadm1 && useradd -G db2iadm1 db2inst1

# Required packages

#RUN yum install -y \
#    vi \
#    sudo \
#    passwd \
#    pam \
#    pam.i686 \
#    ncurses-libs.i686 \
#    file \
#    libaio \
#    libstdc++-devel.i686 \
#    numactl-libs \
#    which \
#    && yum clean all

ENV DB2EXPRESSC_DATADIR /home/db2inst1/data

# IMPORTANT Note:
#  Due to compliance for IBM product, you have to host a downloaded DB2 Express-C Zip file yourself
#  Here are suggested steps:
#    1) Please download zip file of db2 express-c from http://www-01.ibm.com/software/data/db2/express-c/download.html
#    2) Then upload it to a cloud storage like AWS S3 or IBM SoftLayer Object Storage
#    3) Acquire a URL and SHA-256 hash of file and pass it via Docker's build time argument facility

ARG DB2EXPRESSC_URL=ftp://ftp.software.ibm.com/software/data/db2/express/db2exc_images/db2exc_970_LNX_x86_64.tar.gz

#ARG DB2EXPRESSC_URL=http://lorenzana.gt/uploads/files/v10.5fp1_linuxx64_expc.tar.gz
#ARG DB2EXPRESSC_URL=\\172.29.5.249\public\image\v10.5fp1_linuxx64_expc.tar.gz


ADD db2expc.rsp /tmp/db2expc.rsp
ADD db2rfe.cfg /home/db2inst1/sqllib/instance/db2rfe.cfg

COPY db2expc.rsp /tmp
RUN curl -fkSLo /tmp/expc.tar.gz $DB2EXPRESSC_URL
RUN cd /tmp && tar xf expc.tar.gz

RUN rm -rf /home/db2inst1/sqllib
RUN mkdir /home/db2inst1/sqllib
RUN su - root -c "chmod -R 1777 /home/db2inst1/"

 RUN su - db2inst1 -c "/tmp/expc/db2_install -f sysreq -b /home/db2inst1/sqllib"
# RUN su - db2inst1 -c "/tmp/expc/db2setup -r /tmp/db2expc.rsp" || echo "db2setup failed"

 RUN echo '. /home/db2inst1/sqllib/db2profile' >> /home/db2inst1/.bash_profile \
    && rm -rf /tmp/db2* && rm -rf /tmp/expc* \
    && sed -ri  's/(ENABLE_OS_AUTHENTICATION=).*/\1YES/g' /home/db2inst1/sqllib/instance/db2rfe.cfg \
    && sed -ri  's/(RESERVE_REMOTE_CONNECTION=).*/\1YES/g' /home/db2inst1/sqllib/instance/db2rfe.cfg \
    && sed -ri 's/^\*(SVCENAME=db2c_db2inst1)/\1/g' /home/db2inst1/sqllib/instance/db2rfe.cfg \
    && sed -ri 's/^\*(SVCEPORT)=48000/\1=50000/g' /home/db2inst1/sqllib/instance/db2rfe.cfg \
    && mkdir $DB2EXPRESSC_DATADIR && chown db2inst1.db2iadm1 $DB2EXPRESSC_DATADIR

RUN su - db2inst1 -c "db2start && db2set DB2COMM=TCPIP && db2 UPDATE DBM CFG USING DFTDBPATH $DB2EXPRESSC_DATADIR IMMEDIATE && db2 create database db2inst1" \
    && su - db2inst1 -c "db2stop force" \
    && cd /home/db2inst1/sqllib/instance \
&& ./db2rfe -f ./db2rfe.cfg


#COPY docker-entrypoint.sh /entrypoint.sh
#ENTRYPOINT ["/entrypoint.sh"]

#VOLUME $DB2EXPRESSC_DATADIR

#EXPOSE 50000

#=========db2 express END ====


COPY *.sh /usr/local/bin/
COPY *.mqsc /etc/mqm/
COPY admin.json /etc/mqm/

COPY mq-dev-config /etc/mqm/mq-dev-config

RUN chmod +x /usr/local/bin/*.sh

# Always use port 1414 (the Docker administrator can re-map ports at runtime)
# Expose port 9443 for the web console
#VOLUME /home/db2inst1/data

EXPOSE 1414 9443 50000

ENV LANG=en_US.UTF-8
COPY docker-entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
#ENTRYPOINT ["mq.sh"]

entrypoint.sh(带有MQ和DB2命令):

entrypoint.sh (with MQ and DB2 commands):

#======= start MQ =====
set -e
mq-license-check.sh
echo "----------------------------------------"
source mq-parameter-check.sh
echo "----------------------------------------"
setup-var-mqm.sh
echo "----------------------------------------"
which strmqweb && source setup-mqm-web.sh
echo "----------------------------------------"
mq-pre-create-setup.sh
echo "----------------------------------------"
source mq-create-qmgr.sh
echo "----------------------------------------"
source mq-start-qmgr.sh
echo "----------------------------------------"
source mq-dev-config.sh
echo "----------------------------------------"
source mq-configure-qmgr.sh
echo "----------------------------------------"
exec mq-monitor-qmgr.sh ${MQ_QMGR_NAME}
#======== z MQ - END ====== 
pid=0

function log_info {
 echo -e $(date '+%Y-%m-%d %T')"\e[1;32m $@\e[0m"
}
function log_error {
 echo -e >&2 $(date +"%Y-%m-%d %T")"\e[1;31m $@\e[0m"
}

function stop_db2 {
  log_info "stopping database engine"
  su - db2inst1 -c "db2stop force"
}

function start_db2 {
  log_info "starting database engine"
  su - db2inst1 -c "db2start"
}

function restart_db2 {
  # if you just need to restart db2 and not to kill this container
  # use docker kill -s USR1 <container name>
  kill ${spid}
  log_info "Asked for instance restart doing it..."
  stop_db2
  start_db2
  log_info "database instance restarted on request"
}

function terminate_db2 {
  kill ${spid}
  stop_db2
  if [ $pid -ne 0 ]; then
    kill -SIGTERM "$pid"
    wait "$pid"
  fi
  log_info "database engine stopped"
  exit 0 # finally exit main handler script
}

trap "terminate_db2"  SIGTERM
trap "restart_db2"   SIGUSR1

if [ ! -f ~/db2inst1_pw_set ]; then
  if [ -z "$DB2INST1_PASSWORD" ]; then
    log_error "error: DB2INST1_PASSWORD not set"
    log_error "Did you forget to add -e DB2INST1_PASSWORD=... ?"
    exit 1
  else
    log_info "Setting db2inst1 user password..."
    (echo "$DB2INST1_PASSWORD"; echo "$DB2INST1_PASSWORD") | passwd db2inst1 > /dev/null  2>&1
    if [ $? != 0 ];then
      log_error "Changing password for db2inst1 failed"
      exit 1
    fi
    touch ~/db2inst1_pw_set
  fi
fi
if [ ! -f ~/db2_license_accepted ];then
  if [ -z "$LICENSE" ];then
     log_error "error: LICENSE not set"
     log_error "Did you forget to add '-e LICENSE=accept' ?"
     exit 1
  fi

  if [ "${LICENSE}" != "accept" ];then
     log_error "error: LICENSE not set to 'accept'"
     log_error "Please set '-e LICENSE=accept' to accept License before use the DB2 software contained in this image."
     exit 1
  fi
  touch ~/db2_license_accepted
fi

if [[ $1 = "-d" ]]; then
  log_info "Initializing container"
  start_db2
  log_info "Database db2diag log following"
  tail -f ~db2inst1/sqllib/db2dump/db2diag.log &
  export pid=${!}
  while true
  do
    sleep 10000 &
    export spid=${!}
    wait $spid
  done
else
  exec "$1"
fi

并且比:

docker run -e LICENSE=accept  -e MQ_QMGR_NAME=MQ321 -e DB2INST1_PASSWORD=pass -p 41419:1414 -p 9459:9443 -p 5015:50000 allall4r

毕竟,我使用的命令来自:这里
所以我执行了:

root:

And after all, I used command from : HERE So I executed:
root:

  usermod -G mqm db2inst1
  /opt/mqm/bin/setmqinst -i -n Installation1 -p /opt/mqm  

mqm用户:

PATH=$PATH:/opt/mqm/bin

db2inst1用户

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/mqm/lib64
AMT_DATA_PATH=/opt/mqm

db2start
db2 create db testdb
db2 connect to testdb

cd ~/sqllib/cfg/mq
db2 –tvf amtsetup.sql

此处包含构建此映像所需的所有文件的上传:上传链接

映像大约为3.1GB

Upload with all files needed to build this image are here: UPLOAD LINK
Image will be about 3.1GB

推荐答案

我怀疑您出现此症状的原因是指定的帐户 enable_MQFunctions 命令行当时没有 试图运行的密码。您可以通过查看 db2diag.log 来查看确切的身份验证失败消息,和/或通过查看 / etc / passwd 来证明这一点。在您运行 enable_MQFunctions 之前,该帐户的code>条目。

I suspect that the cause of your symptom is that the account specified for enable_MQFunctions command line does not have a password at the time that enable_MQFunctions tries to run. You can prove this by looking at db2diag.log to see the exact authentication failure message, and/or by looking at the /etc/passwd entry for that account just before you run enable_MQFunctions.

您可以展开 Dockerfile 完全在 docker构建期间配置MQ的Db2,而不是在 docker run <之后运行这些步骤或入口点。这样,您将负责Dockerfile中的所有步骤,并且在 docker run 命令后无需手动干预即可重复执行。这也意味着您将使用所有必需的配置来预烘焙构建的映像,然后将其持久化。您需要具有足够的Dockerfile脚本编写能力,才能获得理想的结果。

You can expand the Dockerfile to configure the Db2 for MQ entirely during the docker build instead of running those steps after docker run or in entrypoints. That way you are responsible for all the steps inside the Dockerfile and it will be repeatable without manual intervention after the docker run command. It also means that your built image is pre-baked with all of the required configuration which will then be persistent. You need to have enough competence with scripting in the Dockerfile to get the desired outcome.

正确完成后,enable_MQFunctions将在 docker build 期间正常运行,因此,如果遇到错误,是因为您

When correctly done, the enable_MQFunctions will operate properly during docker build, so if you are getting errors it's because you are doing it incorrectly.

我可以成功配置数据库并在Dockerfile内全部运行 enable_MQFunctions ,这些步骤下面的内容(因为使用了非root用户安装的Db2),因此所有配置都已在生成的映像中。

I can successfully configure the database and run enable_MQFunctions all inside the Dockerfile, with these steps below (because of using a non-root install of Db2), so all the configuration is already in the built image.


  • 在安装Db2之后且在db2start之前,Dockerfile应该
    创建 / home / db2inst1 / sqllib / userprofile (只要实例所有者在 .bash_profile db2profile 中点入点,它将运行$ c>或 .profile ),以执行以下步骤:

  • after installing Db2 and before db2start the Dockerfile should create /home/db2inst1/sqllib/userprofile (which will run whenever the instance-owner accounts dots in its db2profile from .bash_profile or .profile), to do these steps:

-附加 / opt / mqm / lib64 LD_LIBRARY_PATH

-导出AMT_DATA_PATH = / opt / mqm

-前置 / opt / mqm / bin PATH

chown db2inst1:db2iadm1 / home / db2inst1 / sqllib / userprofile

在安装Db2之后且在 db2start 之前, Dockerfile应该运行以下步骤:

after installing Db2 and before db2start, the Dockerfile should run these steps:

- db2set DB2COMM = TCPIP

- db2set DB2ENVLIST = AMT_DATA_PATH

- db2 -v使用联合的yes立即更新dbm cfg

设置密码Dockerfile中db2inst1帐户的单词

set a password for db2inst1 account in the Dockerfile

然后Dockerfile可以运行 db2start ,创建数据库(称它为样本,您可以随意命名)并以db2inst1用户身份运行以下片段,以首先在MQ函数使用的数据库中创建所需的对象:

the Dockerfile can then run db2start, create the database ( i call it sample, you can call it whatever you like) and run the fragment below as user db2inst1 to first create the required objects in the database used by the MQ functions:

su -db2inst1 -c(db2 -v连接到样本; \
db2 -tvf /home/db2inst1/sqllib/cfg/mq/amtsetup.sql; \
db2 -v模式DB2MQ的列表表; \
出口0)

请注意,您必须运行 amtsetup.sql 显式退出0,因为 amtsetup.sql 即使成功完成也总是返回非零的退出代码。 docker build 在这种情况下继续。

Notice that you have to run amtsetup.sql in a subshell ,as shown, to explicitly exit 0, because amtsetup.sql always returns non-zero exit code even when it completes successfully. So you want the docker build to continue in that case.

如果以上所有步骤均已成功完成并且MQ已成功安装,稍后在 Dockerfile 中,可以运行 enable_MQFunctions 如下:

If all the above steps completed successfully and MQ is already successfully installed, later in the Dockerfile you can run the enable_MQFunctions as follows:

我使用ARG INSTANCE_PASSWORD指定db2inst1密码,该密码可以来自外部。

su-db2inst1 -c(。./.profile; \
db2start; \
db2 -v激活数据库样本; \
cd / home / db2inst1 / sqllib / cfg; \
/ home / db2inst1 / sqllib / bin / enable_MQFunctions -echo -force -n sample -u db2i nst1 -p $ INSTANCE_PASSWORD; b
db2stop力; \
出口0)

这篇关于DB2 + IBM MQ; enable_MQFunctions =错误-连接数据库时的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆