数据库镜像可以与事务复制一起使用实现数据库整体的高可用性和高性能,其中镜像可以提供故障检测和故障转移,复制则用于实现读写分离。
数据库镜像涉及一个数据库的两个副本,这两个副本通常驻留在不同的计算机上。 在任何给定时间都只有一个数据库副本可供客户端使用。 该副本称为主体数据库。 客户端对主体数据库所做的更新应用到数据库的另一副本(称为镜像数据库)。 镜像涉及将在主体数据库上执行的每个插入、更新或删除操作的事务日志应用到镜像数据库上。
复制将数据和数据库对象从一个数据库复制和分发到另一个数据库,然后在数据库之间进行同步以保持一致性。
主体数据库和镜像数据库必须共享分发服务器
主体数据库/发布数据库:10.86.3.100,机器名WIN-3-100
镜像数据库:10.86.3.101,机器名WIN-3-101
分发数据库:10.86.3.102,机器名WIN-3-102
订阅数据库1:10.86.3.103,机器名WIN-3-103
数据库名称mydb,端口都是1433
镜像配置的验证方式采用证书验证
步骤1:配置镜像
  • 通过备份方式准备镜像数据库
在主体数据库上创建完整备份和日志备份,官方文档指出,需要至少一个日志备份:
BACKUP DATABASE [mydb] TO DISK = N'D:\backup\mydb.bak' WITH NOFORMAT, NOINIT,  NAME = N'mydb-完整数据库备份 ', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
BACKUP LOG [mydb] TO DISK = N'D:\backup\mydb.trn' WITH NOFORMAT, NOINIT, NAME = N'mydb-事务日志 备份' , SKIP , NOREWIND , NOUNLOAD , STATS = 10
GO

将备份拷贝到镜像服务器上,在镜像服务器上恢复备份,需要指定RESTORE WITH NORECOVERY

RESTORE DATABASE [mydb] FROM  DISK = N'D:\backup\mydb.bak' WITH   FILE = 1,  NORECOVERY ,  NOUNLOAD ,  STATS = 10
GO
RESTORE LOG [mydb] FROM DISK = N'D:\backup\mydb.trn' WITH FILE = 1, NORECOVERY, NOUNLOAD, STATS = 10
GO
  • 配置出站连接和证书

主体数据库配置如下:

--创建密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
SELECT * FROM sys.symmetric_keys
--创建证书
CREATE CERTIFICATE cert_3_100
WITH SUBJECT = 'HOST_A certificate for database mirroring',
EXPIRY_DATE = '1/1/2020'
SELECT * FROM sys.certificates ;
--创建端点
CREATE ENDPOINT master_instance
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE cert_3_100
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
)
SELECT name , role_desc , state_desc , connection_auth_desc , encryption_algorithm_desc
FROM sys.database_mirroring_endpoints
--备份证书到其他系统
BACKUP CERTIFICATE cert_3_101 TO FILE = 'd:\cert_3_100.cer';
GO

镜像数据库配置如下:

--创建密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'password'
SELECT * FROM sys.symmetric_keys
--创建证书
CREATE CERTIFICATE cert_3_101
WITH SUBJECT = 'HOST_A certificate for database mirroring',
EXPIRY_DATE = '1/1/2020'
SELECT * FROM sys.certificates ;
--创建端点
CREATE ENDPOINT backup_instance
STATE = STARTED
AS TCP (
LISTENER_PORT=5022
, LISTENER_IP = ALL
)
FOR DATABASE_MIRRORING (
AUTHENTICATION = CERTIFICATE cert_3_101
, ENCRYPTION = REQUIRED ALGORITHM AES
, ROLE = ALL
)
SELECT name , role_desc , state_desc , connection_auth_desc , encryption_algorithm_desc
FROM sys.database_mirroring_endpoints
--备份证书到其他系统
BACKUP CERTIFICATE cert_3_101 TO FILE = 'd:\cert_3_101.cer';
GO
  • 配置入站连接和证书

主体数据库配置如下:

USE master
--为其他系统创建登录名
CREATE LOGIN login_3_101 WITH PASSWORD = 'password';
SELECT * FROM sys.server_principals
--创建一个使用该登录名的用户
CREATE USER user_3_101 FOR LOGIN login_3_101
SELECT * FROM sys.sysusers
--将证书与用户关联,并将镜像库生成的证书文件放到指定目录中
CREATE CERTIFICATE cert_3_101
AUTHORIZATION user_3_101
FROM FILE = 'd:\cert_3_101.cer'
SELECT * FROM sys.certificates
--授权对远程镜像端点的登录名的 CONNECT权限,授权完成后,完成对登录到所需的证书身份验证的设置
GRANT CONNECT ON ENDPOINT::master_instance TO login_3_101

镜像数据库配置如下:

USE master
--为其他系统创建登录名
CREATE LOGIN login_3_100 WITH PASSWORD = 'password';
SELECT * FROM sys.server_principals
--创建一个使用该登录名的用户,并将主体库生成的证书文件放到指定目录中
CREATE USER user_3_100 FOR LOGIN login_3_100
SELECT * FROM sys.sysusers
--将证书与用户关联
CREATE CERTIFICATE cert_3_100
AUTHORIZATION user_3_100
FROM FILE = 'd:\cert_3_100.cer'
SELECT * FROM sys.certificates
--授权对远程镜像端点的登录名的 CONNECT权限,授权完成后,完成对登录到所需的证书身份验证的设置
GRANT CONNECT ON ENDPOINT::backup_instance TO login_3_100
  • 配置镜像

选择主体数据库mydb数据库对象右键->任务->镜像->配置安全性

因为要采用高性能方式,所以不需要见证服务器

当同步完成后,主体数据库会显示“(主体,已同步)”,镜像数据库会显示(已同步,正在还原)

步骤2:配置分发服务器

  • 在发布服务器、分发服务器和订阅服务器配置hosts文件,加入如下配置:
10.86.3.101    WIN-3-101
10.86.3.102    WIN-3-102
10.86.3.103    WIN-3-103
10.86.3.104    WIN-3-104
  • 将10.86.3.102配置成分发服务器,分发数据库的快照文件建议配置相应的访问权限,因为我的账户有访问权限,所以略去这步
在分发服务器上,选择复制->配置分发,按照下图操作:

点击添加

剩下的就直接下一步,直到完成即可
  • 在分发服务器属性对话框中启用发布服务器
在分发服务器复制选项->分发服务器属性->发布服务器,点击添加按钮,选择发布服务器WIN-3-100,在弹出需要设置管理链接密码的对话框中,输入管理链接的密码

  • 在主体数据库(发布数据库)和镜像数据库中指定分发数据库
首先在WIN-3-100上配置,在复制功能上右键->配置分发,按照图中指示配置,选择"使用以下服务器作为分发服务器",点击添加按钮,选择WIN-3-102作为分发服务器

输入管理密码与步骤3中配置的管理链接密码一致
 
下一步,直至完成。然后如法炮制,在镜像服务器中将WIN-3-102配置为分发服务器,指向同一分发数据库和快照文件
 
步骤3配置发布服务器
选择复制->本地发布->新建发布,按照如下步骤操作

如果要发布的数据库非常大,建议选择业务空闲期进行初始化快照

配置用于故障转移的复制代理(快照代理和日志读取代理)
启动复制监视器,选择发布服务器,选择快照代理,右键代理配置,选择代理配置文件

输入代理名称,取消勾选“仅显示次配置文件中使用的参数”,指定 –PublisherFailoverPartner 代理参数的镜像名称WIN-3-100

按照上述方法,设置日志读取器代理,指定–PublisherFailoverPartner 代理参数的镜像名称WIN-3-100
创建完成之后还有关键的一步,就是在主体和镜像服务器上执行 DBCC TRACEON(1448,-1),如果可以重启最好加入到实例的启动参数中去。如果不设置该参数,会报复制的事务正等待下一次日志备份或等待镜像伙伴更新
 
步骤4配置订阅服务器
在订阅服务器中(WIN-3-103)中建立订阅复制,选择复制->本地订阅(右键)->新建订阅

步骤5测试
连接发布库,向测试表中插入数据并查询
USE mydb
INSERT INTO Admin( user_name) VALUES('master' )
SELECT * FROM admin WHERE user_name='master'

连接订阅库,查询插入数据

USE mydb
SELECT * FROM admin WHERE user_name='master'

故障切换:
停止主体数据库服务,过一会在镜像库执行强制接收
use master ;
alter database mydb set partner FORCE_SERVICE_ALLOW_DATA_LOSS; --强制接收
切换成功后,新的主体数据库显示‘主体,已断开连接’
在新的主体服务器执行:
USE mydb
INSERT INTO Admin( user_name) VALUES('mirror' )
SELECT * FROM admin WHERE user_name='mirror'

在订阅服务器查看:

USE mydb
SELECT * FROM admin WHERE user_name='mirror'
测试成功(测试成功的图居然忘记截了。。。)
当宕机的原主体数据库连接上来后,现在的主体数据库状态由“主体,已断开”变成“主体,挂起”,此时需要在现主体数据库上执行恢复操作,主体数据库状态变为“主体,已同步”
use master ;
alter database mydb set partner resume;

SQL Server复制情况下的高可用方案(一)镜像+复制的更多相关文章

  1. Sql Server优化之索引提示----我们为什么需要查询提示,Sql Server默认情况下优化策略选择的不足

    环境: Sql Server2012 SP3企业版,Windows Server2008 标准版 问题由来: 最近在做DB优化的时候,发现一个存储过程有非常严重的性能问题, 由于整个SP整体逻辑是一个 ...

  2. 疑难杂症--在Windows Server 2008 R2上运行SQL Server 2008情况下,CPU过多导致的问题

    64位的Windows7和Windows Server 2008 R2为了能够在一台机器上,支持超过64个逻辑CPU, 引入了Processor Group这个概念.Processor Group会把 ...

  3. DRBD(Distributed Replicated Block Device) 分布式块设备复制 进行集群高可用方案

    DRBD是一个用软件实现的.无共享的.服务器之间镜像块设备内容的存储复制解决方案. 外文名 DRBD drbdadm 高级管理工具 drbdsetup 置装载进kernel的DRBD模块 drbdme ...

  4. SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -2(虚拟IP视角)

    1.需求描述 我们知道Windows Cluster 都是多节点的,当虚拟IP漂移的时候,一般都是从一个节点漂移到另外一个节点.如果可以及时捕捉到旧节点信息是什么.新节点信息是什么对我们提供高可用的数 ...

  5. keepalived+mysql双主复制高可用方案

    MySQL双主复制,即互为Master-Slave(只有一个Master提供写操作),可以实现数据库服务器的热备,但是一个Master宕机后不能实现动态切换.而Keepalived通过虚拟IP,实现了 ...

  6. centos下搭建高可用redis

    Linux下搭建高可用Redis缓存 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Li ...

  7. SQL Server中查询CPU占用高的SQL语句

    SQL Server中查询CPU占用高的情况,会用到sys.sysprocesses ,dm_exec_sessions ,dm_exec_requests 一.查看当前的数据库用户连接有多少 USE ...

  8. MySQL 同步复制及高可用方案总结

    1.前言 mysql作为应用程序的数据存储服务,要实现mysql数据库的高可用.必然要使用的技术就是数据库的复制,如果主节点出现故障可以手动的切换应用到从节点,这点相信运维同学都是知道,并且可以实现的 ...

  9. BizTalk Server 2010高可用方案

    BizTalk Server 2010高可用方案 本文介绍了 Microsoft BizTalk Server 中通过对主机的各层进行扩展提供高可用性的方案. 分隔各个区域的功能分为不同的主机和中的层 ...

随机推荐

  1. geohash基本原理

    geohash基本原理是将地球理解为一个二维平面,将平面递归分解成更小的子块,每个子块在一定经纬度范围内拥有相同的编码,这种方式简单粗暴,可以满足对小规模的数据进行经纬度的检索 目录: 经纬度常识 认 ...

  2. HTML 代码复用实践 (静态页面公共部分提取复用)

    原文:HTML 代码复用实践 上面的链接里面安装配置步骤已经非常详细,这里主要记录我操作过程中遇到的几个问题 gulp-file-include 的使用     按上面的步骤安装之后,node_mod ...

  3. python学习笔记——2

    Python的字符串 在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言. 对于单个字符的编码,Python提供了ord()函数获取字符的整数表示 ...

  4. day27_面向对象进阶

    飒飒 : . . . . 六.描述符 1 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协 ...

  5. Hibernate5.2之QBC查询

                                                         Hibernate5.2值QBC查询 一.简介  Hibenate的QBC查询个人认为是Hib ...

  6. 扩展ValidationAttribute 1

    MVC中经常会用一些服务端对Model的验证. 服务端验证要继承自ValidationAttribute,并重写IsValid虚方法来自定义自己的验证规则. protected override Va ...

  7. PBR实现2.0

    之前的错误和欠缺 1. 过于简单的划分diffuse和specular,非常光滑的非金属材料也是很能反光的2. 费奈尔效应的处理,F0的选取也比较随意3. 没有GI,更不支持AO 正确划分diffus ...

  8. Sql Server Job 简单使用

    http://www.cnblogs.com/zerocc/p/3400529.html(转载) use msdb EXEC sp_add_job @job_name =   'tk_bakdata' ...

  9. log4cplus 直接创建logger 对象

    #include <log4cplus/loggingmacros.h> #include <log4cplus/fileappender.h> #include <lo ...

  10. jQuery MiniUI开发系列之:数据验证

    在开发应用系统界面时,往往需要进行很多.复杂的数据验证,当填写的数据符合规定,才能提交保存. jQuery MiniUI提供了比较完美的表单数据验证和错误显示的方式. 常见的表单控件,都有一个验证事件 ...