數據庫鏡像可以與事務復制一起使用實現數據庫整體的高可用性和高性能,其中鏡像可以提供故障檢測和故障轉移,復制則用於實現讀寫分離。
數據庫鏡像涉及一個數據庫的兩個副本,這兩個副本通常駐留在不同的計算機上。 在任何給定時間都只有一個數據庫副本可供客戶端使用。 該副本稱為主體數據庫。 客戶端對主體數據庫所做的更新應用到數據庫的另一副本(稱為鏡像數據庫)。 鏡像涉及將在主體數據庫上執行的每個插入、更新或刪除操作的事務日志應用到鏡像數據庫上。
復制將數據和數據庫對象從一個數據庫復制和分發到另一個數據庫,然后在數據庫之間進行同步以保持一致性。
主體數據庫和鏡像數據庫必須共享分發服務器
主體數據庫/發布數據庫:10.86.3.100,機器名WIN-3-100
鏡像數據庫:10.86.3.101,機器名WIN-3-101
分發數據庫:10.86.3.102,機器名WIN-3-102
訂閱數據庫1:10.86.3.103,機器名WIN-3-103
數據庫名稱mydb,端口都是1433
鏡像配置的驗證方式采用證書驗證
步驟1:配置鏡像
- 通過備份方式准備鏡像數據庫
在主體數據庫上創建完整備份和日志備份,官方文檔指出,需要至少一個日志備份:
BACKUP DATABASE [mydb] TO DISK = N'D:\backup\mydb.bak' WITH NOFORMAT, NOINIT, NAME = N'mydb-完整數據庫備份 ', SKIP, NOREWIND, NOUNLOAD, STATS = 10 GO BACKUP LOG [mydb] TO DISK = N'D:\backup\mydb.trn' WITH NOFORMAT, NOINIT, NAME = N'mydb-事務日志 備份' , SKIP , NOREWIND , NOUNLOAD , STATS = 10 GO
將備份拷貝到鏡像服務器上,在鏡像服務器上恢復備份,需要指定RESTORE WITH NORECOVERY
RESTORE DATABASE [mydb] FROM DISK = N'D:\backup\mydb.bak' WITH FILE = 1, NORECOVERY , NOUNLOAD , STATS = 10 GO RESTORE LOG [mydb] FROM DISK = N'D:\backup\mydb.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10 GO
- 配置出站連接和證書
主體數據庫配置如下:
--創建密鑰 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password' SELECT * FROM sys.symmetric_keys --創建證書 CREATE CERTIFICATE cert_3_100 WITH SUBJECT = 'HOST_A certificate for database mirroring', EXPIRY_DATE = '1/1/2020' SELECT * FROM sys.certificates ; --創建端點 CREATE ENDPOINT master_instance STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE cert_3_100 , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL ) SELECT name , role_desc , state_desc , connection_auth_desc , encryption_algorithm_desc FROM sys.database_mirroring_endpoints --備份證書到其他系統 BACKUP CERTIFICATE cert_3_101 TO FILE = 'd:\cert_3_100.cer'; GO
鏡像數據庫配置如下:
--創建密鑰 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password' SELECT * FROM sys.symmetric_keys --創建證書 CREATE CERTIFICATE cert_3_101 WITH SUBJECT = 'HOST_A certificate for database mirroring', EXPIRY_DATE = '1/1/2020' SELECT * FROM sys.certificates ; --創建端點 CREATE ENDPOINT backup_instance STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE cert_3_101 , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL ) SELECT name , role_desc , state_desc , connection_auth_desc , encryption_algorithm_desc FROM sys.database_mirroring_endpoints --備份證書到其他系統 BACKUP CERTIFICATE cert_3_101 TO FILE = 'd:\cert_3_101.cer'; GO
- 配置入站連接和證書
主體數據庫配置如下:
USE master --為其他系統創建登錄名 CREATE LOGIN login_3_101 WITH PASSWORD = 'password'; SELECT * FROM sys.server_principals --創建一個使用該登錄名的用戶 CREATE USER user_3_101 FOR LOGIN login_3_101 SELECT * FROM sys.sysusers --將證書與用戶關聯,並將鏡像庫生成的證書文件放到指定目錄中 CREATE CERTIFICATE cert_3_101 AUTHORIZATION user_3_101 FROM FILE = 'd:\cert_3_101.cer' SELECT * FROM sys.certificates --授權對遠程鏡像端點的登錄名的 CONNECT權限,授權完成后,完成對登錄到所需的證書身份驗證的設置 GRANT CONNECT ON ENDPOINT::master_instance TO login_3_101
鏡像數據庫配置如下:
USE master --為其他系統創建登錄名 CREATE LOGIN login_3_100 WITH PASSWORD = 'password'; SELECT * FROM sys.server_principals --創建一個使用該登錄名的用戶,並將主體庫生成的證書文件放到指定目錄中 CREATE USER user_3_100 FOR LOGIN login_3_100 SELECT * FROM sys.sysusers --將證書與用戶關聯 CREATE CERTIFICATE cert_3_100 AUTHORIZATION user_3_100 FROM FILE = 'd:\cert_3_100.cer' SELECT * FROM sys.certificates --授權對遠程鏡像端點的登錄名的 CONNECT權限,授權完成后,完成對登錄到所需的證書身份驗證的設置 GRANT CONNECT ON ENDPOINT::backup_instance TO login_3_100
- 配置鏡像
選擇主體數據庫mydb數據庫對象右鍵->任務->鏡像->配置安全性
因為要采用高性能方式,所以不需要見證服務器
當同步完成后,主體數據庫會顯示“(主體,已同步)”,鏡像數據庫會顯示(已同步,正在還原)
步驟2:配置分發服務器
- 在發布服務器、分發服務器和訂閱服務器配置hosts文件,加入如下配置:
10.86.3.101 WIN-3-101
10.86.3.102 WIN-3-102
10.86.3.103 WIN-3-103
10.86.3.104 WIN-3-104
- 將10.86.3.102配置成分發服務器,分發數據庫的快照文件建議配置相應的訪問權限,因為我的賬戶有訪問權限,所以略去這步
在分發服務器上,選擇復制->配置分發,按照下圖操作:
點擊添加
剩下的就直接下一步,直到完成即可
- 在分發服務器屬性對話框中啟用發布服務器
在分發服務器復制選項->分發服務器屬性->發布服務器,點擊添加按鈕,選擇發布服務器WIN-3-100,在彈出需要設置管理鏈接密碼的對話框中,輸入管理鏈接的密碼

- 在主體數據庫(發布數據庫)和鏡像數據庫中指定分發數據庫
首先在WIN-3-100上配置,在復制功能上右鍵->配置分發,按照圖中指示配置,選擇"使用以下服務器作為分發服務器",點擊添加按鈕,選擇WIN-3-102作為分發服務器

輸入管理密碼與步驟3中配置的管理鏈接密碼一致


下一步,直至完成。然后如法炮制,在鏡像服務器中將WIN-3-102配置為分發服務器,指向同一分發數據庫和快照文件
步驟3配置發布服務器
選擇復制->本地發布->新建發布,按照如下步驟操作

如果要發布的數據庫非常大,建議選擇業務空閑期進行初始化快照
配置用於故障轉移的復制代理(快照代理和日志讀取代理)
啟動復制監視器,選擇發布服務器,選擇快照代理,右鍵代理配置,選擇代理配置文件

輸入代理名稱,取消勾選“僅顯示次配置文件中使用的參數”,指定 –PublisherFailoverPartner 代理參數的鏡像名稱WIN-3-100
按照上述方法,設置日志讀取器代理,指定–PublisherFailoverPartner 代理參數的鏡像名稱WIN-3-100
創建完成之后還有關鍵的一步,就是在主體和鏡像服務器上執行 DBCC TRACEON(1448,-1),如果可以重啟最好加入到實例的啟動參數中去。如果不設置該參數,會報復制的事務正等待下一次日志備份或等待鏡像伙伴更新
步驟4配置訂閱服務器
在訂閱服務器中(WIN-3-103)中建立訂閱復制,選擇復制->本地訂閱(右鍵)->新建訂閱

步驟5測試
連接發布庫,向測試表中插入數據並查詢
USE mydb INSERT INTO Admin( user_name) VALUES('master' ) SELECT * FROM admin WHERE user_name='master'
連接訂閱庫,查詢插入數據
USE mydb SELECT * FROM admin WHERE user_name='master'
故障切換:
停止主體數據庫服務,過一會在鏡像庫執行強制接收
use master ; alter database mydb set partner FORCE_SERVICE_ALLOW_DATA_LOSS; --強制接收
切換成功后,新的主體數據庫顯示‘主體,已斷開連接’
在新的主體服務器執行:
USE mydb INSERT INTO Admin( user_name) VALUES('mirror' ) SELECT * FROM admin WHERE user_name='mirror'
在訂閱服務器查看:
USE mydb SELECT * FROM admin WHERE user_name='mirror'
測試成功(測試成功的圖居然忘記截了。。。)
當宕機的原主體數據庫連接上來后,現在的主體數據庫狀態由“主體,已斷開”變成“主體,掛起”,此時需要在現主體數據庫上執行恢復操作,主體數據庫狀態變為“主體,已同步”
use master ; alter database mydb set partner resume;