在非域控環境中創建數據庫鏡像, 我們必須使用證書來創建數據庫鏡像。 大致的步驟包括:
在爲數據庫鏡像配置的每個服務器實例上執行下列步驟:
在 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.'.
本文討論的是當這個證書過期後如何恢復數據庫鏡像的解決方案。
-------------------------------------------------------------------------------------------------
解決問題的主要思路是重建一個證書,同時重建對應的 鏡像端點 以及重新給 登錄名 賦予 連接 的權限。以下是解決鏡像服務中鏡像服務器上的證書過期的具體步驟。
注意: 如果你不瞭解證書,用戶,鏡像端點等概念,建議您先閱讀上面的示例文章
1. 在鏡像服務器上,查詢database_mirroring_endpoints表,找到對應的 鏡像端點
select * from master.sys.database_mirroring_endpoints
2. 刪除對應的 鏡像端點
DROP ENDPOINT Endpoint_Mirroring
3. 在鏡像服務器上檢查 證書。這裏一共有兩個鏡像相關證書,其中pvt_key_encryption_type是MK的是本機的證書,另一個是來自主體服務器的證書
select * from master.sys.certificates
4. 查看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).
5. 創建新的 證書,指定一個新的 過期時間(不指定的話,默認過期時間是一年)
CREATE CERTIFICATE HOST_B_cert
WITH SUBJECT = 'HOST_B certificate',
EXPIRY_DATE = '04/06/2099'
;
6. 基於新的證書創建 鏡像端點
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
7. 由於 鏡像端點 重建,因此,對應的 登錄名 也需要重新給予 連接 的權限。
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]
8. 備份新的 證書 到文件,並將文件拷貝到 主體服務器 上。
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'C:\HOST_B_cert.cer';
GO
9. 在 主體服務器 上檢查 證書。 這裏一共有兩個鏡像相關 證書,其中pvt_key_encryption_type是MK的是本機的證書,另一個是來自鏡像服務器的證書。 這裏需要刪除的是來自鏡像服務器的證書
select * from master.sys.certificates
10. 查看expiry_date這列,刪除這個過期的 證書
DROP CERTIFICATE HOST_B_cert
11. 創建新的 證書
CREATE CERTIFICATE HOST_B_cert
AUTHORIZATION HOST_B_user
FROM FILE = 'C:\HOST_B_cert.cer'
GO
12. 檢查數據鏡像是否恢復正常。 如果不正常,檢查主體服務器和鏡像服務器的SQL Server 錯誤日誌,進一步分析問題。
如果是主體服務器上的證書過期,解決思路也是一樣的。 當然,最好是在創建證書的時候指定一個較長的過期時間,這樣就不會碰到這樣的麻煩啦。 J