DM8 DSC 单机双实例部署

1. 部署说明

本报告将原先通过 DEM 页面完成的 DSC 自动部署过程,还原为可在 Linux 命令行中手工完成的配置文件创建、裸盘初始化、服务注册、组件启动和功能验证流程。

本次环境为单台 CentOS 7 虚拟机上的双逻辑实例:

text 复制代码
主机名:dujingying
DM 软件源目录:/dm8
DSC 部署目录:/opt/DMDeploy/dmdsc
内网地址:192.168.200.167
外网地址:192.168.201.73
数据库名:DAMENG
实例:DSC01、DSC02

本环境用于学习和功能验证,不具备真正的主机级高可用能力。

2. 部署规划

2.1 网络规划

text 复制代码
CSS DCR、ASM DCR 通信地址:192.168.200.167
ASM MAL、数据库 MAL 和实例访问地址:192.168.201.73

2.2 共享磁盘规划

text 复制代码
/dev/vdb  500 MB  DCR
/dev/vdc  500 MB  VOTE
/dev/vdd   20 GB  DMLOG
/dev/vde   50 GB  DMDATA

固定设备路径:

text 复制代码
/dev/dm-dsc/dcr   -> /dev/vdb
/dev/dm-dsc/vote  -> /dev/vdc
/dev/dm-dsc/log   -> /dev/vdd
/dev/dm-dsc/data  -> /dev/vde

2.3 端口规划

text 复制代码
组件                 DSC01    DSC02
数据库服务端口         7236     7237
数据库 MAL 端口        7336     7337
ASM MAL 端口           7636     7637
ASM DCR 端口           7736     7737
CSS DCR 端口           7836     7837

DSC 独立 DMAP 端口:4237

2.4 目录规划

text 复制代码
/opt/DMDeploy/dmdsc/bin
/opt/DMDeploy/dmdsc/script
/opt/DMDeploy/dmdsc/data/DSC01
/opt/DMDeploy/dmdsc/data/DSC02
/opt/DMDeploy/dmdsc/CSSM01
/opt/DMDeploy/dmdsc/log

3. 部署前检查

3.1 检查主机资源

bash 复制代码
hostname
hostname -I
cat /etc/os-release
uname -m
nproc
free -h
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINT

3.2 检查 DSC 执行程序

bash 复制代码
ls -lh \
/dm8/bin/dmcss \
/dm8/bin/dmcssm \
/dm8/bin/dmasmsvr \
/dm8/bin/dmasmcmd \
/dm8/bin/dmasmtool \
/dm8/bin/dminit \
/dm8/bin/dmserver \
/dm8/bin/dmap

3.3 检查许可证

使用已运行的 DM8 实例查询许可证信息:

bash 复制代码
su - dmdba

disql SYSDBA/'<数据库密码>'@127.0.0.1:5236
sql 复制代码
select * from v$license;
exit;

确认当前授权支持 DSC 集群功能。本次环境检查结果为支持 DSC 的开发授权。

3.4 检查端口占用

bash 复制代码
for p in \
4237 \
7236 7237 \
7336 7337 \
7636 7637 \
7736 7737 \
7836 7837
do
    if ss -lntH | awk '{print $4}' | grep -qE ":${p}$"; then
        echo "端口 ${p}:已占用"
    else
        echo "端口 ${p}:可用"
    fi
done

原 DMAP 已使用 4236,因此 DSC 环境单独使用 4237

3.5 检查裸设备

以下命令使用 root 执行:

bash 复制代码
wipefs -n /dev/vdb
wipefs -n /dev/vdc
wipefs -n /dev/vdd
wipefs -n /dev/vde

blkid /dev/vdb /dev/vdc /dev/vdd /dev/vde

fdisk -l /dev/vdb
fdisk -l /dev/vdc
fdisk -l /dev/vdd
fdisk -l /dev/vde

findmnt -S /dev/vdb
findmnt -S /dev/vdc
findmnt -S /dev/vdd
findmnt -S /dev/vde

mount | grep -E '/dev/vdb|/dev/vdc|/dev/vdd|/dev/vde'

安装 fuser

bash 复制代码
yum install -y psmisc

检查设备占用:

bash 复制代码
fuser -v /dev/vdb /dev/vdc /dev/vdd /dev/vde
pvs 2>/dev/null
vgs 2>/dev/null
lvs 2>/dev/null
swapon --show
dmsetup ls 2>/dev/null

四块磁盘必须满足:

text 复制代码
无文件系统
无挂载点
无分区
不属于 LVM
不属于 swap
无进程占用

4. 配置固定裸设备路径

4.1 获取设备 ID_PATH

bash 复制代码
for disk in vdb vdc vdd vde
do
    echo "================ /dev/${disk} ================"
    udevadm info --query=property --name=/dev/${disk} |
    grep -E '^(DEVNAME|DEVPATH|ID_SERIAL|ID_SERIAL_SHORT|ID_PATH|ID_WWN|MAJOR|MINOR)='
done

本次设备属性:

text 复制代码
vdb:pci-0000:07:00.0
vdc:pci-0000:08:00.0
vdd:pci-0000:09:00.0
vde:pci-0000:0a:00.0

4.2 创建 udev 规则

bash 复制代码
RULE_FILE=/etc/udev/rules.d/99-dm-dsc.rules

if [ -f "$RULE_FILE" ]; then
    cp -a "$RULE_FILE" "${RULE_FILE}.bak.$(date +%Y%m%d%H%M%S)"
fi

cat > "$RULE_FILE" <<'EOF'
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="pci-0000:07:00.0", SYMLINK+="dm-dsc/dcr", OWNER="dmdba", GROUP="dinstall", MODE="0660"
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="pci-0000:08:00.0", SYMLINK+="dm-dsc/vote", OWNER="dmdba", GROUP="dinstall", MODE="0660"
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="pci-0000:09:00.0", SYMLINK+="dm-dsc/log", OWNER="dmdba", GROUP="dinstall", MODE="0660"
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="pci-0000:0a:00.0", SYMLINK+="dm-dsc/data", OWNER="dmdba", GROUP="dinstall", MODE="0660"
EOF

加载规则:

bash 复制代码
udevadm control --reload-rules
udevadm trigger --action=change --sysname-match=vdb
udevadm trigger --action=change --sysname-match=vdc
udevadm trigger --action=change --sysname-match=vdd
udevadm trigger --action=change --sysname-match=vde
udevadm settle

验证:

bash 复制代码
ls -l /dev/dm-dsc

for disk in dcr vote log data
do
    printf '%-8s -> %s\n' \
    "$disk" \
    "$(readlink -f /dev/dm-dsc/$disk)"
done

ls -lL \
/dev/dm-dsc/dcr \
/dev/dm-dsc/vote \
/dev/dm-dsc/log \
/dev/dm-dsc/data

验证 dmdba 权限:

bash 复制代码
su - dmdba -c '
for disk in dcr vote log data
do
    dev="/dev/dm-dsc/${disk}"
    if [ -b "$dev" ] && [ -r "$dev" ] && [ -w "$dev" ]; then
        echo "$dev:块设备存在,dmdba 具备读写权限"
    else
        echo "$dev:检查失败"
    fi
done
'

5. 准备 DSC 程序和目录

5.1 创建目录

bash 复制代码
mkdir -p \
/opt/DMDeploy/dmdsc/data/DSC01 \
/opt/DMDeploy/dmdsc/data/DSC02 \
/opt/DMDeploy/dmdsc/CSSM01 \
/opt/DMDeploy/dmdsc/log

5.2 复制执行程序和服务脚本

为了使注册后的服务调用 /opt/DMDeploy/dmdsc/bin 下的程序,复制 DM 的 binscript 目录:

bash 复制代码
cp -a /dm8/bin /opt/DMDeploy/dmdsc/
cp -a /dm8/script /opt/DMDeploy/dmdsc/

if [ -d /dm8/lib ]; then
    cp -a /dm8/lib /opt/DMDeploy/dmdsc/
fi

修正权限:

bash 复制代码
chown -R dmdba:dinstall /opt/DMDeploy/dmdsc
chmod 755 /opt/DMDeploy/dmdsc/bin

检查:

bash 复制代码
ls -lh \
/opt/DMDeploy/dmdsc/bin/dmcss \
/opt/DMDeploy/dmdsc/bin/dmcssm \
/opt/DMDeploy/dmdsc/bin/dmasmsvr \
/opt/DMDeploy/dmdsc/bin/dmasmcmd \
/opt/DMDeploy/dmdsc/bin/dmasmtool \
/opt/DMDeploy/dmdsc/bin/dminit \
/opt/DMDeploy/dmdsc/bin/dmserver \
/opt/DMDeploy/dmdsc/bin/dmap

6. 创建并初始化 DCR、VOTE 和 ASM 磁盘

6.1 创建 dmdcr_cfg.ini

bash 复制代码
cat > /opt/DMDeploy/dmdsc/data/DSC01/dmdcr_cfg.ini <<'EOF'
DCR_N_GRP= 3
DCR_VTD_PATH= /dev/dm-dsc/vote
DCR_OGUID= 1482207627

[GRP]
DCR_GRP_TYPE= CSS
DCR_GRP_NAME= GRP_CSS
DCR_GRP_N_EP= 2
DCR_GRP_DSKCHK_CNT= 60

[GRP_CSS]
DCR_EP_NAME= CSS01
DCR_EP_HOST= 192.168.200.167
DCR_EP_PORT= 7836

[GRP_CSS]
DCR_EP_NAME= CSS02
DCR_EP_HOST= 192.168.200.167
DCR_EP_PORT= 7837

[GRP]
DCR_GRP_TYPE= ASM
DCR_GRP_NAME= GRP_ASM
DCR_GRP_N_EP= 2
DCR_GRP_DSKCHK_CNT= 60

[GRP_ASM]
DCR_EP_NAME= ASM01
DCR_EP_SHM_KEY= 5136
DCR_EP_SHM_SIZE= 10
DCR_EP_HOST= 192.168.200.167
DCR_EP_PORT= 7736
DCR_EP_ASM_LOAD_PATH= /dev/dm-dsc

[GRP_ASM]
DCR_EP_NAME= ASM02
DCR_EP_SHM_KEY= 56044
DCR_EP_SHM_SIZE= 10
DCR_EP_HOST= 192.168.200.167
DCR_EP_PORT= 7737
DCR_EP_ASM_LOAD_PATH= /dev/dm-dsc

[GRP]
DCR_GRP_TYPE= DB
DCR_GRP_NAME= GRP_DSC
DCR_GRP_N_EP= 2
DCR_GRP_DSKCHK_CNT= 60

[GRP_DSC]
DCR_EP_NAME= DSC01
DCR_EP_SEQNO= 0
DCR_EP_PORT= 7236

[GRP_DSC]
DCR_EP_NAME= DSC02
DCR_EP_SEQNO= 1
DCR_EP_PORT= 7237
EOF

检查:

bash 复制代码
cat /opt/DMDeploy/dmdsc/data/DSC01/dmdcr_cfg.ini

注意:

text 复制代码
DCR_VTD_PATH 指向 VOTE 磁盘。
DMDCR_PATH 在后续 dmdcr.ini 中指向 DCR 磁盘。
同一台主机上的两个 ASM 节点必须使用不同的 DCR_EP_SHM_KEY。

6.2 创建 DMASMCMD 脚本

发布文档中不记录真实密码:

bash 复制代码
DCR_PWD='<DCR/ASM密码>'

创建脚本:

bash 复制代码
cat > /opt/DMDeploy/dmdsc/data/DSC01/asmcmd_init.txt <<EOF
#asm script file
create dcrdisk '/dev/dm-dsc/dcr' 'dcr'
create votedisk '/dev/dm-dsc/vote' 'vote'
create asmdisk '/dev/dm-dsc/log' 'log0'
create asmdisk '/dev/dm-dsc/data' 'data0'
init dcrdisk '/dev/dm-dsc/dcr' from '/opt/DMDeploy/dmdsc/data/DSC01/dmdcr_cfg.ini' identified by '${DCR_PWD}'
init votedisk '/dev/dm-dsc/vote' from '/opt/DMDeploy/dmdsc/data/DSC01/dmdcr_cfg.ini'
EOF

chown dmdba:dinstall \
/opt/DMDeploy/dmdsc/data/DSC01/asmcmd_init.txt
chmod 600 \
/opt/DMDeploy/dmdsc/data/DSC01/asmcmd_init.txt

执行初始化:

bash 复制代码
su - dmdba -c "
/opt/DMDeploy/dmdsc/bin/dmasmcmd \
SCRIPT_FILE=/opt/DMDeploy/dmdsc/data/DSC01/asmcmd_init.txt
"

实际自动部署日志对应的底层操作为:

text 复制代码
create dcrdisk:成功
create votedisk:成功
create asmdisk log0:成功
create asmdisk data0:成功
init dcrdisk:成功
init votedisk:成功

执行后删除含密码的临时脚本:

bash 复制代码
shred -u /opt/DMDeploy/dmdsc/data/DSC01/asmcmd_init.txt
unset DCR_PWD

7. 配置 ASM MAL 和节点 DCR

7.1 创建 dmasvrmal.ini

bash 复制代码
cat > /opt/DMDeploy/dmdsc/data/DSC01/dmasvrmal.ini <<'EOF'
MAL_CHECK_INTERVAL= 30
MAL_CONN_FAIL_INTERVAL= 10
MAL_LOGIN_TIMEOUT= 15
MAL_BUF_SIZE= 100
MAL_SYS_BUF_SIZE= 0
MAL_VPOOL_SIZE= 128
MAL_COMPRESS_LEVEL= 0

[MAL_INST1]
MAL_INST_NAME= ASM01
MAL_HOST= 192.168.201.73
MAL_PORT= 7636
MAL_LINK_MAGIC= 0

[MAL_INST2]
MAL_INST_NAME= ASM02
MAL_HOST= 192.168.201.73
MAL_PORT= 7637
MAL_LINK_MAGIC= 0
EOF

cp -a \
/opt/DMDeploy/dmdsc/data/DSC01/dmasvrmal.ini \
/opt/DMDeploy/dmdsc/data/DSC02/dmasvrmal.ini

7.2 创建 DSC01 的 dmdcr.ini

bash 复制代码
cat > /opt/DMDeploy/dmdsc/data/DSC01/dmdcr.ini <<'EOF'
DMDCR_PATH= /dev/dm-dsc/dcr
DMDCR_SEQNO= 0
DMDCR_MAL_PATH= /opt/DMDeploy/dmdsc/data/DSC01/dmasvrmal.ini
DMDCR_ASM_RESTART_INTERVAL= 0
DMDCR_ASM_STARTUP_CMD= systemctl start DmASMSvrService_DSC01
DMDCR_DB_RESTART_INTERVAL= 0
DMDCR_DB_STARTUP_CMD= systemctl start DmService_DSC01
DMDCR_MESSAGE_CHECK= 1
EOF

7.3 创建 DSC02 的 dmdcr.ini

bash 复制代码
cat > /opt/DMDeploy/dmdsc/data/DSC02/dmdcr.ini <<'EOF'
DMDCR_PATH= /dev/dm-dsc/dcr
DMDCR_SEQNO= 1
DMDCR_MAL_PATH= /opt/DMDeploy/dmdsc/data/DSC02/dmasvrmal.ini
DMDCR_ASM_RESTART_INTERVAL= 0
DMDCR_ASM_STARTUP_CMD= systemctl start DmASMSvrService_DSC02
DMDCR_DB_RESTART_INTERVAL= 0
DMDCR_DB_STARTUP_CMD= systemctl start DmService_DSC02
DMDCR_MESSAGE_CHECK= 1
EOF

修正权限:

bash 复制代码
chown -R dmdba:dinstall /opt/DMDeploy/dmdsc/data
chmod 640 \
/opt/DMDeploy/dmdsc/data/DSC01/dmdcr_cfg.ini \
/opt/DMDeploy/dmdsc/data/DSC01/dmasvrmal.ini \
/opt/DMDeploy/dmdsc/data/DSC01/dmdcr.ini \
/opt/DMDeploy/dmdsc/data/DSC02/dmasvrmal.ini \
/opt/DMDeploy/dmdsc/data/DSC02/dmdcr.ini

8. 配置 DMCSSM 和独立 DMAP

8.1 创建 dmcssm.ini

bash 复制代码
cat > /opt/DMDeploy/dmdsc/CSSM01/dmcssm.ini <<'EOF'
CSSM_OGUID= 1482207627
CSSM_LOG_FILE_SIZE= 64
CSSM_LOG_SPACE_LIMIT= 0
CSSM_CSS_IP= 192.168.200.167:7836
CSSM_CSS_IP= 192.168.200.167:7837
EOF

chown dmdba:dinstall \
/opt/DMDeploy/dmdsc/CSSM01/dmcssm.ini
chmod 640 \
/opt/DMDeploy/dmdsc/CSSM01/dmcssm.ini

CSSM_OGUID 必须与 dmdcr_cfg.ini 中的 DCR_OGUID 相同。

8.2 创建 dmap.ini

本机原有 DMAP 使用 4236,为 DSC 环境创建独立的 4237

bash 复制代码
cat > /opt/DMDeploy/dmdsc/data/dmap.ini <<'EOF'
AP_PORT=4237
EOF

chown dmdba:dinstall /opt/DMDeploy/dmdsc/data/dmap.ini
chmod 640 /opt/DMDeploy/dmdsc/data/dmap.ini

DMAP 可通过以下命令前台验证:

bash 复制代码
su - dmdba -c "
/opt/DMDeploy/dmdsc/bin/dmap \
dmap_ini=/opt/DMDeploy/dmdsc/data/dmap.ini
"

确认出现 dmap is ready 后退出,后续改为系统服务运行。


9. 注册 CSS、ASM、CSSM 和 DMAP 服务

使用 root 执行。

9.1 注册两个 CSS 服务

bash 复制代码
cd /opt/DMDeploy/dmdsc/script/root

./dm_service_installer.sh \
-t dmcss \
-p _DSC01 \
-dcr_ini /opt/DMDeploy/dmdsc/data/DSC01/dmdcr.ini

./dm_service_installer.sh \
-t dmcss \
-p _DSC02 \
-dcr_ini /opt/DMDeploy/dmdsc/data/DSC02/dmdcr.ini

生成:

text 复制代码
DmCSSService_DSC01
DmCSSService_DSC02

9.2 注册两个 ASM 服务

bash 复制代码
./dm_service_installer.sh \
-t dmasmsvr \
-p _DSC01 \
-dcr_ini /opt/DMDeploy/dmdsc/data/DSC01/dmdcr.ini \
-y DmCSSService_DSC01.service

./dm_service_installer.sh \
-t dmasmsvr \
-p _DSC02 \
-dcr_ini /opt/DMDeploy/dmdsc/data/DSC02/dmdcr.ini \
-y DmCSSService_DSC02.service

生成:

text 复制代码
DmASMSvrService_DSC01
DmASMSvrService_DSC02

9.3 注册 DMCSSM 服务

bash 复制代码
./dm_service_installer.sh \
-t dmcssm \
-p _CSSM01 \
-cssm_ini /opt/DMDeploy/dmdsc/CSSM01/dmcssm.ini

生成:

text 复制代码
DmCSSMonitorService_CSSM01

9.4 创建并注册独立 DMAP 服务

标准 dmap 服务类型不使用 -p 后缀。为了保留原有 DmAPService 的 4236 端口,复制服务脚本并指定单独的 dmap.ini

bash 复制代码
cp -a \
/opt/DMDeploy/dmdsc/bin/DmAPService \
/opt/DMDeploy/dmdsc/bin/DmAPService_dmdsc

sed -i \
's#^[[:space:]]*DMAP_INI_PATH[[:space:]]*=.*#DMAP_INI_PATH=/opt/DMDeploy/dmdsc/data/dmap.ini#' \
/opt/DMDeploy/dmdsc/bin/DmAPService_dmdsc

chmod 755 /opt/DMDeploy/dmdsc/bin/DmAPService_dmdsc
chown dmdba:dinstall /opt/DMDeploy/dmdsc/bin/DmAPService_dmdsc

./dm_service_installer.sh \
-s /opt/DMDeploy/dmdsc/bin/DmAPService_dmdsc

生成:

text 复制代码
DmAPService_dmdsc

重新加载 systemd:

bash 复制代码
systemctl daemon-reload

10. 启动 CSS、CSSM、DMAP 和 ASM

10.1 启动 DMAP 和 CSSM

bash 复制代码
systemctl start DmAPService_dmdsc
systemctl start DmCSSMonitorService_CSSM01

10.2 启动两个 CSS 节点

bash 复制代码
systemctl start DmCSSService_DSC01
systemctl start DmCSSService_DSC02
sleep 10

检查:

bash 复制代码
systemctl is-active \
DmCSSService_DSC01 \
DmCSSService_DSC02 \
DmCSSMonitorService_CSSM01 \
DmAPService_dmdsc

ss -lntp | grep -E ':(4237|7836|7837)\b'

10.3 启动两个 ASM 节点

bash 复制代码
systemctl start DmASMSvrService_DSC01
systemctl start DmASMSvrService_DSC02
sleep 10

检查:

bash 复制代码
systemctl is-active \
DmASMSvrService_DSC01 \
DmASMSvrService_DSC02

ss -lntp | grep -E ':(7636|7637|7736|7737)\b'

ps -eo pid,user,args | grep -E '[d]mcss|[d]masmsvr|[d]mcssm|[d]map'

启动顺序必须保持:

text 复制代码
CSS → ASM → 数据库实例

11. 创建 ASM 磁盘组

连接 ASM:

bash 复制代码
su - dmdba

/opt/DMDeploy/dmdsc/bin/dmasmtool \
dcr_ini=/opt/DMDeploy/dmdsc/data/DSC01/dmdcr.ini

ASM> 提示符中执行:

sql 复制代码
CREATE DISKGROUP DMLOG ASMDISK '/dev/dm-dsc/log'
CREATE DISKGROUP DMDATA ASMDISK '/dev/dm-dsc/data'

退出后再次检查:

bash 复制代码
/opt/DMDeploy/dmdsc/bin/dmasmtool \
dcr_ini=/opt/DMDeploy/dmdsc/data/DSC01/dmdcr.ini

ASM> 中执行:

text 复制代码
ls
lsdsk

实际部署日志确认:

text 复制代码
Create diskgroup DMLOG, with asmdisk /dev/dm-dsc/log
Create diskgroup DMDATA, with asmdisk /dev/dm-dsc/data

12. 初始化 DSC 数据库

12.1 创建 dminit.ini

纯命令行部署直接将两个实例的 CONFIG_PATH 写为最终目录。DEM 自动部署生成的原始 dminit.ini 曾使用 DSC01 下的临时目录,部署任务随后再移动到 DSC02 目录;手工部署无需保留这一中间步骤。

bash 复制代码
cat > /opt/DMDeploy/dmdsc/data/DSC01/dminit.ini <<'EOF'
# 数据库初始化参数配置
DB_NAME= DAMENG
EXTENT_SIZE= 16
PAGE_SIZE= 8
LOG_SIZE= 1024
TIME_ZONE= +08:00
CHARSET= 0
CASE_SENSITIVE= 1
BLANK_PAD_MODE= 0
USE_NEW_HASH= 1

# DSC 初始化参数配置
SYSTEM_PATH= +DMDATA/data
SYSTEM= +DMDATA/data/DAMENG/system.dbf
SYSTEM_SIZE= 128
ROLL= +DMDATA/data/DAMENG/roll.dbf
ROLL_SIZE= 128
MAIN= +DMDATA/data/DAMENG/main.dbf
MAIN_SIZE= 128
CTL_PATH= +DMDATA/data/DAMENG/dm.ctl
CTL_SIZE= 8
DCR_PATH= /dev/dm-dsc/dcr
DCR_SEQNO= 0
AUTO_OVERWRITE= 1

[DSC01]
CONFIG_PATH= /opt/DMDeploy/dmdsc/data/DSC01/DSC01_conf
PORT_NUM= 7236
MAL_HOST= 192.168.201.73
MAL_PORT= 7336
LOG_PATH= +DMLOG/log/DSC01_log1.log
LOG_PATH= +DMLOG/log/DSC01_log2.log

[DSC02]
CONFIG_PATH= /opt/DMDeploy/dmdsc/data/DSC02/DSC02_conf
PORT_NUM= 7237
MAL_HOST= 192.168.201.73
MAL_PORT= 7337
LOG_PATH= +DMLOG/log/DSC02_log1.log
LOG_PATH= +DMLOG/log/DSC02_log2.log
EOF

chown dmdba:dinstall /opt/DMDeploy/dmdsc/data/DSC01/dminit.ini
chmod 600 /opt/DMDeploy/dmdsc/data/DSC01/dminit.ini

AUTO_OVERWRITE=1 会允许初始化程序覆盖同名目标。执行前必须确认 DCR、ASM 磁盘组和目标数据库中不存在需要保留的数据。

12.2 执行初始化

发布文档中使用密码占位符:

bash 复制代码
SYSDBA_PWD='<SYSDBA密码>'
SYSAUDITOR_PWD='<SYSAUDITOR密码>'

执行:

bash 复制代码
su - dmdba -c "
/opt/DMDeploy/dmdsc/bin/dminit \
CONTROL=/opt/DMDeploy/dmdsc/data/DSC01/dminit.ini \
SYSDBA_PWD='${SYSDBA_PWD}' \
SYSAUDITOR_PWD='${SYSAUDITOR_PWD}'
"

初始化成功时应出现:

text 复制代码
create ini file /opt/DMDeploy/dmdsc/data/DSC01/DSC01_conf/dm.ini success
create ini file /opt/DMDeploy/dmdsc/data/DSC02/DSC02_conf/dm.ini success
create rlog file +DMLOG/log/DSC01_log1.log success
create rlog file +DMLOG/log/DSC01_log2.log success
create rlog file +DMLOG/log/DSC02_log1.log success
create rlog file +DMLOG/log/DSC02_log2.log success
create dm database success

清除 Shell 变量:

bash 复制代码
unset SYSDBA_PWD SYSAUDITOR_PWD

12.3 设置关键 dm.ini 参数

bash 复制代码
for ini in \
/opt/DMDeploy/dmdsc/data/DSC01/DSC01_conf/dm.ini \
/opt/DMDeploy/dmdsc/data/DSC02/DSC02_conf/dm.ini
do
    sed -i \
    's/^[[:space:]]*EXTERNAL_AP_PORT[[:space:]]*=.*/EXTERNAL_AP_PORT = 4237/' \
    "$ini"

    sed -i \
    's/^[[:space:]]*MAL_INI[[:space:]]*=.*/MAL_INI = 1/' \
    "$ini"

    sed -i \
    's/^[[:space:]]*ARCH_INI[[:space:]]*=.*/ARCH_INI = 0/' \
    "$ini"

    sed -i \
    's/^[[:space:]]*MPP_INI[[:space:]]*=.*/MPP_INI = 0/' \
    "$ini"

    sed -i \
    's/^[[:space:]]*ALTER_MODE_STATUS[[:space:]]*=.*/ALTER_MODE_STATUS = 0/' \
    "$ini"
done

检查两个实例:

bash 复制代码
for ini in \
/opt/DMDeploy/dmdsc/data/DSC01/DSC01_conf/dm.ini \
/opt/DMDeploy/dmdsc/data/DSC02/DSC02_conf/dm.ini
do
    echo "===== $ini ====="
    grep -nE \
    '^[[:space:]]*(CONFIG_PATH|INSTANCE_NAME|PORT_NUM|EXTERNAL_AP_PORT|MAL_INI|ARCH_INI|MPP_INI|ALTER_MODE_STATUS)[[:space:]]*=' \
    "$ini"
done

应得到:

text 复制代码
DSC01:INSTANCE_NAME=DSC01,PORT_NUM=7236
DSC02:INSTANCE_NAME=DSC02,PORT_NUM=7237
EXTERNAL_AP_PORT=4237
MAL_INI=1
ARCH_INI=0
MPP_INI=0
ALTER_MODE_STATUS=0

12.4 检查 dmmal.ini

bash 复制代码
cat /opt/DMDeploy/dmdsc/data/DSC01/DSC01_conf/dmmal.ini
cat /opt/DMDeploy/dmdsc/data/DSC02/DSC02_conf/dmmal.ini

两个文件内容应一致,关键部分为:

ini 复制代码
[MAL_INST_DSC01]
MAL_INST_NAME= DSC01
MAL_HOST= 192.168.201.73
MAL_PORT= 7336
MAL_INST_HOST= 192.168.201.73
MAL_INST_PORT= 7236

[MAL_INST_DSC02]
MAL_INST_NAME= DSC02
MAL_HOST= 192.168.201.73
MAL_PORT= 7337
MAL_INST_HOST= 192.168.201.73
MAL_INST_PORT= 7237

修正权限:

bash 复制代码
chown -R dmdba:dinstall /opt/DMDeploy/dmdsc/data

13. 注册并启动数据库实例服务

使用 root 执行:

bash 复制代码
cd /opt/DMDeploy/dmdsc/script/root

注册 DSC01:

bash 复制代码
./dm_service_installer.sh \
-t dmserver \
-p _DSC01 \
-dm_ini /opt/DMDeploy/dmdsc/data/DSC01/DSC01_conf/dm.ini \
-dcr_ini /opt/DMDeploy/dmdsc/data/DSC01/dmdcr.ini \
-y DmASMSvrService_DSC01.service

注册 DSC02:

bash 复制代码
./dm_service_installer.sh \
-t dmserver \
-p _DSC02 \
-dm_ini /opt/DMDeploy/dmdsc/data/DSC02/DSC02_conf/dm.ini \
-dcr_ini /opt/DMDeploy/dmdsc/data/DSC02/dmdcr.ini \
-y DmASMSvrService_DSC02.service

生成:

text 复制代码
DmService_DSC01
DmService_DSC02

重新加载并启动:

bash 复制代码
systemctl daemon-reload

systemctl start DmService_DSC01
systemctl start DmService_DSC02
sleep 15

设置开机启动:

bash 复制代码
systemctl enable \
DmAPService_dmdsc \
DmCSSService_DSC01 \
DmCSSService_DSC02 \
DmASMSvrService_DSC01 \
DmASMSvrService_DSC02 \
DmService_DSC01 \
DmService_DSC02 \
DmCSSMonitorService_CSSM01

14. 部署后验证

14.1 检查服务

bash 复制代码
systemctl is-active \
DmCSSService_DSC01 \
DmCSSService_DSC02 \
DmASMSvrService_DSC01 \
DmASMSvrService_DSC02 \
DmService_DSC01 \
DmService_DSC02 \
DmCSSMonitorService_CSSM01 \
DmAPService_dmdsc

全部应返回:

text 复制代码
active

14.2 检查进程

bash 复制代码
ps -eo pid,user,args | grep -E \
'[d]mcss|[d]masmsvr|[d]mserver|[d]mcssm|[d]map'

应包含:

text 复制代码
2 个 dmcss
2 个 dmasmsvr
2 个 DSC dmserver
1 个 dmcssm
1 个 DSC dmap

14.3 检查端口

bash 复制代码
ss -lntp | grep -E \
':(4237|7236|7237|7336|7337|7636|7637|7736|7737|7836|7837)\b'

14.4 登录两个数据库实例

bash 复制代码
su - dmdba

disql SYSDBA/'<SYSDBA密码>'@192.168.201.73:7236
sql 复制代码
select instance_name,status$ from v$instance;
select name,status$ from v$database;
exit;

DSC01 结果:

text 复制代码
INSTANCE_NAME:DSC01
STATUS$:OPEN
数据库名:DAMENG

登录 DSC02:

bash 复制代码
disql SYSDBA/'<SYSDBA密码>'@192.168.201.73:7237
sql 复制代码
select instance_name,status$ from v$instance;
select name,status$ from v$database;
exit;

DSC02 结果:

text 复制代码
INSTANCE_NAME:DSC02
STATUS$:OPEN
数据库名:DAMENG

14.5 使用 DMCSSM 查看集群

bash 复制代码
su - dmdba -c "
printf 'show\nexit\n' |
timeout 20 /opt/DMDeploy/dmdsc/bin/dmcssm \
ini_path=/opt/DMDeploy/dmdsc/CSSM01/dmcssm.ini
"

正常状态:

text 复制代码
CSS01、CSS02:OPEN / WORKING / OK / TRUE
ASM01、ASM02:OPEN / WORKING / OK / TRUE
DSC01、DSC02:OPEN / WORKING / OK / TRUE

15. 共享数据一致性测试

15.1 DSC01 写入数据

bash 复制代码
disql SYSDBA/'<SYSDBA密码>'@192.168.201.73:7236
sql 复制代码
select instance_name,status$ from v$instance;

create table DSC_TEST (
    ID int primary key,
    SOURCE_INST varchar(30),
    TEST_TIME datetime
);

insert into DSC_TEST
values (1,'WRITE_FROM_DSC01',sysdate);

commit;
select * from DSC_TEST;
exit;

15.2 DSC02 查询并写入

bash 复制代码
disql SYSDBA/'<SYSDBA密码>'@192.168.201.73:7237
sql 复制代码
select instance_name,status$ from v$instance;
select * from DSC_TEST;

insert into DSC_TEST
values (2,'WRITE_FROM_DSC02',sysdate);

commit;
select * from DSC_TEST order by ID;
exit;

15.3 返回 DSC01 验证

bash 复制代码
disql SYSDBA/'<SYSDBA密码>'@192.168.201.73:7236
sql 复制代码
select * from DSC_TEST order by ID;
exit;

实际测试结果:

text 复制代码
1  WRITE_FROM_DSC01
2  WRITE_FROM_DSC02

说明两个实例访问同一套共享数据库文件,事务提交后数据能够被另一实例读取。


16. 单实例停止与恢复测试

16.1 停止 DSC02

使用 root:

bash 复制代码
systemctl stop DmService_DSC02
sleep 5

systemctl is-active DmService_DSC01
systemctl is-active DmService_DSC02

结果:

text 复制代码
DmService_DSC01:active
DmService_DSC02:inactive

16.2 查看集群状态

bash 复制代码
su - dmdba -c "
printf 'show\nexit\n' |
timeout 20 /opt/DMDeploy/dmdsc/bin/dmcssm \
ini_path=/opt/DMDeploy/dmdsc/CSSM01/dmcssm.ini
"

实际状态:

text 复制代码
DSC01:OPEN / WORKING / OK / TRUE
DSC02:SHUTDOWN / STOP / ERROR / FALSE

CSS 和 ASM 双节点保持正常。

16.3 验证 DSC01 继续提供服务

bash 复制代码
su - dmdba -c "
/opt/DMDeploy/dmdsc/bin/disql \
SYSDBA/'<SYSDBA密码>'@192.168.201.73:7236 <<'SQL'
select instance_name,status$ from v\$instance;
select * from DSC_TEST order by ID;
exit;
SQL
"

DSC01 能正常查询两条测试数据。

16.4 恢复 DSC02

bash 复制代码
systemctl start DmService_DSC02
sleep 15
systemctl is-active DmService_DSC02

再次检查:

bash 复制代码
su - dmdba -c "
printf 'show\nexit\n' |
timeout 20 /opt/DMDeploy/dmdsc/bin/dmcssm \
ini_path=/opt/DMDeploy/dmdsc/CSSM01/dmcssm.ini
"

恢复结果:

text 复制代码
DSC01:OPEN / WORKING / OK / TRUE
DSC02:OPEN / WORKING / OK / TRUE

17. 常用启停命令

17.1 启动顺序

bash 复制代码
systemctl start DmAPService_dmdsc
systemctl start DmCSSService_DSC01
systemctl start DmCSSService_DSC02
systemctl start DmCSSMonitorService_CSSM01

sleep 10

systemctl start DmASMSvrService_DSC01
systemctl start DmASMSvrService_DSC02

sleep 10

systemctl start DmService_DSC01
systemctl start DmService_DSC02

17.2 停止顺序

bash 复制代码
systemctl stop DmService_DSC02
systemctl stop DmService_DSC01

systemctl stop DmASMSvrService_DSC02
systemctl stop DmASMSvrService_DSC01

systemctl stop DmCSSMonitorService_CSSM01
systemctl stop DmCSSService_DSC02
systemctl stop DmCSSService_DSC01
systemctl stop DmAPService_dmdsc

停止顺序与启动顺序相反:

text 复制代码
数据库实例 → ASM → CSSM/CSS → DMAP

18. 部署注意事项和问题记录

18.1 非 root 用户无法检查裸设备

现象:

text 复制代码
wipefs: Permission denied
fdisk: Permission denied

处理:

bash 复制代码
su -
whoami

裸设备检查、udev 配置和服务注册均使用 root。

18.2 系统没有 fuser

bash 复制代码
yum install -y psmisc

18.3 VirtIO 磁盘没有稳定的 by-id

本次磁盘没有可用序列号,因此通过 ID_PATH 创建 /dev/dm-dsc 固定链接。

18.4 DCR 和 VOTE 路径容易填反

正确对应:

text 复制代码
DCR_VTD_PATH=/dev/dm-dsc/vote
DMDCR_PATH=/dev/dm-dsc/dcr

18.5 单机双实例端口不能重复

同一台主机上的 CSS、ASM、MAL 和数据库端口必须分别规划,不能沿用双机部署中两台主机使用相同端口的写法。

18.6 ASM 共享内存 Key 不能重复

本次配置:

text 复制代码
ASM01:DCR_EP_SHM_KEY=5136
ASM02:DCR_EP_SHM_KEY=56044

18.7 DSC02 的 CONFIG_PATH

DEM 自动部署生成的原始 dminit.ini 曾将 DSC02 配置写入 DSC01 下的临时目录,随后由部署任务移动到最终目录。纯命令行部署时直接填写:

text 复制代码
CONFIG_PATH=/opt/DMDeploy/dmdsc/data/DSC02/DSC02_conf

这样 dminit 会直接在最终目录生成 DSC02 的 dm.inidmmal.ini,不需要额外移动目录。

18.8 DMAP 默认端口冲突

原 DMAP 使用 4236,本次 DSC 使用 4237。必须同时保证:

text 复制代码
dmap.ini:AP_PORT=4237
dm.ini:EXTERNAL_AP_PORT=4237

18.9 服务名后缀中的下划线

为了生成实际服务名:

text 复制代码
DmCSSService_DSC01
DmASMSvrService_DSC01
DmService_DSC01

注册时后缀使用:

text 复制代码
-p _DSC01

而不是 -p DSC01

18.10 启动顺序错误

数据库实例依赖 ASM,ASM 依赖 CSS。应按以下顺序启动:

text 复制代码
CSS → ASM → 数据库实例

18.11 不要在现有集群上重复初始化裸盘

以下命令会改写磁盘头:

text 复制代码
create dcrdisk
create votedisk
create asmdisk
init dcrdisk
init votedisk

仅在首次部署或明确重建环境时执行。


19. 部署结果

本次命令行流程对应的实际部署结果:

text 复制代码
DMCSS 双节点正常
DMASM 双节点正常
DSC01、DSC02 均为 OPEN
DMLOG、DMDATA 磁盘组正常
两个实例访问同一套共享数据库
双实例共享数据读写测试通过
停止 DSC02 后 DSC01 继续提供服务
DSC02 重新启动后正常加入集群
DMCSSM 能正确显示节点停止和恢复状态

环境限制:

text 复制代码
两个逻辑节点运行在同一台虚拟机上
只能验证实例级可用性
不能验证主机、存储和物理网络级容灾
相关推荐
An_s1 小时前
c++对接pdfium(一)win系统篇
开发语言·c++
Zwarwolf1 小时前
Rust零散知识点项目汇总
开发语言·rust
Database_Cool_1 小时前
企业级多模态分析计算引擎选型:首选 AnalyticDB MySQL 向量 + SQL + 实时一体化方案
数据库·sql·mysql
-银雾鸢尾-1 小时前
C#中HashTable相关方法
开发语言·c#
茯苓gao1 小时前
嵌入式开发笔记:Qt信号槽机制深度解析——从原理到实战的全方位指南
开发语言·笔记·嵌入式硬件·qt·学习
SelectDB2 小时前
从 Oracle、Hadoop 到 Apache Doris:哥瑞利泛半导体智能制造数据平台实践
数据库
ihuyigui2 小时前
海外签收通知短信接口
android·java·开发语言·前端·数据库·后端
海棠Flower未眠2 小时前
SpringBoot 消息死信队列(荣耀典藏版)
java·数据库·spring boot
雪的季节2 小时前
Python基础5-18
开发语言·python