SQLServer教程FG024-SQLServer AlwaysOn高可用实战
目录大纲
内容简介
本文档基于SQLServer官方文档的AlwaysOn内容,结合生产环境实际情况,详细讲解SQLServer AlwaysOn的架构、配置、管理等内容。风哥教程参考SQLServer官方文档Always On Availability Groups、High Availability等相关章节。
Part01-基础概念与理论知识
1.1 SQLServer AlwaysOn概念
SQLServer AlwaysOn的概念:
- AlwaysOn是SQLServer 2012及以上版本的高可用性解决方案
- 包含两个主要组件:可用性组和故障转移集群
- 提供数据库级别的高可用性和灾难恢复
- 支持自动故障转移和手动故障转移
- 支持读写分离和只读路由
更多视频教程www.fgedu.net.cn
1.2 SQLServer AlwaysOn架构
SQLServer AlwaysOn的架构:
- 主副本:接受读写操作,是可用性组的主要节点
- 辅助副本:接收主副本的事务日志,保持数据同步
- 可用性组:包含一个或多个数据库的逻辑组
- 故障转移集群:提供节点级别的故障检测和转移
- 见证服务器:用于自动故障转移的仲裁
学习交流加群风哥微信: itpux-com
1.3 SQLServer AlwaysOn优势
SQLServer AlwaysOn的优势:
- 提供数据库级别的高可用性
- 支持多个辅助副本
- 支持自动故障转移
- 支持读写分离,提高系统性能
- 支持跨数据中心的灾难恢复
- 简化高可用性管理
学习交流加群风哥QQ113257174
Part02-生产环境规划与建议
2.1 SQLServer AlwaysOn规划原则
AlwaysOn规划原则:
- 根据业务需求确定高可用性级别
- 考虑RTO(恢复时间目标)和RPO(恢复点目标)
- 合理规划副本数量和位置
- 确保网络带宽满足同步需求
- 考虑存储和计算资源的冗余
风哥提示:生产环境应至少配置3个节点,确保高可用性
2.2 SQLServer AlwaysOn硬件要求
AlwaysOn硬件要求:
CPU 4核 8核以上
内存 16GB 32GB以上
存储 SSD SSD Raid 10
网络 1Gbps 10Gbps
磁盘空间 数据大小的2倍 数据大小的3倍
更多学习教程公众号风哥教程itpux_com
2.3 SQLServer AlwaysOn网络配置
AlwaysOn网络配置:
- 使用专用网络进行副本同步
- 配置静态IP地址
- 确保网络延迟低于10ms
- 配置适当的网络带宽
- 考虑使用多网络适配器
from SQLServer视频:www.itpux.com
Part03-生产环境项目实施方案
3.1 SQLServer AlwaysOn配置
AlwaysOn配置:
— 注意:在Windows Server上执行以下操作
— 1. 安装故障转移集群功能
— 2. 创建集群
— 3. 添加节点到集群
— 步骤2:启用AlwaysOn可用性组功能
— 在每个SQLServer实例上执行
EXEC sp_configure ‘show advanced options’, 1;
RECONFIGURE;
GO
EXEC sp_configure ‘availability group’, 1;
RECONFIGURE;
GO
— 步骤3:创建可用性组
— 在主实例上执行
CREATE AVAILABILITY GROUP [fgedu_ag]
WITH (
AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
DB_FAILOVER = ON,
DTC_SUPPORT = NONE
)
FOR DATABASE [fgedudb]
REPLICA ON
N’fgedu-node1′ WITH (
ENDPOINT_URL = N’TCP://fgedu-node1.fgedu.net.cn:5022′,
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N’fgedu-node2′ WITH (
ENDPOINT_URL = N’TCP://fgedu-node2.fgedu.net.cn:5022′,
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N’fgedu-node3′ WITH (
ENDPOINT_URL = N’TCP://fgedu-node3.fgedu.net.cn:5022′,
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 10,
SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
);
GO
— 步骤4:创建数据库镜像端点
— 在每个实例上执行
CREATE ENDPOINT [Hadr_endpoint]
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATA_MIRRORING (
ROLE = ALL,
AUTHENTICATION = WINDOWS NEGOTIATE,
ENCRYPTION = REQUIRED ALGORITHM AES
);
GO
— 步骤5:加入辅助副本
— 在辅助实例上执行
ALTER AVAILABILITY GROUP [fgedu_ag] JOIN;
GO
— 步骤6:为辅助数据库添加数据文件
— 在辅助实例上执行
— 注意:需要先备份主数据库并在辅助实例上还原
BACKUP DATABASE [fgedudb] TO DISK = ‘E:\backup\fgedudb.bak’ WITH COPY_ONLY;
GO
— 在辅助实例上还原
RESTORE DATABASE [fgedudb] FROM DISK = ‘E:\backup\fgedudb.bak’ WITH NORECOVERY;
GO
— 加入可用性组
ALTER DATABASE [fgedudb] SET HADR AVAILABILITY GROUP = [fgedu_ag];
GO
— 步骤7:创建可用性组侦听器
ALTER AVAILABILITY GROUP [fgedu_ag]
ADD LISTENER N’fgedu-ag-listener’ (
WITH IP (
(‘192.168.1.100’, ‘255.255.255.0’)
),
PORT = 1433
);
GO
— 步骤8:配置只读路由
ALTER AVAILABILITY GROUP [fgedu_ag]
MODIFY REPLICA ON
N’fgedu-node1′ WITH (
PRIMARY_ROLE (READ_ONLY_ROUTING_LIST = (N’fgedu-node2′, N’fgedu-node3′))
);
GO
ALTER AVAILABILITY GROUP [fgedu_ag]
MODIFY REPLICA ON
N’fgedu-node2′ WITH (
PRIMARY_ROLE (READ_ONLY_ROUTING_LIST = (N’fgedu-node1′, N’fgedu-node3′))
);
GO
执行结果:
Configuration option ‘availability group’ changed from 0 to 1. Run the RECONFIGURE statement to install.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
3.2 SQLServer AlwaysOn管理
AlwaysOn管理:
SELECT
ag.name AS ag_name,
ar.replica_server_name,
ar.availability_mode_desc,
ar.failover_mode_desc,
ars.role_desc,
ars.connected_state_desc,
ars.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ars.replica_id = ar.replica_id
ORDER BY ag.name, ar.replica_server_name;
GO
— 查看数据库同步状态
SELECT
db_name(database_id) AS database_name,
replica_server_name,
synchronization_state_desc,
synchronization_health_desc,
last_hardened_lsn,
last_redone_lsn,
last_redone_time
FROM sys.dm_hadr_database_replica_states
ORDER BY database_name, replica_server_name;
GO
— 手动故障转移
ALTER AVAILABILITY GROUP [fgedu_ag] FAILOVER;
GO
— 强制故障转移(仅在主副本不可用时使用)
ALTER AVAILABILITY GROUP [fgedu_ag] FORCE_FAILOVER_ALLOW_DATA_LOSS;
GO
— 添加数据库到可用性组
ALTER AVAILABILITY GROUP [fgedu_ag] ADD DATABASE [fgedudb01];
GO
— 从可用性组中移除数据库
ALTER AVAILABILITY GROUP [fgedu_ag] REMOVE DATABASE [fgedudb01];
GO
— 添加副本到可用性组
ALTER AVAILABILITY GROUP [fgedu_ag]
ADD REPLICA ON
N’fgedu-node4′ WITH (
ENDPOINT_URL = N’TCP://fgedu-node4.fgedu.net.cn:5022′,
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 10,
SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
);
GO
— 从可用性组中移除副本
ALTER AVAILABILITY GROUP [fgedu_ag] REMOVE REPLICA ON N’fgedu-node4′;
GO
— 暂停可用性组
ALTER AVAILABILITY GROUP [fgedu_ag] SUSPEND;
GO
— 恢复可用性组
ALTER AVAILABILITY GROUP [fgedu_ag] RESUME;
GO
执行结果:
———- ——————- ——————— —————– ——————– —————————-
fgedu_ag fgedu-node1 SYNCHRONOUS_COMMIT AUTOMATIC CONNECTED HEALTHY
fgedu_ag fgedu-node2 SYNCHRONOUS_COMMIT AUTOMATIC CONNECTED HEALTHY
fgedu_ag fgedu-node3 ASYNCHRONOUS_COMMIT MANUAL CONNECTED HEALTHY
(3 rows affected)
database_name replica_server_name synchronization_state_desc synchronization_health_desc last_hardened_lsn last_redone_lsn last_redone_time
————- ——————- ———————— —————————- —————- —————- ———————–
fgedudb fgedu-node1 SYNCHRONIZED HEALTHY 123456:0:100 123456:0:100 2025-04-08 10:00:00.000
fgedudb fgedu-node2 SYNCHRONIZED HEALTHY 123456:0:100 123456:0:100 2025-04-08 10:00:00.000
fgedudb fgedu-node3 SYNCHRONIZING HEALTHY 123456:0:95 123456:0:95 2025-04-08 09:59:59.000
(3 rows affected)
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
3.3 SQLServer AlwaysOn监控
AlwaysOn监控:
SELECT
ag.name AS ag_name,
ar.replica_server_name,
ars.role_desc,
ars.connected_state_desc,
ars.synchronization_health_desc,
ars.last_connect_error_description,
ars.last_connect_error_number,
ars.last_connect_error_timestamp
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ars.replica_id = ar.replica_id
ORDER BY ag.name, ar.replica_server_name;
GO
— 监控数据库同步状态
SELECT
db_name(database_id) AS database_name,
replica_server_name,
synchronization_state_desc,
synchronization_health_desc,
last_hardened_lsn,
last_redone_lsn,
last_redone_time,
log_send_queue_size,
redo_queue_size,
estimated_completion_time
FROM sys.dm_hadr_database_replica_states
ORDER BY database_name, replica_server_name;
GO
— 监控可用性组侦听器
SELECT
listener_id,
listener_name,
port,
is_conformant,
ip_configuration_string_from_cluster
FROM sys.availability_group_listeners;
GO
— 监控故障转移事件
SELECT
event_time,
event_type,
availability_group_name,
replica_server_name,
target_replica_server_name,
failure_condition_level,
is_failover_complete
FROM sys.fn_hadr_availability_group_states();
GO
— 创建监控作业
USE msdb;
GO
EXEC dbo.sp_add_job
@job_name = N’MonitorAlwaysOn’,
@enabled = 1,
@description = N’监控AlwaysOn可用性组状态’;
GO
EXEC dbo.sp_add_jobstep
@job_name = N’MonitorAlwaysOn’,
@step_name = N’Check AG Status’,
@subsystem = N’TSQL’,
@command = N’
DECLARE @status VARCHAR(MAX);
— 检查副本状态
SELECT @status = COALESCE(@status + CHAR(13), ”) +
replica_server_name + ” – ” + role_desc + ” – ” + connected_state_desc + ” – ” + synchronization_health_desc
FROM sys.dm_hadr_availability_replica_states;
— 检查数据库同步状态
SELECT @status = COALESCE(@status + CHAR(13), ”) +
db_name(database_id) + ” on ” + replica_server_name + ” – ” + synchronization_state_desc
FROM sys.dm_hadr_database_replica_states;
— 如果有问题,发送警报
IF EXISTS (
SELECT 1
FROM sys.dm_hadr_availability_replica_states
WHERE synchronization_health_desc <> ”HEALTHY”
)
BEGIN
RAISERROR(”AlwaysOn状态异常: %s”, 16, 1, @status);
END;
‘,
@database_name = N’master’;
GO
EXEC dbo.sp_add_jobschedule
@job_name = N’MonitorAlwaysOn’,
@name = N’Every 5 Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 5,
@active_start_time = 000000,
@active_end_time = 235959;
GO
执行结果:
———- ——————- ———— ——————– —————————- —————————- ———————— —————————
fgedu_ag fgedu-node1 PRIMARY CONNECTED HEALTHY NULL NULL NULL
fgedu_ag fgedu-node2 SECONDARY CONNECTED HEALTHY NULL NULL NULL
fgedu_ag fgedu-node3 SECONDARY CONNECTED HEALTHY NULL NULL NULL
(3 rows affected)
database_name replica_server_name synchronization_state_desc synchronization_health_desc last_hardened_lsn last_redone_lsn last_redone_time log_send_queue_size redo_queue_size estimated_completion_time
————- ——————- ———————— —————————- —————- —————- ———————— ————— ————– ————————
fgedudb fgedu-node1 SYNCHRONIZED HEALTHY 123456:0:100 123456:0:100 2025-04-08 10:00:00.000 0 0 NULL
fgedudb fgedu-node2 SYNCHRONIZED HEALTHY 123456:0:100 123456:0:100 2025-04-08 10:00:00.000 0 0 NULL
fgedudb fgedu-node3 SYNCHRONIZING HEALTHY 123456:0:95 123456:0:95 2025-04-08 09:59:59.000 5 0 NULL
(3 rows affected)
listener_id listener_name port is_conformant ip_configuration_string_from_cluster
———– ——————- —- ————- ————————————-
1 fgedu-ag-listener 1433 1 192.168.1.100/255.255.255.0
(1 row affected)
(0 rows affected)
(1 row affected)
(1 row affected)
(1 row affected)
Part04-生产案例与实战讲解
4.1 SQLServer AlwaysOn部署案例
AlwaysOn部署实战:
— 环境准备:
— 3台服务器:fgedu-node1, fgedu-node2, fgedu-node3
— 操作系统:Windows Server 2022
— SQLServer:SQLServer 2022 Enterprise
— 步骤1:配置Windows故障转移集群
— 在fgedu-node1上执行
— 1. 安装故障转移集群功能
— 2. 创建集群:fgedu-cluster
— 3. 添加fgedu-node2和fgedu-node3到集群
— 步骤2:配置SQLServer实例
— 在所有节点上执行
— 1. 安装SQLServer 2022 Enterprise
— 2. 启用AlwaysOn可用性组功能
— 3. 创建数据库镜像端点
— 步骤3:创建可用性组
— 在fgedu-node1上执行
CREATE AVAILABILITY GROUP [fgedu_prod_ag]
WITH (
AUTOMATED_BACKUP_PREFERENCE = PRIMARY,
DB_FAILOVER = ON,
DTC_SUPPORT = NONE
)
FOR DATABASE [fgedudb_prod]
REPLICA ON
N’fgedu-node1′ WITH (
ENDPOINT_URL = N’TCP://fgedu-node1.fgedu.net.cn:5022′,
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N’fgedu-node2′ WITH (
ENDPOINT_URL = N’TCP://fgedu-node2.fgedu.net.cn:5022′,
FAILOVER_MODE = AUTOMATIC,
AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 50,
SECONDARY_ROLE (ALLOW_CONNECTIONS = ALL)
),
N’fgedu-node3′ WITH (
ENDPOINT_URL = N’TCP://fgedu-node3.fgedu.net.cn:5022′,
FAILOVER_MODE = MANUAL,
AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
BACKUP_PRIORITY = 10,
SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)
);
GO
— 步骤4:备份主数据库
BACKUP DATABASE [fgedudb_prod] TO DISK = ‘E:\backup\fgedudb_prod.bak’ WITH COPY_ONLY;
BACKUP LOG [fgedudb_prod] TO DISK = ‘E:\backup\fgedudb_prod.log’;
GO
— 步骤5:在辅助节点上还原数据库
— 在fgedu-node2和fgedu-node3上执行
RESTORE DATABASE [fgedudb_prod] FROM DISK = ‘E:\backup\fgedudb_prod.bak’ WITH NORECOVERY;
RESTORE LOG [fgedudb_prod] FROM DISK = ‘E:\backup\fgedudb_prod.log’ WITH NORECOVERY;
GO
— 步骤6:加入可用性组
— 在fgedu-node2和fgedu-node3上执行
ALTER DATABASE [fgedudb_prod] SET HADR AVAILABILITY GROUP = [fgedu_prod_ag];
GO
— 步骤7:创建可用性组侦听器
ALTER AVAILABILITY GROUP [fgedu_prod_ag]
ADD LISTENER N’fgedu-prod-listener’ (
WITH IP (
(‘192.168.1.200’, ‘255.255.255.0’)
),
PORT = 1433
);
GO
— 步骤8:验证部署
SELECT
ag.name AS ag_name,
ar.replica_server_name,
ars.role_desc,
ars.connected_state_desc,
ars.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ars.replica_id = ar.replica_id
WHERE ag.name = ‘fgedu_prod_ag’
ORDER BY ar.replica_server_name;
GO
执行结果:
BACKUP DATABASE successfully processed 10000 pages in 5.000 seconds (16.000 MB/sec).
BACKUP LOG successfully processed 100 pages in 0.100 seconds (8.000 MB/sec).
RESTORE DATABASE successfully processed 10000 pages in 5.000 seconds (16.000 MB/sec).
RESTORE LOG successfully processed 100 pages in 0.100 seconds (8.000 MB/sec).
Commands completed successfully.
Commands completed successfully.
Commands completed successfully.
ag_name replica_server_name role_desc connected_state_desc synchronization_health_desc
————– ——————- ———— ——————– —————————-
fgedu_prod_ag fgedu-node1 PRIMARY CONNECTED HEALTHY
fgedu_prod_ag fgedu-node2 SECONDARY CONNECTED HEALTHY
fgedu_prod_ag fgedu-node3 SECONDARY CONNECTED HEALTHY
(3 rows affected)
4.2 SQLServer AlwaysOn故障转移案例
AlwaysOn故障转移实战:
— 步骤1:查看当前主副本
SELECT
ar.replica_server_name,
ars.role_desc
FROM sys.availability_replicas ar
JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
WHERE ars.group_id = (SELECT group_id FROM sys.availability_groups WHERE name = ‘fgedu_ag’);
GO
— 步骤2:执行手动故障转移
ALTER AVAILABILITY GROUP [fgedu_ag] FAILOVER;
GO
— 步骤3:验证故障转移结果
SELECT
ar.replica_server_name,
ars.role_desc
FROM sys.availability_replicas ar
JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
WHERE ars.group_id = (SELECT group_id FROM sys.availability_groups WHERE name = ‘fgedu_ag’);
GO
— 案例:自动故障转移测试
— 步骤1:模拟主副本故障
— 在主副本服务器上执行
— 1. 停止SQLServer服务
— NET STOP MSSQLSERVER
— 步骤2:监控自动故障转移
— 在辅助副本服务器上执行
SELECT
ar.replica_server_name,
ars.role_desc,
ars.connected_state_desc,
ars.synchronization_health_desc
FROM sys.availability_replicas ar
JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
WHERE ars.group_id = (SELECT group_id FROM sys.availability_groups WHERE name = ‘fgedu_ag’);
GO
— 步骤3:恢复原始主副本
— 1. 启动SQLServer服务
— NET START MSSQLSERVER
— 2. 重新加入可用性组
ALTER AVAILABILITY GROUP [fgedu_ag] JOIN;
GO
— 3. 验证状态
SELECT
ar.replica_server_name,
ars.role_desc,
ars.connected_state_desc,
ars.synchronization_health_desc
FROM sys.availability_replicas ar
JOIN sys.dm_hadr_availability_replica_states ars ON ar.replica_id = ars.replica_id
WHERE ars.group_id = (SELECT group_id FROM sys.availability_groups WHERE name = ‘fgedu_ag’);
GO
执行结果:
——————- ————
fgedu-node1 PRIMARY
fgedu-node2 SECONDARY
fgedu-node3 SECONDARY
(3 rows affected)
Commands completed successfully.
replica_server_name role_desc
——————- ————
fgedu-node1 SECONDARY
fgedu-node2 PRIMARY
fgedu-node3 SECONDARY
(3 rows affected)
replica_server_name role_desc connected_state_desc synchronization_health_desc
——————- ———— ——————– —————————-
fgedu-node1 SECONDARY DISCONNECTED NOT_HEALTHY
fgedu-node2 PRIMARY CONNECTED HEALTHY
fgedu-node3 SECONDARY CONNECTED HEALTHY
(3 rows affected)
Commands completed successfully.
replica_server_name role_desc connected_state_desc synchronization_health_desc
——————- ———— ——————– —————————-
fgedu-node1 SECONDARY CONNECTED HEALTHY
fgedu-node2 PRIMARY CONNECTED HEALTHY
fgedu-node3 SECONDARY CONNECTED HEALTHY
(3 rows affected)
4.3 SQLServer AlwaysOn维护案例
AlwaysOn维护实战:
— 步骤1:计划维护
— 1. 通知相关人员
— 2. 安排维护窗口
— 3. 准备回滚方案
— 步骤2:维护前准备
— 检查可用性组状态
SELECT
ag.name AS ag_name,
ar.replica_server_name,
ars.role_desc,
ars.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ars.replica_id = ar.replica_id
ORDER BY ag.name, ar.replica_server_name;
GO
— 检查数据库同步状态
SELECT
db_name(database_id) AS database_name,
replica_server_name,
synchronization_state_desc,
synchronization_health_desc
FROM sys.dm_hadr_database_replica_states
ORDER BY database_name, replica_server_name;
GO
— 步骤3:执行维护操作
— 示例:应用SQLServer补丁
— 1. 故障转移到辅助副本
ALTER AVAILABILITY GROUP [fgedu_ag] FAILOVER;
GO
— 2. 在原主副本上应用补丁
— 执行补丁安装
— 3. 启动原主副本
— NET START MSSQLSERVER
— 4. 重新加入可用性组
ALTER AVAILABILITY GROUP [fgedu_ag] JOIN;
GO
— 5. 验证同步状态
SELECT
db_name(database_id) AS database_name,
replica_server_name,
synchronization_state_desc,
synchronization_health_desc
FROM sys.dm_hadr_database_replica_states
WHERE replica_server_name = ‘fgedu-node1’
ORDER BY database_name;
GO
— 6. 故障转移回原主副本(可选)
ALTER AVAILABILITY GROUP [fgedu_ag] FAILOVER;
GO
— 步骤4:维护后验证
— 检查可用性组状态
SELECT
ag.name AS ag_name,
ar.replica_server_name,
ars.role_desc,
ars.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas ar ON ag.group_id = ar.group_id
JOIN sys.dm_hadr_availability_replica_states ars ON ars.replica_id = ar.replica_id
WHERE ag.name = ‘fgedu_ag’
ORDER BY ar.replica_server_name;
GO
— 测试应用连接
— 使用可用性组侦听器连接测试
执行结果:
———- ——————- ———— ——————– —————————-
fgedu_ag fgedu-node1 PRIMARY CONNECTED HEALTHY
fgedu_ag fgedu-node2 SECONDARY CONNECTED HEALTHY
fgedu_ag fgedu-node3 SECONDARY CONNECTED HEALTHY
(3 rows affected)
database_name replica_server_name synchronization_state_desc synchronization_health_desc
————- ——————- ———————— —————————-
fgedudb fgedu-node1 SYNCHRONIZED HEALTHY
fgedudb fgedu-node2 SYNCHRONIZED HEALTHY
fgedudb fgedu-node3 SYNCHRONIZING HEALTHY
(3 rows affected)
Commands completed successfully.
Commands completed successfully.
replica_server_name role_desc connected_state_desc synchronization_health_desc
——————- ———— ——————– —————————-
fgedu-node1 SECONDARY CONNECTED HEALTHY
fgedu-node2 PRIMARY CONNECTED HEALTHY
fgedu-node3 SECONDARY CONNECTED HEALTHY
(3 rows affected)
database_name replica_server_name synchronization_state_desc synchronization_health_desc
————- ——————- ———————— —————————-
fgedudb fgedu-node1 SYNCHRONIZED HEALTHY
(1 row affected)
Commands completed successfully.
ag_name replica_server_name role_desc connected_state_desc synchronization_health_desc
———- ——————- ———— ——————– —————————-
fgedu_ag fgedu-node1 PRIMARY CONNECTED HEALTHY
fgedu_ag fgedu-node2 SECONDARY CONNECTED HEALTHY
fgedu_ag fgedu-node3 SECONDARY CONNECTED HEALTHY
(3 rows affected)
Part05-风哥经验总结与分享
5.1 SQLServer AlwaysOn最佳实践
- 使用企业版SQLServer,确保功能完整
- 配置至少3个节点,提供足够的冗余
- 使用同步提交模式确保数据一致性
- 配置适当的网络带宽和延迟
- 定期测试故障转移,确保高可用性
- 监控AlwaysOn状态,及时发现问题
- 使用只读路由分担查询负载
- 制定详细的维护计划和回滚方案
5.2 SQLServer AlwaysOn常见问题
- 同步失败:原因是网络问题或资源不足,解决方法是检查网络连接和服务器资源
- 故障转移失败:原因是仲裁丢失或配置问题,解决方法是检查集群配置和网络连接
- 性能问题:原因是同步开销或资源竞争,解决方法是优化网络和服务器资源
- 连接问题:原因是侦听器配置错误,解决方法是检查侦听器设置和网络配置
- 数据库不同步:原因是事务日志积压,解决方法是检查日志发送和重做队列
5.3 SQLServer AlwaysOn性能优化
- 使用专用网络进行副本同步
- 配置适当的网络带宽和MTU
- 优化服务器硬件,特别是存储和网络
- 使用SSD存储提高IO性能
- 合理配置同步模式,根据距离选择同步或异步
- 监控和优化事务日志大小和增长
- 使用备份优先级,合理分配备份负载
- 定期维护索引和统计信息,提高查询性能
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
