/*查询所有当前数据库名
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
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
-- 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