麒麟系统,达梦数据库的安装,DM8安装脚本

麒麟系统的操作

复制代码
vim /etc/sysconfig/network-scripts/ifcfg-ens33
复制代码
# 重启
nmcli conn down ens33 && nmcli conn up  ens33

# 或者重载
nmcli conn reload

时间同步

复制代码
vi /etc/chrony.conf

注释掉原有的 pool或 server行(在行首加 #),添加以下阿里云服务器地址:

# 添加阿里云 NTP 服务器
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst

# 或者,使用单个域名(推荐)
server ntp.aliyun.com iburst
复制代码
systemctl restart chronyd
systemctl enable chronyd

配置达梦的安装环境

创建用户和用户组

  • 系统底层配置 → root(管理员权限)

  • 数据库软件运行 + 数据读写 → dmdba(普通业务权限)

    创建用户组 dinstall

    groupadd dinstall -g 2001

    创建用户 dmdba

    useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba

    passwd dmdba
    输入密码:Dm@@2001

修改限制参数

复制代码
修改 /etc/security/limits.conf 文件,配置内容:

cat >> /etc/security/limits.conf <<EOF
dmdba  soft      nice       0
dmdba  hard      nice       0
dmdba  soft      as         unlimited
dmdba  hard      as         unlimited
dmdba  soft      fsize      unlimited
dmdba  hard      fsize      unlimited
dmdba  soft      nproc      65536
dmdba  hard      nproc      65536
dmdba  soft      nofile     65536
dmdba  hard      nofile     65536
dmdba  soft      core       unlimited
dmdba  hard      core       unlimited
dmdba  soft      data       unlimited
dmdba  hard      data       unlimited
EOF

reboot

切换到 dmdba 用户,查看配置是否生效

复制代码
su - dmdba
ulimit -a

创建安装目录

切换至 root 用户,创建实例保存目录、归档保存目录、备份保存目录

复制代码
exit 退出到root用户
# 实例保存目录
mkdir -p /dmdata/data 

# 归档保存目录
mkdir -p /dmdata/arch

# 备份保存目录
mkdir -p /dmdata/dmbak

# owner 改为 dmdba
chown -R dmdba:dinstall /dmdata

# 授予755权限
chmod -R 755 /dmdata/data
chmod -R 755 /dmdata/arch
chmod -R 755 /dmdata/dmbak

DM8 软件下载

官网地址:https://www.dameng.com/

或直接打开 https://eco.dameng.com/download/

复制代码
unzip dm8_20251203_x86_kylin10_sp3_64.zip

镜像挂载

挂载镜像到 /mnt 目录下,查看目录内容

复制代码
mount -o loop,ro dm8_20251203_x86_kylin10_sp3_64.iso /mnt

ll /mnt

-o:选项说明,通过 loop 设备(环回设备)来挂载一个普通文件(比如 ISO 镜像),让它模拟成块设备,再挂载到目录上。

加 -o loop(mount -o loop xxx.iso /mnt) → 挂载 ISO 文件

不加 -o loop(直接 mount /dev/sr0 /mnt) → 挂载真实的光驱设备

-t iso9660:指定文件系统类型(CD/DVD标准格式)

-o ro:以只读方式挂载(光盘天生只读)

/mnt/iso:挂载点目录

ISO 已经成功挂载到 /mnt,里面只有两个文件:

  • DMInstall.bin:达梦安装程序
  • DM8 Install.pdf:安装文档

安装DM8

切换到dmdba安装

复制代码
su - dmdba
cd /mnt

./DMInstall.bin -i

空间不足

复制代码
mount -o remount,size=5G /tmp

永久

复制代码
vim /etc/fstab
tmpfs  /tmp  tmpfs  defaults,size=5G  0  0

再切换回root

为什么切换回root账号?

答案:DmAPService 要以 root 注册/运行,是因为它需要写入系统级的 systemd 配置,并具备更高的权限来管理数据库备份和守护进程;而数据库实例进程依旧以普通用户 dmdba 来跑

执行命令,创建 DmAPService,否则会影响数据库备份。

DmAPService:Database Advanced Process Service(达梦数据库高级进程服务),它是达梦在 Linux/Unix 下提供的一个 辅助后台守护进程,通常随 root_installer.sh 安装一起创建并注册到系统服务里。主要用于:① 数据库备份/恢复 ② 管理数据库(部分) ③ 支持任务调度

复制代码
/home/dmdba/dmdbms/script/root/root_installer.sh

配置环境变量

切换至 dmdba 用户

修改环境变量配置文件 .bash_profile

刷新环境变量

复制代码
su - dmdba
echo "export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool" >> ~/.bash_profile
source ~/.bash_profile

初始化数据库

进入 /home/dmdba/dmdbms/bin 目录下,查看目录内容

复制代码
cd /home/dmdba/dmdbms/bin
ls

使用 dminit 命令初始化实例,dminit 命令可设置多种参数,查看可配置参数

复制代码
./dminit help

使用 dminit 命令初始化实例,设置数据库目录为 /dmdata/data,就是在【二、配置DM8安装环境】中创建的安装目录。

页大小为 32 KB,簇大小为 32 KB,大小写敏感,字符集为 UTF-8,数据库名为 DAMENG(对应图形化安装界面上的默认的数据库名 DAMENG),实例名为 DMSERVER(对应图形化安装界面上的默认的实例名 DMSERVER),端口为 5236

页(Page)是 达梦数据库存储的最小单位,所有的数据(表、索引等)最终都要写入"页"中。​ 簇(Extent)是 一组连续的数据页,是达梦分配空间的基本单位。代表数据库一次分配的空间块。
​ 页大小 & 簇大小的关系?答:页是最小单位,簇是成批单位;PAGE_SIZE = 32K,EXTENT_SIZE = 32K(默认)→ 单个簇 1MB,

复制代码
./dminit path=/dmdata/data \
    PAGE_SIZE=32 \
    EXTENT_SIZE=32 \
    CASE_SENSITIVE=y \
    CHARSET=1 \
    DB_NAME=DAMENG \
    INSTANCE_NAME=DMSERVER \
    PORT_NUM=5236 \
    SYSDBA_PWD=Sysdba123 \
    SYSAUDITOR_PWD=Auditor123

控制台输出 create dm database success,代表数据库实例初始化完全成功

DM8 服务配置

注册服务

切换至 root 用户

进入 /home/dmdba/dmdbms/script/root/ 目录下,查看目录内容

执行 sh 脚本,注册实例服务,数据库名为 DAMENG(对应图形化安装界面上的默认的数据库名 DAMENG),-p DMSERVER 是服务名的后缀(对应图形化安装界面上的默认的实例名 DMSERVER),最终生成的服务名为:DmServiceDMSERVER。

查看 dm_service_installer.sh 脚本文件,了解更多参数信息。

复制代码
exit
cd /home/dmdba/dmdbms/script/root/
ls
./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/DAMENG/dm.ini -p DMSERVER

进入 cd /home/dmdba/dmdbms/bin 目录下,查看目录中生成的服务实例 DmServiceDMSERVER

复制代码
cd /home/dmdba/dmdbms/bin
ls

启动达梦

复制代码
su - dmdba
cd /home/dmdba/dmdbms/bin
./DmServiceDMSERVER start

停止达梦

复制代码
./DmServiceDMSERVER stop
./DmServiceDMSERVER status

重启

复制代码
./DmServiceDMSERVER restart
./DmServiceDMSERVER status

登录DM8

运行 disql 工具

复制代码
/home/dmdba/dmdbms/tool/disql

登录 dm8,默认账号SYSDBA,密码是Sysdba123

复制代码
conn SYSDBA/Sysdba123

查看版本

复制代码
SELECT * FROM v$version;

开放端口5236

查看监听了哪些端口

复制代码
ss -nap | grep dmserver
# 或
netstat -tulnpe | grep dmserver

切换回root用户

复制代码
exit

检查端口是否开放

复制代码
firewall-cmd --zone=public --query-port=5236/tcp

如果端口未放行,执行放行命令

复制代码
firewall-cmd --add-port=5236/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-all

或者直接禁用防火墙

复制代码
systemctl stop firewalld
systemctl disable firewalld

远程客户端连接

使用【DataGrip数据库管理工具或DM管理工具】连接

创建 DM 驱动程序

配置连接

填写 用户密码

账号:SYSDBA

密码:Sysdba123

填写 URL

URL: jdbc:dm://写自己的麒麟服务器的ip地址:5236?resultSetType=1003

应用,测试链接,就🆗了

DM8的shell安装脚本

创建Shell脚本,dm8_install.sh

复制代码
#!/usr/bin/env bash
# dm8_install.sh --- DM8安装最终版
# - 统一将 /tmp (tmpfs) remount 到 3G(避免 2047MiB 边界)
# - 复用 /mnt(只读OK);否则挂载 ISO 到 /opt/dm8
# - 内置 Expect 自动化(覆盖常见问答),timeout -1 防超时
# - 等待并定位 DM_HOME,再执行 root_installer.sh(安装未完成则报错)
# - 初始化数据库(dminit)、注册并启动实例、放行 5236、防火墙
# - 冒烟验证 disql: SELECT * FROM v$version;(已正确转义日志)

set -euo pipefail
trap 'ec=$?; ((ec!=0)) && echo "[ERR ] exit=${ec}, log=/tmp/dm8_install.log"' EXIT
exec > >(tee -a /tmp/dm8_install.log) 2>&1

#================ 配置(可用环境变量覆盖) ================#
DM_GROUP="${DM_GROUP:-dinstall}"
DM_GROUP_ID="${DM_GROUP_ID:-2001}"
DM_USER="${DM_USER:-dmdba}"
DM_UID="${DM_UID:-2001}"
DM_USER_HOME="${DM_USER_HOME:-/home/${DM_USER}}"
DM_HOME="${DM_HOME:-${DM_USER_HOME}/dmdbms}"   # 若安装到 /opt/dmdbms 会自动定位修正
DM_DATA_ROOT="${DM_DATA_ROOT:-/dmdata}"
DM_DATA="${DM_DATA:-${DM_DATA_ROOT}/data}"
DM_ARCH="${DM_ARCH:-${DM_DATA_ROOT}/arch}"
DM_BAK="${DM_BAK:-${DM_DATA_ROOT}/dmbak}"

DM_DB_NAME="${DM_DB_NAME:-DAMENG}"
DM_INSTANCE="${DM_INSTANCE:-DMSERVER}"
DM_PORT="${DM_PORT:-5236}"

SYSDBA_PWD="${SYSDBA_PWD:-Sysdba123}"
SYSAUDITOR_PWD="${SYSAUDITOR_PWD:-Auditor123}"

# 可选:若你想为 dmdba 设置强口令,导出 DM_USER_PASSWORD=******;默认不设置,避免 PAM 报警
DM_USER_PASSWORD="${DM_USER_PASSWORD:-}"

ISO_PATH="${1:-}"   # 传入 ISO 路径

# /tmp 扩容目标(安装器判定容易卡在 2047MiB,统一扩到 3G)
TMP_MIN_BYTES=$(( 2 * 1024 * 1024 * 1024 ))
TMP_TARGET_BYTES=$(( 3 * 1024 * 1024 * 1024 ))
#==========================================================#

log(){ printf "[INFO] %s\n" "$*"; }
warn(){ printf "[WARN] %s\n" "$*"; }
err(){ printf "[ERR ] %s\n" "$*" >&2; }
require_root(){ [[ $EUID -eq 0 ]] || { err "请用 root 运行"; exit 1; }; }
cmd_exists(){ command -v "$1" >/dev/null 2>&1; }

ensure_pkg(){
  local p="$1"
  if ! cmd_exists "$p" && ! rpm -q "$p" >/dev/null 2>&1; then
    if   cmd_exists dnf; then dnf -y install "$p" || true
    elif cmd_exists yum; then yum -y install "$p" || true
    elif cmd_exists apt; then apt update && apt -y install "$p" || true
    fi
  fi
}

append_if_missing(){
  local file="$1" marker="$2" content="$3"
  if [[ ! -f "$file" ]] || ! grep -qF "$marker" "$file" 2>/dev/null; then
    printf "%s\n" "$content" >> "$file"
  fi
}

ensure_user_group(){
  log "ensure user/group"
  getent group "$DM_GROUP" >/dev/null 2>&1 || groupadd -g "$DM_GROUP_ID" "$DM_GROUP"
  if ! id -u "$DM_USER" >/dev/null 2>&1; then
    useradd -G "$DM_GROUP" -m -d "$DM_USER_HOME" -s /bin/bash -u "$DM_UID" "$DM_USER"
    # 仅在显式提供强口令时才设置,避免 PAM 报警
    if [[ -n "$DM_USER_PASSWORD" ]]; then
      echo "${DM_USER}:${DM_USER_PASSWORD}" | chpasswd || true
    fi
  fi
  id "$DM_USER" || true
}

tune_limits(){
  log "apply /etc/security/limits.conf"
  local file="/etc/security/limits.conf"
  local marker="# <dm8-limits>"
  local block="${marker}
${DM_USER}  soft   nice    0
${DM_USER}  hard   nice    0
${DM_USER}  soft   as      unlimited
${DM_USER}  hard   as      unlimited
${DM_USER}  soft   fsize   unlimited
${DM_USER}  hard   fsize   unlimited
${DM_USER}  soft   nproc   65536
${DM_USER}  hard   nproc   65536
${DM_USER}  soft   nofile  65536
${DM_USER}  hard   nofile  65536
${DM_USER}  soft   core    unlimited
${DM_USER}  hard   core    unlimited
${DM_USER}  soft   data    unlimited
${DM_USER}  hard   data    unlimited"
  append_if_missing "$file" "$marker" "$block"
  log "ulimit snapshot (as ${DM_USER})"
  su - "$DM_USER" -c "bash -lc 'ulimit -n; ulimit -u; ulimit -a | head -n 15'" || true
}

prep_dirs(){
  log "prepare data/archive/backup dirs"
  mkdir -p "$DM_DATA" "$DM_ARCH" "$DM_BAK"
  chown -R "${DM_USER}:${DM_GROUP}" "$DM_DATA_ROOT"
  chmod -R 755 "$DM_DATA_ROOT"
}

ensure_tmp_size(){
  log "ensure /tmp size (tmpfs -> 3G)"
  if mount | grep -qE "on /tmp type tmpfs"; then
    mount -o remount,size=${TMP_TARGET_BYTES} /tmp || {
      warn "remount /tmp to 3G failed,继续尝试按现有空间安装"
    }
  fi
}

mount_iso(){
  log "mount iso"
  # 复用 /mnt(只读也 OK)
  if [[ -x "/mnt/DMInstall.bin" ]]; then
    log "reuse existing /mnt (read-only)"
    DM_ISO_MNT="/mnt"; export DM_ISO_MNT; return
  fi
  [[ -n "${ISO_PATH}" ]] || { err "未提供 ISO 路径"; exit 1; }
  [[ -f "${ISO_PATH}" ]] || { err "ISO 不存在: ${ISO_PATH}"; exit 1; }

  local target="/mnt"
  if mount | grep -qE " on /mnt "; then
    target="/opt/dm8"; mkdir -p "$target"
  else
    # 若 /mnt 未挂载但不可写,改用 /opt/dm8
    if ! touch /mnt/.writetest 2>/dev/null; then
      target="/opt/dm8"; mkdir -p "$target"
    else
      rm -f /mnt/.writetest
    fi
  fi
  if ! mount | grep -qE " on ${target} "; then
    mount -o loop "${ISO_PATH}" "$target"
  fi
  [[ -x "${target}/DMInstall.bin" ]] || { err "未在 ${target} 找到 DMInstall.bin"; exit 1; }
  DM_ISO_MNT="$target"; export DM_ISO_MNT
}

write_expect(){
  # 覆盖常见问答:语言/许可/Key/时区/安装类型/安装目录/确认/创建链接/覆盖/继续/任意键
  cat >/tmp/dm8_install.exp <<'EOF'
#!/usr/bin/expect
log_user 1
set timeout -1
if {[info exists env(WORKDIR)]} { set workdir $env(WORKDIR) } else { set workdir "/mnt" }
cd $workdir
spawn ./DMInstall.bin -i
proc yes {} { send "y\r" }

expect {
  -re {Please select the installer.*language|语言.*选择|选择.*语言} { send "1\r"; exp_continue }
  -re {accept.*license|许可.*协议.*接受|是否同意.*许可}         { yes; exp_continue }
  -re {是否.*Key.*路径|Input.*Key.*path}                         { send "n\r"; exp_continue }
  -re {是否设置.*时区|Set.*timezone}                             { send "y\r"; exp_continue }
  -re {请选择.*时区|Select.*timezone}                            { send "21\r"; exp_continue }
  -re {请选择安装类型|Select.*install.*type}                     { send "1\r"; exp_continue }

  # 安装目录/路径:统一回车接受默认
  -re {请选择安装目录|请输入安装目录|安装目录|安装路径|Install.*(path|directory)} { send "\r"; exp_continue }
  -re {是否确认安装目录|确认.*安装目录|Confirm.*install.*directory\?}            { yes; exp_continue }
  -re {是否确认安装路径|Confirm.*install.*path\?}                                { yes; exp_continue }

  -re {是否.*确认.*安装|Proceed.*install\?|Begin.*installation}   { yes; exp_continue }
  -re {是否创建.*链接|Create.*link.*\?}                           { yes; exp_continue }
  -re {已存在.*是否覆盖|存在.*是否继续|overwrite.*\?|continue.*\?} { yes; exp_continue }
  -re {任意键.*继续|Press.*any.*key.*continue}                     { send "\r"; exp_continue }

  # 兜底类确认
  -re {是否.*(继续|安装|确认)|Do you want.*(continue|install|proceed)} { yes; exp_continue }
  eof
}
EOF
  chmod 700 /tmp/dm8_install.exp
  chown "${DM_USER}:${DM_GROUP}" /tmp/dm8_install.exp
}

run_installer(){
  if [[ -x "${DM_HOME}/bin/disql" ]]; then
    log "DM8 已存在:${DM_HOME}"
    return
  fi
  ensure_pkg expect
  write_expect
  log "run installer via Expect"
  su - "${DM_USER}" -c "bash -lc 'WORKDIR=\"${DM_ISO_MNT}\" /usr/bin/expect /tmp/dm8_install.exp'"

  # 等待安装产物并自动定位 DM_HOME(最多等 10 分钟)
  log "wait for installer outputs (root_installer.sh)"
  local try=0 alt=""
  while (( try < 60 )); do
    if [[ -x "${DM_HOME}/script/root/root_installer.sh" ]]; then break; fi
    alt=$(find "/home/${DM_USER}" /opt /usr -type f -path "*/dmdbms/script/root/root_installer.sh" 2>/dev/null | head -n1 || true)
    if [[ -n "$alt" ]]; then
      DM_HOME="$(dirname "$(dirname "$alt")")"; export DM_HOME
      break
    fi
    sleep 10; try=$((try+1))
  done
  [[ -x "${DM_HOME}/script/root/root_installer.sh" ]] || { err "installer 未完成,缺少 root_installer.sh"; exit 1; }

  log "run root_installer.sh"
  "${DM_HOME}/script/root/root_installer.sh"
}

setup_env(){
  log "setup env for ${DM_USER}"
  local profile="${DM_USER_HOME}/.bash_profile"
  local marker="# <dm8-env>"
  local block="${marker}
export DM_HOME=${DM_HOME}
export PATH=\$PATH:\$DM_HOME/bin:\$DM_HOME/tool"
  append_if_missing "$profile" "$marker" "$block"
}

dminit_db(){
  local ini="${DM_DATA}/${DM_DB_NAME}/dm.ini"
  if [[ -f "$ini" ]]; then log "数据库已初始化:$ini"; return; fi
  log "run dminit"
  su - "${DM_USER}" -c "bash -lc 'cd ${DM_HOME}/bin; ./dminit PATH=${DM_DATA} PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=Y CHARSET=1 DB_NAME=${DM_DB_NAME} INSTANCE_NAME=${DM_INSTANCE} PORT_NUM=${DM_PORT} SYSDBA_PWD=${SYSDBA_PWD} SYSAUDITOR_PWD=${SYSAUDITOR_PWD}'"
  [[ -f "${DM_DATA}/${DM_DB_NAME}/dm.ini" ]] || { err "dminit 失败(未生成 dm.ini)"; exit 1; }
}

register_service(){
  log "register systemd service"
  local svc="DmService${DM_INSTANCE}"
  if systemctl list-unit-files | grep -q "^${svc}.service"; then
    log "服务已注册:$svc"; return
  fi
  "${DM_HOME}/script/root/dm_service_installer.sh" -t dmserver -dm_ini "${DM_DATA}/${DM_DB_NAME}/dm.ini" -p "${DM_INSTANCE}"
  systemctl daemon-reload || true
}

start_service(){
  log "start instance service"
  su - "${DM_USER}" -c "bash -lc '${DM_HOME}/bin/DmService${DM_INSTANCE} start'"
  sleep 2
  if ss -lntp 2>/dev/null | grep -q ":${DM_PORT} " || netstat -nlpt 2>/dev/null | grep -q ":${DM_PORT}"; then
    log "port ${DM_PORT} listening"
  else
    warn "未检测到 ${DM_PORT} 监听,请检查日志"
  fi
}

open_firewall(){
  log "open firewall 5236/tcp if firewalld active"
  if cmd_exists firewall-cmd && systemctl is-active --quiet firewalld; then
    firewall-cmd --zone=public --add-port="${DM_PORT}/tcp" --permanent || true
    firewall-cmd --reload || true
  fi
}

smoke_test(){
  log 'smoke test: SELECT * FROM v$version'
  su - "${DM_USER}" -c "${DM_HOME}/bin/disql SYSDBA/${SYSDBA_PWD}@localhost:${DM_PORT} -e 'SELECT * FROM v\$version;'"
}

main(){
  require_root
  ensure_pkg net-tools || true
  ensure_pkg util-linux || true
  ensure_user_group
  tune_limits
  prep_dirs
  ensure_tmp_size
  mount_iso
  run_installer
  setup_env
  dminit_db
  register_service
  start_service
  open_firewall
  smoke_test
  log "✅ DONE"
  warn "如使用了默认口令,请尽快修改 SYSDBA/SYSAUDITOR 密码;dmdba 账号若需登录,请自行执行 passwd dmdba 设置强口令。"
}
main "$@"

怎么运行

复制代码
# 1) 准备口令(可自定义)
export SYSDBA_PWD='Sysdba123'
export SYSAUDITOR_PWD='Auditor123'

# 2) 执行(root),只需传入 ISO 路径
chmod +x dm8_install.sh
sudo bash ./dm8_install.sh /root/dm8_20250122_x86_rh7_64.iso