init: 导入团队知识库内容

This commit is contained in:
yueqian-ai
2026-05-14 16:56:48 +08:00
commit acca2041f0
1681 changed files with 285734 additions and 0 deletions
@@ -0,0 +1,142 @@
#!/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}" <<EOF
create user "${QMODEL_USER}" identified by "${QMODEL_PWD}" hash with SHA512 salt;
grant "PUBLIC","SOI","DBA" to "${QMODEL_USER}";
commit;
EOF
# 2) 业务用户执行初始化脚本
gosu dmdba "${DM_PATH}/bin/disql" "${QMODEL_USER}/${QMODEL_PWD}@127.0.0.1:${PORT}" <<EOF
set define off;
set CHAR_CODE UTF8;
\`${INIT_SQL}
set define on;
EOF
# 恢复 set -e
set -e
mkdir -p "$(dirname "${FIRST_RUN_FLAG}")"
touch "${FIRST_RUN_FLAG}"
echo "[dm8] qModel init finished."
}
# ---------- 主流程 ----------
check_is_init
if [ -z "${DATABASE_ALREADY_EXISTS}" ]; then
db_init
else
echo "[dm8] db already exists, skip dminit."
fi
# 安装服务(修复你原脚本里的那一处 `DmAPService}` 的 bug
if [ ! -f "${DM_PATH}/bin/DmAPService" ]; then
"${DM_PATH}/script/root/dm_service_installer.sh" -s "${DM_PATH}/bin/DmAPService"
fi
if [ ! -f "${DM_PATH}/bin/DmServiceDMSERVER" ]; then
"${DM_PATH}/script/root/dm_service_installer.sh" -t dmserver -p "DMSERVER" -dm_ini "${DM_DATA_DIR}/dm.ini"
fi
# 启动服务
gosu dmdba "${DM_PATH}/bin/DmAPService" start
gosu dmdba "${DM_PATH}/bin/DmServiceDMSERVER" start
# 首次导入任务放到后台,不阻塞主进程
run_init_sql_once &
# 保持容器前台进程:沿用原脚本 tail 日志
exec gosu dmdba tail -f /home/dmdba/dmdbms/log/DmServiceDMSERVER.log
+157
View File
@@ -0,0 +1,157 @@
#!/bin/bash
set -e
DB_PATH=${DB_PATH:-"/home/dmdba/data"}
INSTANCE_NAME=${INSTANCE_NAME:-"DMSERVER"}
DB_NAME=${DB_NAME:-"DAMENG"}
DMDB_INSTALL_PATH=${DMDB_INSTALL_PATH:-"/home/dmdba/dmdb"}
INIT_PARAMS=""
PORT_NUM=${PORT_NUM:-"5236"}
TIME_ZONE=${TIME_ZONE:-"+08:00"}
BUFFER=${BUFFER:-"8000"}
PAGE_CHECK=${PAGE_CHECK:-"3"}
PAGE_SIZE=${PAGE_SIZE:-"8"}
LOG_SIZE=${LOG_SIZE:-"4096"}
EXTENT_SIZE=${EXTENT_SIZE:-"16"}
CHARSET=${CHARSET:-"0"}
USE_DB_NAME=${USE_DB_NAME:-"1"}
AUTO_OVERWRITE=${AUTO_OVERWRITE:-"0"}
BLANK_PAD_MODE=${BLANK_PAD_MODE:-"0"}
DPC_MODE=${DPC_MODE:-"0"}
CASE_SENSITIVE=${CASE_SENSITIVE:-"y"}
OTHER_PARAMS=${OTHER_PARAMS:-""}
SYSDBA_PWD=${SYSDBA_PWD:-""}
SYSAUDITOR_PWD=${SYSAUDITOR_PWD:-""}
# ===== 新增:一次性执行标记 & 日志路径 =====
FIRST_RUN_FLAG="/var/run/dm8_first_run.done" # 首次执行标记
INIT_LOG="/init.log" # 初始化日志文件
function init_db() {
if [ -z "$SYSDBA_PWD" ]; then
echo "SYSDBA_PWD is empty, please set it in environment variables"
exit 1
fi
if [ -z "$SYSAUDITOR_PWD" ]; then
echo "SYSAUDITOR_PWD is empty, please set it in environment variables"
exit 1
fi
# 判断DB_PATH文件夹内是否存在文件
if [ -d "$DB_PATH" ]; then
if [ "$(ls -A $DB_PATH)" ]; then
echo "DB_PATH is not empty, please check it"
exit 1
fi
else
echo "DB_PATH is not exist, create it"
mkdir -p $DB_PATH
chown -R dmdba $DB_PATH
fi
INIT_PARAMS="$INIT_PARAMS PATH=$DB_PATH SYSDBA_PWD=$SYSDBA_PWD SYSAUDITOR_PWD=$SYSAUDITOR_PWD INSTANCE_NAME=$INSTANCE_NAME"
INIT_PARAMS="$INIT_PARAMS PORT_NUM=$PORT_NUM DB_NAME=$DB_NAME TIME_ZONE=$TIME_ZONE BUFFER=$BUFFER PAGE_CHECK=$PAGE_CHECK PAGE_SIZE=$PAGE_SIZE"
INIT_PARAMS="$INIT_PARAMS LOG_SIZE=$LOG_SIZE EXTENT_SIZE=$EXTENT_SIZE CHARSET=$CHARSET USE_DB_NAME=$USE_DB_NAME"
INIT_PARAMS="$INIT_PARAMS AUTO_OVERWRITE=$AUTO_OVERWRITE BLANK_PAD_MODE=$BLANK_PAD_MODE DPC_MODE=$DPC_MODE CASE_SENSITIVE=$CASE_SENSITIVE"
INIT_PARAMS="$INIT_PARAMS $OTHER_PARAMS"
echo "Initializing database..."
echo "Initializing database with parameters:"
echo $INIT_PARAMS
sudo -u dmdba /home/dmdba/dmdb/bin/dminit $INIT_PARAMS
echo "Database initialized"
}
function start_dmap() {
echo "Starting DmAPService..."
sudo -u dmdba /home/dmdba/dmdb/bin/dmap dmap_ini=/home/dmdba/dmdb/bin/dmap.ini &
echo "DmAPService started"
}
# 创建一个函数,用来修改文件的权限
function modify_db_permissions() {
echo "Modifying $DB_PATH permissions..."
chown -R dmdba $DB_PATH
echo "$DB_PATH permissions modified"
}
function check_initialized() {
# 判断 $DB_PATH/$DB_NAME/dm.ini 是否存在
if [ -f "$DB_PATH/$DB_NAME/dm.ini" ]; then
echo "Database already initialized"
modify_db_permissions
else
echo "Database not initialized"
init_db
fi
}
# ===== 新增:等待 TCP 就绪的小函数 =====
wait_tcp_ready() {
local waited=0
local timeout=600
echo "Waiting for dmserver TCP on 127.0.0.1:${PORT_NUM} ..."
# /dev/tcp 存在即可用;若镜像不支持,可改用 nc -z
while ! (echo >"/dev/tcp/127.0.0.1/${PORT_NUM}") >/dev/null 2>&1; do
sleep 2
waited=$((waited+2))
if [ $waited -ge $timeout ]; then
echo "ERROR: TCP 127.0.0.1:${PORT_NUM} not ready in ${timeout}s"
return 1
fi
done
echo "TCP ready."
return 0
}
# ===== 新增:首次执行的后台任务(按你的两段 disql 顺序)=====
post_boot_first_run() {
# 已执行过则直接退出
if [ -f "$FIRST_RUN_FLAG" ]; then
return 0
fi
# 等 TCP 就绪(服务启动完成)
if ! wait_tcp_ready; then
echo "WARN: dmserver TCP not ready; skip first-run init."
return 0
fi
# 准备日志
if [ ! -f "$INIT_LOG" ]; then
echo "init database at $(date +'%Y-%m-%d %H:%M:%S')" > "$INIT_LOG"
fi
echo "Creating business user & grant ..." | tee -a "$INIT_LOG"
# 第一步:SYSDBA 执行建用户与授权
/home/dmdba/dmdb/bin/disql SYSDBA/${SYSDBA_PWD}@localhost:${PORT_NUM} <<EOF >> "$INIT_LOG" 2>&1
create user "${QMODEL_USER}" identified by "${QMODEL_PWD}" hash with SHA512 salt;
grant "PUBLIC","SOI","DBA" to "${QMODEL_USER}";
COMMIT;
EOF
echo "Importing initial data ..." | tee -a "$INIT_LOG"
# 第二步:业务用户导入数据(确保 /home/dmdba/initdata/init-qmodel.sql 可读)
/home/dmdba/dmdb/bin/disql ${QMODEL_USER}/${QMODEL_PWD}@localhost:${PORT_NUM} <<EOF >> "$INIT_LOG" 2>&1
set define off;
set CHAR_CODE UTF8;
\`/home/dmdba/initdata/init-qmodel.sql
set define on;
EOF
# 落标记:仅首次执行
touch "$FIRST_RUN_FLAG"
echo "First-run initialization finished." | tee -a "$INIT_LOG"
}
cd $DMDB_INSTALL_PATH/bin
# 检查DB是否初始化,如果没有初始化则执行初始化
check_initialized
# 启动 DmAPServer
start_dmap
# ===== 新增:后台启动首次执行任务(不阻塞主进程)=====
post_boot_first_run &
# 启动数据库实例(前台)
echo "Starting DmServer..."
exec sudo -u dmdba /home/dmdba/dmdb/bin/dmserver path=$DB_PATH/$DB_NAME/dm.ini
File diff suppressed because it is too large Load Diff