準備:
1. 一個主機,兩個虛擬機
2. 安裝相同版本的SQL Server(2016及以上,Standard或Enterprise)>參考
3. 防火牆開放端口5022
一、數據庫備份和還原
--主體:設置“完整恢復模式”
USE master;
ALTER DATABASE [DBName] SET RECOVERY FULL
GO
--主體:備份數據庫
USE master;
BACKUP DATABASE [DBName]
TO DISK='G:\SQLServer\BACKUP\DBName.bak'
WITH INIT,FORMAT;
GO
--鏡像:還原數據庫(NORECOVERY)
--若主體數據庫與鏡像數據庫路徑一致
RESTORE DATABASE DBName
FROM DISK = 'C:\DBName.bak'
WITH NORECOVERY
GO
--若不一致
RESTORE DATABASE [DBName]
FROM DISK='C:\DBName.bak'
WITH NORECOVERY,
MOVE 'DBName_Data' TO
'D:\Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\Data\DBName_Data.mdf',
MOVE 'DBName_Log' TO
'D:\Program Files\Microsoft SQL Server\MSSQL.n\MSSQL\Data\DBName_Log.ldf';
GO
主體與鏡像數據庫路徑不一致時,建議先使用命令行查詢實際的邏輯名稱(LogicalName):
RESTORE FILELISTONLY FROM DISK='C:\DBName.bak'
比如我的數據庫數據邏輯名是DBName而非DBName_Data,日誌的邏輯名是DBName_log而不是DBName_Log
二、創建證書並交換
/*主體 HOST_A*/
--創建數據庫主密鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<1_Strong_Password!>';
GO
--創建證書
USE master;
CREATE CERTIFICATE HOST_A_cert
WITH SUBJECT = 'HOST_A certificate for database mirroring',
EXPIRY_DATE = '12/31/2020';
GO
--備份證書
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'C:\HOST_A_cert.cer';
GO
/*鏡像 HOST_B*/
--創建數據庫主密鑰(可選)
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<Strong_Password_#2>';
GO
--創建證書
CREATE CERTIFICATE HOST_B_cert
WITH SUBJECT = 'HOST_B certificate for database mirroring',
EXPIRY_DATE = '12/31/2020';
GO
--備份證書
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'C:\HOST_B_cert.cer';
GO
/*見證 HOST_C*/
--創建證書
CREATE CERTIFICATE HOST_C_cert
WITH SUBJECT = 'HOST_C certificate for database witness',
EXPIRY_DATE = '12/31/2020';
GO
--備份證書
BACKUP CERTIFICATE HOST_C_cert TO FILE = 'C:\HOST_C_cert.cer';
GO
/*交換證書:相互拷貝證書*/
三、創建數據庫鏡像端點(用於出站連接)
/*主體*/
USE master;
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_A_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
);
GO
/*鏡像*/
USE master;
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_B_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
);
GO
/*見證*/
USE master;
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE HOST_C_cert
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = WITNESS
);
GO
四、還原證書(用於入站連接)
/* 主體 */
USE master;
--1.爲HOST_B/HOST_C創建登錄名
CREATE LOGIN Mirror_login
WITH PASSWORD = '1Sample_Strong_Password!@#';
GO
--2.創建一個使用該登錄名的用戶
USE master;
CREATE USER Mirror_user FOR LOGIN Mirror_login;
GO
--3.將HOST_B的證書與它在HOST_A上的用戶關聯
CREATE CERTIFICATE HOST_B_cert
AUTHORIZATION Mirror_user
FROM FILE = 'C:\HOST_B_cert.cer';
GO
--3.將HOST_C的證書與它在HOST_A上的用戶關聯
CREATE CERTIFICATE HOST_C_cert
AUTHORIZATION Mirror_user
FROM FILE = 'C:\HOST_C_cert.cer';
GO
/* 鏡像 */
--TODO:創建登錄名及用戶
USE master;
CREATE CERTIFICATE HOST_A_cert
AUTHORIZATION Mirror_user
FROM FILE = 'C:\HOST_A_cert.cer';
GO
CREATE CERTIFICATE HOST_C_cert
AUTHORIZATION Mirror_user
FROM FILE = 'C:\HOST_C_cert.cer';
GO
/* 見證 */
--TODO:創建登錄名及用戶
USE master;
CREATE CERTIFICATE HOST_A_cert
AUTHORIZATION Mirror_user
FROM FILE = 'C:\HOST_A_cert.cer';
GO
CREATE CERTIFICATE HOST_B_cert
AUTHORIZATION Mirror_user
FROM FILE = 'C:\HOST_B_cert.cer';
GO
五、開始鏡像
/*鏡像*/
USE master
GO
ALTER DATABASE [DBName] SET PARTNER = 'TCP://192.168.16.218:5022'; --配置主體服務器
GO
/*主體*/
USE master
GO
ALTER DATABASE [DBName] SET PARTNER = 'TCP://192.168.16.159:5022'; --配置鏡像服務器
GO
ALTER DATABASE [DBName] SET PARTNER = 'TCP://192.168.16.153:5022'; --配置見證服務器
GO
--注意:先配置鏡像的PARTNER,再配置主體的
問題
在配置過程中,由於誤操作比較多,導致遇到LSN過早的問題,如果在當前業務中日誌不是很重要,可以先把日誌清空再進行備份和還原操作
/*主體*/
--清除日誌
USE [master]
GO
ALTER DATABASE DBName SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE DBName SET RECOVERY SIMPLE --簡單模式
GO
USE MirrorDemo
GO
DBCC SHRINKFILE (N'DBName_log' , 2, TRUNCATEONLY) --設置壓縮後的日誌大小爲2M,可以自行指定
GO
USE [master]
GO
ALTER DATABASE DBName SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE DBName SET RECOVERY FULL --還原爲完全模式
GO
--備份日誌:參照第一步
/*鏡像*/
--還原日誌:參照第一步
附兩個鏡像配置教程以供參考: