麒麟系统的操作
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://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