本文档详细记录了达梦数据库(DM9)在单机环境下搭建数据共享集群(DSC,Data Sharing Cluster)并结合 ASM(Automatic Storage Management)自动存储管理的完整部署流程。涵盖前期磁盘准备、UDEV 规则绑定、DCR/VOTE/DATA 盘初始化、DMCSS/DMASM/DMSERVER 服务注册与启动、表空间与用户创建,以及常见问题处理。
涉及版本:9.1.0.26
使用 parted 工具对 NVMe 磁盘进行 GPT 分区,按需求划分多个分区用于不同的 ASM 盘角色。
分区 1:DCR 盘(约 100MB)
分区 2:Vote 盘(约 200MB)
分区 3:LOG 盘(约 20GB)
分区 4:DATA 盘(剩余全部空间)
操作命令如下:
parted /dev/nvme1n1
mklabel gpt
mkpart primary 1 100
mkpart primary 100 200
mkpart primary 200 20680
mkpart primary 20680 3500G
分区完成后,执行 partprobe 使内核重新读取分区表:
partprobe /dev/nvme1n1
由于 NVMe 设备不走 SCSI 协议栈,无法使用 scsi_id,需改用 ENV{ID_SERIAL} 作为唯一标识。编写 UUID_NVME.sh 脚本为各分区生成 udev 规则,将其绑定为统一的 /dev/asm-disk/asm-diskN 名称。
脚本核心逻辑:
#!/bin/bash
# ============================================================
# gen_nvme_udev_rules.sh
# 用途:为 NVMe 磁盘分区生成 udev 规则(用于达梦 ASM 磁盘绑定)
# 说明:NVMe 设备不走 SCSI 协议栈,无法使用 scsi_id,
# 改用 ENV{ID_SERIAL} 作为唯一标识
# ============================================================
SCRIPT_DIR=$(cd "$(dirname "$0")"; pwd)
OUTPUT_FILE="${SCRIPT_DIR}/88-dm-asmddevices.rules"
# 清理旧文件
rm -f "$OUTPUT_FILE"
DISK_PREFIX="/dev/nvme1n1"
echo "# Generated by gen_nvme_udev_rules.sh on $(date)" >> "$OUTPUT_FILE"
echo "# NVMe device: ${DISK_PREFIX}" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"
# 遍历 NVMe 分区
for i in 1 2 3 4; do
DEV_PATH="${DISK_PREFIX}p${i}"
if [ ! -b "$DEV_PATH" ]; then
echo "WARNING: $DEV_PATH 不存在,跳过"
continue
fi
# 获取 ID_SERIAL(方法1:从 udevadm 查询)
ID_SERIAL=$(udevadm info --query=property "$DEV_PATH" 2>/dev/null | \
grep "^ID_SERIAL=" | cut -d= -f2)
# 如果没取到,尝试 ID_SERIAL_SHORT
if [ -z "$ID_SERIAL" ]; then
ID_SERIAL=$(udevadm info --query=property "$DEV_PATH" 2>/dev/null | \
grep "^ID_SERIAL_SHORT=" | cut -d= -f2)
fi
# 如果还不行,读取 WWID
if [ -z "$ID_SERIAL" ]; then
# 先取控制器路径
SYS_PATH=$(udevadm info --query=path "$DEV_PATH" 2>/dev/null)
WWID=$(cat /sys/${SYS_PATH}/wwid 2>/dev/null)
if [ -n "$WWID" ]; then
ID_SERIAL="$WWID"
fi
fi
if [ -z "$ID_SERIAL" ]; then
echo "ERROR: $DEV_PATH 无法获取序列号,跳过"
continue
fi
echo "设备: $DEV_PATH → ID_SERIAL=${ID_SERIAL}"
# 写入 udev 规则
cat >> "$OUTPUT_FILE" << RULE
KERNEL=="nvme1n1p${i}", SUBSYSTEM=="block", ENV{ID_SERIAL}=="${ID_SERIAL}", \
SYMLINK+="asm-disk${i}", OWNER="dmdba", GROUP="dinstall", MODE="0660"
RULE
done
echo ""
echo "完成!已生成: $OUTPUT_FILE"
echo "内容如下:"
echo "----------------------------------------"
cat "$OUTPUT_FILE"
echo "----------------------------------------"
echo ""
echo "使用方法:"
echo " sudo cp ${OUTPUT_FILE} /etc/udev/rules.d/"
echo " sudo udevadm control --reload-rules && sudo udevadm trigger"
echo " ls -l /dev/asm-disk/asm-disk*"
执行脚本:
./uuid_nvme.sh
将生成的规则文件复制到系统 udev 目录并使其生效:
cp /root/88-dm-asmddevices.rules /etc/udev/rules.d/
udevadm control --reload-rules && sudo udevadm trigger
验证绑定结果:
ls -l /dev/asm-disk/asm-disk*
###注意asm-disk/asm-disk*的权限问题,如果脚本赋予权限规则未生效,需要手动赋予dmdba:dinstall权限
使用 blockdev 命令确认各 ASM 盘容量,确保与实际预期相符
完成操作系统层面配置后,安装达梦数据库软件(此处省略具体安装步骤),配置环境变量及用户权限。确保 dmdba 用户对 /dev/asm-disk/* 具有读写权限(已在 udev 规则中设置 owner=dmdba, group=dinstall, mode=0660)。
该文件用于定义集群的 DCR(Distributed Control Repository)配置信息,包括数据库参数、节点信息、日志路径等。路径:/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini
节点 [DSC0] 配置:
配置如下:
[dmdba@ecif-250-21 bin]$ cat /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini
db_name = dsc
system_path = +DMDATA/dsc
main = +DMDATA/dsc/main.dbf
main_size = 128
roll = +DMDATA/dsc/roll.dbf
roll_size = 128
system = +DMDATA/dsc/system.dbf
system_size = 128
ctl_path = +DMDATA/dsc/dm.ctl
ctl_size = 8
log_size = 4096
dcr_path = /dev/asm-disk/asm-disk1
dcr_seqno = 0
auto_overwrite = 0
#初始化参数
PAGE_SIZE = 32
EXTENT_SIZE = 32
BLANK_PAD_MODE = 1
SYSDBA_PWD = Dsc_1234!
SYSAUDITOR_PWD = Dsc_1234!
[DSC0]
config_path = /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dsc0_config
port_num = 6236
mal_host = 9.17.250.21
mal_port = 9340
log_path = +DMDATA/dsc/dsc1_log01.log
log_path = +DMDATA/dsc/dsc1_log02.log
CSS/ASM 启动依赖的基础配置,路径:/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
配置如下:
[dmdba@ecif-250-21 ~]$ cat /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
DMDCR_PATH = /dev/asm-disk/asm-disk1
DMDCR_MAL_PATH = /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmasvrmal.ini
DMDCR_SEQNO = 0
DMDCR_AUTO_OPEN_CHECK = 90
#DMDCR_ASM_RESTART_INTERVAL = 30 #CSS认定ASM故障重启的时间
#DMDCR_ASM_STARTUP_CMD = /dmdata/dmdbms_9_1_0_26/bin/DmASMSvrService1 start
#DMDCR_DB_RESTART_INTERVAL = 60
#DMDCR_DB_STARTUP_CMD = /dmdata/dmdbms_9_1_0_26/bin//DmService1 start
注意:ASM/DB 的自启参数(DMDCR_ASM_RESTART_INTERVAL / DMDCR_ASM_STARTUP_CMD / DMDCR_DB_RESTART_INTERVAL / DMDCR_DB_STARTUP_CMD)初期以注释形式预留,待验证完毕后取消注释实现自动拉起。
MAL 链路配置文件,定义 ASM 实例间的通信地址:
[MAL_INST1]
MAL_INST_NAME = ASM0
MAL_HOST = 9.17.250.21(心跳地址)
MAL_PORT = 5636(MAL 监听端口)
启动 dmasmtool 工具,对各磁盘进行角色分配与初始化:
Step 1:指定磁盘角色
create dcrdisk '/dev/asm-disk/asm-disk1' 'dcr'
create votedisk '/dev/asm-disk/asm-disk2' 'vote'
create asmdisk '/dev/asm-disk/asm-disk3' 'LOG0'
create asmdisk '/dev/asm-disk/asm-disk4' 'DATA0'
Step 2:初始化 DCR 盘
init dcrdisk '/dev/asm-disk/asm-disk1' from '/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini' identified by '密码'
Step 3:初始化 Vote 盘
init votedisk '/dev/asm-disk/asm-disk2' from '/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr_cfg.ini'
先在前台启动 CSS 和 ASM 服务,以便观察日志输出:
./dmcss dcr_ini=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
./dmasmsvr dcr_ini=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
通过 dmasmtool 连接 ASM 实例,创建逻辑磁盘组:
/dmdata/dmdbms_9_1_0_26/bin/dmasmtool dcr_ini=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dmdcr.ini
ASM> create diskgroup 'DMLOG' asmdisk '/dev/asm-disk/asm-disk3'
ASM> create diskgroup 'DMDATA' asmdisk '/dev/asm-disk/asm-disk4'
配置文件路径:/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dminit.ini
[dmdba@ecif-250-21 bin]$ cat /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dminit.ini
db_name = dsc
system_path = +DMDATA/dsc
main = +DMDATA/dsc/main.dbf
main_size = 128
roll = +DMDATA/dsc/roll.dbf
roll_size = 128
system = +DMDATA/dsc/system.dbf
system_size = 128
ctl_path = +DMDATA/dsc/dm.ctl
ctl_size = 8
log_size = 4096
dcr_path = /dev/asm-disk/asm-disk1
dcr_seqno = 0
auto_overwrite = 0
#初始化参数
PAGE_SIZE = 32
EXTENT_SIZE = 32
BLANK_PAD_MODE = 1
SYSDBA_PWD = Dsc_1234!
SYSAUDITOR_PWD = Dsc_1234!
[DSC0]
config_path = /dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dsc0_config
port_num = 6236
mal_host = 9.17.250.21
mal_port = 9340
log_path = +DMDATA/dsc/dsc1_log01.log
log_path = +DMDATA/dsc/dsc1_log02.log
使用 dminit 工具初始化数据库实例:
./dminit control=/dmdata/dmdbms_9_1_0_26/dsc_one_node/config/dminit.ini
通过 dm_service_installer.sh 分别注册 CSS、ASM Server、Database Server 为系统服务,实现开机自启。
注册 CSS 服务:
./dm_service_installer.sh -t dmcss -dcr_ini .../dmdcr.ini -p 1
注册 ASM Server 服务:
./dm_service_installer.sh -t dmasmsvr -dcr_ini .../dmdcr.ini -y DmCSSService1 -p 1
注册 DB Server 服务:
./dm_service_installer.sh -t dmserver -dm_ini .../dsc0_config/dm.ini -dcr_ini .../dmdcr.ini -y DmASMSvrService1 -p 1
### 注册dmserver时 的-m mount在单机情况下不需要添加
CSSM 是集群状态监控工具,配置文件示例如下:
[dmdba@ecif-250-21 bin]$ cat dmcssm.ini
CSSM_OGUID = 45332
#配置所有 CSS 的连接信息,
#和 dmdcr_cfg.ini 中 CSS 配置项的 DCR_EP_HOST 和 DCR_EP_PORT 保持一致
CSSM_CSS_IP = 9.17.250.21:6336
CSSM_LOG_PATH =../log
CSSM_LOG_FILE_SIZE = 512
CSSM_LOG_SPACE_LIMIT = 0
./dmcssm dmcssm.ini
> show
#CSS、ASM、DMSERVER状态均为OPEN表现数据库各个组件运行正常
验证集群正常运行后,取消 dmdcr.ini 中以下参数的注释,使得 DMCSS 能够自动检测故障并重启 ASM 与 DBSERVER:
DMDCR_ASM_RESTART_INTERVAL
DMDCR_ASM_STARTUP_CMD
DMDCR_DB_RESTART_INTERVAL
DMDCR_DB_STARTUP_CMD
随后通过服务方式启动 CSS,由其自动拉起 ASM 和 DBSERVER:
./DmCSSService1 start
十、参数调整
--系统兼容Oracle参数设置
SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',2);
SP_SET_PARA_VALUE(2,'ORDER_BY_NULLS_FLAG',1);
SP_SET_PARA_VALUE(2,'ENABLE_PL_SYNONYM',1);
SP_SET_PARA_VALUE(2,'DEL_HP_OPT_FLAG',4);
SP_SET_PARA_VALUE(2,'CALC_AS_DECIMAL',1);
--系统兼容Mysql参数设置(未配置已配置兼容ORACLE)
SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE',4);
--系统内存相关参数,可以通过下方优化脚本生成
例子:服务器为160Cc+1024G环境参数修改内容
SP_SET_PARA_VALUE(2,'WORKER_THREADS',64);
SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',32);
SP_SET_PARA_VALUE(2,'GEN_SQL_MEM_RECLAIM',0);
SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY', 100);
SP_SET_PARA_VALUE(2,'MEMORY_POOL', 2000);
SP_SET_PARA_VALUE(2,'MEMORY_N_POOLS', 59);
SP_SET_PARA_VALUE(2,'MEMORY_TARGET', 81000);
SP_SET_PARA_VALUE(2,'BUFFER', 324000);
SP_SET_PARA_VALUE(2,'BUFFER_POOLS', 101);
SP_SET_PARA_VALUE(2,'RECYCLE', 33000);
SP_SET_PARA_VALUE(2,'RECYCLE_POOLS', 97);
SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES', 99999);
SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES', 9999);
SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',1);
SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',1);
SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',0);
SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',0);
SP_SET_PARA_VALUE(2,'TASK_THREADS',16);
SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK', 1);
SP_SET_PARA_VALUE(1,'HJ_BUF_GLOBAL_SIZE', 82000);
SP_SET_PARA_VALUE(1,'HJ_BUF_SIZE', 512);
SP_SET_PARA_VALUE(1,'HAGR_BUF_GLOBAL_SIZE',51000);
SP_SET_PARA_VALUE(1,'HAGR_BUF_SIZE', 512);
SP_SET_PARA_VALUE(2,'SORT_FLAG',1);
SP_SET_PARA_VALUE(2,'SORT_BLK_SIZE',2);
SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE', 50);
SP_SET_PARA_VALUE(2,'SORT_BUF_GLOBAL_SIZE', 82000);
SP_SET_PARA_VALUE(2,'RLOG_POOL_SIZE', 2048);
SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE', 2048);
SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE', 1024);
SP_SET_PARA_VALUE(2,'VM_POOL_TARGET', 8192);
SP_SET_PARA_VALUE(2,'SESS_POOL_TARGET', 8192);
SP_SET_PARA_VALUE(2,'USE_PLN_POOL', 1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR', 1);
SP_SET_PARA_VALUE(2,'SVR_LOG', 1);
SP_SET_PARA_VALUE(2,'TEMP_SIZE', 1024);
SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT', 102400);
SP_SET_PARA_VALUE(2,'MAX_SESSIONS', 10100);
SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000);
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER', 0);
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0);
SP_SET_PARA_VALUE(2,'OLAP_FLAG',2);
SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1);
SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0);
SP_SET_PARA_VALUE(2,'MONITOR_INDEX_FLAG',2);
SP_SET_PARA_VALUE(2,'ENABLE_CREATE_BM_INDEX_FLAG',0);
SP_SET_PARA_VALUE(2,'PARALLEL_PURGE_FLAG',1);
SP_SET_PARA_VALUE(2,'PARALLEL_POLICY',2);
SP_SET_PARA_DOUBLE_VALUE(2,'UNDO_RETENTION',900);
SP_SET_PARA_VALUE(2,'UNDO_EXTENT_NUM',16);
SP_SET_PARA_VALUE(2,'ENABLE_INJECT_HINT',1);
SP_SET_PARA_VALUE(2,'BTR_SPLIT_MODE',1);
SP_SET_PARA_VALUE(2,'FAST_LOGIN',1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR_BP',0);
SP_SET_PARA_VALUE(1,'SLCT_OPT_FLAG',0);
--调整过滤条件的选择率基于动态采样调整。
SP_SET_PARA_VALUE(2,'BEXP_CALC_ST_FLAG',0);
--控制 UPDATE 语句的优化。
SP_SET_PARA_VALUE(2,'UPDATE_OPT_FLAG',64);
--全库统计信息收集
sp_set_para_value(1,'AUTO_STAT_OBJ',1); --开启全库
sp_set_para_value(1,'MONITOR_MODIFICATIONS',2); --开启监控用户表对象
sp_set_para_value(1,'MON_CHECK_INTERVAL',10); --秒数便将用户表对象的数据变化情况记录到系统表。
CREATE TABLESPACE "AUSER" DATAFILE 'ECIFPLAT.DBF' SIZE 102400 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "BUSER" DATAFILE 'ECIFOCRM.DBF' SIZE 51200 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "CUSER" DATAFILE 'ECIFODS.DBF' SIZE 1024 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "DUSER" DATAFILE 'sjdjuser.DBF' SIZE 10240 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "EUSER" DATAFILE 'PETL.DBF' SIZE 1024 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE TABLESPACE "FUSER" DATAFILE 'ECIFMODIFY.DBF' SIZE 10240 AUTOEXTEND ON NEXT 512 MAXSIZE 204800;
CREATE USER "AUSER" IDENTIFIED BY "密码" PASSWORD_POLICY 31 DEFAULT TABLESPACE "ECIFPLAT" DEFAULT INDEX TABLESPACE "ECIFPLAT";
CREATE USER "BUSER" IDENTIFIED BY "密码" PASSWORD_POLICY 31 DEFAULT TABLESPACE "ECIFOCRM" DEFAULT INDEX TABLESPACE "ECIFOCRM";
CREATE USER "CUSER" IDENTIFIED BY "密码" PASSWORD_POLICY 31 DEFAULT TABLESPACE "ECIFODS" DEFAULT INDEX TABLESPACE "ECIFODS";
CREATE USER "DUSER" IDENTIFIED BY "密码" PASSWORD_POLICY 31 DEFAULT TABLESPACE "ECIFODS" DEFAULT INDEX TABLESPACE "ECIFODS";
CREATE USER "EAUSER" IDENTIFIED BY "密码" PASSWORD_POLICY 31 DEFAULT TABLESPACE "ECIFODS" DEFAULT INDEX TABLESPACE "ECIFODS";
对所有业务用户授予公共角色与必要权限:
GRANT PUBLIC, RESOURCE, SOI, SVI, VTI TO 用户名;
使用 dexp(达梦导出工具)从源数据库导出全量数据或者DTS全量迁移。(详细不表述)
错误信息:[code: -11055], ASM加载路径中DCRV磁盘过多
==原因分析:==由于原始设备 /dev/nvme1n1 与新创建的 /dev/asm-disk/asm-disk* 符号链接路径重复,导致 ASM 在加载时读到了多条重复路径。
==解决方案:==将 asm-disk 符号链接放到独立的子目录中,例如 /dev/asm-disk/ 目录,避免与原始设备路径冲突。
#达梦数据库 #达梦同行者征文
文章
阅读量
获赞
