| 裸设备名 | 容量 | 用途 | 对应共享磁盘文件 |
|---|---|---|---|
| /dev/sdb | 10GB | 数据磁盘(/dev/asmdata0) | share-data0.vmdk |
| /dev/sdc | 5GB | DCR 磁盘(/dev/asmdcr) | share-dcr.vmdk |
| /dev/sdd | 5GB | Vote 磁盘(/dev/asmvote) | share-vote.vmdk |
| /dev/sde | 10GB | Redo 日志磁盘(/dev/asmlog0) | share-log0.vmdk |
| /dev/sdf | 10GB | 归档日志磁盘(/dev/asmarch0) | share-arch0.vmdk |
| 数据库安装目录 | 目录 |
|---|---|
| 数据库安装目录 | /home/dmdba/dmdbms |
| 归档目录 | /home/dmdba/dmarch |
| SQL日志目录 | /home/dmdba/sqllog |
| 备份目录 | /home/dmdba/dmbak |
| NMON目录 | /home/dmdba/nmon |
| 配置文件目录 | /home/dmdba/dsc_config |
| 数据文件 | +DMDATA |
| 归档目录 | +DMARCH |
| REDO日志 | +DMLOG |
| DCR、VOTE信息 | +DCR、+VOTE |
vmware安装目录下打开cmd,通过VMware自带工具vmware-vdiskmanager创建共享磁盘
# 数据磁盘(10G)
.\vmware-vdiskmanager.exe -c -s 10g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-data0.vmdk"
# DCR磁盘(5G)
.\vmware-vdiskmanager.exe -c -s 5g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-dcr.vmdk"
# vote磁盘(5G)
.\vmware-vdiskmanager.exe -c -s 5g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-vote.vmdk"
# redo日志磁盘(10G)
.\vmware-vdiskmanager.exe -c -s 10g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-log0.vmdk"
# 归档日志磁盘(10G)
.\vmware-vdiskmanager.exe -c -s 10g -a lsilogic -t 2 "D:\VMwareVM\dsc1\sharedisk\share-arch0.vmdk"
在关闭虚拟机后在虚拟机存放目录编辑两台虚拟机的配置文件(.vmx),在末尾添加共享磁盘配置:
# shared disks configure
# 共享磁盘配置区块开始 — 用于在多台 VM 之间共享同一组 VMDK
diskLib.dataCacheMaxSize=0
# 禁用磁盘数据缓存;0 表示不使用宿主缓存,确保 I/O 直接写入宿主存储以降低数据不一致风险
diskLib.dataCacheMaxReadAheadSize=0
# 关闭预读(read-ahead)最大值,避免自动预读导致额外 I/O
diskLib.dataCacheMinReadAheadSize=0
# 关闭预读最小阈值,配合上面完全关闭预读行为
diskLib.dataCachePageSize=4096
# 缓存页大小(字节),当启用缓存时按此粒度工作(这里为 4KB)
diskLib.maxUnsyncedWrites = "0"
# 不允许未同步写(unsynced writes),强制写入同步刷盘,优先数据一致性
disk.locking = "FALSE"
# 禁用 VMware 文件锁定机制,允许多个 VM 打开同一 VMDK(用于测试/共享场景)。风险:可能导致并发写冲突或数据损坏
scsi1.sharedBus = "virtual"
# 将 SCSI 控制器设置为虚拟共享总线,使多台 VM 能通过同一控制器共享磁盘
scsi1.present = "TRUE"
# 表示该 SCSI 控制器已启用并附加到虚拟机
scsi1.virtualDev = "lsilogic"
# SCSI 控制器的虚拟设备类型为 LSI Logic(Guest 端应使用对应驱动)
# 数据磁盘
# 用于存放业务/数据文件的共享磁盘
scsi1:0.mode = "independent-persistent"
# 磁盘为 independent-persistent,不随 VM 快照回滚或被快照影响,写入持久化
scsi1:0.deviceType = "disk"
# 设备类型为磁盘(vmdk)
scsi1:0.present = "TRUE"
# 该磁盘条目启用并附加到 VM
scsi1:0.fileName = "G:\\Virtual Machines\\CentOS 7 Minimal\\sharedisk\\share-data0.vmdk"
# 指向 VMDK 描述文件路径。多台 VM 指向同一路径即可实现共享(宿主必须能访问该路径)
scsi1:0.redo = ""
# redo 为空表示不使用 redo/覆盖快照文件(无单独的 redo 文件)
# DCR磁盘
# DCR(Distributed Consensus/Coordination)或仲裁相关磁盘
scsi1:1.mode = "independent-persistent"
scsi1:1.deviceType = "disk"
scsi1:1.present = "TRUE"
scsi1:1.fileName = "G:\\Virtual Machines\\CentOS 7 Minimal\\sharedisk\\share-dcr.vmdk"
scsi1:1.redo = ""
# 同上,指向仲裁/协调用途的共享 VMDK
# vote磁盘
# 用于集群投票/仲裁的小磁盘(通常很小)
scsi1:2.mode = "independent-persistent"
scsi1:2.deviceType = "disk"
scsi1:2.present = "TRUE"
scsi1:2.fileName = "G:\\Virtual Machines\\CentOS 7 Minimal\\sharedisk\\share-vote.vmdk"
scsi1:2.redo = ""
# redo日志磁盘
# 用于写 redo/回滚日志的共享磁盘(数据库/集群日志)
scsi1:3.mode = "independent-persistent"
scsi1:3.deviceType = "disk"
scsi1:3.present = "TRUE"
scsi1:3.fileName = "G:\\Virtual Machines\\CentOS 7 Minimal\\sharedisk\\share-log0.vmdk"
scsi1:3.redo = ""
# 归档日志磁盘
# 用于归档日志(archive log)存放的共享磁盘
scsi1:4.mode = "independent-persistent"
scsi1:4.deviceType = "disk"
scsi1:4.present = "TRUE"
scsi1:4.fileName = "G:\\Virtual Machines\\CentOS 7 Minimal\\sharedisk\\share-arch0.vmdk"
scsi1:4.redo = ""
创建dmdba用户,主组群为dinstall
groupadd dinstall #创建主组群
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba #创建用户
passwd dmdba #设置密码
在/etc/security/limits.conf添加上以下内容
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft stack 65536
dmdba hard stack 65536
在/etc/systemd/system.conf进行修改
DefaultLimitNOFILE=65535
mount dm8_20250912_x86_rh7_64.iso /mnt/cdrom
cd /mnt/cdrom
su dmdba
./DMInstall.bin -i #静默安装,跟着选项按照自己的需求安装即可
/dm/dmdbms/script/root/root_installer.sh # root用户执行脚本
dm8安装路径目前为/home/dmdba/dmdbms,环境变量配置/home/dmdba/.bash_profile修改如下
export DM_HOME=/home/dmdma/dmdbms -- 根据安装目录修改
export PATH=$PATH:$DM_HOME/bin
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DM_HOME/bin"
[root@localhost ~]# for i in `cat /proc/partitions | awk '{print $4}' |grep sd | grep [b-z]$`; do echo "### $i: `/usr/lib/udev/scsi_id -g -u -d /dev/$i`"; done
### sdb: 36000c29b83b60c0ae1260d7084af6060 # 数据磁盘
### sdd: 36000c29718ab0f9ea2134211def4284b # vote磁盘
### sdc: 36000c29f8d4be16e8cd4450f1e9f34fe # DCR磁盘
### sdf: 36000c29f12f883c5a85b5753c10795c0 # 归档日志磁盘
### sde: 36000c296c3e418cca6f2c1e6aa1dd19e # redo日志磁盘
或者每一块分别查询(得出来的结果相同)
/usr/lib/udev/scsi_id -g -u /dev/sdb # 数据磁盘
/usr/lib/udev/scsi_id -g -u /dev/sdc # DCR磁盘
/usr/lib/udev/scsi_id -g -u /dev/sdd # vote磁盘
/usr/lib/udev/scsi_id -g -u /dev/sde # redo日志磁盘
/usr/lib/udev/scsi_id -g -u /dev/sdf # 归档日志磁盘
这里采用脚本创建,也可以通过vi /etc/udev/rules.d/88-dm-asmdevices.rules命令手动创建。脚本内容如下:
#!/bin/bash
# 获取脚本所在目录
curr=$(cd "$(dirname "$0")"; pwd)
# 定义规则文件名
rules_file="$curr/88-dm-asmdevices.rules"
# 删除旧规则文件
rm -f "$rules_file"
# 定义磁盘设备与描述的对应关系(关键映射表,确保与实际一致)
# 格式:设备名 描述 符号链接名
declare -A disk_mapping=(
["sdb"]="数据磁盘 DMDATA"
["sdc"]="DCR磁盘 DCR"
["sdd"]="vote磁盘 VOTE"
["sde"]="redo日志磁盘 DMLOG"
["sdf"]="归档日志磁盘 DMARCH"
)
# 循环处理每个磁盘设备
for dev in "${!disk_mapping[@]}"; do
# 解析描述和符号链接名
desc=$(echo "${disk_mapping[$dev]}" | awk '{print $1}')
symlink=$(echo "${disk_mapping[$dev]}" | awk '{print $2}')
# 获取当前磁盘的scsi_id
scsi_id=$(/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device="/dev/$dev")
if [ -z "$scsi_id" ]; then
echo "警告:无法获取设备 /dev/$dev 的scsi_id,跳过该设备"
continue
fi
# 生成RUN命令(根据磁盘类型区分逻辑)
if [ "$symlink" = "DCR" ]; then
# DCR磁盘需要创建/dev_DSC目录
run_cmd="RUN+=\"/bin/sh -c 'chown dmdba:dinstall /dev/\$name; mkdir -p /dev_DSC; ln -s /dev/$symlink /dev_DSC/$symlink'\""
elif [ "$symlink" = "DMLOG" ]; then
# redo日志磁盘需要额外设置目录权限
run_cmd="RUN+=\"/bin/sh -c 'chown dmdba:dinstall /dev/\$name; ln -s /dev/$symlink /dev_DSC/$symlink; chown -R dmdba:dinstall /dev_DSC'\""
else
# 其他磁盘仅创建链接
run_cmd="RUN+=\"/bin/sh -c 'chown dmdba:dinstall /dev/\$name; ln -s /dev/$symlink /dev_DSC/$symlink'\""
fi
# 写入规则到文件
echo "# $desc" >> "$rules_file"
echo "KERNEL==\"sd*\", SUBSYSTEM==\"block\"," \
"PROGRAM==\"/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\"," \
"RESULT==\"$scsi_id\"," \
"SYMLINK+=\"$symlink\"," \
"OWNER=\"dmdba\"," \
"GROUP=\"dinstall\"," \
"MODE=\"0660\"," \
"$run_cmd" >> "$rules_file"
echo "" >> "$rules_file" # 空行分隔
done
echo "已生成udev规则文件: $rules_file"
udev规则文件创建完成后需要把88-dm-asmdevices.rules配置文件cp到DSC的每个节点上
cp 88-dm-asmdevices.rules /etc/udev/rules.d/88-dm-asmdevices.rules
然后验证
#生效udev规则
udevadm control --reload-rules && udevadm trigger
# 验证磁盘链接
ls -lth /dev_DSC
需要运行su dmdba切换用户后在dsc_config目录下新建配置文件dmdcr_cfg.ini
DCR_N_GRP = 3 ##集群环境有多少个 GROUP,范围:1~16
DCR_VTD_PATH = /dev_DSC/VOTE ##规划为 vote 的磁盘
DCR_OGUID = 63635 ## 消息标识,一个组里面只有一个。
[GRP] #新建一个 GROUP
DCR_GRP_TYPE = CSS ##组类型(CSS/ASM/DB)
DCR_GRP_NAME = GRP_CSS ##组名
DCR_GRP_N_EP = 2 ##组内节点个数
DCR_GRP_DSKCHK_CNT = 60 ##磁盘心跳容错时间,单位:秒
[GRP_CSS]
DCR_EP_NAME = CSS0 ##CSS 节点名
DCR_EP_HOST = 192.168.4.20 ##心跳地址
DCR_EP_PORT = 9836 ##CSS 端口
[GRP_CSS]
DCR_EP_NAME = CSS1
DCR_EP_HOST = 192.168.4.21
DCR_EP_PORT = 9837
[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 = ASM0 ##ASM 节点名,和 dmasvrmal 的 MAL_INST_NAME 一致
DCR_EP_HOST = 192.168.4.20 ##心跳地址
DCR_EP_PORT = 5836 ##ASM 端口
DCR_EP_ASM_LOAD_PATH = /dev_DSC
DCR_EP_SHM_KEY = 42424 ##共享内存标识
DCR_EP_SHM_SIZE = 200 ##共享内存大小
[GRP_ASM]
DCR_EP_NAME = ASM1
DCR_EP_HOST = 192.168.4.21
DCR_EP_PORT = 5837
DCR_EP_ASM_LOAD_PATH = /dev_DSC
DCR_EP_SHM_KEY = 42425
DCR_EP_SHM_SIZE = 200
[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 ##实例名,和 dm.ini 的 INSTANCE_NAME 一致
DCR_EP_SEQNO = 0 ##组内序号,不能重复
DCR_EP_PORT = 5236 ##实例端口,和 dm.ini 的 PORT_NUM 一致
[GRP_DSC]
DCR_EP_NAME = DSC02
DCR_EP_SEQNO = 1
DCR_EP_PORT = 5236
cd /home/dmdba/dmdbms/bin
./dmasmcmd
在交互界面执行以下指令
ASM>create dcrdisk '/dev_DSC/DCR' 'DCR'
[TRACE]The ASM initialize dcrdisk /dev_DSC/DCR to name DMASMDCR
Used time: 23.102(ms).
ASM>create votedisk '/dev_DSC/VOTE' 'VOTE'
[TRACE]The ASM initialize votedisk /dev_DSC/VOTE to name DMASMVOTE
Used time: 20.061(ms).
ASM>create asmdisk '/dev_DSC/DMDATA' 'DMDATA'
[TRACE]The ASM initialize asmdisk /dev_DSC/DMDATA to name DMASMDMDATA
Used time: 19.806(ms).
ASM>create asmdisk '/dev_DSC/DMLOG' 'DMLOG'
[TRACE]The ASM initialize asmdisk /dev_DSC/DMLOG to name DMASMDMLOG
Used time: 17.575(ms).
<!-- ASM>create asmdisk '/dev_DSC/DMARCH' 'DMARCH'
[TRACE]The ASM initialize asmdisk /dev_DSC/DMARCH to name DMASMDMARCH
Used time: 26.024(ms). -->
ASM>init dcrdisk '/dev_DSC/DCR' from '/home/dmdba/dsc_config/dmdcr_cfg.ini' identified by '[数据库密码]'
[TRACE]DG 126 alloc extent for inode (0, 0, 1)
[TRACE]DG 126 alloc 4 extents for 0xfe000002 (0, 0, 2)->(0, 0, 5)
Used time: 88.358(ms).
ASM>init votedisk '/dev_DSC/VOTE' from '/home/dmdba/dsc_config/dmdcr_cfg.ini'
[TRACE]DG 125 alloc extent for inode (0, 0, 1)
[TRACE]DG 125 alloc 4 extents for 0xfd000002 (0, 0, 2)->(0, 0, 5)
Used time: 39.780(ms).
vi /home/dmdba/dsc_config/dmasvrmal.ini
[MAL_INST1]
MAL_INST_NAME= ASM0
MAL_HOST= 192.168.4.20
MAL_PORT= 4836 #MAL 监听端口
[MAL_INST2]
MAL_INST_NAME= ASM1
MAL_HOST= 192.168.4.21
MAL_PORT= 4837
节点1
su dmdba
vi /home/dmdba/dsc_config/dmdcr.ini
DMDCR_PATH = /dev_DSC/DCR
DMDCR_MAL_PATH = /home/dmdba/dsc_config/dmasvrmal.ini
DMDCR_SEQNO = 0
DMDCR_ASM_RESTART_INTERVAL = 0 #CSS 认定 ASM 故障重启的时间
DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/dmdba/dsc_config/dmdcr.ini
DMDCR_DB_RESTART_INTERVAL = 0 ##CSS 认定 DSC 故障重启的时间,设置为 0 不自动拉起
DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver path=/home/dmdba/dsc_config/DSC01_conf/dm.ini dcr_ini=/home/dmdba/dsc_config/dmdcr.ini
节点2
su dmdba
vi /home/dmdba/dsc_config/dmdcr.ini
DMDCR_PATH = /dev_DSC/DCR
DMDCR_MAL_PATH = /home/dmdba/dsc_config/dmasvrmal.ini
DMDCR_SEQNO = 1
DMDCR_ASM_RESTART_INTERVAL = 0
DMDCR_ASM_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmasmsvr dcr_ini=/home/dmdba/dsc_config/dmdcr.ini
DMDCR_DB_RESTART_INTERVAL = 0
DMDCR_DB_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver path=/home/dmdba/dsc_config/DSC02_conf/dm.ini dcr_ini=/home/dmdba/dsc_config/dmdcr.ini
cd /home/dmdba/dmdbms/bin
./dmcss DCR_INI=/home/dmdba/dsc_config/dmdcr.ini
启动新终端并切换至dmdba用户
cd /home/dmdba/dmdbms/bin
./dmasmsvr DCR_INI=/home/dmdba/dsc_config/dmdcr.ini
启动新终端并切换至dmdba用户
cd /home/dmdba/dmdbms/bin
./dmasmtool DCR_INI=/home/dmdba/dsc_config/dmdcr.ini
ASM>CREATE DISKGROUP DMDATA asmdisk '/dev_DSC/DMDATA'
ASM>CREATE DISKGROUP DMLOG asmdisk '/dev_DSC/DMLOG'
编辑dminit.ini
vi /home/dmdba/dsc_config/dminit.ini
DB_NAME= dsc2
SYSTEM_PATH= +DMDATA/data
SYSTEM= +DMDATA/data/system.dbf
SYSTEM_SIZE= 128
ROLL= +DMDATA/data/roll.dbf
ROLL_SIZE= 128
MAIN= +DMDATA/data/main.dbf
MAIN_SIZE= 128
CTL_PATH= +DMDATA/data/dm.ctl
LOG_SIZE= 2048
DCR_PATH= /dev_DSC/DCR
DCR_SEQNO= 0
AUTO_OVERWRITE= 2
PAGE_SIZE = 16
EXTENT_SIZE = 16
SYSDBA_PWD=Dmglydmm@2025
SYSAUDITOR_PWD=Dmglydmm@2025
[DSC01]
CONFIG_PATH= /home/dmdba/dsc_config/DSC01_conf
PORT_NUM = 5236
MAL_HOST= 192.168.4.20
MAL_PORT= 6536
LOG_PATH= +DMLOG/log/DSC01_log1.log
LOG_PATH= +DMLOG/log/DSC01_log2.log
[DSC02]
CONFIG_PATH= /home/dmdba/dsc_config/DSC02_conf
PORT_NUM = 5237
MAL_HOST= 192.168.4.21
MAL_PORT= 6537
LOG_PATH= +DMLOG/log/DSC02_log1.log
LOG_PATH= +DMLOG/log/DSC02_log2.log
cd /home/dmdba/dmdbms/bin
./dminit control=/home/dmdba/dsc_config/dminit.ini
scp -r /home/dmdba/dsc_config/DSC02_conf dmdba@192.168.4.21:/home/dmdba/dsc_config/
节点1
./dmserver dcr_ini=/home/dmdba/dsc_config/dmdcr.ini /home/dmdba/dsc_config/DSC01_conf/dm.ini
节点2
./dmserver dcr_ini=/home/dmdba/dsc_config/dmdcr.ini /home/dmdba/dsc_config/DSC02_conf/dm.ini
mkdir -p /home/dmdba/dm/cssmlog
vi /home/dmdba/dsc_config/dmcssm.ini
# dmcssm.ini定义 OGUID、CSS 节点 IP、日志路径等
# OGUID需与dmdcr_cfg.ini一致
CSSM_OGUID = 63635
CSSM_CSS_IP = 192.168.4.20:9836
CSSM_CSS_IP = 192.168.4.21:9837
CSSM_LOG_PATH = /home/dmdba/dm/cssmlog
CSSM_LOG_FILE_SIZE = 32
CSSM_LOG_SPACE_LIMIT = 0
cd /home/dmdba/dmdbms/bin
./dmcssm /home/dmdba/dsc_config/dmcssm.ini
./dmasmtool DCR_INI=/home/dmdba/dsc_config/dmdcr.ini
ASM>ls
ASM>lsdsk
./disql SYSDBA/'"Dmglydmm@2025"'@127.0.0.1:5236
SQL> SELECT GROUP_ID,DISK_ID,DISK_NAME,DISK_PATH,SIZE,FREE_MB,STATUS FROM V$ASMDISK;
启动DMDSC集群之前,必须先启动集群同步服务DMCSS,如果使用了DMASM文件系统,则DMASMSVR服务也必须先启动,最后启动DMSERVER
完整退出DMDSC集群的正确步骤为:依次退出DMSERVER、DMASMSVR、DMCSS,未按照该顺序进行将导致节点异常退出。
文章
阅读量
获赞
