一种通过拆分读写请求提升数据库性能的高可用架构,由 1 个主节点(处理写操作)和多个备节点(处理读操作)组成,通过日志同步保持数据一致,适用于读多写少场景。
主节点(Primary):唯一处理写请求(如新增、更新数据),生成 Redo 日志并同步到备节点。
备节点(Standby):最多支持 8 个,仅处理读请求(如查询),通过重做主节点日志保持数据一致。
守护进程(dmwatcher):运行在各节点,监控数据库状态,触发故障自动切换(主节点故障时,备节点升级为主节点)。
监视器(dmmonitor):独立节点,监控集群状态,支持手动切换命令,记录集群事件。
MAL 系统:节点间通信机制,通过dmmal.ini配置,实现日志传输和状态同步。
连接池(RWC Pool):自动路由请求(写请求到主节点,读请求到备节点),应用无需修改代码。
dmarch.ini配置归档类型ARCH_TYPE:
即时归档:Redo日志写入主库联机日志文件后,立即异步发送至备库(默认模式)
实时归档:Redo日志在事务提交前同步发送至备库,确保强一致性(适用于金融等高安全场景)
可以先创建一个文件夹,测速文件放那里,执行完测试就删除
—— dd测试命令
dd if=/dev/zero of=/dmdata/test1 bs=8K count=4K oflag=dsync;
dd if=/dev/zero of=/dmdata/test2 bs=16K count=4K oflag=dsync;
dd if=/dev/zero of=/dmdata/test3 bs=32K count=4K oflag=dsync;
dd if=/dev/zero of=/dmdata/test4 bs=64K count=4K oflag=dsync;
—— fio测试命令(如果是虚拟机,采用fio命令再测试一次磁盘,dd命令可能测不准)
yum install fio* (没有的话先安装fio命令)
cd /dmdata
fio -filename=test -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=32k -size=5G -numjobs=16 -runtime=10 -group_reporting -name=mytest
注意:磁盘性能影响数据库使用,所以一定先测试再决定是否部署。
#修改内核参数
vi /etc/sysctl.conf
#在文件末尾加上
fs.file-max = 6815744
fs.aio-max-nr = 1048576
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
kernel.core_pattern = /dmdata/core.%e_%p_%t
vm.swappiness=10
vm.dirty_background_ratio = 0
vm.min_free_kbytes = 512000
#保存退出
让参数生效
sysctl -p
为了系统安全,一般不使用root用户来安装数据库
#创建用户组,并指定其组ID为2001,可以防止系统分配重复的组ID
groupadd dinstall -g 2001
#创建用户
# 创建数据库管理用户 ‘dmdba’,指定用户ID ‘2001’,主目录 ‘/home/dmdba’,默认Shell ‘/bin/bash’,并加入 ‘dinstall’ 组,
# -m: 若主目录不存在则自动创建, -G: 指定附加组, -d: 指定主目录; -s: 指定Shell, -u: 指定用户ID。
useradd -G dinstall -m -d /home/dmdba -s /bin/bash -u 2001 dmdba
#修改密码(刚创建的用户是没有密码的,要我们去加)
passwd dmdba
#密码:Dm@1357
#查看用户UID\GID\所属组
id dmdba
查看是否存在这个目录
ls -ld /home/dmdba
查看用户详情
grep dmdba /etc/passwd
#实例保存目录
mkdir -p /dmdata/data
#归档保存目录
mkdir -p /dmdata/arch
#备份保存目录
mkdir -p /dmdata/dmbak
#dmdba 用户可读写执行,同组用户可读执行,其他用户可读执行
chown -R dmdba:dinstall /dmdata/data
chown -R dmdba:dinstall /dmdata/arch
chown -R dmdba:dinstall /dmdata/dmbak
chmod -R 755 /dmdata/data
chmod -R 755 /dmdata/arch
chmod -R 755 /dmdata/dmbak
解除操作系统对 dmdba 用户运行数据库进程的资源限制
\#永久生效配置
\#设置用户或用户组的资源限制
vi /etc/security/limits.conf
直接就在该文档末尾处添加配置即可。
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
#重启服务器生效
sudo reboot
此外需要检查/etc/security/limits.d/目录下是否有其他限制资源的配置文件,如果有也需要修改。
切换到dmdba用户下查看是否修改成功
\#切换到 dmdba 用户,查看是否生效
su - dmdba
ulimit -a
一般是关闭防护墙,在root用户下,关闭防火墙
su root
systemctl stop firewalld.service
systemctl status firewalld.service
systemctl disable firewalld.service
或者也可以开放指定端口
\#开放指定端口
firewall-cmd --permanent --add-port=5236/tcp
firewall-cmd --permanent --add-port=22/tcp
\#重新加载防火墙配置,这样才能永久有效
firewall-cmd --reload
查看selinux的模式,SELinux 有 3 种模式,分别是 Enforcing,Permissive 和 Disabled 状态。
Enforcing:强制模式。代表 SELinux 在运行中,且已经开始限制 domain/type 之间的验证关系;
Permissive:宽容模式。代表 SELinux 在运行中,不会限制 domain/type 之间的验证关系,即使验证不正确,进程仍可以对文件进行操作。如果验证不正确会发出警告。
Disabled:关闭模式。SELinux 并没有实际运行。
Enforcing 状态的值是 1,permissive 状态是 0
—— 查看selinux的模式
getenforce
—— 临时性关闭(立即生效,但是重启服务器后失效)
setenforce 0 #设置selinux为permissive模式(即关闭)
—— 开机不重启
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
—— 查看
cat /etc/selinux/config
vi /etc/default/grub
#找到对应的地方进行补充 numa=off transparent_hugepage=never
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off transparent_hugepage=never"
执行这些检查
# 查看 NUMA 节点统计
numastat
#显示当前 shell 或进程的 NUMA 相关设置**
numactl --show
#显示系统的 NUMA 硬件拓扑(节点、CPU、内存等)
numactl --hardware
#立即重启系统,让配置永久生效
shutdown -r now
—— 查看磁盘调度算法:举例: sda 是盘符
cat /sys/block/sda/queue/scheduler
#对于SAS或STAT磁盘(机械硬盘),建议修改为deadline调度算法
—— 修改对应磁盘调度算法为 deadline
echo 'deadline' > /sys/block/sda/queue/scheduler
#对于SSD(固态硬盘),建议修改为NOOP调度算法
# 修改对应磁盘调度算法为 NOOP
echo 'NOOP'>/sys/block/sda/queuelscheduler
Linux系统一般默认使用CFQ调度,修改磁盘调度方法:
查看调度:cat /sys/block/sda/queue/scheduler
临时修改:echo "deadline" > /sys/block/sda/queue/scheduler
永久修改: grubby --update-kernel=ALL --args="elevator=deadline"
#重启生效
reboot
表示当前使用的deadline调度算法
vi /etc/fstab
#进入/etc/fsstab配置文件屏蔽掉swap一行
#UUID=b9a576fa-8a7d-4d5d-bfd9-4d196523fc81 swap swap defaults 0 0
#禁用 /proc/swaps 中的所有交换区
swapoff
注意:Swap 的关闭需要视情况而定,建议内存充裕时关闭,内存太小不关闭。
DefaultLimitNOFILE:用户默认最大打开文件数。
DefaultLimitNPROC:用户默认最大进程数。
vi /etc/systemd/system.conf,调整如下内容:
在末尾加上即可
DefaultLimitNOFILE=65536
DefaultLimitNPROC=65536
需要重启数据库服务器生效。
reboot
在dmdba用户下,调整dmdba用户的环境变量
su dmdba
vi /home/dmdba/.bash_profile
#文件末尾添加如下内容:
#设置了 `DM_HOME` 变量,指定了达梦数据库的安装目录
export DM_HOME=/home/dmdba/dmdbms
#通过追加 `$DM_HOME/bin` 到 `PATH`,允许用户直接调用位于该目录下的所有命令,而不必输入完整路径
export PATH=$PATH:$DM_HOME/bin
#让系统知道去哪里寻找达梦数据库的共享库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin
#添加完成后让它生效
source ~/.bash_profile
这是会影响后面的启动实例操作,配置完必须要source让它生效
确认安装包和环境相匹配
—— 查看IP地址
ip -4 a
—— 查看内核版本
uname -a
—— 查看操作系统版本
cat /etc/*release*
—— 获取操作系统信息(kylin10 sp3系统,数据盘如果用了ext4格式,可能会有性能问题,需要打操作系统的补丁,联系客户处理)
nkvers
—— 查看内存 (GB、MB、KB)
free -g
free -m
free -b
—— 查看CPU信息
lscpu
—— 查看网络配置
ifconfig
两个网卡(ens33,ens37)
操作系统是Centos7,CPU是x86_64架构的
用root命令操作
su root
cd /opt
#创建一个目录放达梦的安装文件,并且赋予权限给dmdba用户
mkdir /opt/dm
chown dmdba.dinstall /opt/dm
chmod 755 /opt/dm
上传镜像文件到这里/opt/dm
执行命令校验sha256跟下载的安装包名.iso_SHA256.txt对比。
—— linux校验命令
sha256sum 安装包名.iso
—— Windows校验命令
certutil -hashfile 安装包名.iso SHA256
使用root用户挂载数据库软件的iso文件
mkdir -p /dmiso
--进入安装包目录
cd /opt/dm
mount -o loop dm8_20250528_x86_rh6_64.iso /dmiso
\#切换dmdba用户
su - dmdba
\#进入挂载目录
cd /dmiso
\#执行安装命令
./DMInstall.bin -i
根据这个提示切换到root用户下,执行上面的服务脚本命令,创建并启动服务。
su root
/home/dmdba/dmdbms/script/root/root_installer.sh
#切换到dmdba用户
su dmdba
#进入数据库安装bin目录下
cd /home/dmdba/dmdbms/bin
#初始化
--主库
./dminit path=/dmdata/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 log_size=2048 DB_NAME=dmdb INSTANCE_NAME=RW1 PORT_NUM=5236 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
--备库
./dminit path=/dmdata/data PAGE_SIZE=32 EXTENT_SIZE=32 CASE_SENSITIVE=y CHARSET=1 log_size=2048 DB_NAME=dmdb INSTANCE_NAME=RW2 PORT_NUM=5236 SYSDBA_PWD=Dameng123 SYSAUDITOR_PWD=Dameng123
重点参数:
PATH 初始数据库存放的路径
db_name 数据库名(DAMENG) 默认
INSTANCE_NAME 实例名(DMSERVER) 默认
PAGE_SIZE 数据页大小(8),可选值:4, 8, 16, 32,单位:K
LOG_SIZE 日志文件大小(256),单位为:M,范围为:64M ~ 2G
CHARSET/UNICODE_FLAG 字符集(0),可选值:0[GB18030],1[UTF-8],2[EUC-KR]
CASE_SENSITIVE 大小敏感(Y),可选值:Y/N,1/0
注意:
初始化参数中除了 path 参数必须指定,其它参数都有默认值,如果需求与默认值不同,初始化的时候请指定需要的值。因为部分参数初始化后是无法修改的例如:page_size(页大小),charset(字符集),case_sensitive(大小写敏感)等。更多参数./dminit help 查看,是否无法修改的参数可以查询 v$dm_ini 视图,para_type=’READ ONLY’ 表示无法修改。
key与版本一定要匹配,key也是区分企业版和安全版
脱机备份期间主库必须关闭,避免备份后产生新日志。初始化后测试主库能正常启动后,关闭数据库实例服务!
#在主机上执行以下命令,确认主库 dmap 服务已启动
ps -ef|grep dmap
#若未启动,则先启动 DMAP 服务,dmdba 到安装目录的 bin 下执行以下命令:
./DmAPService start
如果执行dmrman use_ap=2找不到命令,重新执行一遍vi /home/dmdba/.bash_profile,source ~/.bash_profile
dmdba用户 启动dmrman工具,执行 backup 全库:
#在dmdba用户下执行
#
#启动dmrman工具
dmrman use_ap=2
#执行 backup 全库
backup database '/dmdata/data/dmdb/dm.ini' backupset '/home/dmdba/bakfull';
#校验备份
check backupset '/home/dmdba/bakfull';
#退出
RMAN> exit;
进入到备份的目录,可以看到已经生成了备份文件
bakfull.bak :备份数据文件。这个文件包含了从数据库中导出的实际数据和日志信息。
bakfull.meta:元数据文件。这个文件包含了关于备份集的元数据信息,比如备份的时间戳、备份级别(全量还是增量)、备份的数据块映射、以及用于验证和恢复过程所需的其他控制信息。
注意
scp -r /home/dmdba/bakfull 192.168.155.116:/home/dmdba/
#将/dmdata/dmbak/backupful发送到备库的/home/dmdba/目录下
在备库对应目录就可以看到这个备份的文件夹了
在备库主机上
一定要确保备库的数据库服务是停止状态,开着的就到bin目录下关闭
./DmServicedmdb stop
使用 dmrman 工具还原备库,dmdba 用户执行:
./dmrman
进入dmrman工具交互界面
校验备份集
check backupset '/home/dmdba/bakfull';
执行恢复:
#执行 restore :物理还原 restore
restore database '/dmdata/data/dmdb/dm.ini' from backupset '/home/dmdba/bakfull';
#执行 restore :日志恢复 recover
recover database '/dmdata/data/dmdb/dm.ini' from backupset '/home/dmdba/bakfull';
# recover update db_magic:标识更新 update db_magic
recover database '/dmdata/data/dmdb/dm.ini' update db_magic;
到dm.ini文件修改对应参数
主库
vi /dmdata/data/dmdb/dm.ini
# 修改以下参数
#当前数据库实例的名称
INSTANCE_NAME = rw1
#启用MAL(Message Access Layer,消息访问层)系统,1时数据库会加载`dmmal.ini`配置文件
MAL_INI = 1
#启用归档功能,1时数据库会加载`dmarch.ini`配置文件
ARCH_INI = 1
#禁止手动修改数据库模式
ALTER_MODE_STATUS = 0
# 控制表空间脱机行为
ENABLE_OFFLINE_TS = 2
#在Redo日志中记录逻辑操作标识
RLOG_APPEND_LOGIC = 1
备库
INSTANCE_NAME=rw2
MAL_INI=1
ARCH_INI=1
ALTER_MODE_STATUS=0
ENABLE_OFFLINE_TS=2
RLOG_APPEND_LOGIC=1
检查配置的参数是否正确
grep -Ew "INSTANCE_NAME|PORT_NUM|DW_INACTIVE_INTERVAL|ALTER_MODE_STATUS|ENABLE_OFFLINE_TS|MAL_INI|ARCH_INI|RLOG_SEND_APPLY_MON" /dmdata/data/dmdb/dm.ini
原来时没有这个文件的,要新建
主库和备库在数据库实例下新建这个文件
vi /dmdata/data/dmdb/dmarch.ini
#主库
# 配置归档模式, 事务一致性模式 还是 高性能模式 实时归档默认为:0 读写分离模式为:1
ARCH_WAIT_APPLY=1
[ARCHIVE_REALTIME1]
#ARCH_TYPE 归档类型 LOCAL REMOTE REALTIME TIMELY ASYNC
ARCH_TYPE= REALTIME
ARCH_DEST= dw2
[ARCHIVE_LOCAL1]
ARCH_TYPE= LOCAL
ARCH_DEST= /dmdata/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
#备库
vi /dmdata/data/dmdb/dmarch.ini
ARCH_WAIT_APPLY=1
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = rw1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
读写分离集群要加上:实时归档 realtime+dmarch.ini(ARCH_WAIT_APPLY=1、ARCH_TYPE=REALTIME)
在主库和备库的数据库实例下新建dmmal.ini文件
在实例目录下新建文件 dmmal.ini,执行以下命令。
vi /dmdata/data/dmdb/dmmal.ini
主备库2个节点文件内容要相同。
[MAL_INST1]
MAL_INST_NAME=rw1
MAL_HOST=192.168.100.115
MAL_PORT=7336
MAL_INST_HOST=192.168.155.115
MAL_INST_PORT=5236
MAL_DW_PORT=7436
MAL_INST_DW_PORT=7536
[MAL_INST2]
MAL_INST_NAME=rw2
MAL_HOST=192.168.100.116
MAL_PORT=7336
MAL_INST_HOST=192.168.155.116
MAL_INST_PORT=5236
MAL_DW_PORT=7436
MAL_INST_DW_PORT=7536
在实例目录下新建文件 dmwatcher.ini(原本没有这个文件的),执行以下命令:
vi /dmdata/dmdb/dmwatcher.ini
主备库2节点文件内容要相同。
[GRP_DW]
DW_TYPE = GLOBAL
DW_MODE =AUTO
DW_ERROR_TIME = 30
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 20
INST_OGUID = 453331
INST_INI = /dmdata/data/dmdb/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/dmserver
补充说明:DW_MODE参数,MANUAL表示手动切换,AUTO表示自动切换。
以上启动为前台方式启动,仅用户搭建过程中验证配置。配置没问题后需要将实例,守护进程和确认监视器注册为系统服务。
使用 root 用户,到数据库安装目录的script/root下。
cd /home/dmdba/dmdbms/script/root/
#注册守护进程服务(主备库都执行)。
./dm_service_installer.sh -t dmwatcher -p RW1 -watcher_ini /dmdata/data/dmdb/dmwatcher.ini
./dm_service_installer.sh -t dmwatcher -p RW2 -watcher_ini /dmdata/data/dmdb/dmwatcher.ini
注册数据库实例服务(主备库都执行):
./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/dmdb/dm.ini -p RW1
./dm_service_installer.sh -t dmserver -dm_ini /dmdata/data/dmdb/dm.ini -p RW2
注意
这一步不要启动数据库的实例服务!dminit直接生成完整配置,启动操作反而破坏备份一致性。因为这个启动操作使主库生成初始事务(LSN推进),但此时备库尚未加入集群。后续用此状态备份,备库还原后LSN停留在备份时刻,而主库后续正式启动时LSN继续增长,导致不一致。
主备库设置的OGUID不同会导致守护进程无法识别集群关系。
使用 dmdba 用户,到数据库安装目录的 bin 下执行。
su - dmdba
cd /home/dmdba/dmdbms/bin/
--以mount状态启动数据库实例
dmserver /dmdata/data/dmdb/dm.ini mount
一个终端在mount状态启动实例,另外一个终端进入disql执行下面的
以dmdba用户
设置 OGUID和修改数据库模式
主库上执行:
在disql模式下,
#进入到安装目录下
cd $DM_HOME/bin
#在新的终端使用 disql 工具连接数据库,用sysdba用户登录
./disql SYSDBA/'"Dameng123"'
# 允许手动修改
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
# 修改配置
SQL>sp_set_oguid(453331);
SQL>alter database primary;
# 不允许手动修改
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
备库上执行:
在disql模式下,
# 允许手动修改
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 1);
# 修改配置
SQL>sp_set_oguid(453331);
SQL>alter database standby;
# 不允许手动修改
SQL>SP_SET_PARA_VALUE(1, 'ALTER_MODE_STATUS', 0);
dmdba 用户下,到数据库安装目录的 bin 下执行以下命令(主备库都执行):
--以服务方式启动(前面已经创建守护进程服务了,如果没有创建,就这里创建)
su - dmdba
cd /home/dmdba/dmdbms/bin/
./DmWatcherServiceRW1 start
./DmWatcherServiceRW2 start
守护进程启动后,会将 Mount 的实例 Open。数据守护系统刚启动时,所有实例处于 Mount 状态,守护进程处于 Startup 状态,启动时需要将实例转换到 Open 状态,守护进程也切换到 Open 状态。
在主备节点加上配置文件即可
新建普通监视器配置文件 dmmonitor.ini,执行以下命令:
分别在主备库节点上,都添加普通监视器配置文件。
vi /dmdata/data/dmdb/dmmonitor.ini
添加以下内容:
MON_DW_CONFIRM = 0
MON_LOG_PATH = /home/dmdba/dmdbms/log
MON_LOG_INTERVAL = 60
MON_LOG_FILE_SIZE = 200
MON_LOG_SPACE_LIMIT = 1024
[GRP_DW]
MON_INST_OGUID = 453331
MON_DW_IP = 192.168.100.115:7436
MON_DW_IP = 192.168.100.116:7436
执行以下命令,启动监视器:
./dmmonitor /dmdata/data/dmdb/dmmonitor.ini
在非主备节点的主机上装
监视器虚拟机配置(在主备服务器以外的服务器上)需安装有 DM 数据库软件(客户端即可),且与主备心跳网络端口开放,守护进程配置为自动切换时,必须配置确认监视器。
监视器安装客户端
用dmdba用户新建确认监视器配置文件 dmmonitor.ini(dmmonitor.ini 存放目录没有限制,一般和 dm.ini 存放在同一个目录),执行以下命令
su dmdba
vi /home/dmdba/dmdbms/dmmonitor.ini
#内容为
MON_DW_CONFIRM = 1 #普通监视器模式 | MON_DW_CONFIRM = 1 #确认监视器模式(集群做自动切换模式时)
MON_LOG_PATH = /home/dmdba/dmdbms/log #监视器日志文件存放路径
MON_LOG_INTERVAL = 60 #每隔 60 s 定时记录系统信息到日志文件
MON_LOG_FILE_SIZE = 200 #每个日志文件最大 32 MB
MON_LOG_SPACE_LIMIT = 1024 #不限定日志文件总占用空间
[GRP_DW]
MON_INST_OGUID = 453331 #组 GRP_DW 的唯一 OGUID 值
#以下配置为监视器到组 GRP_DW 的守护进程的连接信息,以“IP:PORT”的形式配置
#IP 对应 dmmal.ini 中的 MAL_HOST,PORT 对应 dmmal.ini 中的 MAL_DW_PORT
# MON_DW_IP = 10.0.0.100:7436 #没有内网,直接写ip
MON_DW_IP = 192.168.100.115:7436
MON_DW_IP = 192.168.100.116:7436
MON_DW_CONFIRM= 1
MON_LOG_PATH= /home/dmdba/dmdbms/log
MON_LOG_INTERVAL= 60
MON_LOG_FILE_SIZE= 200
MON_LOG_SPACE_LIMIT= 1024
[GRP_DW]
MON_INST_OGUID= 453331
MON_DW_IP= 192.168.100.115:7436
MON_DW_IP= 192.168.100.116:7436
注册监视器服务(在确认监视器服务器上注册服务,手动切换模式可忽略此步骤):
#进入到安装目录下
cd $DM_HOME/bin
#注册监视器服务
以root用户注册,在/home/dmdba/dmdbms/script/root目录下
su root
cd /home/dmdba/dmdbms/script/root
./dm_service_installer.sh -t dmmonitor -monitor_ini /home/dmdba/dmdbms/dmmonitor.ini -p dmdb
根据以下流程启动集群
正常守护进程状态 WSTATUS 为 OPEN,实例状态 ISTATUS 为 OPEN,归档类型 RTYPE 为REALTIME,归档状态 RSTAT 为VALID。
主备节点修改它们的实例日志配置
su dmdba
vi /dmdata/data/dmdb/sqllog.ini
BUF_TOTAL_SIZE = 10240
BUF_SIZE = 1024
BUF_KEEP_CNT = 6
[SLOG_ALL]
FILE_PATH = ../log
PART_STOR = 1
SWITCH_MODE = 2
SWITCH_LIMIT = 512
ASYNC_FLUSH = 1
FILE_NUM = 5
ITEMS = 0
SQL_TRACE_MASK = 23
MIN_EXEC_TIME = 1500
USER_MODE = 0
USERS =
监视器(普通监视器、确认监视器都看看)查看主备集群状态
执行以下命令,启动监视器:
./dmmonitor /dmdata/dmdb/dmmonitor.ini
输入 show 命令查看集群状态:
其中守护进程状态 WSTATUS 为 OPEN,实例状态 ISTATUS 为 OPEN,归档类型 RTYPE 为 TIMELY,归档状态 RSTAT 为VALID。
disql 客户端验证
使用 disql 客户端登录主库,创建测试表,插入数据,执行以下命令:
./disql SYSDBA/'"Dameng123"'
SQL 提示符下执行以下命令:
create table test(id int);
insert into test values (1);
commit;
使用 disql 客户端登录备库,查询测试表验证,执行以下命令:
./disql SYSDBA/'"Dameng123"'
SQL 提示符下执行以下命令:
select * from test;
查看数据是否正常同步。
集群部署完成后,需要优化 dm.ini 参数,主备库都需要修改。
找一个管理工具,根据实际环境的cpu,内存等配置,修改指定参数,exec_mode int:= 1; 执行参数脚本后会输出参数设置语句,再放到数据库执行即可。
重启集群(参数修改后需要重启集群)
严格安装顺序执行
读写分离集群重启:
关闭主库守护进程:systemctl stop DmWatcherServiceDW
关闭备库守护进程:systemctl stop DmWatcherServiceDW
关闭主库实例:systemctl stop DmServiceDW
关闭备库实例:systemctl stop DmServiceDW
启动主库实例:systemctl start DmServiceDW
启动备库实例:systemctl start DmServiceDW
启动主库守护进程:systemctl start DmWatcherServiceDW
启动备库守护进程:systemctl start DmWatcherServiceDW
注意:内存4G以下的不做调整,采用默认参数
一般在主库下面做,根据应用需求,定制备份策略如下所示
备份类型 备份周期 备份时间
全量备份 每周 每周六 23 点
增量备份 每天 除周六外每天 23 点
删除备份 每天 每天 23 点 30
登录数据库执行以下命令,创建作业系统表
可以用DM管理工具连接,在管理工具上执行。
SP_INIT_JOB_SYS(1);
全量备份(每周六 23 点全备):其中有1分钟后的一次性全备调度,执行完成后检查备份是否成功。
call SP_CREATE_JOB('bakfull',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakfull');
call SP_ADD_JOB_STEP('bakfull', 'bak1', 6, '01020000/dmdata/dmbak', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakfull', 'std1', 1, 2, 1, 64, 0, '23:00:00', NULL, '2021-11-01 21:17:22', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakfull');
增量备份(每周除周六外每天 23 点增量备份):
call SP_CREATE_JOB('bakincr',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakincr');
call SP_ADD_JOB_STEP('bakincr', 'bak2', 6, '41010000/dmdata/dmbak|/dmdata/dmbak', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakincr', 'std2', 1, 2, 1, 63, 0, '23:00:00', NULL, '2021-11-01 21:19:30', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakincr');
对以上备份立刻执行一遍
#查看备份作业
select id,name from sysjob.sysjobs;
#选择要立刻执行的作业
--立即执行一次作业
--SP_DBMS_JOB_RUN(待运行的作业id);select id,name from sysjob.sysjobs;查出作业id
SP_DBMS_JOB_RUN(1753770734);
到对应备份目录可以看到已经有备份文件了,说明立刻执行成功。
备份定期删除(每天 23:30 删除 14 天前备份):
--创建作业
call SP_CREATE_JOB('delbak',1,0,'',0,0,'',0,'');
--开始配置
call SP_JOB_CONFIG_START('delbak');
--设置删除备份的任务
call SP_ADD_JOB_STEP('delbak', 'bak1', 0, 'sf_bakset_backup_dir_add(''disk'',''/dmdata/dmbak'');
call sp_db_bakset_remove_batch(''disk'',now()-14);', 3, 3, 0, 0, NULL, 0);
--开始配置作业调度
call SP_ADD_JOB_SCHEDULE('delbak', 'del01', 1, 1, 1, 0, 0, '23:30:00', NULL, sysdate, NULL, '');
--结束配置并提交作业
call SP_JOB_CONFIG_COMMIT('delbak');
另外添加自动收集统计信息的任务(每天1点收集全库统计信息)
call SP_CREATE_JOB('statistics',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('statistics');
call SP_ADD_JOB_STEP('statistics', 'statistics1', 0, 'begin
for rs in (select ''sf_set_SESSION_para_value(''''HAGR_HASH_SIZE'''',(select cast(
case when max(table_rowcount(owner,table_name))<=(select max_value from v$dm_ini
where para_Name=''''HAGR_HASH_SIZE'''') and max(table_rowcount(owner,table_name))>=(
select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') then
max(table_rowcount(owner,table_name)) when max(table_rowcount(owner,table_name))<(
select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') then
(select min_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') else
(select max_value from v$dm_ini where para_Name=''''HAGR_HASH_SIZE'''') end as bigint)
from dba_tables where owner=''''''||NAME||''''''));''
sql1,''DBMS_STATS.GATHER_SCHEMA_STATS(''''''||NAME||'''''',100,TRUE,''''FOR ALL COLUMNS SIZE AUTO'''');''
sql2
from SYS.SYSOBJECTS where TYPE$=''SCH'' ) loop
execute immediate rs.sql1;
execute immediate rs.sql2;
end loop;
end;', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('statistics', 'statistics1', 1, 2, 1, 64, 0, '01:00:00', NULL, '2021-06-09 22:54:37', NULL, '');
call SP_JOB_CONFIG_COMMIT('statistics');
说明:每周6凌晨1点开始收集。
注意:上线前,必须提前48小时,完成数据迁移和统计信息收集。
客户端主机上需要配置 dm_svc.conf 文件(未安装 DM 数据库的机器新建即可),文件路径:
32 位的 DM 安装在 Win32 操作平台下,此文件位于 %SystemRoot%\system32 目录;
64 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\system32 目录;
32 位的 DM 安装在 Win64 操作平台下,此文件位于 %SystemRoot%\SysWOW64 目录;
在 Linux 平台下,此文件位于/etc 目录。
文件内容:
# 以#开头的行表示是注释
# 全局配置区
TIME_ZONE=(480)
LANGUAGE=(CN)
DMRW=(192.168.155.115:5236,192.168.155.116:5236)
DIRECT=(Y)
#服务配置区
[DMRW]
LOGIN_MODE=(1) #只连主库
RW_SEPARATE=(1) #是否启用读写分离
RW_PERCENT=(0) #读写分离分发比例(0~100) 这里是25%的读分配给主库
客户端程序连接数据库时,需要指定 IP 端口处替换为服务名即可,例如:disql SYSDBA/’“Hn@dameng123”’@DMDW。jdbc的url为:jdbc:dm://DMDW
注意:当修改了 dm_svc.conf 内容后,需要重启客户端程序,修改的配置才能生效。
①在windows用dm管理工具连接
②Linux:在中间件或者应用服务器上,新建/etc/dm_svc.conf配置文件(要在安装了达梦客户端的虚拟机上)。
用disql连接
#进入到安装目录下
cd $DM_HOME/bin
#在新的终端使用 disql 工具连接数据库,用sysdba用户登录连接服务名
./disql SYSDBA/’“Dameng123”’@DMRW
11.验证读写分离
-- 执行写操作(应显示主库实例名)
CREATE TABLE test_rw(id INT);
INSERT INTO test_rw VALUES(1);
SELECT INSTANCE_NAME FROM V$INSTANCE; -- 应返回 RW1
-- 执行读操作(应显示备库实例名)
SELECT * FROM test_rw;
SELECT INSTANCE_NAME FROM V$INSTANCE; -- 应返回 RW2
出现实例是mount状态,主备之间的LSN不一致,回顾部署过程发现在主备库进行数据备份还原之后,没有以MOUNT方式开启数据库(而是以OPEN方式开启),导致产生了Redo日志,造成主备库数据不一致。
解决方法:关闭dmwatcher以及数据库实例,重新进行主备库的数据备份及还原流程,确保主备库数据一致后再次以MOUNT方式开启实例,开启dmwatcher以及dmmonitor。
关键注意事项:
1.脱机备份期间主库必须关闭,避免备份后产生新日志。
2.OGUID必须一致。
3.启动顺序严禁跳过:MOUNT模式 → 设置数据库模式 → 启动守护进程。
4.监视器若仍报错,检查守护进程日志(dmwatcher.log*),定位具体错误。
社区地址:https://eco.dameng.com
文章
阅读量
获赞