本主题提供的信息有助于排查设置数据库镜像会话时出现的问题。
注释
确保满足 数据库镜像的所有先决条件。
| 問题 | 概要 |
|---|---|
| 错误消息 1418 | 此 SQL Server 消息指示无法访问或不存在服务器网络地址,并建议验证网络地址名称并重新发出命令。 有关详细信息,请参阅 MSSQLSERVER_1418 主题。 |
| 帐户 | 介绍了正确配置运行 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 目录视图。
对于难以解释的数据库镜像设置问题,建议检查每个服务器实例,以确定它是否侦听正确的端口。 有关验证端口可用性的信息,请参阅 MSSQLSERVER_1418。
确保已启动端点 (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来自另一服务器实例的服务帐户登录需要 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)。
操作失败 Create-File
在不影响镜像会话的情况下添加文件要求文件的路径存在于这两个服务器上。 因此,如果在创建镜像数据库时移动数据库文件,则后来的添加文件操作可能会在镜像数据库上失败,并导致镜像被暂停。
修复此问题:
数据库所有者必须删除镜像会话并还原包含已添加文件的文件组的完整备份。
然后,所有者必须备份包含主体服务器上添加文件操作的日志,并在镜像数据库上使用 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)的事务。
有关详细信息,请参阅 数据库镜像或 AlwaysOn 可用性组不支持跨数据库事务(SQL Server)。