SQLServer 复制和数据库镜像 详细配置部署

SQLserver 可以把镜像和复制同时部署,结合了双方的高可用性,可以使数据库得到更好的高可用性和容灾的保证。

关于镜像:数据库镜像

关于复制:数据库镜像

本章的复制为事务可更新订阅:事务复制的可更新订阅

关于复制和数据库镜像:复制和数据库镜像

理论的东西参考官方文档吧,这里主要是部署配置过程。

下图为本章参考部署的架构图:

本章模拟的服务器:


kk-ad


192.168.2.1


DC(域控)


kk-db1


192.168.2.10


主机(Replication + Mirror)


kk-db2


192.168.2.11


镜像(Mirror)


kk-db3


192.168.2.12


见证机(WITNESS)+ 分发


kk-db4


192.168.2.13


订阅(测试1个)

将复制与数据库镜像一起使用时,注意以下要求和注意事项:

1. 主体数据库和镜像数据库必须共享分发服务器。 建议此处使用远程分发服务器,如果发布服务器有意外故障转移,则远程分发服务器可以提供较大的容错能力。

2. 对于合并复制,以及对于使用只读订阅服务器或排队更新订阅服务器的事务复制,复制支持对发布数据库进行镜像。 不支持即时更新对等拓扑中的订阅服务器、Oracle 发布服务器、发布服务器并重新发布。

3. 存在于数据库外部的元数据和对象不复制到镜像数据库,包括登录名、作业、链接服务器等等。 如果要求镜像数据库中有元数据和对象,则必须手动复制它们。

配置复制和数据库镜像主要步骤:

1. 配置数据库镜像;(参考 SQLServer 数据库镜像(二)域环境中完整镜像脚本配置

2. 配置分发服务器;(参考 如何配置发布和分发  , 如何在分发服务器上启用远程发布服务器

3. 配置发布和订阅;(参考 如何创建事务性发布的可更新订阅  ,SqlServer 使用脚本创建分发服务及事务复制的可更新订阅

说明及注意修改的地方:

本测试使用域账号作为数据库登录账号:[KK\UserReplMirror]

对应数据库用户:[UserReplMirror]

测试数据库:[DemoDB]

确保各服务器能相互访问

数据库 [DemoDB]  恢复模式为完整模式(镜像必须)

数据库 [DemoDB]  所有者改为 [sa]

账号 [KK\UserReplMirror] 授予 sysadmin 权限;或者在数据库 [DemoDB] 中授予用户 [UserReplMirror] 数据库角色为 [db_owner]

复制的代理作业的所有者都改为[sa]

1. 配置数据库镜像:

--主体创建数据库
USE [master]
GO
CREATE DATABASE [DemoDB]
GO
ALTER DATABASE [DemoDB] SET RECOVERY FULL WITH NO_WAIT
GO

--主体:创建证书 和 备份
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '[email protected]';
GO
CREATE CERTIFICATE Cert_kk_db1_mssqlserver
WITH SUBJECT = 'Cert_kk_db1_mssqlserver',
START_DATE = '2015-06-01',EXPIRY_DATE = '2018-06-01';
GO
BACKUP CERTIFICATE Cert_kk_db1_mssqlserver
TO FILE = 'C:\Databases\Cert_kk_db1_mssqlserver.cer';
GO  

--镜像:创建证书 和 备份
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '[email protected]';
GO
CREATE CERTIFICATE Cert_kk_db2_mssqlserver
WITH SUBJECT = 'Cert_kk_db2_mssqlserver',
START_DATE = '2015-06-01',EXPIRY_DATE = '2018-06-01';
GO
BACKUP CERTIFICATE Cert_kk_db2_mssqlserver
TO FILE = 'C:\Databases\Cert_kk_db2_mssqlserver.cer';
GO 

--见证:创建证书 和 备份
USE master;
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '[email protected]';
GO
CREATE CERTIFICATE Cert_kk_db3_mssqlserver
WITH SUBJECT = 'Cert_kk_db3_mssqlserver',
START_DATE = '2015-06-01',EXPIRY_DATE = '2018-06-01';
GO
BACKUP CERTIFICATE Cert_kk_db3_mssqlserver
TO FILE = 'C:\Databases\Cert_kk_db3_mssqlserver.cer';
GO 

--  交换证书(相互拷贝证书):
/*
主体证书(拷贝到)————>镜像、见证
镜像证书(拷贝到)————>主体、见证
见证证书(拷贝到)————>主体、镜像
*/  

--  主体(创建用户、还原证书、创建端点):
USE master
GO
CREATE LOGIN [KK\UserReplMirror] FROM WINDOWS;
GO
CREATE USER [UserReplMirror] FOR LOGIN [KK\UserReplMirror];
GO
CREATE CERTIFICATE [Cert_kk_db2_mssqlserver]
AUTHORIZATION [UserReplMirror]
FROM FILE = 'C:\Databases\Cert_kk_db2_mssqlserver.cer';
GO
CREATE CERTIFICATE [Cert_kk_db3_mssqlserver]
AUTHORIZATION [UserReplMirror]
FROM FILE = 'C:\Databases\Cert_kk_db3_mssqlserver.cer';
GO

CREATE ENDPOINT [Endpoint_For_Mirror]
    AUTHORIZATION [KK\UserReplMirror]
    STATE=STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING
    (ROLE = PARTNER, AUTHENTICATION = CERTIFICATE Cert_kk_db1_mssqlserver, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
--GRANT CONNECT ON ENDPOINT::Endpoint_For_Mirror TO [KK\UserReplMirror];
--GO

--  镜像(创建用户、还原证书、创建端点):
USE master
GO
CREATE LOGIN [KK\UserReplMirror] FROM WINDOWS;
GO
CREATE USER [UserReplMirror] FOR LOGIN [KK\UserReplMirror];
GO
CREATE CERTIFICATE [Cert_kk_db1_mssqlserver]
AUTHORIZATION [UserReplMirror]
FROM FILE = 'C:\Databases\Cert_kk_db1_mssqlserver.cer';
GO
CREATE CERTIFICATE [Cert_kk_db3_mssqlserver]
AUTHORIZATION [UserReplMirror]
FROM FILE = 'C:\Databases\Cert_kk_db3_mssqlserver.cer';
GO

CREATE ENDPOINT [Endpoint_For_Mirror]
    AUTHORIZATION [KK\UserReplMirror]
    STATE=STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING
    (ROLE = PARTNER, AUTHENTICATION = CERTIFICATE Cert_kk_db2_mssqlserver, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
--GRANT CONNECT ON ENDPOINT::Endpoint_For_Mirror TO [KK\UserReplMirror];
--GO

--  见证(创建用户、还原证书、创建端点):
USE master
GO
CREATE LOGIN [KK\UserReplMirror] FROM WINDOWS;
GO
CREATE USER [UserReplMirror] FOR LOGIN [KK\UserReplMirror];
GO
CREATE CERTIFICATE [Cert_kk_db1_mssqlserver]
AUTHORIZATION [UserReplMirror]
FROM FILE = 'C:\Databases\Cert_kk_db1_mssqlserver.cer';
GO
CREATE CERTIFICATE [Cert_kk_db2_mssqlserver]
AUTHORIZATION [UserReplMirror]
FROM FILE = 'C:\Databases\Cert_kk_db2_mssqlserver.cer';
GO

USE master;
CREATE ENDPOINT [Endpoint_For_Mirror]
    AUTHORIZATION [KK\UserReplMirror]
    STATE=STARTED
    AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)
    FOR DATA_MIRRORING
    (ROLE = WITNESS, AUTHENTICATION = CERTIFICATE Cert_kk_db3_mssqlserver, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
--GRANT CONNECT ON ENDPOINT::Endpoint_For_Mirror TO [KK\UserReplMirror];
--GO

--主体:备份数据库
USE master;
BACKUP DATABASE [DemoDB]
TO DISK = 'C:\Databases\DemoDB.BAK' WITH INIT,FORMAT
GO 

BACKUP LOG [DemoDB]
TO DISK = 'C:\Databases\DemoDB_LOG.BAK' WITH INIT,FORMAT
GO 

--镜像:还原数据库(NORECOVERY)
USE master;
RESTORE DATABASE [DemoDB]
FROM  DISK = N'C:\Databases\DemoDB.BAK'
WITH  FILE = 1,
MOVE N'DemoDB' TO N'C:\Databases\DemoDB.mdf',
MOVE N'DemoDB_log' TO N'C:\Databases\DemoDB_log.ldf',
NOUNLOAD, NORECOVERY, STATS = 10
GO  

RESTORE DATABASE [DemoDB]
FROM DISK = N'C:\Databases\DemoDB_LOG.BAK'
WITH NORECOVERY
GO 

--开始镜像 

--在【镜像】执行,PARTNER为主服务器
USE [master]
GO
ALTER DATABASE [DemoDB] SET PARTNER = 'TCP://192.168.2.10:5022';
GO  

--在【主体】执行,PARTNER为镜像服务器
USE [master]
GO
ALTER DATABASE [DemoDB] SET PARTNER = 'TCP://192.168.2.11:5022';
GO
ALTER DATABASE [DemoDB] SET WITNESS = 'TCP://192.168.2.12:5022';
GO

--在主体执行:设置为高安全模式
ALTER DATABASE [DemoDB] SET SAFETY FULL

EXEC [DemoDB].dbo.sp_changedbowner @loginame = N'sa', @map = false
GO
EXEC master..sp_addsrvrolemember @loginame = N'KK\UserReplMirror', @rolename = N'sysadmin'
GO

2. 配置分发服务器

登录到该服务器。


kk-db3


192.168.2.12


见证机(WITNESS)+ 分发

右键复制,配置分发。

分发服务器选择 “kk-db3” 本地服务器。添加 “KK-DB1 ” (主机)和  “KK-DB2 ” (镜像) 为发布服务器,否则连接不到该分发服务器。

注意:创建分发服务器时,要求数据管理密码。右键“复制”—“分发服务器属性”—“发布服务器”  可看到和设置。

配置用于故障转移的复制代理

可配置参数 PublisherFailoverPartner 的代理:

1 - 复制快照代理(对于所有发布)

2 - 复制日志读取器代理(对于所有事务发布)

4 - 复制合并代理(对于合并订阅)

9 - 复制队列读取器代理(对于支持排队更新订阅的事务发布)

当前为可更新订阅,只要更改1,2,9 就行(分发库执行)

[email protected]_value 为镜像服务
exec sp_add_agent_parameter @profile_id = 1,
@parameter_name = N'-PublisherFailoverPartner',
@parameter_value = N'kk-db2'

exec sp_add_agent_parameter @profile_id = 2,
@parameter_name = N'-PublisherFailoverPartner',
@parameter_value = N'kk-db2'

exec sp_add_agent_parameter @profile_id = 9,
@parameter_name = N'-PublisherFailoverPartner',
@parameter_value = N'kk-db2'

接着 重启SQL Server 代理

3. 配置发布和订阅

登录到服务器


kk-db1


192.168.2.10


主机(Replication + Mirror)

创建本地发布,选择分发服务器。(只有分发中添加了发布服务器的信息,此处才能访问)

这里需要输入在分发服务器设置的管理密码。

注:此时在分发服务器( 192.168.2.12 )生成的复制相关作业代理,所有者改为 [sa]

登录到服务器


kk-db4


192.168.2.13


订阅

创建订阅:(发布选择 “kk-db1”)

创建完成订阅后,初始化订阅,登录到服务器:


kk-db1


192.168.2.10


主机(Replication + Mirror)

登录到服务器:


kk-db3


192.168.2.12


见证机(WITNESS)+ 分发

右键 “复制”—“启动复制监视器”,右键 “添加发布服务器”,将 发布服务器 “kk-db1” 添加,即可看到复制监控情况

配置已完成!~

4. 测试

现在把主体(Replication + Mirror)服务停止:

停止后,到原来的镜像(kk-db2)查看,镜像变成了主体,本地发布也出现了(原来镜像是不存在的)

但是,当我从现在的主体(kk-db2)插入数据时,数据并没有同步到订阅!~

难道是哪里配置不对??!~~

网上查找后,发现是BUG,原因是:

This problem occurs because Log Reader Agent does not copy the transactions that are marked for replication from the transaction log into the distribution database. Log Reader Agent cannot read past a specific log sequence number (LSN). This specific LSN
represents the last LSN that has been hardened to the transaction log of the mirror database.

FIX: Changes in the publisher database are not replicated to the subscribers in a transactional replication if the publisher database runs exposed in a database mirroring
session in SQL Server 2005

暂时不修复,用其他方法设置也可以:

(先启动 kk-db1 的SQLserver 服务)

在主体 和 镜像中,设置服务启动参数,添加 -T1448,重启服务即可。

此时停止主体实例,镜像变成主体,操作数据可正常和订阅同步了!~

至此,就算完成了,个人测试,也可能有不对的地方。

时间: 2024-08-05 07:06:19

SQLServer 复制和数据库镜像 详细配置部署的相关文章

SQL server 2005 数据库镜像详细过程

1.添加完整的域名后缀 重启系统 右键计算机 ==> 属性 ==> 更改设置(计算机名) ==> 更改 ==> hq.com 2.SQL服务启动账户 创建相同的用户账户 密码也必须相同 并且加入到管理员组 配置用户名密码: net user hqsqluser HqsqlQWE19832 /add 将用户加入到组: net localgroup administrators hqsqluser /add 查看命令 net user hqsqluser 删除users组 net lo

SQL Server 2012 数据库镜像配置完整篇

"数据库镜像"是一种提高 SQL Server 数据库的可用性的解决方案. 镜像基于每个数据库实现,并且只适用于使用完整恢复模式的数据库.数据库镜像维护一个数据库的两个副本,这两个副本必须驻留在不同的 SQL Server 数据库引擎 服务器实例上. 通常,这些服务器实例驻留在不同位置的计算机上. 启动数据库上的数据库镜像操作时,在这些服务器实例之间形成一种关系,称为"数据库镜像会话".其中一个服务器实例使数据库服务于客户端("主体服务器"), 

如何配置数据库镜像<一>

一.简介 “数据库镜像”是Sql Server 2005推出的一个主要用于提高数据库可用率的软件解决方案.镜像是基于每个数据库执行的,仅适用于使用完整恢复模式的数据库.简单恢复模式和大容量日志恢复模式不支持数据库镜像. 数据库镜像是通过维护一个热备用服务器而发挥作用的.在一般的镜像会话期间,如果生产服务器出现故障,客户端应用程序可以通过重新连接到备用服务器来快速进行恢复. 二.前提条件 1.准备好服务器,保证数据库版本至少是Sql Server 2005 SP1,当然最好是最新版本,老的版本测试

通过SQL Server 2008数据库复制实现数据库同步备份

SQL Server 2008数据库复制是通过发布/订阅的机制进行多台服务器之间的数据同步,我们把它用于数据库的同步备份.这里的同步备份指的是备份服务器与主服务器进行 实时数据同步,正常情况下只使用主数据库服务器,备份服务器只在主服务器出现故障时投入使用.它是一种优于文件备份的数据库备份解决方案. 在选择数据库同步备份解决方案时,我们评估了两种方式:SQL Server 2008的数据库镜像和SQL Server 2008数据库复制.数据库镜像的优点是系统能自动发现主服务器故障,并且自动切换至镜

13.1 准备数据库镜像

13.1 准备数据库镜像 以下通过实验说明配置数据库镜像的过程. 现有环境如下: 服务器名称 角色 SQLSVR1 主体服务器 SQLSVR2 镜像服务器 SQLSVR3 见证服务器 需要配置数据库镜像的数据库为SQLDB01. 13.1.1 先决条件 由于主体服务器需要往镜像服务器传送事务日志记录,因此数据库必须为完整恢复模式. 数据库镜像不支持 FILESTREAM.不能在主体服务器上创建 FILESTREAM 文件组.不能为包含 FILESTREAM 文件组的数据库配置数据库镜像. 在 3

SQLServer 数据库镜像+复制切换方案

目标: 主机做了Mirror和Replication,当主机出现问题时,Replication和Mirror实现自动的故障转移(Mirror 和Replication都切换到备机,而当主机 重新启动后,自动充当备机的角色). 环境: 五台虚拟机,配置均为Windows2008 Enterprise + SQLServer2008R2 Enterprise 08R201:Mirror 见证机(WITNESS)           IP:192.168.56.101 08R202:主机(Rep+Mi

centos7部署MongoDB数据库复制集(超详细)

centos7部署MongoDB数据库复制集(超详细)重点:复制集概述:复制集实现原理:复制集的应用案例:一.概述:组成:Mongodb复制集(副本集replica set)由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary通过oplog来同步Primary的数据,保证主节点和从节点数据的一致性,复制集在完成主从复制的基础上,通过心跳机制,一旦primary节点出现宕

SQLServer 数据库镜像(二)域环境中完整镜像脚本配置

SQLServer 数据库镜像(一)单服务器无见证的镜像脚本配置 断断续续弄了几天,搭建了域,服务器加入域后再测试另一种情况. 测试环境: 主服务器:   IP = 192.168.2.10 InstanceName = MSSQLSERVER LISTENER_PORT = 5022 镜像服务器:    IP = 192.168.2.10 InstanceName = MSSQLSERVERA LISTENER_PORT = 5023 见证服务器: IP = 192.168.2.11 Inst

数据库热备之SQLServer的数据库镜像实施笔记

转载自:http://kb.cnblogs.com/page/45937/ 最初在为公司设计SQLServer数据库镜像的时候,首先考虑的是高可用性(三台计算机,一台见证服务器,一台做主数据库,一台做镜像) 在虚拟机环境下部署成功,一切都是那么的完美.故障转移3秒之内就可以顺利完成. 1.高可用性的实施代码: /******************************************************** 此脚本在主体服务器执行 ************************