--在非域控环境中创建数据库镜像, 我们必须使用证书来创建数据库镜像。 大致的步骤包括:

--在为数据库镜像配置的每个服务器实例上执行下列步骤:

--在 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、带自动故障转移功能的高安全(同步):需要见证服务器实例。如果主服务器和镜像服务器都可用,则提交在它们上面所做的更改并镜像。如果主服务器不可用,则见证服务器就会控制自动故障转移到镜像服务器上。

SQL SERVER2008 镜像全攻略的更多相关文章

  1. SQL Server 备份和还原全攻略

    原文:SQL Server 备份和还原全攻略 一.知识点 完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份, ...

  2. Moon.Orm3.8技术全攻略

    Moon.ORM技术全攻略  一.绪论 本文主要是针对Moon.ORM的技术的讨论及其使用使用指导.如有其它疑问,请留言.本文主要针对Moon.ORM3.9版本,同时将会对4.0做一个技术预览.本文从 ...

  3. 取代奶瓶Minidwep-gtk破解WPA 全攻略

    取代奶瓶Minidwep-gtk 破 WPA 全攻略  目录 1. CDlinux 下使用 minidwepgtk 获取握手包并使用自带的字典破解 2. 自带的字典破解不出密码时使用 U 盘外挂字典继 ...

  4. Android-x86虚拟机安装配置全攻略

    转自Android-x86虚拟机安装配置全攻略 注:这里安装从简,具体请参考虚拟机Vmware安装运行安卓4.0详细教程 Android-x86虚拟机安装配置网上有很多,但是全部说明白的确不多,希望这 ...

  5. 用友U8客户端连接不上服务器全攻略

    用友U8客户端连接不上服务器全攻略 http://www.enet.com.cn2009年09月23日09:26 来自论坛 [导读]:如果网络不通,就让用户查找网络原因 检查步骤: 1.网络是否通? ...

  6. VS2013全攻略(安装,技巧,快捷键,插件)!

    工欲善其事,必先利其器.VS2013全攻略(安装,技巧,快捷键,插件)! 之前一篇<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥>承蒙大家喜爱和编辑推荐,在此 ...

  7. EhLib DBGridEh组件在Delphi中应用全攻略总结(转)

    EhLib DBGridEh组件在Delphi中应用全攻略总结(转) http://blog.sina.com.cn/s/blog_94b1b40001013xn0.html 优化SQL查询:如何写出 ...

  8. 开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程

    目录 基本原理 方法1 - 本机Windows下建站 (力荐) 下载安装node.js 用管理员权限打开命令行,安装hexo-cli和hexo 下载安装git 初始化hexo 使用hexo gener ...

  9. [C#]画图全攻略(饼图与柱状图)(转)

    http://blog.chinaunix.net/uid-15481846-id-2769484.html 首先建立一个c#的类库.   打开vs.net,建立一个名为Insight_cs.WebC ...

随机推荐

  1. TOML 详解

    TOML的由来 配置文件的使用由来已久,从.ini.XML.JSON.YAML再到TOML,语言的表达能力越来越强,同时书写便捷性也在不断提升. TOML是前GitHub CEO, Tom Prest ...

  2. 序列内第k小查询(线段树)

    最近请教了一下大佬怎么求序列内第k大查询,自己又捣鼓了一下,虽然还没有懂得区间第k大查询,不过姑且做一个记录先吧 因为每个元素大小可能很大而元素之间不连续,所以我们先离散化处理一下,程序中的ori[ ...

  3. Linux操作系统常见安装方式

    Linux操作系统常见安装方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在window操作系统安装程序只需要点点鼠标就能搞定的事情,但是在Linux操作系统中,尤其是字符终端 ...

  4. 六、Kafka 用户日志上报实时统计之分析与设计

    一.项目整体概述 简述项目的背景 背景:用户行迹企业运营 分析项目的目的 通过对项目的分析,可以初步得到以下目的: •实时掌握用户动态 •根据实时统计结果,适度推广 •统计分析效果,快速合理的调整 二 ...

  5. VBS 重启 TP-Link 路由器

    分享一个自己用的小工具,重启TP-Link路由器的,好像还是大学时候写的,献丑了. 其他路由器可能有些不同,但是思路都是差不多的. user = "admin" '路由器帐号 pa ...

  6. 使用Console命令调试JS

    一.console 的对象常用的方法 1.console.log(object[, object, ...])使用频率最高的一条语句:向控制台输出一条消息.支持 C 语言 printf 式的格式化输出 ...

  7. 【JAVA】配置JAVA环境变量,安装Eclipse

    Java程序依赖JDK,就像C#程序依赖.NetFrameWork一样. 所以在开发之前,必须在win7或者是linux上,安装jdk(JavaDevelopkit)里面包括java一些工具,还有JR ...

  8. LintCode 407: Plus One

    LintCode 407: Plus One 题目描述 给定一个非负数,表示一个数字数组,在该数的基础上+1,返回一个新的数组. 该数字按照位权大小进行排列,位权最大的数在列表的最前面. 样例 给定 ...

  9. canvas画布,写字板

    <!doctype html><html><head> <meta charset="utf-8"> <meta http-e ...

  10. EOJ Monthly 2019.2 (based on February Selection) D.进制转换

    题目链接: https://acm.ecnu.edu.cn/contest/140/problem/D/ 题目: 思路: 我们知道一个数在某一个进制k下末尾零的个数x就是这个数整除kx,这题要求刚好末 ...