数据库镜像配置故障排除 (SQL Server)
适用范围:SQL Server
本主题提供有关信息以帮助您解决设置数据库镜像会话时遇到的问题。
注意
请确保满足所有 数据库镜像的先决条件。
问题 | 总结 |
---|---|
错误消息 1418 | 此 SQL Server 消息指示无法到达服务器网络地址或该地址不存在,同时建议您确认网络地址名称并重新发出命令。 |
帐户 | 介绍了正确配置运行 SQL Server 所用的帐户的相关要求。 |
端点 | 介绍了正确配置每个服务器实例的数据库镜像端点的要求。 |
SystemAddress | 概述了在数据库镜像配置中指定服务器实例的系统名称的备选方法。 |
网络访问 | 记录了允许每个服务器实例通过 TCP 访问其他一个或多个服务器实例的端口的要求。 |
镜像数据库准备 | 概述了准备镜像数据库以开始镜像的要求。 |
失败的创建文件操作 | 说明如何响应失败的创建文件操作。 |
使用 Transact-SQL 开始镜像 | 说明 ALTER DATABASE database_name SET PARTNER ='partner_server' 语句所需的顺序。 |
跨数据库事务 | 自动故障转移可能导致自动不正确地解决有疑问的事务。 因此,数据库镜像不支持跨数据库事务。 |
帐户
必须正确配置运行 SQL Server 所用的帐户。
帐户是否具有正确的权限?
如果这些帐户在相同的域帐户中运行,则会减少配置错误的几率。
如果这些帐户在不同的域中运行或不属于域帐户,则必须在其他计算机的 master 中创建一个登录帐户,并且必须授予该登录帐户端点的 CONNECT 权限。 有关详细信息,请参阅当数据库在其他服务器实例上可用时管理元数据 (SQL Server)。 这包括网络服务帐户。
如果使用本地系统帐户将 SQL Server 作为服务运行,则必须使用证书进行身份验证。 有关详细信息,请参阅使用数据库镜像终结点证书 (Transact-SQL)。
终结点
必须正确配置端点。
确保每个服务器实例(主体服务器、镜像服务器和见证服务器,如果有的话)都有数据库镜像端点。 有关详细信息,请参阅 sys.database_mirroring_endpoints (Transact-SQL),并根据身份验证的形式,参阅创建使用 Windows 身份验证的数据库镜像终结点 (Transact-SQL) 或使用数据库镜像终结点证书 (Transact-SQL)。
检查端口号是否正确。
若要标识当前与服务器实例的数据库镜像终结点关联的端口,请使用 sys.database_mirroring_endpoints 和 sys.tcp_endpoints 目录视图。
对于难以解释的数据库镜像设置问题,建议您检查每个服务器实例以确定它是否正在侦听相应的端口。
确保已启动端点 (STATE = STARTED)。 对于每个服务器实例,使用以下 Transact-SQL 语句。
SELECT state_desc FROM sys.database_mirroring_endpoints
有关 state_desc 列的详细信息,请参阅 sys.database_mirroring_endpoints (Transact-SQL)。
若要启动终结点,请使用以下 Transact-SQL 语句。
ALTER ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP (LISTENER_PORT = <port_number>) FOR database_mirroring (ROLE = ALL); GO
有关详细信息,请参阅 ALTER ENDPOINT (Transact-SQL)。
检查 ROLE 是否正确。 对于每个服务器实例,使用以下 Transact-SQL 语句。
SELECT role FROM sys.database_mirroring_endpoints; GO
有关详细信息,请参阅 sys.database_mirroring_endpoints (Transact-SQL)。
从其他服务器实例的服务帐户登录需要 CONNECT 权限。 确保其他服务器的登录帐户具有 CONNECT 权限。 若要确定哪个登录帐户拥有对终结点的 CONNECT 权限,请对每个服务器实例使用以下 Transact-SQL 语句。
SELECT 'Metadata Check'; SELECT EP.name, SP.STATE, CONVERT(nvarchar(38), suser_name(SP.grantor_principal_id)) AS GRANTOR, SP.TYPE AS PERMISSION, CONVERT(nvarchar(46),suser_name(SP.grantee_principal_id)) AS GRANTEE FROM sys.server_permissions SP , sys.endpoints EP WHERE SP.major_id = EP.endpoint_id ORDER BY Permission,grantor, grantee; GO
系统地址
对于数据库镜像配置中服务器实例的系统名称,可以使用明确标识系统的任何名称。 服务器地址可以是系统名称(如果各系统都在同一个域中)、完全限定域名或 IP 地址(最好是静态 IP 地址)。 保证使用完全限定域名的有效性。 有关详细信息,请参阅指定服务器网络地址(数据库镜像)。
网络访问
必须允许每个服务器实例都能通过 TCP 访问其他一个或多个服务器实例的端口。 当服务器实例位于相互不信任的不同域(不可信的域)中时,这尤为重要。 这会限制服务器实例之间大部分的通信。
镜像数据库准备
无论是首次开始镜像还是在删除镜像后再次开始镜像,都要验证镜像数据库是否可以进行镜像。
在镜像服务器上创建镜像数据库时,请确保指定相同数据库名称 WITH NORECOVERY 来还原主体数据库备份。 此外,还必须再次使用 WITH NORECOVERY 应用进行该备份之后创建的所有日志备份。
另外,我们建议,如有可能,镜像数据库的文件路径(包括驱动器号)应该与主体数据库的路径相同。 如果文件路径必须互不相同(例如,如果主体数据库位于“F:”驱动器上,但镜像系统没有“F:”驱动器),则必须在 RESTORE 语句中加入 MOVE 选项。
重要
如果在创建镜像数据库时移动了数据库文件,则可能导致以后不挂起镜像就无法向数据库添加文件。
如果数据库镜像已经停止,则必须将对主体数据库执行的所有后续日志备份应用到镜像数据库中,然后才可以重新启动镜像。
有关详细信息,请参阅为镜像准备镜像数据库 (SQL Server)。
失败的创建文件操作
在不影响镜像会话的情况下添加文件要求该文件路径同时存在于两个服务器上。 因此,如果在创建镜像数据库时移动了数据库文件,则随后在镜像数据库上的添加文件操作可能会失败,并可能会导致镜像挂起。
修复此问题:
数据库所有者必须删除此镜像会话,并还原包含所添加文件的文件组的完整备份。
然后,所有者必须备份主体服务器上包含添加文件操作的日志,并使用 WITH NORECOVERY 和 WITH MOVE 选项在镜像数据库上手动还原此日志备份。 执行此操作可在镜像服务器上创建指定的文件路径,并将相应的新文件还原到该位置。
若要准备数据库以进行新的镜像会话,数据库所有者还必须使用 WITH NO RECOVERY 选项还原主体服务器上所有其他未完成的日志备份。
有关详细信息,请参阅删除数据库镜像 (SQL Server)、为镜像准备镜像数据库 (SQL Server)、使用 Windows 身份验证建立数据库镜像会话 (Transact-SQL)、使用数据库镜像终结点证书 (Transact-SQL),或使用 Windows 身份验证建立数据库镜像会话 (SQL Server Management Studio)。
使用 Transact-SQL 开始镜像
发出 ALTER DATABASE database_name SET PARTNER ='partner_server' 语句的顺序非常关键。
第一个语句必须在镜像服务器上运行。 发出此语句时,镜像服务器不会尝试联系任何其他服务器实例。 相反,镜像服务器指示其数据库先进行等待,直到主体服务器与镜像服务器建立联系。
第二个 ALTER DATABASE 语句必须在主体服务器上运行。 此语句使主体服务器尝试连接到镜像服务器。 创建此连接之后,镜像服务器随后将尝试通过其他连接与主体服务器建立连接。
有关详细信息,请参阅 ALTER DATABASE (Transact-SQL)。
注意
有关使用 SQL Server Management Studio 启动镜像的信息,请参阅使用 Windows 身份验证建立数据库镜像会话 (SQL Server Management Studio)。
跨数据库事务
在具有自动故障转移功能的高安全性模式下镜像数据库时,自动故障转移可能会导致自动解析并且可能错误解析有疑问的事务。 如果提交跨数据库事务时在任一数据库中进行自动故障转移,则数据库之间可能发生逻辑上的不一致。
自动故障转移可能影响的跨数据库事务类型包括:
正在同一 SQL Server实例中更新多个数据库的事务。
使用 Microsoft 分布式事务处理协调器 (MS DTC) 的事务。
有关详细信息,请参阅用于 Always On 可用性组和数据库镜像的跨数据库事务和分布式事务 (SQL Server)。
另请参阅
设置数据库镜像 (SQL Server)
针对数据库镜像和 Always On 可用性组的传输安全性 (SQL Server)