目標:數據庫
主機作了Mirror和Replication,當主機出現問題時,Replication和Mirror實現自動的故障轉移(Mirror 和Replication都切換到備機,而當主機服務器
從新啓動後,自動充當備機的角色)。測試
環境:代理
五臺虛擬機,配置均爲Windows2008 Enterprise + SQLServer2008R2 Enterprise日誌
08R201:Mirror 見證機(WITNESS) IP:192.168.56.101xml
08R202:主機(Rep+Mirror) IP:192.168.56.102blog
08R203:Rep分發機 IP:192.168.56.103事務
08R204:Rep訂閱機 IP:192.168.56.104cmd
08R205:鏡像機(Mirror) IP:192.168.56.105同步
步驟:
配置有見證服務器的鏡像
08R202(Master) 上運行下面的腳本:
--主機執行: USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123456abc'; CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' , START_DATE = '11/08/2010',EXPIRY_DATE = '10/31/2099'; --主機執行: 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 ); --主機執行: BACKUP CERTIFICATE HOST_A_certTO FILE = 'D:HOST_A_cert.cer';
08R205(Mirror) 上運行下面的腳本:
--備機執行: USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123456abc'; CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate', START_DATE = '11/08/2010',EXPIRY_DATE = '10/31/2099'; --備機執行: 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 ); --備機執行: BACKUP CERTIFICATE HOST_B_certTO FILE = 'D:HOST_B_cert.cer';
08R201(WITNESS) 上運行下面的腳本:
--見證機執行 USE master; CREATE MASTER KEY ENCRYPTION BY PASSWORD ='123456abc'; CREATE CERTIFICATE HOST_W_cert WITH SUBJECT = 'HOST_W certificate', START_DATE = '11/08/2010',EXPIRY_DATE = '10/31/2099'; --見證機執行 CREATE ENDPOINT Endpoint_Mirroring STATE = STARTED AS TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL ) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_W_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL ); --見證機執行 BACKUP CERTIFICATE HOST_W_certTO FILE = 'D:HOST_W_cert.cer';
將HOST_B_cert.cer和HOST_W_cert.cer拷貝到 08R202 機器的」D:Cert「目錄;
將HOST_A_cert.cer和HOST_W_cert.cer拷貝到 08R205 機器的」D:Cert「目錄;
將HOST_A_cert.cer和HOST_B_cert.cer拷貝到 08R201 機器的」D:Cert「目錄;
08R202(Master) 上運行下面的腳本:
--Master CREATE LOGIN HOST_B_login WITH PASSWORD = '123abc!@#'; CREATEUSER HOST_B_user FOR LOGIN HOST_B_login; CREATE CERTIFICATE HOST_B_certAUTHORIZATION HOST_B_user FROM FILE = 'D:CertHOST_B_cert.cer'; GRANTCONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login]; CREATE LOGIN HOST_W_login WITH PASSWORD = '123abc!@#'; CREATE USER HOST_W_user FORLOGIN HOST_W_login; CREATE CERTIFICATE HOST_W_cert AUTHORIZATIONHOST_W_user FROM FILE = 'D:CertHOST_W_cert.cer'; GRANT CONNECT ONENDPOINT::Endpoint_Mirroring TO [HOST_W_login];
08R205(Mirror) 上運行下面的腳本:
--Mirror CREATE LOGIN HOST_A_login WITH PASSWORD = '123abc!@#'; CREATEUSER HOST_A_user FOR LOGIN HOST_A_login; CREATE CERTIFICATE HOST_A_certAUTHORIZATION HOST_A_user FROM FILE = 'D:CertHOST_A_cert.cer'; GRANTCONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login]; CREATE LOGIN HOST_W_login WITH PASSWORD = '123abc!@#'; CREATE USER HOST_W_user FORLOGIN HOST_W_login; CREATE CERTIFICATE HOST_W_cert AUTHORIZATIONHOST_W_user FROM FILE = 'D:CertHOST_W_cert.cer'; GRANT CONNECT ONENDPOINT::Endpoint_Mirroring TO [HOST_W_login];
08R201(WITNESS) 上運行下面的腳本:
--WITNESS CREATE LOGIN HOST_A_login WITH PASSWORD = '123abc!@#'; CREATEUSER HOST_A_user FOR LOGIN HOST_A_login; CREATE CERTIFICATE HOST_A_certAUTHORIZATION HOST_A_user FROM FILE = 'D:CertHOST_A_cert.cer'; GRANTCONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login]; CREATE LOGIN HOST_B_login WITH PASSWORD = '123abc!@#'; CREATE USER HOST_B_user FORLOGIN HOST_B_login; CREATE CERTIFICATE HOST_B_cert AUTHORIZATIONHOST_B_user FROM FILE = 'D:CertHOST_B_cert.cer'; GRANT CONNECT ONENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
08R202(Master) 上備份數據庫:
BACKUP DATABASE RepTest TO DISK='D:tempRepTest.bak' BACKUP LOG RepTestTO DISK='D:tempRepTest.trn'
將備份文件拷貝到 08R205(Mirror) 上作還原(最好以SA賬號登陸,使得數據庫全部者爲」SA「):
--RESTORE RESTORE DATABASE RepTest FROM DISK = N'D:RepTest.bak' WITHFILE = 1, MOVE N'RepTest' TO N'D:DataRepTest.mdf', MOVE N'RepTest_log'TO N'D:DataRepTest_log.ldf', NORECOVERY, NOUNLOAD, STATS = 10 GORESTORE LOG RepTest FROM DISK ='D:RepTest.trn' WITH NORECOVERY
在08R205(Mirror) 上執行:
--Mirror ALTER DATABASE RepTest SET PARTNER ='TCP://192.168.56.102:5022';
在 08R202(Master)上執行:
ALTER DATABASE RepTest SET PARTNER = 'TCP://192.168.56.105:5022'; ALTERDATABASE RepTest SET WITNESS = 'TCP://192.168.56.101:5022'; ALTERDATABASE RepTest SET SAFETY FULL
到此,鏡像已經創建完成。
配置Replication(事務型複製)
Replicaiton不作具體的搭建過程,只作幾點說明:
1. 08R202和08R205都須要搭建到08R203的Distribution;
2. 08R202和08R205上的發佈庫的全部者必須爲「SA」,不然切換會出現以下錯誤:The process could not execute ‘sp_replcmds’ on ‘WIN-08R205′.
3. 08R203分發機上配置文件須要作以下修改(配置故障轉移Partner):
--配置複製故障轉移參數 --查看代理配置,在分發服務器運行 execsp_help_agent_profile --Agent_Type含義 --1 = Snapshot Agent; 2 = Log Reader Agent; 3 = Distribution Agent; --4 = Merge Agent; 9 = Queue Reader Agent. --對於事務複製,需查看Agent_Type=1,2的Profile_id --對於事務複製,須要配置快照代理(Snapshot Agent)和日誌讀取代理(Log Reader Agent) execsp_add_agent_parameter @profile_id = 1, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'WIN-08R205'--鏡像服務器名稱 exec sp_add_agent_parameter @profile_id = 2, @parameter_name = N'-PublisherFailoverPartner', @parameter_value = N'WIN-08R205'--鏡像服務器名稱
修改完成後,記得重啓Agent服務,使之生效。
4. 從08R202建立到08R204的同步鏈。
模擬故障轉移並觀察結果
1. 暫停08R202的SQLServer服務;
2. 到08R205上觀察鏡像和同步鏈是否轉移過去了;
3. 若是同步鏈正常,修改某個表中的數據,看是否能同步到08R204上;
4. 從新啓動08R202的SQLServer服務,看其是否成爲了鏡像機;
5. 若是一塊兒都正常,那恭喜啦,咱們的測試成功。