一、注意點
1.數據庫的模式要是完整模式。
2.要對數據庫完整備份和事務日志備份,分別還原到鏡像庫上,使用NORECOVERY模式。
3.鏡像數據庫是不允許刪除和操作,即便查看屬性也不行。
4.先刪除端點,再刪除證書,再刪除主密鑰。
5.見證服務器不需要還原主體上的數據庫。
6.該文檔中主體服務器、鏡像服務器、見證服務器都沒有加入到域中。
7.主體服務器、鏡像服務器、見證服務器的操作系統可以不一樣,但是SQL版本得一致
二、搭建步驟
1、創建主密鑰(主庫、鏡像庫、認證服務器上都執行)
命令:
use master
go
create master key encryption by password='$a123456'
go
查看主密鑰
select * from sys.key_encryptions
創建主密鑰之前:
創建主密鑰之后:
2、分別在主體服務器、鏡像服務器、見證服務器上創建證書
命令:
主庫上執行:
use master
go
create certificate mirror01_cert with subject='mirror01 certificate',expiry_date='2099-1-1'
go
鏡像庫上執行:
use master
go
create certificate mirror02_cert with subject='mirror02 certificate',expiry_date='2099-1-1'
go
--見證服務器上執行
use master
go
create certificate mirror_witness_cert with subject='mirrorWitness certificate',expiry_date='2099-1-1'
go
查看證書:
select * from sys.certificates
3、分別在主體服務器、鏡像服務器、見證服務器上創建端點
命令:
主庫上執行:
use master
go
create endpoint Endpoint_Mirroring
state=started
as tcp ( listener_port = 5022,listener_ip = all )
for database_mirroring ( authentication = certificate mirror01_cert, encryption = required algorithm aes, role = all )
go
鏡像庫上執行:
use master
go
create endpoint Endpoint_Mirroring
state=started
as tcp ( listener_port = 5022,listener_ip = all )
for database_mirroring ( authentication = certificate mirror02_cert, encryption = required algorithm aes, role = all )
go
--見證服務器上執行
use master
go
create endpoint Endpoint_Mirroring
state=started
as tcp ( listener_port = 5022,listener_ip = all )
for database_mirroring ( authentication = certificate mirror_witness_cert, encryption = required algorithm aes, role = all )
go
SSMS查看創建的端點
4、備份證書(主體服務器、鏡像服務器、見證服務器都備份,並互相拷貝過去,保證每個服務器上都有3個證書)
命令:
主庫上執行:
use master
go
backup certificate mirror01_cert to file = 'D:\cert\mirror01_cert.cer'
go
鏡像庫上執行:
use master
go
backup certificate mirror02_cert to file = 'D:\cert\mirror02_cert.cer'
go
--見證服務器上執行
use master
go
backup certificate mirror_witness_cert to file = 'D:\cert\mirror_witness_cert.cer'
go
5、創建登錄名(這個要和證書關聯,所以主體服務器、鏡像服務器、見證服務器都要創建除自己以外的另外2個用戶)
命令:
主庫上執行:
--創建鏡像庫上的證書關聯用戶
use master
go
create login mirror02_login with password='abc@123456'
go
--創建見證庫上的證書關聯用戶
use master
go
create login mirror_witness with password='abc@123456'
go
鏡像庫上執行:
--創建主庫上的證書關聯用戶
use master
go
create login mirror01_login with password='abc@123456'
go
--創建見證庫上的證書關聯用戶
use master
go
create login mirror_witness with password='abc@123456'
go
見證服務器執行
--創建主庫上的證書關聯用戶
use master
go
create login mirror01_login with password='abc@123456'
go
--創建鏡像庫上的證書關聯用戶
use master
go
create login mirror02_login with password='abc@123456'
go
6、創建使用該登錄名的用戶(主體服務器、鏡像服務器、見證服務器都要創建)
命令:
主庫上執行
--創建鏡像庫上的證書關聯用戶
use master
go
create user mirror02_user for login mirror02_login
go
--創建見證庫上的證書關聯用戶
use master
go
create user mirror_witness_user for login mirror_witness
go
鏡像庫上執行
--創建主庫上的證書關聯用戶
use master
go
create user mirror01_user for login mirror01_login
go
--創建見證庫上的證書關聯用戶
use master
go
create user mirror_witness_user for login mirror_witness
go
見證服務器執行
--創建主庫上的證書關聯用戶
use master
go
create user mirror01_user for login mirror01_login
go
--創建鏡像庫上的證書關聯用戶
use master
go
create user mirror02_user for login mirror02_login
go
7、證書與用戶關聯
命令:
主庫上執行
--使鏡像庫上的證書與用戶關聯
use master
go
create certificate mirror02_cert
authorization mirror02_user
from file='D:\cert\mirror02_cert.cer'
go
--使見證庫上的證書與用戶關聯
use master
go
create certificate mirror_witness_cert
authorization mirror_witness_user
from file='D:\cert\mirror_witness_cert.cer'
go
鏡像庫上執行
--使主庫上的證書與用戶關聯
use master
go
create certificate mirror01_cert
authorization mirror01_user
from file='D:\cert\mirror01_cert.cer'
go
--使見證庫上的證書與用戶關聯
use master
go
create certificate mirror_witness_cert
authorization mirror_witness_user
from file='D:\cert\mirror_witness_cert.cer'
go
見證服務器執行
--使主庫上的證書與用戶關聯
use master
go
create certificate mirror01_cert
authorization mirror01_user
from file='D:\cert\mirror01_cert.cer'
go
--使鏡像庫上的證書與用戶關聯
use master
go
create certificate mirror02_cert
authorization mirror02_user
from file='D:\cert\mirror02_cert.cer'
go
8、授予對遠程數據庫端點的登錄名的CONNECT權限(每個上面2個用戶都要有端點的權限)
命令:
主庫上執行
use master
go
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [mirror02_login];
go
use master
go
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [mirror_witness];
go
鏡像庫上執行
use master
go
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [mirror01_login];
go
use master
go
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [mirror_witness];
go
見證服務器執行
use master
go
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [mirror01_login];
go
use master
go
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [mirror02_login];
go
9、對需要做鏡像的數據庫做完整備份和事務日志備份,然后在鏡像庫上做還原(先還原完整備份,再還原事務日志),使用NORECOVERY模式,這里不做闡述,最后還原后的數據庫狀態如下:
10.連接鏡像(先在鏡像庫上操作,然后在主庫上操作,不需要在見證數據庫上操作)
注:CCAS21、CCAS22、JF-RLZY-DB1是3台機器的機器名
命令:
鏡像庫上執行 (做完這個操作后,數據庫的狀態:正在恢復)
use master
go
ALTER DATABASE test SET PARTNER = 'TCP://CCAS21:5022';
go
主庫上執行
--連接鏡像庫
use master
go
ALTER DATABASE test SET PARTNER = 'TCP://CCAS22:5022';
go
--連接見證服務器
use master
go
ALTER DATABASE test SET WITNESS = 'TCP://JF-RLZY-DB1:5022';
go
11.查看數據庫的狀態
(1)主庫的狀態
(2)鏡像庫的狀態
三、用到的SQL
--1.刪除端點
drop endpoint Endpoint_Mirroring
--2.刪除證書(所有證書都刪除)
drop certificate mirror01_cert
--3.查看證書
select * from sys.certificates
--4.刪除主秘鑰
drop master key
--5.查詢數據庫的狀態
命令:
select
mirroring_role_desc, --數據庫在鏡像會話中的角色
mirroring_state_desc, --鏡像當前狀態
mirroring_safety_level_desc, --鏡像運行模式
mirroring_witness_state_desc --與見證服務器的連接情況
from sys.database_mirroring where database_id=DB_ID(N'test')
或
select
mirroring_role_desc, --數據庫在鏡像會話中的角色
mirroring_state, --鏡像數據庫的狀態,0-已掛起,1-於其他伙伴斷開,2-正在同步,3-掛起故障轉移,4-已同步
mirroring_state_desc, --鏡像當前狀態
mirroring_safety_level_desc, --鏡像運行模式
mirroring_safety_level , --數據庫的同步模式,1是異步,2是同步
mirroring_connection_timeout, --鏡像連接超時時間,默認是10秒
mirroring_failover_lsn --最新事務日志記錄的日志序列號
from sys.database_mirroring where database_id=DB_ID(N'APPROVE')
主庫上執行
鏡像庫上執行
6、監控的語句
命令:
select d.name as dbname, m.mirroring_state from sys.databases d
inner join sys.database_mirroring m
on d.database_id = m.database_id
where mirroring_state='1' and m.database_id >4
注:mirroring_state的值為1表示與另一伙伴斷開連接