mssql 2019 Always on后,故障转移后孤立用户问题解决
mssql 2019 Always on后,故障转移后孤立用户问题解决
问题:
1 | 数据库配置了Always ON高可用性组。还有的可以访问到主体数据库登录一次,但转移后,就无法登录到备用服务器上的新主体数据库。 |
原因:
1 2 | 该问题是因为每台服务器上的SQL Server登录的SID(安全标识符)不匹配。尽管对于登录的名字是相同的,但登录经由该login的SID解决。这不是Windows /域用户/组登录的问题, 因为这些登录的SID是基于域SID为用户/组创建,因此将成为给定同一用户/组相同的,无论添加到什么样的SQL Server用户/组。 |
解决方案:
1 | 我们需要在secondary replica上面创建SQL Server login,不仅仅具有相同的名称,而且还具有相同SID在主服务器上创建SQL Server登录。下面相关的语句: |
在主库上执行的语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | SELECT 'create login [' +p.name + '] ' + case when p.type in ( 'U' , 'G' ) then 'from windows ' else '' end + 'with ' + case when p.type = 'S' then 'password = ' + master.sys.fn_varbintohexstr(l.password_hash) + ' hashed, ' + 'sid = ' + master.sys.fn_varbintohexstr(l.sid) + ',check_expiration = ' + case when l.is_expiration_checked >0 then 'ON, ' else 'OFF, ' end + 'check_policy= ' + case when l.is_policy_checked> 0 then 'ON, ' else 'OFF, ' end + case when l.credential_id > 0 then 'credential = ' + c.name + ', ' else '' end else '' end + 'default_database = ' + p.default_database_name+ case when len(p.default_language_name) >0 then ',default_language = ' + p.default_language_name else '' end FROM sys.server_principals p LEFT JOIN sys.sql_logins l ON p.principal_id = l.principal_id LEFT JOIN sys.credentials c ON l.credential_id= c.credential_id WHERE p.type in ( 'S' , 'U' , 'G' ) AND p.name<> 'sa' |
将在主服务器上面运行,并将输出的结果在副本中执行。
主库输出结果如下:
在备库上执行完后。再次故障切换后,该问题没有复现。应用用户登录db正常。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端