SQL SERVER2008 鏡像全攻略

--在非域控環境中建立數據庫鏡像, 咱們必須使用證書來建立數據庫鏡像。 大體的步驟包括:

--在爲數據庫鏡像配置的每一個服務器實例上執行下列步驟:

--在 master 數據庫中,建立數據庫主密鑰。
--在 master 數據庫中,爲服務器實例建立加密證書。
--使用服務器實例的證書爲該服務器實例建立端點。
--將證書備份到文件,並將其安全地複製到其餘系統。


--而後,對爲數據庫鏡像配置的每一個夥伴執行這些步驟。在 master 數據庫中:

--爲其餘系統建立登陸名。
--建立一個使用該登陸名的用戶。
--獲取其餘服務器實例的鏡像端點的證書。
--將該證書與在步驟 2 中建立的用戶相關聯。
--授予對該鏡像端點的登陸名的 CONNECT 權限。


/*查詢全部當前數據庫名
select SERVERPROPERTY(N'servername')
SELECT
dtb.name AS [Name]
FROM
master.sys.databases AS dtb
ORDER BY
[Name] ASC
*/
-------------------------------------------------------前期準備
-- 查看數據庫版本
SELECT @@VERSION
-----配置數據庫鏡像事務安全級別
ALTER DATABASE TestMirroring SET SAFETY FULL
-----更改主數據庫爲使用完整恢復模式(若是非完整恢復模式則 可使用下面SQL更改成 完整恢復模式)
USE master
ALTER DATABASE TestMirroring
SET RECOVERY FULL WITH no_wait

/*跨數據庫事務和分佈式事務均不支持數據庫鏡像
*/

--主服務器 見證服務器 鏡像服務器的數據庫版本必須相同
--備份主數據庫(完整備份)
BACKUP DATABASE [TestMirroring] TO DISK = N'C:/wenzhongfiles/TestMirror.bak' WITH NOFORMAT, NOINIT,
NAME = N'TestMirroring-完整 數據庫 備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10
--備份主數據庫的完整日誌文件
BACKUP LOG [TestMirroring] TO DISK = N'C:/wenzhongfiles/TestMirrorlog.bak' WITH NOFORMAT, NOINIT,
NAME = N'TestMirroring-事務日誌 備份', SKIP, NOREWIND, NOUNLOAD, STATS = 10
--在鏡像服務器上還原(還原選項 norecovery(即不對數據庫執行任何操做))
RESTORE DATABASE [TestMirroring] FROM DISK = N'F:/TestMirror.bak' WITH FILE = 1, MOVE N'TestMirror'
TO N'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestMirroring.mdf', MOVE N'TestMirror_log'
TO N'E:/Program Files/Microsoft SQL Server/MSSQL10.MSSQLSERVER/MSSQL/DATA/TestMirroring_1.ldf', NORECOVERY, NOUNLOAD, REPLACE, STATS = 10
--將備份的完整日誌文件在 鏡像服務器上執行 日誌文字間恢復(還原選項 norecovery(即不對數據庫執行任何操做))
RESTORE LOG [TestMirroring] FROM DISK = N'F:/TestMirrorlog.bak' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10


--------------正式開始(代碼僅僅是舉例主服務器上的)

--------------------------------------------------------------------------在 主、鏡像、見證服務器上 分別執行:
------建立數據庫對稱密鑰
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'wenzhong';
GO
------建立數據庫證書(注意:證書失效日期)
--DROP CERTIFICATE host_A_cert
CREATE CERTIFICATE host_A_cert
WITH SUBJECT = 'host_A certificate',START_DATE = '01/01/2011',EXPIRY_DATE = '12/31/2099';
GO
------利用建立的證書爲服務器實例建立鏡像端點
--DROP ENDPOINT Endpoint_Mirroring
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 = PARTNER
)
GO
------將證書分別備份出來,而後互換(即:主服務器上保證存在 鏡像和見證服務器上建立的證書;鏡像服務器上 存在 主服務器和見證服務器上建立的證書;
-- 見證服務器上存在 主服務器和鏡像服務器上建立的證書)
BACKUP CERTIFICATE host_A_cert TO FILE = 'F:\Host_A_cert.cer'
------在各自的服務器上爲其餘兩個服務器分別建立一個登錄名
USE master;
--DROP LOGIN host_B_login
CREATE LOGIN host_B_login WITH PASSWORD = 'wenzhong'
GO
USE master;
--DROP LOGIN host_C_login
CREATE LOGIN host_C_login WITH PASSWORD = 'wenzhong'
GO
------建立一個使用上面建立的登陸名的用戶
--DROP USER host_B_user
CREATE USER host_B_user FOR LOGIN host_B_login;
GO --DROP USER host_C_user
CREATE USER host_C_user FOR LOGIN host_C_login;
GO
------使得證書和用戶進行關聯
--DROP CERTIFICATE host_B_cert
CREATE CERTIFICATE host_B_cert
AUTHORIZATION host_B_user
FROM FILE = 'F:/host_B.cer'
GO
--DROP CERTIFICATE host_C_cert
CREATE CERTIFICATE host_C_cert
AUTHORIZATION host_C_user
FROM FILE = 'F:/host_C.cer'
GO
------將對遠程鏡像端點的鏈接(CONNECT)權限授予該登陸名
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_B_login]
GO
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [host_C_login]
GO

-----------------避免「孤立用戶」。鏡像服務器的缺點就是不能自動維護登陸名,須要手動維護。
-------在主服務器中查找相應的用戶名和對應的SID號
USE master
select sid,name from syslogins
-------在鏡像服務器上(備機上)將對應的用戶名和SID建立起來
USE master
exec sp_addlogin
@loginame = '<LoginName>',
@passwd = '<Password>',
@sid = <sid>
-------能夠在此時進行備份主數據庫和日誌並進行還原操做,也能夠在正式開始前執行備份和還原操做(sql見前面)


-----------------------------------------------------------------------------最後
--------在鏡像服務器上將主數據庫設置爲其夥伴(必須首先執行,順序不能顛倒)
ALTER DATABASE TestMirroring
SET PARTNER = 'TCP://192.168.0.211:5022'
GO
--------在主數據庫服務器上將鏡像服務器設置爲其夥伴
ALTER DATABASE TestMirroring
SET PARTNER = 'TCP://192.168.0.111:5022'
GO
--------在主數據庫服務器上設置見證服務器。
ALTER DATABASE TestMirroring
SET WITNESS = 'TCP://192.168.0.192:5022'
GO

-----------------------------------------------------------------------------對設置是否成功進行測試
--------因爲鏡像 的缺點:在鏡像服務器上沒法查詢數據。須要測試是否能夠成功。(數據庫複製功能則能夠)
--------經過在鏡像數據庫上建立數據庫快照能夠間接讀取某一個時刻點的鏡像數據庫
--------測試過程:
--------主機上執行:
USE master;

ALTER DATABASE TestMirroring SET SAFETY FULL;-----切換到高安全模式不然執行手動切換會失敗

GO
ALTER DATABASE TestMirroring SET PARTNER FAILOVER ---手動進行主備切換
------鏡像服務器上執行:
USE master;
ALTER DATABASE TestMirroring SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS ---在鏡像機上執行強制切換(當主服務器數據宕機時)


-------若是原來的主服務器恢復,能夠繼續工做,須要從新設定鏡像
----備機(鏡像服務器)上執行:
--恢復鏡像
USE master;
ALTER DATABASE TestMirroring SET PARTNER RESUME
--切換主備
ALTER DATABASE TestMirroring SET PARTNER FAILOVER
------------------------刪除數據庫鏡像
ALTER DATABASE TestMirroring SET PARTNER OFF
-----------暫停數據庫鏡像會話
ALTER DATABASE TestMirroring SET PARTNER SUSPEND
-----恢復數據庫鏡像會話
ALTER DATABASE TestMirroring SET PARTNER RESUME
ALTER DATABASE TestMirroring SET PARTNER SUSPEND
-----關閉見證服務器
ALTER DATABASE TestMirroring SET WITNESS OFF





/*

默認狀況下,事務安全級別的設置爲 FULL,即同步運行模式,並且SQL Server 2005 標準版只支持同步模式。
關閉事務安全可將會話切換到異步運行模式,該模式可以使性能達到最佳。
*/
--事務安全,同步模式
USE master;
ALTER DATABASE TestMirroring SET PARTNER SAFETY FULL
--事務不安全,異步模式
ALTER DATABASE TestMirroring SET PARTNER SAFETY OFF;

--------在高性能模式下,見證服務器對可用性會有不利影響。若是見證服務器是針對數據庫鏡像會話而配置,則主體服務器必須至少鏈接到一個其餘服務器實例,
-- 即鏡像服務器或見證服務器,或者是鏈接到這兩個服務器。不然,將沒法使用數據庫,而且不能進行強制服務(可能丟失數據)。
-- 所以,對於高性能模式,建議始終將見證服務器設置爲 OFF。
-- 見證服務器的惟一角色是支持自動故障轉移。並不能用於數據庫,是 SQL Server 的可選實例。
-- 它能使高安全性模式會話中的鏡像服務器識別出是否要啓動自動故障轉移(見證服務器的角色就是啓動自動故障轉移)。
ALTER DATABASE TestMirroring SET PARTNER OFF

/*
自動故障轉移所需條件

A、數據庫鏡像會話必須在高安全性模式下運行,而且必須處理見證服務器。
B、鏡像數據庫必須已經同步。這將保證發送到鏡像服務器的全部日誌都已寫入磁盤。
C、主體服務器已中斷了與其他數據庫鏡像配置的通訊,而鏡像服務器和見證服務器將保留仲裁。可是,若是全部服務器實例都已中斷通訊,
而見證服務器和鏡像服務器稍後從新創建通訊,則不會發生自動故障轉移。
D、鏡像服務器已檢測到丟失了主體服務器
E、鏡像服務器檢測主體服務器故障的方式取決於故障是硬故障仍是軟故障。

自動故障轉移原理

A、若是主體服務器仍在運行中,則將主體數據庫的狀態更改成 DISCONNECTED 並斷開全部客戶端與主體數據庫的鏈接。
B、見證服務器和鏡像服務器將主體服務器註冊爲不可用。
C、若是重作隊列中有任何等待的日誌,則鏡像服務器將完成前滾鏡像數據庫的操做
D、前一個鏡像數據庫做爲新的聯機主體數據庫,恢復經過儘快回滾未提交的事務將這些事務所有清除。鎖將隔離這些事務。
E、當前一個主體服務器從新聯接到會話時,它將認定其故障轉移夥伴如今擁有主體角色。前一個主體服務器接管鏡像角色,並將其數據庫做爲鏡像數據庫。
新的鏡像服務器會盡快將新的鏡像數據庫與主體數據庫同步。新的鏡像服務器從新同步數據庫後,就能夠再次執行故障轉移,但按反向執行。。
*/

--------------------外延
-----使用ADO.NET或者SQL Native Client可以自動鏈接到故障轉移後的夥伴,鏈接字符串以下所示:
  ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true; 

--若是沒有鏡像服務器的建設,或環境沒法實現鏡像服務器的建設。經過下面的代碼同樣能夠實現相似鏡像的功能 

-----C# code


Imports System.Data.SqlClient
Imports System.Data

Public Class dbConn
Private primaryServerLocation As String="SERVER=primaryAddress;DATABASE=yourDB;User id=youruserID;Password=yourPassword;"
Private secondaryServerLocationAsString="SERVER=secondaryAddress;DATABASE=yourDB;User id=youruserID;Password=yourPassword;"


Public sqlConnection AsSqlConnection
Public cmd AsSqlCommand

Public Sub primaryConnection()
Try
sqlConnection = New System.Data.SqlClient.SqlConnection(primaryServerLocation)
cmd = NewSystem.Data.SqlClient.SqlCommand()

'test connection
sqlConnection.Open()
sqlConnection.Close()
Catch ex As Exception
secondaryConnection()
End Try
End Sub

Public Sub secondaryConnection()
'Used as the failover secondary serverif primaryis down.
Try
sqlConnection = New System.Data.SqlClient.SqlConnection(secondaryServerLocation)
cmd = NewSystem.Data.SqlClient.SqlCommand()

'test connection
sqlConnection.Open()
sqlConnection.Close()
Catch ex As Exception
End Try
End Sub


-----C# code
  --=================查看數據庫鏡像的配置狀態=================

-- 1.經過Management studio 對象資源管理器,查看主體數據庫、鏡像數據庫狀態
-- 2.經過Management studio 對象資源管理器中的數據庫屬性查看狀態
-- 3.經過系統目錄視圖查看數據庫鏡像配置狀況

use master
go
SELECT * FROM sys.database_mirroring_endpoints
SELECT * FROM sys.database_mirroring
WHERE database_id =(SELECT database_id FROM sys.databases
WHERE name = 'TestMirroring')
SELECT * FROM sys.database_mirroring_witnesses






鏡像的運行模式有三種:

一、 高性能(異步):先提交主服務器上的更改,而後將其傳輸到鏡像服務器上。

二、不帶自動故障轉移功能的高安全(同步): 過程始終提交主服務和鏡像服務器上的更改。

三、帶自動故障轉移功能的高安全(同步):須要見證服務器實例。若是主服務器和鏡像服務器均可用,則提交在它們上面所作的更改並鏡像。若是主服務器不可用,則見證服務器就會控制自動故障轉移到鏡像服務器上。 sql

相關文章
相關標籤/搜索