本文档详细介绍DM数据库灾备方案设计的方法和技巧,包括灾备概念、灾备级别、灾备的重要性、灾备规划、灾备架构、灾备最佳实践、灾备实施、灾备测试、灾备维护等内容,风哥教程参考DM官方文档《DM8高可用与集群》手册,适合DBA人员进行DM数据库的灾备方案设计。
Part01-基础概念与理论知识
1.1 DM数据库灾备概念
DM数据库灾备是指通过技术手段,在主数据库发生灾难时,能够快速恢复数据库服务,确保业务的连续性。灾备包括备份、恢复、高可用等多个方面,是数据库安全的重要组成部分。
灾备的目标:
- 业务连续性:确保数据库服务的持续可用
- 数据完整性:确保数据不丢失
- 快速恢复:在灾难发生后能够快速恢复服务
- 最小化损失:减少灾难对业务的影响
1.2 DM数据库灾备级别
DM数据库灾备级别:
# 灾备级别
#
# 1. 本地灾备
– 定义:在同一数据中心内进行灾备
– 优势:距离近,网络延迟低,恢复速度快
– 劣势:无法防范数据中心级灾难
– 适用场景:防范服务器故障、存储故障等本地灾难
#
# 2. 异地灾备
– 定义:在不同数据中心之间进行灾备
– 优势:可以防范数据中心级灾难
– 劣势:网络延迟高,恢复速度相对较慢
– 适用场景:防范地震、洪水等区域性灾难
#
# 3. 多中心灾备
– 定义:在多个数据中心之间进行灾备
– 优势:提供更高的可用性和容灾能力
– 劣势:成本高,管理复杂
– 适用场景:对业务连续性要求极高的关键业务
#
# 4. 灾备等级
– RTO(恢复时间目标):从灾难发生到系统恢复的时间
– RPO(恢复点目标):灾难发生后数据丢失的时间点
– 等级1:RTO < 1小时,RPO < 10分钟 - 等级2:RTO < 4小时,RPO < 30分钟 - 等级3:RTO < 24小时,RPO < 1小时
#
# 1. 本地灾备
– 定义:在同一数据中心内进行灾备
– 优势:距离近,网络延迟低,恢复速度快
– 劣势:无法防范数据中心级灾难
– 适用场景:防范服务器故障、存储故障等本地灾难
#
# 2. 异地灾备
– 定义:在不同数据中心之间进行灾备
– 优势:可以防范数据中心级灾难
– 劣势:网络延迟高,恢复速度相对较慢
– 适用场景:防范地震、洪水等区域性灾难
#
# 3. 多中心灾备
– 定义:在多个数据中心之间进行灾备
– 优势:提供更高的可用性和容灾能力
– 劣势:成本高,管理复杂
– 适用场景:对业务连续性要求极高的关键业务
#
# 4. 灾备等级
– RTO(恢复时间目标):从灾难发生到系统恢复的时间
– RPO(恢复点目标):灾难发生后数据丢失的时间点
– 等级1:RTO < 1小时,RPO < 10分钟 - 等级2:RTO < 4小时,RPO < 30分钟 - 等级3:RTO < 24小时,RPO < 1小时
1.3 DM数据库灾备的重要性
DM数据库灾备的重要性:
- 业务连续性:确保数据库服务的持续可用,减少业务中断
- 数据安全:确保数据不丢失,保护企业核心数据资产
- 合规要求:满足行业和法规的合规性要求
- 风险防范:防范各种灾难风险,如硬件故障、自然灾害、人为错误等
- 业务信心:提高客户和合作伙伴对业务的信心
- 竞争优势:在灾备能力方面具有竞争优势
- 成本控制:减少灾难带来的经济损失
- 管理效率:提高IT管理的效率和可靠性
风哥提示:
风哥提示:灾备是数据库安全的重要组成部分,通过有效的灾备措施,可以确保业务的连续性,保护数据安全,满足合规要求。
风哥提示:灾备是数据库安全的重要组成部分,通过有效的灾备措施,可以确保业务的连续性,保护数据安全,满足合规要求。
Part02-生产环境规划与建议
2.1 DM数据库灾备规划
生产环境DM数据库灾备规划:
# 灾备规划
#
# 1. 灾备需求分析
– 业务需求:根据业务特点确定灾备需求
– 合规要求:根据行业和法规要求确定灾备等级
– 风险评估:评估可能的灾难风险
– 成本预算:确定灾备实施的预算
#
# 2. 灾备目标设定
– RTO(恢复时间目标):确定从灾难发生到系统恢复的时间
– RPO(恢复点目标):确定灾难发生后数据丢失的时间点
– 可用性目标:确定系统的可用性要求
– 数据完整性目标:确定数据的完整性要求
#
# 3. 灾备方案选择
– 本地灾备:适用于防范本地灾难
– 异地灾备:适用于防范区域性灾难
– 多中心灾备:适用于对业务连续性要求极高的场景
#
# 4. 灾备技术选型
– 备份恢复:基于备份的灾备方案
– 主备复制:基于主备复制的灾备方案
– 集群:基于集群的灾备方案
– 云灾备:基于云服务的灾备方案
#
# 5. 灾备资源规划
– 硬件资源:服务器、存储、网络等
– 软件资源:数据库软件、灾备软件等
– 人力资源:灾备管理和维护人员 学习交流加群风哥微信: itpux-com
– 时间资源:灾备实施和测试时间
#
# 6. 灾备流程设计
– 灾备实施流程:灾备系统的部署和配置
– 灾备测试流程:定期测试灾备系统的有效性
– 灾备切换流程:灾难发生时的切换流程
– 灾备恢复流程:灾难后的恢复流程
#
# 7. 灾备监控与告警
– 监控内容:灾备系统的状态、性能等
– 告警机制:灾备系统异常的告警
– 监控工具:使用专业的监控工具
#
# 8. 灾备文档与培训
– 灾备文档:灾备方案、操作手册等
– 人员培训:对相关人员进行培训
– 演练计划:定期进行灾备演练
#
# 1. 灾备需求分析
– 业务需求:根据业务特点确定灾备需求
– 合规要求:根据行业和法规要求确定灾备等级
– 风险评估:评估可能的灾难风险
– 成本预算:确定灾备实施的预算
#
# 2. 灾备目标设定
– RTO(恢复时间目标):确定从灾难发生到系统恢复的时间
– RPO(恢复点目标):确定灾难发生后数据丢失的时间点
– 可用性目标:确定系统的可用性要求
– 数据完整性目标:确定数据的完整性要求
#
# 3. 灾备方案选择
– 本地灾备:适用于防范本地灾难
– 异地灾备:适用于防范区域性灾难
– 多中心灾备:适用于对业务连续性要求极高的场景
#
# 4. 灾备技术选型
– 备份恢复:基于备份的灾备方案
– 主备复制:基于主备复制的灾备方案
– 集群:基于集群的灾备方案
– 云灾备:基于云服务的灾备方案
#
# 5. 灾备资源规划
– 硬件资源:服务器、存储、网络等
– 软件资源:数据库软件、灾备软件等
– 人力资源:灾备管理和维护人员 学习交流加群风哥微信: itpux-com
– 时间资源:灾备实施和测试时间
#
# 6. 灾备流程设计
– 灾备实施流程:灾备系统的部署和配置
– 灾备测试流程:定期测试灾备系统的有效性
– 灾备切换流程:灾难发生时的切换流程
– 灾备恢复流程:灾难后的恢复流程
#
# 7. 灾备监控与告警
– 监控内容:灾备系统的状态、性能等
– 告警机制:灾备系统异常的告警
– 监控工具:使用专业的监控工具
#
# 8. 灾备文档与培训
– 灾备文档:灾备方案、操作手册等
– 人员培训:对相关人员进行培训
– 演练计划:定期进行灾备演练
2.2 DM数据库灾备架构
DM数据库灾备架构:
灾备架构类型:
- 备份恢复架构:基于定期备份的灾备方案
- 主备架构:基于主备复制的灾备方案
- 集群架构:基于集群的灾备方案
- 多中心架构:基于多数据中心的灾备方案
2.3 DM数据库灾备最佳实践
DM数据库灾备最佳实践:
# 灾备最佳实践
#
# 1. 灾备方案设计
– 基于业务需求:根据业务特点设计灾备方案
– 分层设计:采用多层灾备策略
– 冗余设计:确保灾备系统的可靠性
– 可扩展性:考虑业务增长的需求
#
# 2. 灾备技术选择
– 选择适合的灾备技术:根据业务需求选择合适的灾备技术
– 混合使用:结合多种灾备技术,提高灾备效果
– 技术成熟度:选择成熟可靠的灾备技术
– 成本效益:平衡灾备成本和效益 学习交流加群风哥QQ113257174
#
# 3. 灾备实施
– 详细规划:制定详细的灾备实施计划
– 测试验证:在实施过程中进行测试验证
– 文档记录:记录灾备实施过程和配置
– 培训人员:对相关人员进行培训
#
# 4. 灾备测试
– 定期测试:定期进行灾备测试
– 全面测试:测试灾备系统的各个方面
– 模拟灾难:模拟各种灾难场景
– 记录结果:记录测试结果和改进措施
#
# 5. 灾备维护
– 定期检查:定期检查灾备系统的状态
– 及时更新:及时更新灾备系统的配置和软件
– 监控告警:建立灾备系统的监控和告警机制
– 文档更新:及时更新灾备文档
#
# 6. 灾备切换
– 切换流程:制定详细的切换流程
– 切换演练:定期进行切换演练
– 切换决策:明确切换决策的流程和责任
– 切换验证:切换后进行验证
#
# 7. 灾备恢复
– 恢复流程:制定详细的恢复流程
– 恢复测试:定期进行恢复测试
– 恢复验证:恢复后进行验证
– 恢复文档:记录恢复过程和结果
#
# 8. 灾备管理
– 责任明确:明确灾备管理的责任
– 流程规范:建立规范的灾备管理流程
– 持续改进:根据实际情况持续改进灾备方案
– 经验总结:总结灾备管理的经验
#
# 1. 灾备方案设计
– 基于业务需求:根据业务特点设计灾备方案
– 分层设计:采用多层灾备策略
– 冗余设计:确保灾备系统的可靠性
– 可扩展性:考虑业务增长的需求
#
# 2. 灾备技术选择
– 选择适合的灾备技术:根据业务需求选择合适的灾备技术
– 混合使用:结合多种灾备技术,提高灾备效果
– 技术成熟度:选择成熟可靠的灾备技术
– 成本效益:平衡灾备成本和效益 学习交流加群风哥QQ113257174
#
# 3. 灾备实施
– 详细规划:制定详细的灾备实施计划
– 测试验证:在实施过程中进行测试验证
– 文档记录:记录灾备实施过程和配置
– 培训人员:对相关人员进行培训
#
# 4. 灾备测试
– 定期测试:定期进行灾备测试
– 全面测试:测试灾备系统的各个方面
– 模拟灾难:模拟各种灾难场景
– 记录结果:记录测试结果和改进措施
#
# 5. 灾备维护
– 定期检查:定期检查灾备系统的状态
– 及时更新:及时更新灾备系统的配置和软件
– 监控告警:建立灾备系统的监控和告警机制
– 文档更新:及时更新灾备文档
#
# 6. 灾备切换
– 切换流程:制定详细的切换流程
– 切换演练:定期进行切换演练
– 切换决策:明确切换决策的流程和责任
– 切换验证:切换后进行验证
#
# 7. 灾备恢复
– 恢复流程:制定详细的恢复流程
– 恢复测试:定期进行恢复测试
– 恢复验证:恢复后进行验证
– 恢复文档:记录恢复过程和结果
#
# 8. 灾备管理
– 责任明确:明确灾备管理的责任
– 流程规范:建立规范的灾备管理流程
– 持续改进:根据实际情况持续改进灾备方案
– 经验总结:总结灾备管理的经验
Part03-生产环境项目实施方案
3.1 DM数据库灾备实施
3.1.1 本地灾备实施
# 本地灾备实施
#
# 1. 备份策略设计
##
# 全量备份
– 频率:每周一次
– 时间:周末凌晨 更多视频教程www.fgedu.net.cn
– 存储:本地磁盘或磁带
##
# 增量备份
– 频率:每天一次
– 时间:凌晨
– 存储:本地磁盘
##
# 日志备份
– 频率:每小时一次
– 存储:本地磁盘
#
# 2. 备份配置
##
# 配置备份目录
$ mkdir -p /dm/backup/full /dm/backup/incremental /dm/backup/log
##
# 配置备份脚本
#!/bin/bash
# full_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d)
BACkUP_DIR=/dm/backup/full
mkdir -p $BACkUP_DIR
disql SYSDBA/SYSDBA << EOF backup database full to '$BACkUP_DIR/full_$DATE.bak' compressed; EOF echo "全量备份完成:$BACkUP_DIR/full_$DATE.bak" ### 配置增量备份脚本 #!/bin/bash # incremental_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d) BACkUP_DIR=/dm/backup/incremental mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup database incremental to '$BACkUP_DIR/incremental_$DATE.bak' compressed; EOF echo "增量备份完成:$BACkUP_DIR/incremental_$DATE.bak" ### 配置日志备份脚本 #!/bin/bash # log_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d_%H%M%S) BACkUP_DIR=/dm/backup/log mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup archive log all to '$BACkUP_DIR/log_$DATE.bak' compressed; EOF echo "日志备份完成:$BACkUP_DIR/log_$DATE.bak" ## 3. 配置定时任务 ## # 全量备份 $ crontab -e 0 2 * * 0 /dm/scripts/full_backup.sh ## # 增量备份 $ crontab -e 0 1 * * 1-6 /dm/scripts/incremental_backup.sh ## # 日志备份 $ crontab -e 0 * * * * /dm/scripts/log_backup.sh # # 4. 验证备份 ## # 查看备份集 $ disql SYSDBA/SYSDBA SQL> select * from v$backup_set;
##
# 验证备份集
SQL> validate backup set ‘/dm/backup/full/full_20250409.bak’;
#
# 5. 恢复测试
##
# 模拟故障
$ rm -rf /dm/fgdata/fgedudb/* 更多学习教程公众号风哥教程itpux_com
##
# 恢复数据库
$ /dm/app/bin/DmServicefgedudb stop
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset ‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset ‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ with archivedir ‘/dm/backup/log’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
$ /dm/app/bin/DmServicefgedudb start
##
# 验证恢复
SQL> select * from fgedu.t_user;
#
# 1. 备份策略设计
##
# 全量备份
– 频率:每周一次
– 时间:周末凌晨 更多视频教程www.fgedu.net.cn
– 存储:本地磁盘或磁带
##
# 增量备份
– 频率:每天一次
– 时间:凌晨
– 存储:本地磁盘
##
# 日志备份
– 频率:每小时一次
– 存储:本地磁盘
#
# 2. 备份配置
##
# 配置备份目录
$ mkdir -p /dm/backup/full /dm/backup/incremental /dm/backup/log
##
# 配置备份脚本
#!/bin/bash
# full_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d)
BACkUP_DIR=/dm/backup/full
mkdir -p $BACkUP_DIR
disql SYSDBA/SYSDBA << EOF backup database full to '$BACkUP_DIR/full_$DATE.bak' compressed; EOF echo "全量备份完成:$BACkUP_DIR/full_$DATE.bak" ### 配置增量备份脚本 #!/bin/bash # incremental_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d) BACkUP_DIR=/dm/backup/incremental mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup database incremental to '$BACkUP_DIR/incremental_$DATE.bak' compressed; EOF echo "增量备份完成:$BACkUP_DIR/incremental_$DATE.bak" ### 配置日志备份脚本 #!/bin/bash # log_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d_%H%M%S) BACkUP_DIR=/dm/backup/log mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup archive log all to '$BACkUP_DIR/log_$DATE.bak' compressed; EOF echo "日志备份完成:$BACkUP_DIR/log_$DATE.bak" ## 3. 配置定时任务 ## # 全量备份 $ crontab -e 0 2 * * 0 /dm/scripts/full_backup.sh ## # 增量备份 $ crontab -e 0 1 * * 1-6 /dm/scripts/incremental_backup.sh ## # 日志备份 $ crontab -e 0 * * * * /dm/scripts/log_backup.sh # # 4. 验证备份 ## # 查看备份集 $ disql SYSDBA/SYSDBA SQL> select * from v$backup_set;
##
# 验证备份集
SQL> validate backup set ‘/dm/backup/full/full_20250409.bak’;
#
# 5. 恢复测试
##
# 模拟故障
$ rm -rf /dm/fgdata/fgedudb/* 更多学习教程公众号风哥教程itpux_com
##
# 恢复数据库
$ /dm/app/bin/DmServicefgedudb stop
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset ‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset ‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ with archivedir ‘/dm/backup/log’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
$ /dm/app/bin/DmServicefgedudb start
##
# 验证恢复
SQL> select * from fgedu.t_user;
3.1.2 异地灾备实施
# 异地灾备实施
#
# 1. 环境准备
##
# 主库环境
– 主机名:fgedu-primary
– IP地址:192.168.1.100
– 数据库:fgedudb
– 端口:5236
##
# 备库环境
– 主机名:fgedu-standby
– IP地址:192.168.2.100
– 数据库:fgedudb
– 端口:5236
#
# 2. 主库配置
##
# 启用归档模式
$ disql SYSDBA/SYSDBA
SQL> alter database mount;
SQL> alter database archivelog; from DB视频:www.itpux.com
SQL> alter database add archivelog ‘dest=/dm/arch,type=local,file_size=1024,space_limit=10240’;
SQL> alter database open;
##
# 配置主库参数
SQL> alter system set ‘ARCH_SEND_DEST’ = ‘192.168.2.100:5236’ scope=spfile;
SQL> alter system set ‘ARCH_SEND_FLAG’ = 1 scope=spfile;
SQL> alter system set ‘RLOG_SEND_APPLY_MON’ = 60 scope=spfile;
##
# 重启主库
$ /dm/app/bin/DmServicefgedudb restart
#
# 3. 备库配置
##
# 复制主库数据文件
$ scp -r /dm/fgdata/fgedudb/* fgedu-standby:/dm/fgdata/fgedudb/
##
# 配置备库参数
$ vi /dm/app/conf/dm.ini
INSTANCE_NAME = fgedudb_standby
PORT_NUM = 5236
ARCH_INI = 1
##
# 配置备库归档
$ vi /dm/app/conf/dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = 192.168.1.100:5236
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
##
# 启动备库
$ /dm/app/bin/dmserver /dm/app/conf/dm.ini mount
$ /dm/app/bin/disql SYSDBA/SYSDBA
SQL> alter database standby;
SQL> alter database open;
#
# 4. 验证主备同步
##
# 查看主库状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 查看备库状态
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 测试数据同步
SQL> insert into fgedu.t_user values (1, ‘测试数据’);
SQL> commit;
##
# 验证备库数据
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from fgedu.t_user;
#
# 5. 切换测试
##
# 手动切换
$ disql SYSDBA/SYSDBA
SQL> alter database switchover to standby;
##
# 验证切换后的主库
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
##
# 回切
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
#
# 6. 监控与维护
##
# 监控主备状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$dm_ini where para_name like ‘%ARCH%’;
SQL> select * from v$archive_status;
##
# 定期检查同步状态
$ /dm/scripts/check_standby.sh
##
# 监控脚本
#!/bin/bash
# check_standby.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d_%H%M%S)
LOG_DIR=/dm/log/monitor
mkdir -p $LOG_DIR
disql SYSDBA/SYSDBA << EOF spool $LOG_DIR/standby_status_$DATE.txt select '=== 主库状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; select '=== 主备同步状态 ===' from dual; select * from v$dm_ini where para_name like '%ARCH%' ; spool off EOF echo "主备状态检查完成:$LOG_DIR/standby_status_$DATE.txt"
#
# 1. 环境准备
##
# 主库环境
– 主机名:fgedu-primary
– IP地址:192.168.1.100
– 数据库:fgedudb
– 端口:5236
##
# 备库环境
– 主机名:fgedu-standby
– IP地址:192.168.2.100
– 数据库:fgedudb
– 端口:5236
#
# 2. 主库配置
##
# 启用归档模式
$ disql SYSDBA/SYSDBA
SQL> alter database mount;
SQL> alter database archivelog; from DB视频:www.itpux.com
SQL> alter database add archivelog ‘dest=/dm/arch,type=local,file_size=1024,space_limit=10240’;
SQL> alter database open;
##
# 配置主库参数
SQL> alter system set ‘ARCH_SEND_DEST’ = ‘192.168.2.100:5236’ scope=spfile;
SQL> alter system set ‘ARCH_SEND_FLAG’ = 1 scope=spfile;
SQL> alter system set ‘RLOG_SEND_APPLY_MON’ = 60 scope=spfile;
##
# 重启主库
$ /dm/app/bin/DmServicefgedudb restart
#
# 3. 备库配置
##
# 复制主库数据文件
$ scp -r /dm/fgdata/fgedudb/* fgedu-standby:/dm/fgdata/fgedudb/
##
# 配置备库参数
$ vi /dm/app/conf/dm.ini
INSTANCE_NAME = fgedudb_standby
PORT_NUM = 5236
ARCH_INI = 1
##
# 配置备库归档
$ vi /dm/app/conf/dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = 192.168.1.100:5236
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
##
# 启动备库
$ /dm/app/bin/dmserver /dm/app/conf/dm.ini mount
$ /dm/app/bin/disql SYSDBA/SYSDBA
SQL> alter database standby;
SQL> alter database open;
#
# 4. 验证主备同步
##
# 查看主库状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 查看备库状态
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 测试数据同步
SQL> insert into fgedu.t_user values (1, ‘测试数据’);
SQL> commit;
##
# 验证备库数据
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from fgedu.t_user;
#
# 5. 切换测试
##
# 手动切换
$ disql SYSDBA/SYSDBA
SQL> alter database switchover to standby;
##
# 验证切换后的主库
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
##
# 回切
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
#
# 6. 监控与维护
##
# 监控主备状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$dm_ini where para_name like ‘%ARCH%’;
SQL> select * from v$archive_status;
##
# 定期检查同步状态
$ /dm/scripts/check_standby.sh
##
# 监控脚本
#!/bin/bash
# check_standby.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d_%H%M%S)
LOG_DIR=/dm/log/monitor
mkdir -p $LOG_DIR
disql SYSDBA/SYSDBA << EOF spool $LOG_DIR/standby_status_$DATE.txt select '=== 主库状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; select '=== 主备同步状态 ===' from dual; select * from v$dm_ini where para_name like '%ARCH%' ; spool off EOF echo "主备状态检查完成:$LOG_DIR/standby_status_$DATE.txt"
3.1.3 多中心灾备实施
# 多中心灾备实施
#
# 1. 环境准备
##
# 主中心
– 主机名:fgedu-primary
– IP地址:192.168.1.100
– 数据库:fgedudb
– 端口:5236
##
# 灾备中心
– 主机名:fgedu-standby
– IP地址:192.168.2.100
– 数据库:fgedudb
– 端口:5236
##
# 第三中心
– 主机名:fgedu-third
– IP地址:192.168.3.100
– 数据库:fgedudb
– 端口:5236
#
# 2. 主中心配置
##
# 启用归档模式
$ disql SYSDBA/SYSDBA
SQL> alter database mount;
SQL> alter database archivelog;
SQL> alter database add archivelog
‘dest=/dm/arch,type=local,file_size=1024,space_limit=10240’;
SQL> alter system set ‘ARCH_SEND_DEST’ = ‘192.168.2.100:5236,192.168.3.100:5236’
scope=spfile;
SQL> alter system set ‘ARCH_SEND_FLAG’ = 1 scope=spfile;
SQL> alter database open;
#
# 3. 灾备中心配置
##
# 复制主库数据文件
$ scp -r /dm/fgdata/fgedudb/* fgedu-standby:/dm/fgdata/fgedudb/
##
# 配置备库参数
$ vi /dm/app/conf/dm.ini
INSTANCE_NAME = fgedudb_standby
PORT_NUM = 5236
ARCH_INI = 1
##
# 配置备库归档
$ vi /dm/app/conf/dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = 192.168.1.100:5236
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
##
# 启动备库
$ /dm/app/bin/dmserver /dm/app/conf/dm.ini mount
$ /dm/app/bin/disql SYSDBA/SYSDBA
SQL> alter database standby;
SQL> alter database open;
#
# 4. 第三中心配置
##
# 复制主库数据文件
$ scp -r /dm/fgdata/fgedudb/* fgedu-third:/dm/fgdata/fgedudb/
##
# 配置备库参数
$ vi /dm/app/conf/dm.ini
INSTANCE_NAME = fgedudb_third
PORT_NUM = 5236
ARCH_INI = 1
##
# 配置备库归档
$ vi /dm/app/conf/dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = 192.168.1.100:5236
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
##
# 启动备库
$ /dm/app/bin/dmserver /dm/app/conf/dm.ini mount
$ /dm/app/bin/disql SYSDBA/SYSDBA
SQL> alter database standby;
SQL> alter database open;
#
# 5. 验证多中心同步
##
# 查看主库状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 查看灾备中心状态
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 查看第三中心状态
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 测试数据同步
SQL> insert into fgedu.t_user values (1, ‘测试数据’);
SQL> commit;
##
# 验证备库数据
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from fgedu.t_user;
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> select * from fgedu.t_user;
#
# 6. 多中心切换测试
##
# 主中心故障切换到灾备中心
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证灾备中心成为主库
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
##
# 灾备中心故障切换到第三中心
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> alter database switchover to primary;
##
# 验证第三中心成为主库
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> select * from v$instance;
#
# 7. 监控与维护
##
# 监控多中心状态
$ /dm/scripts/check_multi_standby.sh
##
# 监控脚本
#!/bin/bash
# check_multi_standby.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d_%H%M%S)
LOG_DIR=/dm/log/monitor
mkdir -p $LOG_DIR
disql SYSDBA/SYSDBA << EOF spool $LOG_DIR/multi_standby_status_$DATE.txt select '=== 主中心状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; select '=== 主备同步状态 ===' from dual; select * from v$dm_ini where para_name like '%ARCH%' ; spool off EOF disql SYSDBA/SYSDBA@192.168.2.100:5236 << EOF spool $LOG_DIR/standby_status_$DATE.txt select '=== 灾备中心状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; spool off EOF disql SYSDBA/SYSDBA@192.168.3.100:5236 << EOF spool $LOG_DIR/third_status_$DATE.txt select '=== 第三中心状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; spool off EOF echo "多中心状态检查完成:$LOG_DIR/multi_standby_status_$DATE.txt"
#
# 1. 环境准备
##
# 主中心
– 主机名:fgedu-primary
– IP地址:192.168.1.100
– 数据库:fgedudb
– 端口:5236
##
# 灾备中心
– 主机名:fgedu-standby
– IP地址:192.168.2.100
– 数据库:fgedudb
– 端口:5236
##
# 第三中心
– 主机名:fgedu-third
– IP地址:192.168.3.100
– 数据库:fgedudb
– 端口:5236
#
# 2. 主中心配置
##
# 启用归档模式
$ disql SYSDBA/SYSDBA
SQL> alter database mount;
SQL> alter database archivelog;
SQL> alter database add archivelog
‘dest=/dm/arch,type=local,file_size=1024,space_limit=10240’;
SQL> alter system set ‘ARCH_SEND_DEST’ = ‘192.168.2.100:5236,192.168.3.100:5236’
scope=spfile;
SQL> alter system set ‘ARCH_SEND_FLAG’ = 1 scope=spfile;
SQL> alter database open;
#
# 3. 灾备中心配置
##
# 复制主库数据文件
$ scp -r /dm/fgdata/fgedudb/* fgedu-standby:/dm/fgdata/fgedudb/
##
# 配置备库参数
$ vi /dm/app/conf/dm.ini
INSTANCE_NAME = fgedudb_standby
PORT_NUM = 5236
ARCH_INI = 1
##
# 配置备库归档
$ vi /dm/app/conf/dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = 192.168.1.100:5236
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
##
# 启动备库
$ /dm/app/bin/dmserver /dm/app/conf/dm.ini mount
$ /dm/app/bin/disql SYSDBA/SYSDBA
SQL> alter database standby;
SQL> alter database open;
#
# 4. 第三中心配置
##
# 复制主库数据文件
$ scp -r /dm/fgdata/fgedudb/* fgedu-third:/dm/fgdata/fgedudb/
##
# 配置备库参数
$ vi /dm/app/conf/dm.ini
INSTANCE_NAME = fgedudb_third
PORT_NUM = 5236
ARCH_INI = 1
##
# 配置备库归档
$ vi /dm/app/conf/dmarch.ini
[ARCHIVE_LOCAL1]
ARCH_TYPE = LOCAL
ARCH_DEST = /dm/arch
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
[ARCHIVE_REMOTE1]
ARCH_TYPE = REMOTE
ARCH_DEST = 192.168.1.100:5236
ARCH_FILE_SIZE = 1024
ARCH_SPACE_LIMIT = 10240
##
# 启动备库
$ /dm/app/bin/dmserver /dm/app/conf/dm.ini mount
$ /dm/app/bin/disql SYSDBA/SYSDBA
SQL> alter database standby;
SQL> alter database open;
#
# 5. 验证多中心同步
##
# 查看主库状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 查看灾备中心状态
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 查看第三中心状态
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> select * from v$instance;
SQL> select * from v$archive_status;
##
# 测试数据同步
SQL> insert into fgedu.t_user values (1, ‘测试数据’);
SQL> commit;
##
# 验证备库数据
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from fgedu.t_user;
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> select * from fgedu.t_user;
#
# 6. 多中心切换测试
##
# 主中心故障切换到灾备中心
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证灾备中心成为主库
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
##
# 灾备中心故障切换到第三中心
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> alter database switchover to primary;
##
# 验证第三中心成为主库
$ disql SYSDBA/SYSDBA@192.168.3.100:5236
SQL> select * from v$instance;
#
# 7. 监控与维护
##
# 监控多中心状态
$ /dm/scripts/check_multi_standby.sh
##
# 监控脚本
#!/bin/bash
# check_multi_standby.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d_%H%M%S)
LOG_DIR=/dm/log/monitor
mkdir -p $LOG_DIR
disql SYSDBA/SYSDBA << EOF spool $LOG_DIR/multi_standby_status_$DATE.txt select '=== 主中心状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; select '=== 主备同步状态 ===' from dual; select * from v$dm_ini where para_name like '%ARCH%' ; spool off EOF disql SYSDBA/SYSDBA@192.168.2.100:5236 << EOF spool $LOG_DIR/standby_status_$DATE.txt select '=== 灾备中心状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; spool off EOF disql SYSDBA/SYSDBA@192.168.3.100:5236 << EOF spool $LOG_DIR/third_status_$DATE.txt select '=== 第三中心状态 ===' from dual; select * from v$instance; select '=== 归档状态 ===' from dual; select * from v$archive_status; spool off EOF echo "多中心状态检查完成:$LOG_DIR/multi_standby_status_$DATE.txt"
3.2 DM数据库灾备测试
3.2.1 灾备测试计划
# 灾备测试计划
#
# 1. 测试目标
– 验证灾备系统的有效性
– 测试灾备切换的流程
– 评估灾备恢复的时间
– 验证数据的完整性
#
# 2. 测试类型
– 全量恢复测试:测试完整的恢复流程
– 增量恢复测试:测试基于增量备份的恢复
– 切换测试:测试主备切换的流程
– 故障演练:模拟各种故障场景
#
# 3. 测试准备
– 测试环境:准备测试环境
– 测试数据:准备测试数据
– 测试脚本:编写测试脚本
– 测试人员:安排测试人员
#
# 4. 测试流程
– 准备阶段:准备测试环境和数据
– 执行阶段:执行测试用例
– 验证阶段:验证测试结果
– 总结阶段:总结测试经验
#
# 5. 测试用例
##
# 全量恢复测试
1. 执行全量备份
2. 模拟数据库故障
3. 执行全量恢复
4. 验证数据完整性
5. 验证系统可用性
##
# 增量恢复测试
1. 执行全量备份
2. 执行增量备份
3. 模拟数据库故障
4. 执行全量恢复
5. 执行增量恢复
6. 验证数据完整性
7. 验证系统可用性
##
# 切换测试
1. 验证主备同步状态
2. 执行主备切换
3. 验证备库成为主库
4. 执行回切
5. 验证主库恢复
##
# 故障演练
1. 模拟主库故障
2. 执行灾备切换
3. 验证业务连续性
4. 恢复主库
5. 执行回切
#
# 6. 测试工具
– 备份恢复工具:dmrman
– 监控工具:Zabbix、Grafana
– 测试工具:自定义测试脚本
#
# 7. 测试报告
– 测试结果:记录测试结果
– 问题分析:分析测试中发现的问题
– 改进建议:提出改进建议
– 测试结论:总结测试结论
#
# 1. 测试目标
– 验证灾备系统的有效性
– 测试灾备切换的流程
– 评估灾备恢复的时间
– 验证数据的完整性
#
# 2. 测试类型
– 全量恢复测试:测试完整的恢复流程
– 增量恢复测试:测试基于增量备份的恢复
– 切换测试:测试主备切换的流程
– 故障演练:模拟各种故障场景
#
# 3. 测试准备
– 测试环境:准备测试环境
– 测试数据:准备测试数据
– 测试脚本:编写测试脚本
– 测试人员:安排测试人员
#
# 4. 测试流程
– 准备阶段:准备测试环境和数据
– 执行阶段:执行测试用例
– 验证阶段:验证测试结果
– 总结阶段:总结测试经验
#
# 5. 测试用例
##
# 全量恢复测试
1. 执行全量备份
2. 模拟数据库故障
3. 执行全量恢复
4. 验证数据完整性
5. 验证系统可用性
##
# 增量恢复测试
1. 执行全量备份
2. 执行增量备份
3. 模拟数据库故障
4. 执行全量恢复
5. 执行增量恢复
6. 验证数据完整性
7. 验证系统可用性
##
# 切换测试
1. 验证主备同步状态
2. 执行主备切换
3. 验证备库成为主库
4. 执行回切
5. 验证主库恢复
##
# 故障演练
1. 模拟主库故障
2. 执行灾备切换
3. 验证业务连续性
4. 恢复主库
5. 执行回切
#
# 6. 测试工具
– 备份恢复工具:dmrman
– 监控工具:Zabbix、Grafana
– 测试工具:自定义测试脚本
#
# 7. 测试报告
– 测试结果:记录测试结果
– 问题分析:分析测试中发现的问题
– 改进建议:提出改进建议
– 测试结论:总结测试结论
3.2.2 灾备测试执行
# 灾备测试执行
#
# 1. 全量恢复测试
##
# 执行全量备份
$ /dm/scripts/full_backup.sh
##
# 模拟数据库故障
$ /dm/app/bin/DmServicefgedudb stop
$ rm -rf /dm/fgdata/fgedudb/*
##
# 执行全量恢复
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
##
# 启动数据库
$ /dm/app/bin/DmServicefgedudb start
##
# 验证数据完整性
$ disql SYSDBA/SYSDBA
SQL> select * from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
##
# 验证系统可用性
$ disql SYSDBA/SYSDBA
SQL> select status from v$instance;
#
# 2. 增量恢复测试
##
# 执行全量备份
$ /dm/scripts/full_backup.sh
##
# 插入测试数据
$ disql SYSDBA/SYSDBA
SQL> insert into fgedu.t_user values (100, ‘增量测试数据’);
SQL> commit;
##
# 执行增量备份
$ /dm/scripts/incremental_backup.sh
##
# 模拟数据库故障
$ /dm/app/bin/DmServicefgedudb stop
$ rm -rf /dm/fgdata/fgedudb/*
##
# 执行全量恢复
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
##
# 执行增量恢复
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/incremental/incremental_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
##
# 启动数据库
$ /dm/app/bin/DmServicefgedudb start
##
# 验证数据完整性
$ disql SYSDBA/SYSDBA
SQL> select * from fgedu.t_user where id = 100;
##
# 验证系统可用性
$ disql SYSDBA/SYSDBA
SQL> select status from v$instance;
#
# 3. 切换测试
##
# 验证主备同步状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$archive_status;
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$archive_status;
##
# 执行主备切换
$ disql SYSDBA/SYSDBA
SQL> alter database switchover to standby;
##
# 验证备库成为主库
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
##
# 插入测试数据
SQL> insert into fgedu.t_user values (200, ‘切换测试数据’);
SQL> commit;
##
# 执行回切
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证主库恢复
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from fgedu.t_user where id = 200;
#
# 4. 故障演练
##
# 模拟主库故障
$ /dm/app/bin/DmServicefgedudb stop
$ ifconfig eth0 down
##
# 执行灾备切换
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证业务连续性
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> insert into fgedu.t_user values (300, ‘故障演练数据’);
SQL> commit;
##
# 恢复主库
$ ifconfig eth0 up
$ /dm/app/bin/DmServicefgedudb start
##
# 执行回切
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证主库恢复
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from fgedu.t_user where id = 300;
#
# 1. 全量恢复测试
##
# 执行全量备份
$ /dm/scripts/full_backup.sh
##
# 模拟数据库故障
$ /dm/app/bin/DmServicefgedudb stop
$ rm -rf /dm/fgdata/fgedudb/*
##
# 执行全量恢复
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
##
# 启动数据库
$ /dm/app/bin/DmServicefgedudb start
##
# 验证数据完整性
$ disql SYSDBA/SYSDBA
SQL> select * from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
##
# 验证系统可用性
$ disql SYSDBA/SYSDBA
SQL> select status from v$instance;
#
# 2. 增量恢复测试
##
# 执行全量备份
$ /dm/scripts/full_backup.sh
##
# 插入测试数据
$ disql SYSDBA/SYSDBA
SQL> insert into fgedu.t_user values (100, ‘增量测试数据’);
SQL> commit;
##
# 执行增量备份
$ /dm/scripts/incremental_backup.sh
##
# 模拟数据库故障
$ /dm/app/bin/DmServicefgedudb stop
$ rm -rf /dm/fgdata/fgedudb/*
##
# 执行全量恢复
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
##
# 执行增量恢复
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/incremental/incremental_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
##
# 启动数据库
$ /dm/app/bin/DmServicefgedudb start
##
# 验证数据完整性
$ disql SYSDBA/SYSDBA
SQL> select * from fgedu.t_user where id = 100;
##
# 验证系统可用性
$ disql SYSDBA/SYSDBA
SQL> select status from v$instance;
#
# 3. 切换测试
##
# 验证主备同步状态
$ disql SYSDBA/SYSDBA
SQL> select * from v$archive_status;
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$archive_status;
##
# 执行主备切换
$ disql SYSDBA/SYSDBA
SQL> alter database switchover to standby;
##
# 验证备库成为主库
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> select * from v$instance;
##
# 插入测试数据
SQL> insert into fgedu.t_user values (200, ‘切换测试数据’);
SQL> commit;
##
# 执行回切
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证主库恢复
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from fgedu.t_user where id = 200;
#
# 4. 故障演练
##
# 模拟主库故障
$ /dm/app/bin/DmServicefgedudb stop
$ ifconfig eth0 down
##
# 执行灾备切换
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证业务连续性
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> insert into fgedu.t_user values (300, ‘故障演练数据’);
SQL> commit;
##
# 恢复主库
$ ifconfig eth0 up
$ /dm/app/bin/DmServicefgedudb start
##
# 执行回切
$ disql SYSDBA/SYSDBA@192.168.2.100:5236
SQL> alter database switchover to primary;
##
# 验证主库恢复
$ disql SYSDBA/SYSDBA
SQL> select * from v$instance;
SQL> select * from fgedu.t_user where id = 300;
3.3 DM数据库灾备维护
3.3.1 灾备维护计划
# 灾备维护计划
#
# 1. 日常维护
– 备份检查:检查备份是否成功
– 同步检查:检查主备同步状态
– 空间检查:检查备份存储空间
– 日志检查:检查数据库日志
#
# 2. 定期维护
– 备份测试:定期测试备份的有效性
– 切换测试:定期测试主备切换
– 性能检查:检查灾备系统的性能
– 安全检查:检查灾备系统的安全
#
# 3. 维护任务
##
# 备份维护
– 清理过期备份:定期清理过期的备份文件
– 备份验证:定期验证备份的完整性
– 备份策略调整:根据业务需求调整备份策略
##
# 主备维护
– 同步状态检查:定期检查主备同步状态
– 网络检查:检查主备之间的网络连接
– 参数调整:根据业务需求调整主备参数
– 软件更新:及时更新数据库软件和补丁
##
# 存储维护
– 空间管理:定期检查和清理存储空间
– 性能优化:优化存储性能
– 故障预防:预防存储故障
##
# 监控维护
– 监控配置:配置和调整监控参数
– 告警管理:管理和处理告警
– 监控工具更新:更新监控工具
#
# 4. 维护工具
– 备份管理工具:管理备份文件
– 监控工具:监控灾备系统状态
– 自动化脚本:自动化维护任务
– 日志分析工具:分析数据库日志
#
# 5. 维护文档
– 维护计划:制定详细的维护计划
– 维护记录:记录维护过程和结果
– 问题记录:记录维护中发现的问题
– 改进措施:记录改进措施
#
# 1. 日常维护
– 备份检查:检查备份是否成功
– 同步检查:检查主备同步状态
– 空间检查:检查备份存储空间
– 日志检查:检查数据库日志
#
# 2. 定期维护
– 备份测试:定期测试备份的有效性
– 切换测试:定期测试主备切换
– 性能检查:检查灾备系统的性能
– 安全检查:检查灾备系统的安全
#
# 3. 维护任务
##
# 备份维护
– 清理过期备份:定期清理过期的备份文件
– 备份验证:定期验证备份的完整性
– 备份策略调整:根据业务需求调整备份策略
##
# 主备维护
– 同步状态检查:定期检查主备同步状态
– 网络检查:检查主备之间的网络连接
– 参数调整:根据业务需求调整主备参数
– 软件更新:及时更新数据库软件和补丁
##
# 存储维护
– 空间管理:定期检查和清理存储空间
– 性能优化:优化存储性能
– 故障预防:预防存储故障
##
# 监控维护
– 监控配置:配置和调整监控参数
– 告警管理:管理和处理告警
– 监控工具更新:更新监控工具
#
# 4. 维护工具
– 备份管理工具:管理备份文件
– 监控工具:监控灾备系统状态
– 自动化脚本:自动化维护任务
– 日志分析工具:分析数据库日志
#
# 5. 维护文档
– 维护计划:制定详细的维护计划
– 维护记录:记录维护过程和结果
– 问题记录:记录维护中发现的问题
– 改进措施:记录改进措施
3.3.2 灾备维护执行
# 灾备维护执行
#
# 1. 日常维护
##
# 备份检查
$ /dm/scripts/check_backup.sh
##
# 同步检查
$ /dm/scripts/check_standby.sh
##
# 空间检查
$ df -h
##
# 日志检查
$ tail -f /dm/app/log/dm_alert.log
#
# 2. 定期维护
##
# 备份测试
$ /dm/scripts/test_backup.sh
##
# 切换测试
$ /dm/scripts/test_switchover.sh
##
# 性能检查
$ /dm/scripts/check_performance.sh
##
# 安全检查
$ /dm/scripts/check_security.sh
#
# 3. 备份维护
##
# 清理过期备份
$ /dm/scripts/clean_backup.sh
##
# 备份验证
$ /dm/scripts/verify_backup.sh
##
# 备份策略调整
$ vi /dm/scripts/full_backup.sh
#
# 4. 主备维护
##
# 同步状态检查
$ disql SYSDBA/SYSDBA
SQL> select * from v$archive_status;
##
# 网络检查
$ ping 192.168.2.100
$ telnet 192.168.2.100 5236
##
# 参数调整
SQL> alter system set ‘ARCH_SEND_DEST’ = ‘192.168.2.100:5236’ scope=spfile;
##
# 软件更新
$ /dm/app/bin/dminit
#
# 5. 存储维护
##
# 空间管理
$ du -sh /dm/backup/*
$ find /dm/backup -name “*.bak” -mtime +30 -delete
##
# 性能优化
$ iostat -x 1 10
##
# 故障预防
$ smartctl -a /dev/sda
#
# 6. 监控维护
##
# 监控配置
$ vi /etc/zabbix/zabbix_agentd.conf
##
# 告警管理
$ zabbix_alert
##
# 监控工具更新
$ yum update zabbix-agent
#
# 7. 维护文档
##
# 维护计划
$ vi /dm/docs/maintenance_plan.md
##
# 维护记录
$ vi /dm/docs/maintenance_log.md
##
# 问题记录
$ vi /dm/docs/issue_log.md
##
# 改进措施
$ vi /dm/docs/improvement_plan.md
#
# 1. 日常维护
##
# 备份检查
$ /dm/scripts/check_backup.sh
##
# 同步检查
$ /dm/scripts/check_standby.sh
##
# 空间检查
$ df -h
##
# 日志检查
$ tail -f /dm/app/log/dm_alert.log
#
# 2. 定期维护
##
# 备份测试
$ /dm/scripts/test_backup.sh
##
# 切换测试
$ /dm/scripts/test_switchover.sh
##
# 性能检查
$ /dm/scripts/check_performance.sh
##
# 安全检查
$ /dm/scripts/check_security.sh
#
# 3. 备份维护
##
# 清理过期备份
$ /dm/scripts/clean_backup.sh
##
# 备份验证
$ /dm/scripts/verify_backup.sh
##
# 备份策略调整
$ vi /dm/scripts/full_backup.sh
#
# 4. 主备维护
##
# 同步状态检查
$ disql SYSDBA/SYSDBA
SQL> select * from v$archive_status;
##
# 网络检查
$ ping 192.168.2.100
$ telnet 192.168.2.100 5236
##
# 参数调整
SQL> alter system set ‘ARCH_SEND_DEST’ = ‘192.168.2.100:5236’ scope=spfile;
##
# 软件更新
$ /dm/app/bin/dminit
#
# 5. 存储维护
##
# 空间管理
$ du -sh /dm/backup/*
$ find /dm/backup -name “*.bak” -mtime +30 -delete
##
# 性能优化
$ iostat -x 1 10
##
# 故障预防
$ smartctl -a /dev/sda
#
# 6. 监控维护
##
# 监控配置
$ vi /etc/zabbix/zabbix_agentd.conf
##
# 告警管理
$ zabbix_alert
##
# 监控工具更新
$ yum update zabbix-agent
#
# 7. 维护文档
##
# 维护计划
$ vi /dm/docs/maintenance_plan.md
##
# 维护记录
$ vi /dm/docs/maintenance_log.md
##
# 问题记录
$ vi /dm/docs/issue_log.md
##
# 改进措施
$ vi /dm/docs/improvement_plan.md
Part04-生产案例与实战讲解
4.1 DM数据库本地灾备案例
以下是一个本地灾备的案例:
#
# 本地灾备案例
##
# 场景描述
某企业需要为DM数据库配置本地灾备,确保在服务器故障时能够快速恢复数据。
##
# 实施步骤
# 1. 环境准备
#
# 服务器配置
– 主机名:fgedu-db
– IP地址:192.168.1.100
– 操作系统:Oracle Linux 9.3
– 数据库:DM8
– 存储:2TB SSD
#
# 备份存储
– 本地磁盘:1TB
– 备份目录:/dm/backup
# 2. 备份策略设计
#
# 全量备份
– 频率:每周日凌晨2点
– 存储:/dm/backup/full
– 保留期:4周
#
# 增量备份
– 频率:每天凌晨1点
– 存储:/dm/backup/incremental
– 保留期:2周
#
# 日志备份
– 频率:每小时
– 存储:/dm/backup/log
– 保留期:1周
# 3. 备份配置
#
# 创建备份目录
$ mkdir -p /dm/backup/full /dm/backup/incremental /dm/backup/log
#
# 配置备份脚本
##
# 全量备份脚本
#!/bin/bash
# full_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d)
BACkUP_DIR=/dm/backup/full
mkdir -p $BACkUP_DIR
disql SYSDBA/SYSDBA << EOF backup database full to '$BACkUP_DIR/full_$DATE.bak' compressed; EOF echo "全量备份完成:$BACkUP_DIR/full_$DATE.bak" ### 增量备份脚本 #!/bin/bash # incremental_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d) BACkUP_DIR=/dm/backup/incremental mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup database incremental to '$BACkUP_DIR/incremental_$DATE.bak' compressed; EOF echo "增量备份完成:$BACkUP_DIR/incremental_$DATE.bak" ### 日志备份脚本 #!/bin/bash # log_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d_%H%M%S) BACkUP_DIR=/dm/backup/log mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup archive log all to '$BACkUP_DIR/log_$DATE.bak' compressed; EOF echo "日志备份完成:$BACkUP_DIR/log_$DATE.bak" # # 配置定时任务 $ crontab -e 0 2 * * 0 /dm/scripts/full_backup.sh 0 1 * * 1-6 /dm/scripts/incremental_backup.sh 0 * * * * /dm/scripts/log_backup.sh # 4. 备份验证 # # 查看备份集 $ disql SYSDBA/SYSDBA SQL> select * from v$backup_set;
#
# 验证备份集
SQL> validate backup set ‘/dm/backup/full/full_20250409.bak’;
# 5. 恢复测试
#
# 模拟故障
$ /dm/app/bin/DmServicefgedudb stop
$ rm -rf /dm/fgdata/fgedudb/*
#
# 恢复数据库
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ with archivedir ‘/dm/backup/log’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
#
# 启动数据库
$ /dm/app/bin/DmServicefgedudb start
#
# 验证数据完整性
SQL> select * from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
# 6. 监控与维护
#
# 监控备份状态
$ /dm/scripts/check_backup.sh
#
# 清理过期备份
$ /dm/scripts/clean_backup.sh
#
# 定期测试恢复
$ /dm/scripts/test_backup.sh
# 7. 效果评估
#
# 备份效果
– 备份成功完成
– 备份文件完整
– 备份时间合理
#
# 恢复效果
– 恢复成功完成
– 数据完整无丢失
– 恢复时间在RTO范围内
#
# 维护效果
– 备份监控有效
– 过期备份及时清理
– 定期测试验证
# 本地灾备案例
##
# 场景描述
某企业需要为DM数据库配置本地灾备,确保在服务器故障时能够快速恢复数据。
##
# 实施步骤
# 1. 环境准备
#
# 服务器配置
– 主机名:fgedu-db
– IP地址:192.168.1.100
– 操作系统:Oracle Linux 9.3
– 数据库:DM8
– 存储:2TB SSD
#
# 备份存储
– 本地磁盘:1TB
– 备份目录:/dm/backup
# 2. 备份策略设计
#
# 全量备份
– 频率:每周日凌晨2点
– 存储:/dm/backup/full
– 保留期:4周
#
# 增量备份
– 频率:每天凌晨1点
– 存储:/dm/backup/incremental
– 保留期:2周
#
# 日志备份
– 频率:每小时
– 存储:/dm/backup/log
– 保留期:1周
# 3. 备份配置
#
# 创建备份目录
$ mkdir -p /dm/backup/full /dm/backup/incremental /dm/backup/log
#
# 配置备份脚本
##
# 全量备份脚本
#!/bin/bash
# full_backup.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
export DM_HOME=/dm/app
export PATH=$PATH:$DM_HOME/bin
DATE=$(date +%Y%m%d)
BACkUP_DIR=/dm/backup/full
mkdir -p $BACkUP_DIR
disql SYSDBA/SYSDBA << EOF backup database full to '$BACkUP_DIR/full_$DATE.bak' compressed; EOF echo "全量备份完成:$BACkUP_DIR/full_$DATE.bak" ### 增量备份脚本 #!/bin/bash # incremental_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d) BACkUP_DIR=/dm/backup/incremental mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup database incremental to '$BACkUP_DIR/incremental_$DATE.bak' compressed; EOF echo "增量备份完成:$BACkUP_DIR/incremental_$DATE.bak" ### 日志备份脚本 #!/bin/bash # log_backup.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: `http://www.fgedu.net.cn` export DM_HOME=/dm/app export PATH=$PATH:$DM_HOME/bin DATE=$(date +%Y%m%d_%H%M%S) BACkUP_DIR=/dm/backup/log mkdir -p $BACkUP_DIR disql SYSDBA/SYSDBA << EOF backup archive log all to '$BACkUP_DIR/log_$DATE.bak' compressed; EOF echo "日志备份完成:$BACkUP_DIR/log_$DATE.bak" # # 配置定时任务 $ crontab -e 0 2 * * 0 /dm/scripts/full_backup.sh 0 1 * * 1-6 /dm/scripts/incremental_backup.sh 0 * * * * /dm/scripts/log_backup.sh # 4. 备份验证 # # 查看备份集 $ disql SYSDBA/SYSDBA SQL> select * from v$backup_set;
#
# 验证备份集
SQL> validate backup set ‘/dm/backup/full/full_20250409.bak’;
# 5. 恢复测试
#
# 模拟故障
$ /dm/app/bin/DmServicefgedudb stop
$ rm -rf /dm/fgdata/fgedudb/*
#
# 恢复数据库
$ /dm/app/bin/dmrman
RMAN> restore database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ from backupset
‘/dm/backup/full/full_20250409.bak’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ with archivedir ‘/dm/backup/log’;
RMAN> recover database ‘/dm/app/conf/dm.ini’ update db_magic;
#
# 启动数据库
$ /dm/app/bin/DmServicefgedudb start
#
# 验证数据完整性
SQL> select * from fgedu.t_user;
SQL> select count(*) from fgedu.t_order;
# 6. 监控与维护
#
# 监控备份状态
$ /dm/scripts/check_backup.sh
#
# 清理过期备份
$ /dm/scripts/clean_backup.sh
#
# 定期测试恢复
$ /dm/scripts/test_backup.sh
# 7. 效果评估
#
# 备份效果
– 备份成功完成
– 备份文件完整
– 备份时间合理
#
# 恢复效果
– 恢复成功完成
– 数据完整无丢失
– 恢复时间在RTO范围内
#
# 维护效果
– 备份监控有效
– 过期备份及时清理
– 定期测试验证
4.2 DM数据库异地灾备案例
以下是一个异地灾备的案例:
#
# 异地灾备案例
##
# 场景描述
某企业需要为DM数据库配置异地灾备,确保在数据中心级灾难时能够快速恢复服务。
##
# 实施步骤
# 1. 环境准备
#
# 主中心
– 主机名:fgedu-primary
– IP地址:192.168.1.100
– 操作系统:Oracle Linux 9.3
– 数据库:DM8
– 存储:5TB SSD
#
# 灾备中心
– 主机名:fgedu-standby
– IP地址:192.168.2.100
# 异地灾备案例
##
# 场景描述
某企业需要为DM数据库配置异地灾备,确保在数据中心级灾难时能够快速恢复服务。
##
# 实施步骤
# 1. 环境准备
#
# 主中心
– 主机名:fgedu-primary
– IP地址:192.168.1.100
– 操作系统:Oracle Linux 9.3
– 数据库:DM8
– 存储:5TB SSD
#
# 灾备中心
– 主机名:fgedu-standby
– IP地址:192.168.2.100
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
