最近按照操作步骤搭建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站视频搭建,报错如下:
大意为WSFC中的某个资源不可用,报5018,从故障转移控制台看,错误信息为:
但Get-ClusterResource显示均为online,从CLUSTER1的sql server日志上看,错误信息为:
官方文档关于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时报错:
问题2:
在报restore错后,又参考了csdn教程2里的相关内容,了解到,针对sql server 2019,需要先restore辅助副本为NORECOVERY,并且,在搭建alwayson时,不能像b站说的选择全备,需要选在仅连接,因此,删除了alwayson group重新按要求搭建,但又出现问题了,在最后一步连接时报错:
从报错信息看,我并没有在主数据库进行日志备份,因此,再次删除重新搭建,这次将备份数据和日志同时通过脚本进行操作:
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个问题也是在最后连接时报错:
从报错信息看,是由于辅助副本的日志和数据不匹配,因此,我删除了高可用组,在CLUSTER1上将日志同样用NORECOVERY还原后,再次重新搭建,终于成功了!
RESTORE LOG [testdb2]
FROM DISK = N'\\CLUSTER1\bk\testdb2_Log.trn'
WITH NORECOVERY;
CLUSTER1显示已同步而不是还原:
最后也试了下主这边插入一条数据,辅那边立马同步了。