![两个 MS SQL 实例,一个数据库文件](https://linux22.com/image/601114/%E4%B8%A4%E4%B8%AA%20MS%20SQL%20%E5%AE%9E%E4%BE%8B%EF%BC%8C%E4%B8%80%E4%B8%AA%E6%95%B0%E6%8D%AE%E5%BA%93%E6%96%87%E4%BB%B6.png)
是否可以将一个数据库文件附加到两个不同的 SQL 实例?
假设 MDF 位于 NAS 上,并且我想要在两个不同的服务器上有 MS SQL 的主实例和辅助实例(在这个问题中不考虑集群),并且我希望两个实例都引用同一个 MDF。
一次只能将一个实例附加到 MDF 还是可以同时将两个实例附加到 MDF。将 SQL 实例“A”附加到此 MDF,然后取消附加,再将实例“B”附加到此 MDF,这是否存在问题?
感谢您的输入。
答案1
2018 年 2 月:这个答案非常老旧,而且相当过时。请不要将其用于现代 SQL 安装(2014 或更高版本)。出于历史目的,将其保留在下面
在 MSSQL 中拥有冷备用服务器的正确方法是SQL日志传送。这涉及在两台服务器上拥有两个数据库副本,其中 A 定期将日志文件还原到 B。
在 MSSQL 2008 R2 或更低版本中拥有热备用服务器的正确方法是SQL 数据库镜像. 在 SQL Server 2012 中始终开启。这涉及在两台服务器上彼此同步地拥有两个数据库副本。
在 MSSQL 2008 R2 或更低版本中拥有热备用服务器的正确方法是SQL 群集(在 2012 年,这也是 AlwaysOn 的一部分)。这涉及 SAN(不是 NAS,除非您的 NAS 可以公开支持集群的 iSCSI 卷;有些支持)上的数据库的单个副本、Windows Server 2008 R2 Enterprise(或 2012 Datacenter)、SQL Server Enterprise 和正确配置的 Windows 故障转移群集。
没有哪个版本的 SQL Server 允许将其 MDF/LDF 文件存储在 CIFS/NFS/SMB 共享上。它们必须存储在块存储上,这为您提供了本地磁盘或 SAN 卷(例如 iSCSI 或 FC 公开卷)的选项。
答案2
采用这种方案时,无法保证当服务器 A 发生故障或 NAS 发生故障时 MDF 不会损坏。
该方案忽略了 LDF 文件。人们通常认为 LDF 并不重要,但事实并非如此。LDF 充当预写日志,当一个实例重新启动(或另一个实例启动,如在集群中)时,更改会“重放”。您需要 LDF,否则您将丢失数据。
另一件需要考虑的事情是,基于 SMB 的 NAS 设备通常性能极差。如果设备支持 iSCSI,情况可能不会那么糟糕。如果您使用 SMB,使用映射驱动器会很麻烦。您必须调整 SQL Server 以将文件存储在网络共享上。
如果您想避免集群,只需像其他人一样,研究数据库镜像(在 SQL Server 2005 中引入)或日志传送(几乎可以与任何 SQL Server 版本一起使用,尽管官方支持直到 SQL Server 2000 才首次亮相)。
随大流通常是最安全的做法,尽管这可能不是最有趣的做法。当你处理客户的数据时,你想要的是“安全”,而不是“有趣”。
无论您使用哪种策略,都有其他细节需要担心,例如确保作业、登录名、密码、用户 ID 等在两个实例上都保持最新,确保您保持备份正确,等等。
答案3
从我读过的资料来看,MS SQL 对 MDF 文件使用文件级锁定。因此,如果两个 MS SQL 实例都在运行,则它们不能使用同一个文件。但是,如果您有一种机制来确保一次只运行一个,则可以让两个 MS SQL 实例使用同一个 MDF。
答案4
如果您正在寻找一种方法来让备份 SQL 服务器几乎可以随时运行,那么一种选择就是定期在主服务器上生成数据库备份。然后,您可以有一个将备份复制到辅助服务器的过程。然后,您只需创建一个脚本,在需要时将备份导入辅助服务器即可。
如果每台服务器都有自己的存储,这还可以消除外部 NAS 设备作为单点故障的情况。此技术适用于较旧版本的 SQL Server。但是,如果您拥有最新版本,SQL Server 2012 标准版(及更高版本)支持更强大的数据库镜像方法。请参阅以下链接: