最近按照操作步骤搭建sql server 2019的always on,过程中遇到一些问题,拿出来与大家分享:

我的环境:

1台windows server 2016域控器,2台sql server 2019(KB5021124)实例服务器

192.168.115.18  --- AD

192.168.115.19  -- CLUSTER1

192.168.115.20  -- CLUSTER2

我搭建环境时的参考:


我的问题:

问题1:

在按照b站视频搭建时,WSFC搭建完成,但通过powershell命令Get-ClusterGroup查看时发现存在存储是offline的:

PS C:\Users\Administrator> Get-ClusterGroup
Name     OwnerNode State
 ----     --------- -----
 可用存储 cluster1  Offline
 群集组   cluster2  Online尝试切换到另一节点,也是一样:
PS C:\Users\Administrator> Get-ClusterGroup
Name     OwnerNode State
 ----     --------- -----
 可用存储 cluster1  Offline
 群集组   cluster1  Online

由于我是2个节点,从故障转移集群管理器上看,该磁盘所在位置为单节点,因此怀疑此配置正常,之后,开始搭建always on,当创建好测试DB后,做数据备份,安装b站视频搭建,报错如下:

sql server集群仲裁 sql server 2019集群_sql

大意为WSFC中的某个资源不可用,报5018,从故障转移控制台看,错误信息为:

sql server集群仲裁 sql server 2019集群_sqlserver_02

但Get-ClusterResource显示均为online,从CLUSTER1的sql server日志上看,错误信息为:

sql server集群仲裁 sql server 2019集群_数据库_03

官方文档关于41044解释:
找不到可用性组 '%.*ls' 的可用性组名称到 ID 映射条目。 
可用性组名称可能不正确。 如果这是 WSFC 可用性组,
则此 Windows Server 故障转移群集中可能不存在该可用性组。 
验证可用性组是否存在以及可用性组名称是否正确,然后重试该操作。

19435解释:
Always On:AG '%.*ls' 的 AG 完整性检查失败,错误为 %d,严重性为 %d,状态为 %d。

官方文档关于搭建高可用组的一些条件等:

针对可用性组的先决条件、限制和建议 - SQL Server Always On | Microsoft Learn

在查看官方文档时,以下3个查询我认为比较有用:

查看sql server实例镜像信息
 select * from sys.database_mirroring_endpoints;查看sql server实例端节点信息
 SELECT name, port FROM sys.tcp_endpoints;查看指定或列出所有sql server的error id解释的内容
 SELECT message_id AS Error,
     severity AS Severity,
     [Event Logged] = CASE is_event_logged
         WHEN 0 THEN 'No' ELSE 'Yes'
         END,
     [text] AS [Description]
 FROM sys.messages
 --WHERE language_id = 1040 /* replace 1040 with the desired language ID, such as 1033 for US English */
 --WHERE language_id = 2052
 where message_id = 19435;

另外,官网中提到修改一个配置,但我在cluster1、cluster2上分别执行后,同样的问题仍然存在:

sp_configure 'contained database authentication', 1;  
 GO  
 RECONFIGURE;  
 GO

经过各种尝试,什么创建侦听器啊,换域账号登录重新搭建啊,都没有解决以上问题,因此,我又参考了csdn中的教程,教程中指出,应将sql server的登录账户为域账户,并给sysadmin的权限,我照做了,同样的问题仍然存在,后来,我有看了下故障转移管理器报告的描述:

“根据资源和角色的失败策略,群集服务可能会尝试使资源在此节点上联机,或将组移到群集的其他节点中,然后重新启动它。请使用故障转移群集管理器或 Get-ClusterResource Windows PowerShell cmdlet 检查资源和组状态。”

因此,我尝试将主节点从CLUSTER1切换到CLUSTER2,再次尝试在CLUSTER1上创建always on(CLUSTER1主,CLUSTER2辅),同样的问题仍然存在,因此,我思考了下CLUSTER1和CLUSTER2上有哪些不同,因为在alwayson时需要先备份目标DB,并且将备份文件放入共享文件夹中,因此,按照b站视频我将共享文件夹设置在CLUSTER1中,网络位置为:\\CLUSTER1\bk,但CLUSTER2也是可以访问\\CLUSTER1\bk路径下的文件的,是不是创建alwayson时,需要从CLUSTER2连\\CLUSTER1\bk去RESTORE时通过搭建向导无法访问?因此我尝试了从CLUSTER2上搭建alwayson(CLUSTER2主,CLUSTER1辅),结果在执行创建alwayson时成功了,但后面restore时报错:

sql server集群仲裁 sql server 2019集群_sql server集群仲裁_04

问题2:

在报restore错后,又参考了csdn教程2里的相关内容,了解到,针对sql server 2019,需要先restore辅助副本为NORECOVERY,并且,在搭建alwayson时,不能像b站说的选择全备,需要选在仅连接,因此,删除了alwayson group重新按要求搭建,但又出现问题了,在最后一步连接时报错:

sql server集群仲裁 sql server 2019集群_sqlserver_05

从报错信息看,我并没有在主数据库进行日志备份,因此,再次删除重新搭建,这次将备份数据和日志同时通过脚本进行操作:

BACKUP DATABASE [testdb2] TO  DISK = N'\\CLUSTER1\bk\testdb2.bak' WITH NOFORMAT, INIT,  
 NAME = N'testdb2-full', SKIP, NOREWIND, NOUNLOAD,  STATS = 10;
 BACKUP LOG testdb2
 TO DISK = '\\CLUSTER1\bk\testdb2_Log.trn'
 WITH INIT;
 GO

再次删除重新搭建,此问题已经解决,但产生了下一个问题。

问题3:

第3个问题也是在最后连接时报错:

sql server集群仲裁 sql server 2019集群_高可用_06

从报错信息看,是由于辅助副本的日志和数据不匹配,因此,我删除了高可用组,在CLUSTER1上将日志同样用NORECOVERY还原后,再次重新搭建,终于成功了!

RESTORE LOG [testdb2]
 FROM DISK = N'\\CLUSTER1\bk\testdb2_Log.trn'
 WITH NORECOVERY;

sql server集群仲裁 sql server 2019集群_数据库_07

CLUSTER1显示已同步而不是还原:

sql server集群仲裁 sql server 2019集群_sqlserver_08

最后也试了下主这边插入一条数据,辅那边立马同步了。