转载自:http://kb.cnblogs.com/page/45937/
最初在为公司设计SQLServer数据库镜像的时候,首先考虑的是高可用性(三台计算机,一台见证服务器,一台做主数据库,一台做镜像)
在虚拟机环境下部署成功,一切都是那么的完美。故障转移3秒之内就可以顺利完成。
1.高可用性的实施代码:/********************************************************
此脚本在主体服务器执行
********************************************************/
--镜像只支持完全恢复模式,在备份数据库之前检查恢复的模式
--对要镜像的数据库进行完整备份后,复制到镜像数据库以NORECOVERNY选项进行恢复
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd0';
GO
--为此服务器实例制作一个证书。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate',START_DATE  = '01/01/2012',EXPIRY_DATE ='01/01/2020';
GO 设置上开始日期,证书有效期为一年。不设开始日期,即日启算有效期也为一年。为了避免麻烦,使用上述参数设置有效期,否则任期内你会很惨。。。。。。EXPIRY_DATE ='01/01/2020'有效期到2020年,这个一定要有
--使用该证书为服务器实例创建一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_MirroringSTATE = STARTEDAS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_A_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = PARTNER);
GO--备份 HOST_A 证书,并将其复制到其他机器,将 C:\backup\HOST_A_cert.cer 复制到 HOST_B\HOST_C。
BACKUP CERTIFICATE HOST_A_cert TO FILE = 'C:\backup\HOST_A_cert.cer';
GO
--为入站连接配置 Host_A
--在 HOST_A 上为 HOST_B 创建一个登录名。
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'P@ssw0rd0';
GO--创建一个使用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_certAUTHORIZATION HOST_B_userFROM FILE = C:\backup\HOST_B_cert.cer'
GO--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO--在 HOST_A 上为 HOST_C 创建一个登录名。
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'P@ssw0rd0';
GO--创建一个使用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_certAUTHORIZATION HOST_C_userFROM FILE = C:\backup\HOST_C_cert.cer'
GO--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
GOUSE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'P@ssw0rd0';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR CERTIFICATE HOST_A_cert;
GO--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO--必须要在镜像数据库中先设置好伙伴后,才能在主体服务器执行
--在 HOST_A 的主体服务器实例上,将 HOST_B 上的服务器实例设置为伙伴(使其成为初始镜像服务器实例)。
ALTER DATABASE crm SET PARTNER = 'TCP://192.168.1.205:5022';
GO--设置见证服务器
ALTER DATABASE crm SET WITNESS = N'TCP://192.168.1.204:5022';
GO/***********************************************
在镜像服务器执行此脚本
***********************************************/
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd0';
GO
--为 HOST_B 服务器实例制作一个证书。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate for database mirroring', START_DATE  = '01/01/2012',EXPIRY_DATE ='01/01/2020';
;
GO
--在 HOST_B 中为服务器实例创建一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_MirroringSTATE = STARTEDAS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_B_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = PARTNER);
GO
--备份 HOST_B 证书,将 C:\HOST_B_cert.cer 复制到 HOST_A\HOST_C。
BACKUP CERTIFICATE HOST_B_cert TO FILE = 'c:\backup\HOST_B_cert.cer';
GO --为入站连接配置 Host_B
--在 HOST_B 上为 HOST_A 创建一个登录名。
USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'P@ssw0rd0';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_certAUTHORIZATION HOST_A_userFROM FILE = 'c:\backup\HOST_A_cert.cer'
GO--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO--在 HOST_B 上为 HOST_C 创建一个登录名。
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'P@ssw0rd0';
GO--创建一个使用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR LOGIN HOST_C_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_certAUTHORIZATION HOST_C_userFROM FILE = 'c:\backup\HOST_C_cert.cer'
GO--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_C_login];
GO--在 HOST_B 上为 HOST_B 创建一个登录名。
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'P@ssw0rd0';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR CERTIFICATE HOST_B_cert;
GO
--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO
--在 HOST_B 的镜像服务器实例上,将 HOST_A 上的服务器实例设置为伙伴(使其成为初始主体服务器实例)。
ALTER DATABASE crm SET PARTNER = 'TCP://192.168.1.203:5022';
GO/****************************
见证服务器执行
*****************************/
--ALTER DATABASE MirrorDB SET PARTNER OFF
USE master;
--DROP MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'P@ssw0rd0';
GO--为此服务器实例制作一个证书。
--DROP CERTIFICATE HOST_C_cert
CREATE CERTIFICATE HOST_C_cert WITH SUBJECT = 'HOST_C certificate',START_DATE  = '01/01/2009';
GO--使用该证书为服务器实例创建一个镜像端点。
--DROP ENDPOINT Endpoint_Mirroring
CREATE ENDPOINT Endpoint_MirroringSTATE = STARTEDAS TCP (LISTENER_PORT=5022, LISTENER_IP = ALL) FOR DATABASE_MIRRORING ( AUTHENTICATION = CERTIFICATE HOST_C_cert, ENCRYPTION = REQUIRED ALGORITHM AES, ROLE = WITNESS);
GO--备份 HOST_C 证书,并将其复制到其他系统,即 HOST_B\HOST_A。
BACKUP CERTIFICATE HOST_C_cert TO FILE = 'c:\backup\HOST_C_cert.cer';
GO--为入站连接配置 Host_C
--在 HOST_C 上为 HOST_B 创建一个登录名。
USE master;
--DROP LOGIN HOST_B_login
CREATE LOGIN HOST_B_login WITH PASSWORD = 'P@ssw0rd0';
GO--创建一个使用该登录名的用户。
--DROP USER HOST_B_user
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_B_cert
CREATE CERTIFICATE HOST_B_certAUTHORIZATION HOST_B_userFROM FILE = 'c:\backup\HOST_B_cert.cer'
GO--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];
GO--在 HOST_C 上为 HOST_A 创建一个登录名。
USE master;
--DROP LOGIN HOST_A_login
CREATE LOGIN HOST_A_login WITH PASSWORD = 'P@ssw0rd0';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_A_user
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
GO
--使证书与该用户关联。
--DROP CERTIFICATE HOST_A_cert
CREATE CERTIFICATE HOST_A_certAUTHORIZATION HOST_A_userFROM FILE = 'c:\backup\HOST_A_cert.cer'
GO--授予对远程镜像端点的登录名的 CONNECT 权限。
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];
GO--在 HOST_C 上为 HOST_C 创建一个登录名。
USE master;
--DROP LOGIN HOST_C_login
CREATE LOGIN HOST_C_login WITH PASSWORD = 'P@ssw0rd0';
GO
--创建一个使用该登录名的用户。
--DROP USER HOST_C_user
CREATE USER HOST_C_user FOR CERTIFICATE HOST_C_cert;
GO可能有朋友们会比较有疑惑,你一下搞两个数据库出来,他们的ip地址都不一样,到时候数据库切换过去了,我的数据库的连接字符串可如何是好?难道还得在代码中去控制是连接哪个数据库吗?
其实这个问题是这样的,使用ADO.NET或者SQL Native Client能够自动连接到故障转移后的伙伴,连接字符串如下所示:
ConnectionString="DataSource= A;Failover Partner=B;Initial Catalog=AdventureWorks;Integrated Security=true;"
DataSource= A;这个就是我们常用的主数据库的ip地址,Failover Partner=B;这个填写的就是镜像数据库的ip地址,一旦出现了连接错误,ado.net会在超时以后自动去连接镜像数据库。2.高级别保护模式
在昨天晚上加班做实施的时候,才发现我的设计已经被修改了,由于以前的项目有java写的也有c#写的,全自动的故障转移不能够实现。换句话说,由于老项目中的历史遗留问题,以及特殊模块的耦合性过高,无法解耦,只能在高级别保护模式或高性能模式中选择一种了。那么这两者有什么区别呢?
简单一点来说,区别就在与事务安全模式上跟应用场景上。
高级别保护模式采用的是同步镜像, SAFETY FULL。应用场景:通常在局域网中或对数据要求比较高的场景中。
高性能保护模式采用的是异步镜像, SAFETY OFF。应用场景:通常在广域网或对数据要求不太高,丢失几条数据是允许的,但是必须保证它不中断服务。
在微软的SQLServer2005的课程上是这么说的。如果是高级别保护模式的话,主、从数据库只要有一台不能正常保证服务,数据库就不能够对外进行服务了,我在开始的时候就没有打算采用这种模式,因为部门经理说了,丢失一两条数据是可以接受的,况且我们公司是做运营的,按照起先微软的课程的理论,高级别保护模式是不太适合我们公司的应用场景的,万一有一台数据库出问题了,整个服务就被中断,这是不能让人接受的。再说了,公司对数据要求不太苛刻,两台服务器都有内网线连接,由于内网传输速度非常的快,即使采用高性能模式,一般来说也是不会丢失数据的。于是我打算采用高性能模式来做数据库的镜像。由于公司服务器没有域环境,所以我就采用了证书验证来做SQLServer镜像。
意外收获:
两台服务器全部都安装了SQLServer2008,在设置事务安全模式的时候,才发现SQLServer2008不支持异步模式。提示大概如下:此SQLServer版本不支持修改事务安全模式,alter database失败。我当时汗都出来了,忙活了一晚上,到最后居然是这个结果。
由于是服务器维护时间,我大胆的把镜像服务器停止了,结果却让我大吃一惊,主数据库依旧可以正常工作,正常对外提供服务。也就是说,起先微软的课程讲的知识是错误的,两台数据库做镜像,不管是哪台数据库出了问题,另外的一台数据库都可以保证正常对外提供服务。于是我反复试验反复切换了一下,结果依然是这样。
由于高级别保护模式与高性能模式代码差不太多,只是在事务安全模式的设置上有些小区别,前面已经提到,这里就不再多解释了。实施的代码如下:USE  master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE CERTIFICATE HOST_A_cert WITH SUBJECT = 'HOST_A certificate' ,
START_DATE  = '01/01/2012',EXPIRY_DATE ='01/01/2020';
;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 = ALL );BACKUP  CERTIFICATE HOST_A_cert TO  FILE  =  'c:\backup\HOST_A_cert.cer';CREATE  LOGIN HOST_B_login WITH  PASSWORD  =  'password';
CREATE USER HOST_B_user FOR LOGIN HOST_B_login;
CREATE CERTIFICATE HOST_B_cert AUTHORIZATION HOST_B_user FROM FILE = 'c:\backup\HOST_B_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_B_login];ALTER  DATABASE crm SET  PARTNER  =  'TCP://10.10.10.8:5022';USE  master;
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password';
CREATE CERTIFICATE HOST_B_cert WITH SUBJECT = 'HOST_B certificate',
START_DATE  = '01/01/2012',EXPIRY_DATE ='01/01/2020';
;CREATE  ENDPOINT Endpoint_Mirroring
STATE = STARTED
AS
TCP ( LISTENER_PORT=5022 , LISTENER_IP = ALL )
FOR
DATABASE_MIRRORING
( AUTHENTICATION = CERTIFICATE HOST_B_cert , ENCRYPTION = REQUIRED ALGORITHM AES , ROLE = ALL );BACKUP  CERTIFICATE HOST_B_cert TO  FILE  =  'c:\backup\HOST_B_cert.cer';CREATE  LOGIN HOST_A_login WITH  PASSWORD  = 'password';
CREATE USER HOST_A_user FOR LOGIN HOST_A_login;
CREATE CERTIFICATE HOST_A_cert AUTHORIZATION HOST_A_user FROM FILE = 'c:\backup\HOST_A_cert.cer';
GRANT CONNECT ON ENDPOINT::Endpoint_Mirroring TO [HOST_A_login];ALTER  DATABASE crm SET  PARTNER  =  'TCP://10.10.10.6:5022';可能有朋友会比较奇怪,你这里也没有使用ALTER DATABASE crm SET SAFETY FULL; 按理应该是高性能模式才对呀?
其实这个问题是这样的,我的这个SQLServer2008默认已经是将事务安全模式设置为full了,即使是手动设置也一样,并且我实施的时候SQLServer2008不支持将事务安全模式设置为OFF。
OK,一切都设置好了,那么就可以模拟服务器真的down机时候的操作了,后续的工作我也把代码做了总结,具体代码如下:--主备互换
--主机执行:ALTER DATABASE crm SET PARTNER FAILOVER--主服务器Down掉,备机紧急启动并且开始服务
ALTER DATABASE crm SET PARTNER FORCE_SERVICE_ALLOW_DATA_LOSS原来的主服务器恢复,可以继续工作,需要重新设定镜像
--备机执行:
USE master
ALTER DATABASE crm SET PARTNER RESUME  --恢复镜像ALTER DATABASE crm SET PARTNER FAILOVER; --切换主备3.监视数据库镜像
SQLServer提供了一些视图,可以供查询镜像的各种状态,到时候可以根据这个做一个监视,一旦发生故障转移群集,发邮件给系统管理员,好让系统管理员及时的知道数据库服务器发生了什么问题,即使的做故障分析、排查。有关这方面资料,MSDN上已经提供太多资料了。感兴趣的朋友可以去查这方面的资料。
在文章的最后提出一个有争议的问题:SQLServer(2008)高级别保护模式,只要有一台数据库能够保证正常运行,就可以正常对外提供服务。我的实验结果是这样的,这的确跟以往的理论知识有些出入。
还等什么,赶快搭环境动手实验一下吧,体验一下SQLServer镜像带来的快感。希望有兴趣的朋友们一起学习探讨。

转载于:https://www.cnblogs.com/lhws/p/3807593.html

数据库热备之SQLServer的数据库镜像实施笔记相关推荐

  1. Oracle数据库数据同步方案,ORACLE数据库热备方案

    ORACLE数据库热备方案 相关指标 1.数据库秒级.事务级热备(可跨操作系统平台) 实时监控数据库,将数据库变化后的数据以秒级别的时间备份到备库,同时只备份主数据库已成功的事务. 2.备用数据库在线 ...

  2. MySQL 数据库热备的操作

    2019独角兽企业重金招聘Python工程师标准>>> 注意:服务器数据库热备  效果:缓解单台数据库连接量过大造成的响应超时问题,缓解高并发情况的响应问题: 可做操作:读写分离操作 ...

  3. mysql 本地热备_MySQL 数据库热备的操作

    注意:服务器数据库热备 效果:缓解单台数据库连接量过大造成的响应超时问题,缓解高并发情况的响应问题: 可做操作:读写分离操作,将 主服务器数据库 设置[写]操作: 从服务器数据库 设置[读]操作: 此 ...

  4. SqlServer双机热备模式下单节点数据库重装后的配置

    对于Oracle和Sqlserver来说,双机软件的本质在于,将数据库文件放到共享存储上共享出来         对于Oracle来说就是参数文件+控制文件+数据文件+日志文件         对于S ...

  5. Oracle数据库置于热备模式,Oracle数据库热备方案

    相关指标 1.数据库秒级.事务级热备(可跨操作系统平台) 实时监控数据库,将数据库变化后的数据以秒级别的时间备份到备库,同时只备份主数据库已成功的事务. 2.备用数据库在线,可进行操作 同步过程中备用 ...

  6. oracle数据库灾备方式,浅析Oracle数据库的三种灾备技术

    ;p(DxM.e0对于的灾备技术,我们可以从Data Guard,GoldenGate和CDP角度去考虑.51Testing软件测试网z(X_2r-e L1lx51Testing软件测试网^;q9fl ...

  7. 【Oracle】数据库热备

    --创建脚本 注:脚本第三行中的DB_NAME,需要改为自己的数据库名(show parameter name;): oracle用户下新建目录:/home/oracle/DB_NAME/hot_ba ...

  8. mysql数据库的冷热备份_MySQL数据备份方式,及热备与冷备的优缺点

    一.按照数据库的运行状态分类: (1) 热备:在数据库运行时,直接进行备份,对运行的数据库没有影响 (2) 冷备:在数据库停止运行的时候进行备份,这种备份方式最为简单,只需要拷贝数据库物理文件即可. ...

  9. PostgreSQL数据库WAL——备机回放checkpoint WAL

    从PostgreSQL数据库WAL--资源管理器RMGR文章中,我们知道XLog日志被划分为多个类型的资源管理器,每个资源管理器只需要负责与自己相关的日志处理(抽象出操作函数,不同的日志实现不同的操作 ...

  10. SQLServer图数据库一些优点

    SQLServer图数据库一些优点 原文:SQLServer图数据库一些优点 上一篇简要介绍了图数据库的一些基本内容(初识SQL Server2017 图数据库(一)),本篇通过对比关系型一些语法来体 ...

最新文章

  1. [翻译] Ruby Golf
  2. 关于Google Map API V2 版本的定位与导航
  3. 依赖注入之Autofac使用总结
  4. 【摩天好课】数字时代职业生涯规划
  5. mongodb添加创建修改时间_mongodb副本集生产环境下部署案例,推荐一个主两个从三台机器...
  6. agv ti 毫米波雷达_华为将利用 5G 开发激光雷达和毫米波雷达 - 产业资讯 -AGV产业联盟官方网站 -新战略机器人网-工业、服务、AGV机器人产业资讯传播者...
  7. Selenium 自动化测试基础知识
  8. 如何在六个月或更短的时间内成为DevOps工程师(一)
  9. Java学习----集合框架总结
  10. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例
  11. win10上如何启用或禁用Windows功能
  12. IDEA build时出现Artifact contains illegal characters的解决
  13. C#操作xml SelectNodes,SelectSingleNode总是返回NULL
  14. Spring全面详解(学习总结)
  15. Eclipse 菜单栏翻译
  16. word/excel 通配符
  17. Python字符串格式化
  18. BADI 和BAPI 的区别
  19. SpringBoot从入门到精通-佟刚-专题视频课程
  20. React 项目性能分析及优化

热门文章

  1. Banner字符可以通过类似以下网站生成
  2. win10系统安装postgresql后无法连接
  3. tomcat启动报错 关键字:java.lang.NoClassDefFoundError和 java.lang.ClassNotFoundExceeption
  4. acm康复训练记4-world final 2017
  5. Https之SSL原理
  6. Codeforces Round #518 (Div. 2) B LCM
  7. MyEclipse 8.5配置Tomcat 7.0
  8. tomcat多实例部署相关
  9. 小小知识点(十一)——MATLAB中fftshift的作用
  10. loadrunner—web_url