Whoami:5年+金融、政府、医疗领域工作经验的DBA
Certificate:OCP、PCP
Skill:Oracle、Mysql、PostgreSQL
Platform:CSDN、墨天伦、公众号(呆呆的私房菜)
复制
阅读本文可以了解达梦数据库主备形态下的标准化部署,包括主从原理剖析、数据库安装和参数优化等相关内容。
达梦数据库的主备守护集群(DataWatch)是一种高可用、高性能的数据库解决方案,它通过实现异地容灾来保障数据库的持续可用性。
其核心原理是将主库产生的Redo日志传输到备库,备库接收并重新应用这些日志,以实现与主库的数据同步。这种机制主要由主库、备库、Redo日志、Redo日志传输、Redo日志重演、守护进程和监视器等组件构成。
dmmonitor监视器:
1. 监控dmwatcher发送的消息,如主备库状态变化、故障切换中数据库模式、状态变化的完整过程;
2. 接收用户输入的管理命令,如启停dmwatcher监控功能、执行主备切换和备库故障接管等操作;
3. 发起故障自动接管命令,主库故障时选择复合接管条件的备库,并通知备库接管服务。
dmwatcher守护进程:
1. 负责监控数据库状态,必要时重启数据库服务;dmwatcher与数据库实例建立通信后,数据库实例会定时发送信息到dmwatcher;
2. 守护进程更新本地记录的实例信息后,同时记录该时间戳。当检测到实例进程id已经不存在或超过一段时间没有收到实例信息,则会认为实例故障。如果配置了自动重启,则实例会被重启拉起。
先来了解一下达梦的数据库模式:
模式 | 说明 |
normal | 提供正常的数据库服务,操作没有限制。生成正常的本地归档,但不发送realtime、timely和async归档 |
primary | 提供正常的数据库服务,操作极少有限制,部分模式功能受限(不支持修改表空间文件名、不支持需改arch_ini参数);正常生成本地归档、支持realtime、timely和async归档;对临时表空间以外的所有数据库对象的修改操作都强制生成redo日志 |
standby | 可以执行数据库备份、查询等只读数据库操作;正常生成本地归档、正常发送async归档redo日志,但realtime、timely归档均强制失效;时间触发器和事件触发器均失效 |
再来了解一下达梦的日志归档模式:
模式 | 说明 |
本地归档模式 | 写入online redo后,再写入本地归档日志; 写入失败时,系统会等待用户释放磁盘空间,若磁盘空间损坏导致失败,系统会强制halt |
实时归档模式 | 写入online redo后,发送到备库; 写入失败时,会suspend数据库,保持归档不变,等待守护进程干预 |
即时归档模式 | 写入online redo后,发送到备库; 写入失败时,会suspend数据库并设置归档为无效状态,等待守护进程干预 |
异步归档模式 | 定时启动归档线程;异常时不做处理,等待下次触发继续发送 收到后立即响应 |
同步归档模式 | 写入归档日志后,发送到备库; 写入失败时,接设置归档状态为无效,不会suspend数据库 |
实时归档是实现主备库数据同步的基础,实时主备同步实现原理如下:
1. 主库生成 online redo log,当触发日志写文件操作后,日志线程将 rlog_pkg 发送到备库;
2. 备库接收到后进行合法性校验(检查日志是否连续,备库状态是否open等),如果不合法则返回错误,合法则作为 keep_rlog_pkg 的 redo log 加入 aaply 任务队列进行 redo 重演,并响应主库日志接收成功;当有多个备库时,主库需要收到所有备库的响应信息才继续后续操作。
实时主备系统具备数据实时同步、主备切换、自动故障转移、自动数据同步、备库接管、备库强制接管等优势。
1. 部署规划(IP规划 + 端口规划):
主机名 | 服务IP | 心跳IP | 数据库名 | 实例名 |
dmdb01 | 192.168.56.11 | 10.0.0.11 | dmdb | dw1 |
dmdb02 | 192.168.56.22 | 10.0.0.22 | dmdb | dw2 |
实例名 | 实例端口 | MAL监听端口 | 实例本地守护进程监听端口 | 实例监听守护进程监听端口 |
dw1 | 5236 | 7336 | 7436 | 7536 |
dw2 | 5236 | 7336 | 7436 | 7536 |
2. 操作系统配置
所有节点执行
cat >> etc/sysctl.conf <<EOF
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
EOF
sysctp -p
# 配置资源限制
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
# 关闭透明大页
vi etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off transparent_hugepage=never"
grub2-mkconfig -o etc/grub2.cfg
reboot now
# 禁用swap分区
vi etc/fstab
# 注释swap分区配置
swapoff
复制
3. 用户、目录和环境变量配置
所有节点执行
groupadd dinstall -g 1001
useradd -g dinstall -m -d /home/dmdba -s /bin/bash -u 1001 dmdba
echo 'dmdba#2024' | passwd --stdin dmdba
mkdir -p /dmdbms /dmdata /dmbackup
chown dmdba.dinstall -R dmdbms dmdata dmbackup
mount /dev/sdb dmdbms
mount /dev/sdc /dmdata
mount /dev/sdd /dmbackup
cat >> /home/dmdba/.bash_profile <<EOF
export DM_HOME=/dmdbms
export PATH=\$PATH:\$DM_HOME/bin
export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\$DM_HOME/bin
EOF
复制
4. 数据库软件安装
所有节点执行
# 上传介质到/tmp
mount -o /tmp/dm8_20240712_x86_rh7_64.iso /mnt
# 安装数据库
su - dmdba
cd mnt
./DMInstall.bin -i
选择安装程序的语言 c/C 为中文,e/E 为英文。
提示是否安装 key 文件,输入 N 跳过。
选择时区,21 即东 8 区。
选择安装类型,默认典型安装(包含所有内容)。
选择软件安装目录,默认/home/dmdba/dmdbms,输入/dmdbms设置软件安装目录
确认安装
安装完成提示使用root执行脚本:
/dmdbms/script/root/root_installer.sh
复制
5. 初始化数据库并启动实例
所有节点执行
dminit path=/dmdata page_size=32 extent_size=32 charset=1 log_size=2048 db_name=dmdb instance_name=dmdb SYSDBA_PWD="dameng#2024" SYSAUDITOR_PWD="dameng#2024"
dmserver dmdata/dmdb/dm.ini
# 系统出现system is ready后输入 exit 停止数据库
复制
6. 脱机备份主数据库
主节点执行
# 检查damp服务是否已经启动
ps -ef | grep dmap
# 如果没有启动,需要手动启动
DmAPService start
# 启动 dmrman 备份工具
dmrman use_ap=2
backup database '/dmdata/dmdb/dm.ini' backupset '/home/dmdba/bak';
复制
7. 执行备份还原备库
# 将备份文件/home/dmdba/bak 文件拷贝到备库服务器上
dmrman
restore database '/dmdata/dmdb/dm.ini' from backupset '/home/dmdba/bak';
recover database '/dmdata/dmdb/dm.ini' from backupset '/home/dmdba/bak';
recover database '/dmdata/dmdb/dm.ini' update db_magic;
复制
8. 修改 dm.ini 配置参数
主库修改参数如下:
vi dmdata/dmdb/dm.ini
INSTANCE_NAME = dw1
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
RLOG_APPEND_LOGIC = 1
备库修改参数如下:
INSTANCE_NAME = dw2
MAL_INI = 1
ARCH_INI = 1
ALTER_MODE_STATUS = 0
ENABLE_OFFLINE_TS = 2
RLOG_APPEND_LOGIC = 1
复制
9. 配置归档配置文件 dmarch.ini
主库执行:
cat > dmdata/dmdb/dmarch.ini <<EOF
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = dw2
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = dmdata/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
EOF
备库执行
cat > /dmdata/dmdb/dmarch.ini <<EOF
[ARCHIVE_REALTIME1]
ARCH_TYPE = REALTIME
ARCH_DEST = dw1
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dmdata/arch
ARCH_FILE_SIZE = 2048
ARCH_SPACE_LIMIT = 102400
EOF
复制
10. 配置MAL系统配置文件 dmmal.ini
主备节点执行:
cat > /dmdata/dmdb/dmmal.ini <<EOF
MAL_CHECK_INTERVAL = 5
MAL_CONN_FAIL_INTERVAL = 15
[MAL_INST1]
MAL_INST_NAME = dw1
MAL_HOST = 10.0.0.11
MAL_PORT = 7336
MAL_INST_HOST = 192.168.56.11
MAL_INST_PORT = 5236
MAL_DW_PORT = 7436
MAL_INST_DW_PORT = 7536
[MAL_INST2]
MAL_INST_NAME = dw2
MAL_HOST = 10.0.0.22
MAL_PORT = 7336
MAL_INST_HOST = 192.168.56.22
MAL_INST_PORT = 5236
MAL_DW_PORT = 7436
MAL_INST_DW_PORT = 7536
EOF
复制
11. 配置守护进程配置文件 dmwatcher.ini
主备节点执行:
cat > /dmdata/dmdb/dmmal.ini <<EOF
[GRP_DW]
DW_TYPE = GLOBAL
DW_MODE = MANUAL
DW_ERROR_TIME = 30
INST_RECOVER_TIME = 60
INST_ERROR_TIME = 20
INST_OGUID = 453331
INST_INI = /dmdata/dmdb/dm.ini
INST_AUTO_RESTART = 1
INST_STARTUP_CMD = /home/dmdba/dmdbms/bin/DmServiceDW start
EOF
复制
12. 注册服务
注册守护进程服务(主备库都执行):
cd /dmdata/script/root
./dm_service_installer.sh -t dmwatcher -p DW -watcher_ini /dmdata/dmdb/dmwatcher.ini
注册数据库实例服务(主备库都执行):
./dm_service_installer.sh -t dmserver -p DW -dm_ini /dmdata/dmdb/dm.ini
复制
13. 启动集群
主备库执行:
dmserver /dmdata/dmdb/dm.ini mount
# 在新的终端使用 disql 工具连接数据库
./disql SYSDBA/'"dameng#2024"'
# 主备库都修改 oguid,执行以下命令:
sp_set_oguid(453331);
# 主库dmdb01上修改数据库模式为 primary,执行以下命令:
alter database primary;
# 备库dmdb02上修改数据库模式为 standby,执行以下命令:
alter database standby;
# 启动守护进程(主备库执行)
dmwatcher /dmdata/dmdb/dmwatcher.ini
# 守护进程启动成功后,会将mount的实例open起来
复制
14. 配置并启动监视器
可以在任意的主备节点上配置,生产系统最好独立一台主机部署,注意需要安装有DM数据库软件,并且与主备心跳网络端口开放
cat >> /dmdata/dmdb/dmmonitor.ini <<EOF
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 = 10.0.0.11:7436
MON_DW_IP = 10.0.0.22:7436
EOF
dmmonitor /dmdata/dmdb/dmmonitor.ini
复制
15. 配置sql日志
主备节点执行
cat >> /dmdata/dmdb/sqllog.ini <<EOF
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 = 2:3:25
MIN_EXEC_TIME = 1500
USER_MODE = 0
USERS =
EOF
复制
16. 验证主备节点同步状态
# 主库执行写入
disql SYSDBA/'"dameng#2024"'@192.168.56.11:5236
create table test(id int);
insert into test values (1);
commit;
# 备库检查写入,确认数据是否同步
disql SYSDBA/'"dameng#2024"'@192.168.56.22:5236
select * from test;
复制
17. 执行主备参数优化
disql SYSDBA/'"dameng#2024"'@localhost:5236 \`Para_Optimization.sql
复制
18. 主备库重启
# 关闭主库守护进程:
systemctl stop DmWatcherServiceDW
# 关闭备库守护进程:
systemctl stop DmWatcherServiceDW
# 关闭主库实例:
systemctl stop DmServiceDW
# 关闭备库实例:
systemctl stop DmServiceDW
# 启动主库实例:
systemctl start DmServiceDW
# 启动备库实例:
systemctl start DmServiceDW
# 启动主库守护进程:
systemctl start DmWatcherServiceDW
# 启动备库守护进程:
systemctl start DmWatcherServiceDW
复制
19. 备份策略配置
1. 全量备份:每周六凌晨2点
2. 增量备份:除周六外每天凌晨2点
3. 删除备份:每天凌晨3点
disql SYSDBA/'"dameng#2024"'@localhost:5236
-- 创建作业系统表
SP_INIT_JOB_SYS(1);
-- 全量备份(每周六凌晨2点)
call SP_CREATE_JOB('bakfull',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakfull');
call SP_ADD_JOB_STEP('bakfull', 'bak1', 6, '/dmbackup', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakfull', 'std1', 1, 2, 1, 64, 0, '23:00:00', NULL, '2024-09-01 20:00:00', NULL, '');
call SP_ADD_JOB_SCHEDULE('bakfull', 'once', 1, 0, 0, 0, 0, NULL, NULL, sysdate+1/1440, NULL, '');
call SP_JOB_CONFIG_COMMIT('bakfull');
-- 增量备份(除周六外每天凌晨2点)
call SP_CREATE_JOB('bakincr',1,0,'',0,0,'',0,'');
call SP_JOB_CONFIG_START('bakincr');
call SP_ADD_JOB_STEP('bakincr', 'bak2', 6, '/dmbackup', 0, 0, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('bakincr', 'std2', 1, 2, 1, 63, 0, '23:00:00', NULL, '2024-09-01 20:01:00', NULL, '');
call SP_JOB_CONFIG_COMMIT('bakincr');
-- 删除备份(每天凌晨3点)
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'',''/dmbackup'');
call sp_db_bakset_remove_batch(''DISK'',now()-14);', 1, 2, 0, 0, NULL, 0);
call SP_ADD_JOB_SCHEDULE('delbak', 'del01', 1, 1, 1, 0, 0, '23:30:00', NULL, '2024-09-01 20:03:00', NULL, '');
call SP_JOB_CONFIG_COMMIT('delbak')
复制
20. 配置自动收集统计信息任务
每周六凌晨1点开始收集
disql SYSDBA/'"dameng#2024"'@localhost:5236
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, '2024-09-06 20:10:37', NULL, '');
call SP_JOB_CONFIG_COMMIT('statistics')
复制
21. 客户端连接集群
# 修改配置之后,需要重启客户端程序生效
vi /etc/dm_svc.conf
# 全局配置区
DMDW=(192.168.56.11:5236,192.168.56.22:5236)
TIME_ZONE=(+480)
LOGIN_ENCRYPT=(0)
DIRECT=(Y)
[DMDW]
LOGIN_MODE=(1)
# 客户端程序连接数据库时,需要指定IP端口处替换为服务名,如jdbc的url为:
jdbc:dm://DMDW
复制
本文内容就到这啦,阅读完本篇,相信你已经掌握对达梦数据库的主备形态的标准化部署了吧!我们下篇再见!
