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






鏡像的運行模式有三種:

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM