--在非域控环境中创建数据库镜像, 我们必须使用证书来创建数据库镜像。 大致的步骤包括:
--在为数据库镜像配置的每个服务器实例上执行下列步骤:
--在 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、带自动故障转移功能的高安全(同步):需要见证服务器实例。如果主服务器和镜像服务器都可用,则提交在它们上面所做的更改并镜像。如果主服务器不可用,则见证服务器就会控制自动故障转移到镜像服务器上。