我有一个设置,其中 3 台服务器组合成可用性组
所有 3 台服务器都有本地直接连接的 SSD 驱动器,用户数据库文件托管在这些驱动器上
但是 AG 中每台服务器的系统数据库(master 和 msdb)都托管在通过网络访问的 SAN 设备上
尚未将它们移动到本地 SSD 驱动器
问题:
在任何服务器和 SAN 设备之间的网络连接丢失(电缆损坏、NIC 损坏、一些临时网络故障等)的假设情况下,
该服务器上的 SQL Server 服务会立即脱机或停止正常工作吗?
或者如果 master 和 msdb 在网络中断之前缓存在 RAM 中,它会继续工作一段时间?
您不能依赖缓存在内存中的系统数据库,更有可能它们不会是因为它们相对于用户数据库的访问频率较低。
我认为您最终将处于准功能状态,您的用户数据库仍然可以访问,但服务器实例的某些功能依赖
master
并且msdb
会抛出一些奇怪的错误,具体取决于您的服务器正在做什么。SQL Server 实例的服务应继续保持在线(“已启动”状态)。例如,如果您有任何Scheduled Agent Jobs,我敢打赌(但不能在没有测试的情况下肯定地说)他们在尝试运行时会遇到错误(无论是默默地还是明显地),因为他们的大部分元数据是存储在msdb
数据库中。如果发生这种情况,您最好尽快恢复对这些系统数据库的访问,以保证所有特性和功能的 100% 可靠性。
从文档
可用性组数据库级别运行状况检测故障转移选项文档的警告部分包含一些可能会改进我们对该问题的猜测的信息:
来自(足够接近的)实验室测试
master
和msdb
日志文件放在笔式驱动器(驱动器 D:) 上——为了简洁起见,我不会描述这个过程;Lab
;master
我运行的数据库select name, state_desc from sys.databases;
;Lab
一切都很好,我什至更新了一个表;CREATE DATABASE StorageOffline;
。我收到以下错误消息:D:\
它并没有改变数据库的状态,也没有使实例脱机;我继续使用
Lab
数据库几分钟没有(明显的)主要问题,并且在我写这个答案时实例才停止工作。当然,在生产中继续工作并不是一个可靠的状态,但是下线需要一些时间。结论
基于这些信息,我的想法是:
我会说不。我还没有使用可用性组,但是如果该功能旨在使重要的数据库保持在线状态并且它不监控磁盘正常运行时间或正在积极监控的数据库的数据库文件可用性,它不会更快地注意到问题不属于可用性组的数据库。
是的,但这取决于您的环境有多忙。数据库将保持在线状态,直到 SQL Server 尝试在数据库文件上读取
master
或写入内容。msdb
但我同意京东的观点,你不应该依赖这种情况给你足够的时间来采取任何措施来避免你的实例下线。
取决于什么样的离线。我让它自己进入一个不知道提交了哪些事务的状态,因为它看到的故障模式是写入 dbs 在块级别失败。它很好地向日志发送垃圾邮件,但在我手动退回它之前无法恢复,因为它会在遇到 IO 错误后认为内存中的副本是正确的。
我敢肯定有人会过来说这简直是疯了。我同意。这是可怕的行为。但是我在现场观察到了。当使服务器恢复正常时,
SELECT
观察者显示数据库已回滚。请注意,虽然任何运行 aCOMMIT
saw it 的人都会出错,但进一步SELECT
的语句可以看到失败提交的结果,就好像他们已经通过使用语句读取它们而成功一样,SELECT
直到我手动回收它为止。呸。