#!/bin/sh set -e DM_PATH=/home/dmdba/dmdbms DM_DATA_DIR=/home/dmdba/data/DAMENG INIT_SQL=/home/dmdba/initdata/init-qmodel.sql FIRST_RUN_FLAG=/var/run/qmodel_init.done PORT=${PORT_NUM:-5236} # ---------- 检查是否已经初始化 ---------- check_is_init() { if [ -d "${DM_DATA_DIR}" ]; then DATABASE_ALREADY_EXISTS=true fi } # ---------- 初始化数据库 ---------- db_init() { echo "[dm8] init db ..." mkdir -p "${DM_DATA_DIR}" chown -R dmdba "${DM_DATA_DIR}" cd "${DM_PATH}/bin" # 初始化参数,参考你原来的需求 INIT_ARGS="PATH=/home/dmdba/data DB_NAME=DAMENG PORT_NUM=${PORT} PAGE_SIZE=16 CHARSET=1 LENGTH_IN_CHAR=1 CASE_SENSITIVE=${CASE_SENSITIVE:-0}" if [ -n "${SYSDBA_PWD}" ]; then INIT_ARGS="${INIT_ARGS} SYSDBA_PWD=${SYSDBA_PWD}" fi if [ -n "${SYSAUDITOR_PWD}" ]; then INIT_ARGS="${INIT_ARGS} SYSAUDITOR_PWD=${SYSAUDITOR_PWD}" fi echo "[dm8] dminit ${INIT_ARGS}" gosu dmdba "${DM_PATH}/bin/dminit" ${INIT_ARGS} echo "[dm8] db init done." } # ---------- 等待 dmserver TCP 端口可用(参考老版本逻辑) ---------- wait_dm_ready() { echo "[dm8] wait dmserver tcp on 127.0.0.1:${PORT} ..." i=0 max=6000 # 最多等 6000 秒 while [ $i -lt $max ]; do # 使用 /dev/tcp 检测端口是否可连 if (echo >"/dev/tcp/127.0.0.1/${PORT}") >/dev/null 2>&1; then echo "[dm8] dmserver tcp ready." return 0 fi i=`expr $i + 1` sleep 1 done echo "[dm8] WARN: dmserver tcp not ready after ${max}s, continue anyway." return 1 } # ---------- 首次启动时导入 init-qmodel.sql ---------- run_init_sql_once() { # 已经执行过了就直接跳过 if [ -f "${FIRST_RUN_FLAG}" ]; then echo "[dm8] qModel init already done, skip." return 0 fi # 没有 SQL 文件就不导入,避免每次都尝试 if [ ! -f "${INIT_SQL}" ]; then echo "[dm8] ${INIT_SQL} not found, skip qModel init." mkdir -p "$(dirname "${FIRST_RUN_FLAG}")" touch "${FIRST_RUN_FLAG}" return 0 fi # 必要环境变量没配也跳过 if [ -z "${QMODEL_USER}" ] || [ -z "${QMODEL_PWD}" ] || [ -z "${SYSDBA_PWD}" ]; then echo "[dm8] QMODEL_USER / QMODEL_PWD / SYSDBA_PWD not set, skip qModel init." mkdir -p "$(dirname "${FIRST_RUN_FLAG}")" touch "${FIRST_RUN_FLAG}" return 0 fi # 仅用 TCP 端口检测等待服务就绪 wait_dm_ready echo "[dm8] start create business user and import init-qmodel.sql ..." # 为了防止“用户已存在”等导致整个容器退出,这里临时关掉 set -e set +e # 1) SYSDBA 创建业务用户并授权 gosu dmdba "${DM_PATH}/bin/disql" "SYSDBA/${SYSDBA_PWD}@127.0.0.1:${PORT}" <