数据库镜像可以与事务复制一起使用实现数据库整体的高可用性和高性能,其中镜像可以提供故障检测和故障转移,复制则用于实现读写分离。
数据库镜像涉及一个数据库的两个副本,这两个副本通常驻留在不同的计算机上。 在任何给定时间都只有一个数据库副本可供客户端使用。 该副本称为主体数据库。 客户端对主体数据库所做的更新应用到数据库的另一副本(称为镜像数据库)。 镜像涉及将在主体数据库上执行的每个插入、更新或删除操作的事务日志应用到镜像数据库上。
复制将数据和数据库对象从一个数据库复制和分发到另一个数据库,然后在数据库之间进行同步以保持一致性。
主体数据库和镜像数据库必须共享分发服务器
主体数据库/发布数据库: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. MYSQL file types redo log

    https://blogs.oracle.com/mysqlinnodb/entry/data_organization_in_innodb https://blogs.oracle.com/mysq ...

  2. ubuntu 16.04 启用root用户方法

    引用:http://blog.csdn.net/sunxiaoju/article/details/51993091 1.使用:sudo passwd root设置root的密码,如下图所示: 2.使 ...

  3. 转:linux lsof命令详解

    简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

  4. Maven新建webapp项目index.jsp报错

    最近用eclipse新建了一个maven项目,结果刚新建完成index.jsp页面就报错了,先把错误信息贴出来看看 后来就找资料,结果发现两种解决办法,希望可以帮助用得上的人! 第一种:直接在pom. ...

  5. Who is using Asio?

    https://think-async.com/Asio/WhoIsUsingAsio

  6. [Linux] -Docker修改空间大小

    Docker默认空间大小分为两个,一个是池空间大小,另一个是容器空间大小. 池空间大小默认为:100G 容器空间大小默认为是:10G 所以修改空间大小也分为两个: 这里使用centos下的yum进行安 ...

  7. T-SQL中的随机数

    SQL开发中会有生成随机数的需求,下面说几种常用的需求和解决办法(基于MS SQL),最后总结出通用的办法: 1.0-9间的随机整数,包括0和9本身: abs(checksum(newid()))%1 ...

  8. Svg path画线(不管是直线还是曲线)在一定情况下线条的宽度不一的情况(记录)

    在项目中涉及到svg: 使用path划线实现图表功能. 记录在实现的过程中发现的问题:path在小像素的情况下画出的线条宽度不一样.这是为什么呢? 以下是我做的猜想: 可以看图 在宽度给的很足的时候没 ...

  9. SPOJ bsubstr

    题目大意:给你一个长度为n的字符串,求出所有不同长度的字符串出现的最大次数. n<=250000 如:abaaa 输出: 4 2 1 1 1 spoj上的时限卡的太严,必须使用O(N)的算法那才 ...

  10. Angular中的Ajax

    //我们使用Ajax访问本地或者同域名下的数据或者文件module.controller('InTheatersController',['$scope','$http', function($sco ...