1. 首页 > SQLServer教程 > 正文

SQLServer教程FG047-SQLServer异地容灾实战

目录大纲

内容简介

本文档基于SQLServer官方文档的异地容灾相关内容,结合生产环境实际情况,详细讲解SQLServer异地容灾的规划、实施、监控与维护等内容。风哥教程参考SQLServer官方文档High Availability、Disaster Recovery等相关章节。

Part01-基础概念与理论知识

1.1 异地容灾概念

异地容灾概念:

  • 异地容灾是指在不同地理位置部署灾备系统,以应对区域性灾难
  • 异地容灾的目标是确保在主站点发生灾难时,能够快速恢复业务
  • 异地容灾包括数据复制、故障转移、业务切换等环节
  • 异地容灾应考虑RTO(恢复时间目标)和RPO(恢复点目标)

更多视频教程www.fgedu.net.cn

1.2 异地容灾级别

异地容灾级别:

  • Level 1:定期备份,手动恢复
  • Level 2:自动备份,手动恢复
  • Level 3:实时复制,手动故障转移
  • Level 4:实时复制,自动故障转移
  • Level 5:多活架构,自动负载均衡

学习交流加群风哥微信: itpux-com

1.3 异地容灾技术

异地容灾技术:

  • 日志传送:通过传送事务日志实现数据复制
  • 数据库镜像:通过镜像实现数据复制
  • AlwaysOn可用性组:通过可用性组实现数据复制和故障转移
  • 存储复制:通过存储层实现数据复制
  • 云服务:使用云服务实现异地容灾

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 异地容灾规划原则

异地容灾规划原则:

  • 地理位置选择:选择距离主站点足够远的地理位置,避免同一区域灾难
  • 网络规划:确保异地站点与主站点之间有可靠的网络连接
  • 硬件配置:异地站点的硬件配置应不低于主站点
  • 数据一致性:确保异地站点的数据与主站点保持一致
  • 自动化:尽可能实现容灾操作的自动化
  • 可测试性:定期测试容灾方案的有效性
  • 文档化:详细记录容灾方案和操作流程

风哥提示:异地容灾规划应从业务需求出发,综合考虑RTO、RPO、成本等因素

2.2 异地容灾架构设计

异地容灾架构设计:

  • 主备架构:主站点运行,备用站点处于 standby 状态
  • 双活架构:主站点和备用站点同时运行,数据双向复制
  • 多活架构:多个站点同时运行,负载均衡
  • 混合架构:结合本地容灾和异地容灾

更多学习教程公众号风哥教程itpux_com

2.3 异地容灾网络规划

异地容灾网络规划:

  • 网络带宽:根据数据量和复制频率计算所需带宽
  • 网络延迟:考虑网络延迟对复制的影响
  • 网络可靠性:使用多条网络线路,提高可靠性
  • 网络安全:确保异地站点与主站点之间的网络安全
  • 网络监控:建立网络监控体系,及时发现网络问题

from SQLServer视频:www.itpux.com

Part03-生产环境项目实施方案

3.1 异地容灾方案设计

异地容灾方案设计:

— 步骤1:业务影响分析
— 评估业务重要性、RTO和RPO要求
— 确定关键业务系统和数据

— 步骤2:风险评估
— 识别潜在的灾难风险
— 评估灾难对业务的影响

— 步骤3:选择异地容灾技术
— 根据业务需求选择合适的容灾技术
— 评估技术可行性和成本

— 步骤4:设计异地容灾架构
— 主站点架构设计
— 异地站点架构设计
— 网络架构设计

— 步骤5:制定容灾策略
— 数据复制策略
— 故障转移策略
— 业务切换策略

— 步骤6:制定容灾计划
— 容灾实施计划
— 容灾演练计划
— 容灾维护计划

— 步骤7:编写容灾文档
— 容灾架构文档
— 容灾操作手册
— 容灾演练记录

执行结果:

业务影响分析报告:
– 业务系统:核心交易系统
– 重要性:高
– RTO:2小时
– RPO:5分钟
– 关键数据:交易数据、客户信息、账户余额

风险评估报告:
– 自然灾害:地震、洪水、台风
– 人为故障:硬件故障、软件故障、人为误操作
– 网络故障:网络中断、DDoS攻击

异地容灾技术选择:
– 主站点:SQLServer 2022 Enterprise Edition
– 异地站点:SQLServer 2022 Enterprise Edition
– 容灾技术:AlwaysOn可用性组(异步复制)

异地容灾架构设计:
– 主站点:北京数据中心
– 异地站点:上海数据中心
– 网络:专线连接,带宽100Mbps
– 存储:主站点和异地站点使用相同配置的存储

3.2 异地容灾实施

异地容灾实施:

— 步骤1:准备异地站点环境
— 部署服务器
— 配置网络连接
— 安装SQLServer

— 步骤2:配置主站点
— 启用AlwaysOn功能
— 配置数据库
— 备份数据库

— 步骤3:配置异地站点
— 启用AlwaysOn功能
— 配置网络连接
— 安装SQLServer

— 步骤4:配置AlwaysOn可用性组
— 创建可用性组
— 添加主站点副本
— 添加异地站点副本
— 配置复制模式(异步)

— 步骤5:测试数据复制
— 插入测试数据
— 验证异地站点数据

— 步骤6:配置故障转移
— 测试手动故障转移
— 配置自动故障转移(可选)

— 步骤7:配置监控
— 监控可用性组状态
— 监控数据复制状态
— 监控网络状态

— 步骤8:测试容灾方案
— 模拟主站点故障
— 执行故障转移
— 验证业务切换

— 步骤9:文档更新
— 更新容灾架构文档
— 更新容灾操作手册
— 记录测试结果

执行结果:

异地站点环境准备完成:
– 服务器名称:fgedu-dr-sh-01
– IP地址:192.168.2.100
– SQLServer版本:2022 Enterprise Edition

AlwaysOn可用性组配置完成:
– 可用性组名称:AG_fgedudb
– 主站点副本:fgedu-prod-bj-01
– 异地站点副本:fgedu-dr-sh-01
– 复制模式:异步提交

数据复制测试完成:
– 主站点插入测试数据:成功
– 异地站点验证数据:成功

故障转移测试完成:
– 手动故障转移:成功
– 业务切换:成功
– RTO:45分钟
– RPO:5分钟

监控配置完成:
– 可用性组状态监控:配置完成
– 数据复制状态监控:配置完成
– 网络状态监控:配置完成

3.3 异地容灾监控与维护

异地容灾监控与维护:

— 步骤1:监控可用性组状态
— 创建监控作业
EXEC dbo.sp_add_job @job_name = N’MonitorAGStatus’;
EXEC dbo.sp_add_jobstep
@job_name = N’MonitorAGStatus’,
@step_name = N’Check AG Status’,
@subsystem = N’TSQL’,
@command = N’– 检查可用性组状态
SELECT
ag.name AS availability_group,
ar.replica_server_name,
ar.operational_state_desc,
ar.availability_mode_desc,
ar.failover_mode_desc,
ar.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id;

— 检查数据库同步状态
SELECT
db_name(dr.database_id) AS database_name,
dr.replica_id,
dr.synchronization_state_desc,
dr.synchronization_health_desc,
dr.last_hardened_lsn,
dr.last_redone_lsn
FROM sys.dm_hadr_database_replica_states dr;
‘,
@database_name = N’master’;
EXEC dbo.sp_add_schedule
@schedule_name = N’Every15Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 15,
@active_start_time = 000000;
EXEC dbo.sp_attach_schedule
@job_name = N’MonitorAGStatus’,
@schedule_name = N’Every15Minutes’;
EXEC dbo.sp_add_jobserver
@job_name = N’MonitorAGStatus’;

— 步骤2:监控网络状态
— 创建网络监控脚本
cat > /sqlserver/scripts/network_monitor.sh << 'EOF' #!/bin/bash # network_monitor.sh # from:www.itpux.com.qq113257174.wx:itpux-com # web: http://www.fgedu.net.cn ping -c 5 192.168.2.100 > /dev/null
if [ $? -ne 0 ]; then
echo “Network connection to DR site failed” | mail -s “Network Alert” admin@fgedu.net.cn
fi
EOF

chmod +x /sqlserver/scripts/network_monitor.sh

— 添加到crontab
crontab -e
# 添加以下行
*/5 * * * * /sqlserver/scripts/network_monitor.sh

— 步骤3:定期维护
— 检查数据库完整性
DBCC CHECKDB(‘fgedudb’) WITH NO_INFOMSGS;

— 更新统计信息
UPDATE STATISTICS fgedu.sales WITH FULLSCAN;

— 重建索引
ALTER INDEX ALL ON fgedu.sales REBUILD WITH (ONLINE = ON, FILLFACTOR = 80);

— 步骤4:容灾演练
— 制定演练计划
— 执行演练
— 记录演练结果
— 优化容灾方案

— 步骤5:故障转移测试
— 手动故障转移
ALTER AVAILABILITY GROUP [AG_fgedudb] FAILOVER;
GO

— 故障转移回主站点
ALTER AVAILABILITY GROUP [AG_fgedudb] FAILOVER;
GO

执行结果:

可用性组状态监控作业创建成功。
网络监控脚本创建成功。

数据库完整性检查结果:
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

统计信息更新成功。
索引重建成功。

容灾演练结果:
– 演练日期:2025-04-08
– 演练类型:全流程演练
– 演练结果:成功
– RTO:45分钟
– RPO:5分钟
– 发现问题:无
– 改进措施:无

故障转移测试结果:
– 手动故障转移:成功
– 故障转移回主站点:成功

Part04-生产案例与实战讲解

4.1 日志传送异地容灾案例

日志传送异地容灾实战:

— 案例:日志传送异地容灾
— 步骤1:准备环境
— 主站点:北京(fgedu-prod-bj-01)
— 异地站点:上海(fgedu-dr-sh-01)

— 步骤2:配置主站点
— 创建备份共享目录
— 授予SQLServer服务账户访问权限

— 步骤3:配置异地站点
— 创建数据库
CREATE DATABASE fgedudb_DR;
GO

— 将数据库设置为恢复模式
ALTER DATABASE fgedudb_DR SET RECOVERY FULL;
GO

— 备份主数据库
BACKUP DATABASE fgedudb TO DISK = ‘\\fgedu-prod-bj-01\Backup\fgedudb.bak’ WITH INIT;
GO

— 还原到异地站点
RESTORE DATABASE fgedudb_DR FROM DISK = ‘\\fgedu-prod-bj-01\Backup\fgedudb.bak’
WITH NORECOVERY,
MOVE ‘fgedudb’ TO ‘D:\SQLServer\Data\fgedudb_DR.mdf’,
MOVE ‘fgedudb_log’ TO ‘D:\SQLServer\Log\fgedudb_DR_log.ldf’;
GO

— 步骤4:配置日志传送
— 在主站点上执行
EXEC msdb.dbo.sp_add_log_shipping_primary_database
@database = N’fgedudb’,
@backup_directory = N’\\fgedu-prod-bj-01\Backup\’,
@backup_share = N’\\fgedu-prod-bj-01\Backup\’,
@backup_job_name = N’LSBackup_fgedudb’,
@backup_retention_period = 4320,
@backup_compression = 1,
@backup_threshold = 60,
@threshold_alert_enabled = 1,
@history_retention_period = 5760;
GO

— 获取主数据库ID
DECLARE @primary_id UNIQUEIDENTIFIER;
SELECT @primary_id = primary_id
FROM msdb.dbo.log_shipping_primary_databases
WHERE primary_database = N’fgedudb’;

— 添加辅助数据库
EXEC msdb.dbo.sp_add_log_shipping_secondary_primary
@primary_server = N’fgedu-prod-bj-01′,
@primary_database = N’fgedudb’,
@backup_source_directory = N’\\fgedu-prod-bj-01\Backup\’,
@backup_destination_directory = N’D:\SQLServer\Backup\’,
@copy_job_name = N’LSCopy_fgedu-prod-bj-01_fgedudb’,
@restore_job_name = N’LSRestore_fgedu-prod-bj-01_fgedudb’,
@file_retention_period = 4320,
@secondary_database = N’fgedudb_DR’,
@overwrite = 1,
@copy_threshold = 60,
@restore_threshold = 60,
@threshold_alert_enabled = 1,
@history_retention_period = 5760,
@monitor_server = N’fgedu-prod-bj-01′,
@monitor_server_security_mode = 1;
GO

— 步骤5:启动日志传送作业
— 启动备份作业
EXEC msdb.dbo.sp_start_job N’LSBackup_fgedudb’;

— 启动复制作业
EXEC msdb.dbo.sp_start_job N’LSCopy_fgedu-prod-bj-01_fgedudb’;

— 启动还原作业
EXEC msdb.dbo.sp_start_job N’LSRestore_fgedu-prod-bj-01_fgedudb’;

— 步骤6:监控日志传送状态
EXEC msdb.dbo.sp_help_log_shipping_monitor;
GO

— 步骤7:测试容灾
— 模拟主站点故障
— 在异地站点上执行
RESTORE DATABASE fgedudb_DR WITH RECOVERY;
GO

— 验证数据完整性
SELECT TOP 10 * FROM fgedu.sales;
GO

执行结果:

Commands completed successfully.

Commands completed successfully.

Processed 288 pages for database ‘fgedudb’, file ‘fgedudb’ on file 1.
Processed 2 pages for database ‘fgedudb’, file ‘fgedudb_log’ on file 1.
BACKUP DATABASE successfully processed 290 pages in 0.123 seconds (18.685 MB/sec).

Processed 288 pages for database ‘fgedudb_DR’, file ‘fgedudb’ on file 1.
Processed 2 pages for database ‘fgedudb_DR’, file ‘fgedudb_log’ on file 1.
RESTORE DATABASE successfully processed 290 pages in 0.156 seconds (14.826 MB/sec).

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

primary_database secondary_server secondary_database last_backup_date last_backup_file last_copied_date last_copied_file last_restored_date last_restored_file
————— —————- —————– —————– —————– —————– —————– —————— ——————
fgedudb fgedu-dr-sh-01 fgedudb_DR 2025-04-08 10:00:00 \\fgedu-prod-bj-01\Backup\fgedudb_20250408100000.trn 2025-04-08 10:01:00 D:\SQLServer\Backup\fgedudb_20250408100000.trn 2025-04-08 10:02:00 D:\SQLServer\Backup\fgedudb_20250408100000.trn

Commands completed successfully.

sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
2 2 1002 2025-04-08 10:00:00.000 2000.00 COMPLETED
3 3 1003 2025-04-08 10:00:00.000 3000.00 PENDING

(3 rows affected)

4.2 AlwaysOn异地容灾案例

AlwaysOn异地容灾实战:

— 案例:AlwaysOn异地容灾
— 步骤1:准备环境
— 主站点:北京(fgedu-prod-bj-01)
— 异地站点:上海(fgedu-dr-sh-01)

— 步骤2:启用AlwaysOn功能
— 在两台服务器上启用AlwaysOn功能
— 重启SQLServer服务

— 步骤3:创建可用性组
— 在主站点上执行
CREATE AVAILABILITY GROUP [AG_fgedudb]
FOR DATABASE [fgedudb]
REPLICA ON
N’fgedu-prod-bj-01′ WITH (
ENDPOINT_URL = N’TCP://fgedu-prod-bj-01:5022′,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
FAILOVER_MODE = AUTOMATIC,
SEEDING_MODE = AUTOMATIC,
SECONDARY_ROLE (ALLOW_CONNECTIONS = NO)
),
N’fgedu-dr-sh-01′ WITH (
ENDPOINT_URL = N’TCP://fgedu-dr-sh-01:5022′,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
FAILOVER_MODE = MANUAL,
SEEDING_MODE = AUTOMATIC,
SECONDARY_ROLE (ALLOW_CONNECTIONS = NO)
);
GO

— 步骤4:验证可用性组状态
SELECT
ag.name AS availability_group,
ar.replica_server_name,
ar.operational_state_desc,
ar.availability_mode_desc,
ar.failover_mode_desc,
ar.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id;
GO

— 步骤5:测试数据复制
— 在主站点上插入测试数据
INSERT INTO fgedu.sales (
product_id,
customer_id,
sale_date,
amount,
status
) VALUES (
4,
1004,
GETDATE(),
4000.00,
‘COMPLETED’
);
GO

— 在异地站点上验证数据
SELECT TOP 10 * FROM fgedu.sales;
GO

— 步骤6:测试故障转移
— 手动故障转移到异地站点
ALTER AVAILABILITY GROUP [AG_fgedudb] FAILOVER;
GO

— 验证故障转移结果
SELECT
ag.name AS availability_group,
ar.replica_server_name,
ar.operational_state_desc,
ar.availability_mode_desc,
ar.failover_mode_desc,
ar.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id;
GO

— 步骤7:故障转移回主站点
ALTER AVAILABILITY GROUP [AG_fgedudb] FAILOVER;
GO

— 步骤8:配置监控
— 创建监控作业
EXEC dbo.sp_add_job @job_name = N’MonitorAGStatus’;
EXEC dbo.sp_add_jobstep
@job_name = N’MonitorAGStatus’,
@step_name = N’Check AG Status’,
@subsystem = N’TSQL’,
@command = N’SELECT
ag.name AS availability_group,
ar.replica_server_name,
ar.operational_state_desc,
ar.availability_mode_desc,
ar.failover_mode_desc,
ar.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id;’,
@database_name = N’master’;
EXEC dbo.sp_add_schedule
@schedule_name = N’Every15Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 15,
@active_start_time = 000000;
EXEC dbo.sp_attach_schedule
@job_name = N’MonitorAGStatus’,
@schedule_name = N’Every15Minutes’;
EXEC dbo.sp_add_jobserver
@job_name = N’MonitorAGStatus’;

执行结果:

Commands completed successfully.

availability_group replica_server_name operational_state_desc availability_mode_desc failover_mode_desc synchronization_health_desc
—————— ——————- ——————— ——————– —————– —————————-
AG_fgedudb fgedu-prod-bj-01 ONLINE SYNCHRONOUS_COMMIT AUTOMATIC HEALTHY
AG_fgedudb fgedu-dr-sh-01 ONLINE ASYNCHRONOUS_COMMIT MANUAL HEALTHY

(2 rows affected)

(1 rows affected)

sale_id product_id customer_id sale_date amount status
———– ———– ———– ———————– ——————— ——————–
1 1 1001 2025-04-08 10:00:00.000 1000.00 COMPLETED
2 2 1002 2025-04-08 10:00:00.000 2000.00 COMPLETED
3 3 1003 2025-04-08 10:00:00.000 3000.00 PENDING
4 4 1004 2025-04-08 10:05:00.000 4000.00 COMPLETED

(4 rows affected)

Commands completed successfully.

availability_group replica_server_name operational_state_desc availability_mode_desc failover_mode_desc synchronization_health_desc
—————— ——————- ——————— ——————– —————– —————————-
AG_fgedudb fgedu-prod-bj-01 ONLINE SYNCHRONOUS_COMMIT AUTOMATIC HEALTHY
AG_fgedudb fgedu-dr-sh-01 PRIMARY ASYNCHRONOUS_COMMIT MANUAL HEALTHY

(2 rows affected)

Commands completed successfully.

availability_group replica_server_name operational_state_desc availability_mode_desc failover_mode_desc synchronization_health_desc
—————— ——————- ——————— ——————– —————– —————————-
AG_fgedudb fgedu-prod-bj-01 PRIMARY SYNCHRONOUS_COMMIT AUTOMATIC HEALTHY
AG_fgedudb fgedu-dr-sh-01 ONLINE ASYNCHRONOUS_COMMIT MANUAL HEALTHY

(2 rows affected)

Commands completed successfully.

4.3 混合云异地容灾案例

混合云异地容灾实战:

— 案例:混合云异地容灾
— 步骤1:准备环境
— 本地站点:北京数据中心
— 云站点:Azure云

— 步骤2:配置本地站点
— 启用AlwaysOn功能
— 配置数据库

— 步骤3:配置Azure云站点
— 创建Azure SQL Managed Instance
— 配置网络连接

— 步骤4:配置数据复制
— 使用Azure Data Factory配置数据复制
— 或使用SQLServer AlwaysOn可用性组

— 步骤5:测试数据复制
— 插入测试数据
— 验证云站点数据

— 步骤6:配置故障转移
— 测试手动故障转移
— 配置自动故障转移(可选)

— 步骤7:配置监控
— 监控本地站点状态
— 监控云站点状态
— 监控数据复制状态

— 步骤8:测试容灾
— 模拟本地站点故障
— 执行故障转移到云站点
— 验证业务切换

— 步骤9:配置回切
— 当本地站点恢复后,执行回切
— 验证数据一致性

执行结果:

Azure SQL Managed Instance创建完成:
– 实例名称:fgedu-sql-mi
– 区域:East Asia
– 版本:SQLServer 2022

数据复制配置完成:
– 复制方式:Azure Data Factory
– 复制频率:每5分钟
– 复制状态:正常

数据复制测试完成:
– 本地站点插入测试数据:成功
– 云站点验证数据:成功

故障转移测试完成:
– 手动故障转移:成功
– 业务切换:成功
– RTO:1小时
– RPO:5分钟

监控配置完成:
– 本地站点监控:配置完成
– 云站点监控:配置完成
– 数据复制监控:配置完成

Part05-风哥经验总结与分享

5.1 异地容灾最佳实践

异地容灾最佳实践:

  • 地理位置选择:选择距离主站点足够远的地理位置,避免同一区域灾难
  • 网络规划:确保异地站点与主站点之间有可靠的网络连接
  • 硬件配置:异地站点的硬件配置应不低于主站点
  • 数据一致性:确保异地站点的数据与主站点保持一致
  • 自动化:尽可能实现容灾操作的自动化
  • 定期演练:每季度或半年进行一次容灾演练
  • 监控体系:建立完善的监控体系,及时发现问题
  • 文档化:详细记录容灾方案和操作流程

更多视频教程www.fgedu.net.cn

5.2 异地容灾常见问题

常见问题:

  • 网络带宽不足:异地容灾需要足够的网络带宽
  • 网络延迟:网络延迟可能导致数据同步延迟
  • 存储不足:异地站点需要足够的存储空间
  • 同步延迟:异步复制可能导致数据同步延迟
  • 演练不充分:容灾演练不充分,导致实际灾难发生时无法有效响应
  • 监控不到位:监控体系不完善,无法及时发现问题
  • 文档不全:容灾文档不完整,导致操作流程不清晰

学习交流加群风哥微信: itpux-com

5.3 异地容灾性能优化

性能优化:

  • 网络优化:使用高速网络连接,如专线、MPLS等
  • 存储优化:使用高性能存储设备,如SSD
  • 复制优化:根据网络带宽调整复制频率和压缩选项
  • 备份优化:使用压缩备份,减少备份时间和存储空间
  • 监控优化:建立实时监控体系,及时发现性能问题
  • 自动化优化:实现容灾操作的自动化,减少人工干预
  • 资源优化:合理配置服务器资源,确保异地站点性能
  • 测试优化:定期测试容灾性能,及时发现并解决问题

学习交流加群风哥QQ113257174

风哥提示:异地容灾是确保业务连续性的重要保障,应根据业务需求和风险评估制定合适的容灾策略,并定期进行演练和优化。

更多学习教程公众号风哥教程itpux_com

from SQLServer视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息