| 角色 | IP | 代號 | SQL 版本 |
|---|---|---|---|
| 主體伺服器 | 192.168.10.2 | A | SQL Server 2005 |
| 鏡像伺服器 | 192.168.10.1 | B | SQL Server 2005 |
鏡像端點通訊埠:TCP 5022 (防火牆需雙向開放)。
-- 1. 建立資料庫主金鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPassword#2024';
GO
-- 2. 建立主體專用憑證
CREATE CERTIFICATE Cert_A
WITH SUBJECT = 'Cert_A_Mirroring',
START_DATE = '2024-01-01',
EXPIRY_DATE = '2099-01-01';
GO
-- 3. 建立鏡像端點,綁定憑證
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRING (
AUTHENTICATION = CERTIFICATE Cert_A,
ENCRYPTION = REQUIRED ALGORITHM AES, -- 建議 AES 強度
ROLE = ALL
);
GO
-- 4. 備份憑證公開鑰,複製到鏡像伺服器 B
BACKUP CERTIFICATE Cert_A TO FILE = 'D:\Cert_A.cer';
GO
USE master;
GO
-- 1. 建立主金鑰
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'StrongPassword#2024';
GO
-- 2. 建立鏡像專用憑證
CREATE CERTIFICATE Cert_B
WITH SUBJECT = 'Cert_B_Mirroring',
START_DATE = '2024-01-01',
EXPIRY_DATE = '2099-01-01';
GO
-- 3. 建立端點,綁定自身憑證
CREATE ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
FOR DATABASE_MIRRING (
AUTHENTICATION = CERTIFICATE Cert_B,
ENCRYPTION = REQUIRED ALGORITHM AES,
ROLE = ALL
);
GO
-- 4. 備份憑證公開鑰,複製到主體伺服器 A
BACKUP CERTIFICATE Cert_B TO FILE = 'D:\Cert_B.cer';
GO
-- 1. 建立鏡像端連線用登入
CREATE LOGIN Login_B WITH PASSWORD = 'ComplexPwd$Mirror';
GO
-- 2. 建立使用者映射
CREATE USER User_B FOR LOGIN Login_B;
GO
-- 3. 從 B 複製來的公開鑰建立憑證,授權給 User_B
CREATE CERTIFICATE Cert_B AUTHORIZATION User_B FROM FILE = 'D:\Cert_B.cer';
GO
-- 4. 授予連線端點權限
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [Login_B];
GO
CREATE LOGIN Login_A WITH PASSWORD = 'ComplexPwd$Mirror';
GO
CREATE USER User_A FOR LOGIN Login_A;
GO
CREATE CERTIFICATE Cert_A AUTHORIZATION User_A FROM FILE = 'D:\Cert_A.cer';
GO
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [Login_A];
GO
-- 確保完整復原模式
ALTER DATABASE TestDB SET RECOVERY FULL;
GO
-- 完整備份
BACKUP DATABASE TestDB
TO DISK = 'D:\SQLBackup\TestDB_Full.bak'
WITH FORMAT, INIT, COMPRESSION, CHECKSUM;
GO
-- 記錄備份 (同一文件追加)
BACKUP LOG TestDB
TO DISK = 'D:\SQLBackup\TestDB_Full.bak'
WITH CHECKSUM;
GO
-- 將 .bak 複製到鏡像伺服器 B 同路徑或共享路徑
直接
RESTORE ... FROM DISK易觸發「備份集與現有資料庫不同」錯誤。建議使用sp_addumpdevice邏輯裝置方式,確保備份集識別一致。
-- 1. 建立邏輯備份裝置
EXEC sp_addumpdevice 'disk', 'TestDB_Full_Dev', 'D:\Backup\TestDB_Full.bak';
EXEC sp_addumpdevice 'disk', 'TestDB_Log_Dev', 'D:\Backup\TestDB_Full.bak'; -- 同檔不同組
GO
-- 2. 完整備份還原 (NORECOVERY)
RESTORE DATABASE TestDB
FROM TestDB_Full_Dev
WITH FILE = 1, NORECOVERY, REPLACE, STATS = 10;
GO
-- 3. 記錄備份還原 (NORECOVERY)
-- 先查詢備份組序號
RESTORE HEADERONLY FROM TestDB_Log_Dev;
-- 假設最後一組 Position = 2
RESTORE LOG TestDB
FROM TestDB_Log_Dev
WITH FILE = 2, NORECOVERY;
GO
若備份檔包含多組,
FILE必須指定對應序號。可用RESTORE HEADERONLY確認最後一組 LSN 連續性。
ALTER DATABASE TestDB SET PARTNER = 'TCP://192.168.10.2:5022';
GO
ALTER DATABASE TestDB SET PARTNER = 'TCP://192.168.10.1:5022';
GO
-- 在主體伺服器執行
ALTER DATABASE TestDB SET PARTNER FAILOVER;
GO
-- 在鏡像伺服器執行
ALTER DATABASE TestDB SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS;
GO
ALTER DATABASE TestDB SET PARTNER OFF;
GO
-- 1. 移除鏡像關係
ALTER DATABASE TestDB SET PARTNER OFF;
GO
-- 2. 刪除端點
DROP ENDPOINT Endpoint_Mirroring;
GO
-- 3. 刪除憑證 (先刪憑證再刪主金鑰)
DROP CERTIFICATE Cert_A; -- 或 Cert_B
GO
DROP MASTER KEY;
GO
-- 4. 刪除登入/使用者
DROP LOGIN Login_B; -- 對應另一邊
DROP USER User_B;
GO