数据库镜像中证书过期的解决方案
在非域控环境中创建数据库镜像, 我们必须使用证书来创建数据库镜像。 大致的步骤包括:
在为数据库镜像配置的每个服务器实例上执行下列步骤:
- 在 master 数据库中,创建数据库主密钥。
- 在 master 数据库中,为服务器实例创建加密证书。
- 使用服务器实例的证书为该服务器实例创建端点。
- 将证书备份到文件,并将其安全地复制到其他系统。
然后,对为数据库镜像配置的每个伙伴执行这些步骤。在 master 数据库中:
- 为其他系统创建登录名。
- 创建一个使用该登录名的用户。
- 获取其他服务器实例的镜像端点的证书。
- 将该证书与在步骤 2 中创建的用户相关联。
- 授予对该镜像端点的登录名的 CONNECT 权限。
微软联机丛书提供了一个使用脚本创建使用证书的数据库镜像的步骤,请参阅
示例:使用证书设置数据库镜像 (Transact-SQL)
http://msdn.microsoft.com/zh-cn/library/ms191140(v=SQL.100).aspx
其中的第2步创建证书时,我们可以指定证书过期的日期。 如果不指定,默认过期的时间是一年。当证书过期之后,数据库服务重启之后镜像将不工作。 检查SQL Server错误日志,有如下的消息:
2011-04-06 10:30:29.050 Logon Database Mirroring login attempt failed with error: 'Connection handshake failed. The certificate used by this endpoint was not found: Certificate expired. Use DBCC CHECKDB in master database to verify the metadata integrity of the endpoints. State 85.'.
本文讨论的是当这个证书过期后如何恢复数据库镜像的解决方案。
-------------------------------------------------------------------------------------------------
解决问题的主要思路是重建一个证书,同时重建对应的 镜像端点 以及重新给 登录名 赋予 连接 的权限。以下是解决镜像服务中镜像服务器上的证书过期的具体步骤。
注意: 如果你不了解证书,用户,镜像端点等概念,建议您先阅读上面的示例文章
- 在镜像服务器上,查询database_mirroring_endpoints表,找到对应的 镜像端点
select * from master.sys.database_mirroring_endpoints
- 删除对应的 镜像端点
DROP ENDPOINT Endpoint_Mirroring
- 在镜像服务器上检查 证书。这里一共有两个镜像相关证书,其中pvt_key_encryption_type是MK的是本机的证书,另一个是来自主体服务器的证书
select * from master.sys.certificates
- 查看expiry_date这一列,删除过期的 证书
DROP CERTIFICATE HOST_B_cert
此时, 如果有镜像端点建立在这个证书上,会提示如下错误消息:
Msg 15187, Level 16, State 1, Line 1
The certificate cannot be dropped because it is used by one or more endpoint(s).
- 创建新的 证书,指定一个新的 过期时间(不指定的话,默认过期时间是一年)
CREATE CERTIFICATE HOST_B_cert
WITH SUBJECT = 'HOST_B certificate',
EXPIRY_DATE = '04/06/2099'
;
- 基于新的证书创建 镜像端点
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=7024
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_B_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
);
GO
- 由于 镜像端点 重建,因此,对应的 登录名 也需要重新给予 连接 的权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO
如果不给的话,在SQL Server错误日志里我们可以看到如下错误消息。
2011-04-06 11:01:23.050 Logon Database Mirroring login attempt failed with error: 'Connection handshake failed. The login 'HOST_A_login' does not have CONNECT permission on the endpoint. State 84.'. [CLIENT: 2001:4898:0:fff:0:5efe:10.172.8.189]
- 备份新的 证书 到文件,并将文件拷贝到 主体服务器 上。
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'C:\HOST_B_cert.cer';
GO
- 在 主体服务器 上检查 证书。 这里一共有两个镜像相关 证书,其中pvt_key_encryption_type是MK的是本机的证书,另一个是来自镜像服务器的证书。 这里需要删除的是来自镜像服务器的证书
select * from master.sys.certificates
- 查看expiry_date这列,删除这个过期的 证书
DROP CERTIFICATE HOST_B_cert
- 创建新的 证书
CREATE CERTIFICATE HOST_B_cert
AUTHORIZATION HOST_B_user
FROM FILE = 'C:\HOST_B_cert.cer'
GO
- 检查数据镜像是否恢复正常。 如果不正常,检查主体服务器和镜像服务器的SQL Server 错误日志,进一步分析问题。
如果是主体服务器上的证书过期,解决思路也是一样的。 当然,最好是在创建证书的时候指定一个较长的过期时间,这样就不会碰到这样的麻烦啦。 J