SQL Server 复制功能折腾了好几天了,现特将其配置过程以及其间遇到的问题记录下来,以备日后查阅。同时,也让“同道”同学们少走不必要的弯路。如果有不对之处,欢迎大家指正,欢迎沟通交流。

一、复制功能概述

  SQL Server 复制功能实现了主从库的分离,从而将主库的压力分解掉,主库就主要负责数据的更、改等,而主库主要负责查询。(废话一句:本人之所以入了这个坑,还是因为项目需要,我勒个去~~,真的老血都吐了3.7坛了都)。另外,有了主、从库,则从另一个方面,也多了一层安全性,即:备份。万一主从出了什么问题,从库却还在。

  本文主要讲述的是通过:发布 -------- 订阅的方式实现数据库的主、从分离。因此,必然的,将需要配置一个发布服务器 与 一个订阅服务器。其中发布服务器负责将数据分布到相应的订阅服务器上,而订阅服务器,则负责接收数据,并将数据整合、更新到自己库上,从而保证其数据与主库一样。下面将自己配置发布与订阅的流程以及遇到的问题详细记录如下。

  注意:以下配置在阿里云ECS服务器环境下操作。

二、配置前的准备工作

DBServer 机器两台,分别为:DBServer_master 与 DBServer_slave,操作系统均为:Windows Server 2008 r2 x64

SQL Server x64 Enterprize 版本(注意:使用企业版本,标准版本好像不支持事务复制,先前用的是绿色版本是不支持的,后来改用企业版就可以了)。在安装 SQL Server 时,建议全选所有组件。否则复制相关的组件必需要钩选。

三、发布与订阅

  请查看参考文献资料。关于这部分的操作网络上可以查到不少,因此不再多做介绍。

四、注意事项

  关于这部分内容其实才是真正的核心所在,网络上的文章几乎都只介绍了如果创建发布与订阅的标准流程,但其间可能会遇到的非常非常多的问题都被省掉不写。现特将本人遇到的问题都一一记录下来,以备大家查阅,少走弯路。

  1. Master服务器的网络可见需要开启。开启步骤如下:
    a) 服务 -> SSDP Discovery 启动该服务并设置自动启动
    b) 服务 -> UPnP Device Host 启动该服务并设置自动启动。(注意:该服务一定是后于 a) 点的服务开启)
    c) 右键 "网络" 图标 -> 打开网络和共享中心 -> 更改高级共享设置 -> 点选"启用网络发现"
    d) 右键 "网络" 图标 -> 打开网络和共享中心 -> 更改高级共享设置 -> 点选"启用共享以便可以访问网络的用户可以读取和写入公用文件夹中的文件"
  2. Slave服务器也按照上面第1点的操作开启网络可见性
  3. Master 服务器 与 Slave 服务器都建立如下 Windows 账户,以供 SQL Server 事务复制中进行连接使用。
    a) 控制面板 -> 用户账户 -> 管理其他账户 -> 创建一个新账户 -> 输入新用户名称(如:sql_dbuser)和密码(如:abcdefg)。
    提示:选择标准账户即可。
  4. 新建目录(如:D:\abc\master_slave),并将 master_slave 目录共享
    注意:
    a) 新建完共享目录后,一定记得在 Slave 服务器上尝试打开该远程目录,如果可以打开,则说明该目录可远程访问。(否则还怎么同步数据了?)
    b) Master 服务器与 Slave 服务器的网络环境搭建完成后,双方要互相ping以及telnet一下,看下是否能够互通,只有互通了,才可能顺序完成复制。
    提示:telnet的端口一般是1433,因为数据库安装好后,没什么特殊更改,默认就是1433端口。
    c) 正常情况下,要开放1433端口。(本人是没处理该细节,因为先前就已经在运行的Master服务器,所以肯定是有开放的)
  5. master_slave 目录共享后,为其添加 sql_dbuser 用户的读写权限。(注意:建议将 Everyone 给移除)
  6. Master 服务器与 Slave 服务器的 SQL Server 代理服务以 sql_dbuser 用户身份登录。下面以 Slave 服务器的 SQL Server 代理服务的设置为例进行描述
    a) 打开"SQL Server 配置管理器" -> SQL Server 服务 -> 右键"SQL Server 代理 (MSSQLSERVER)" -> 属性
    b) 点选"本账户" -> 在账户名右侧点击"浏览" -> 输入"sql_dbuser" -> 检查名称 -> 点击确定 -> 输入密码。(注意:SQL Server 代理需要重启)
  7. Master 服务器与 Slave 服务器需要开启 Named Pipes 以及 TCP/IP 协议。
    a) 打开"Sql Server Configuration Manager" -> SQL Server 网络配置 -> MSSQLSERVER 的协议
    b) 右键"Named Pipes" -> 启用
    c) 右键"TCP/IP" -> 启用
    注意:右键"TCP/IP" -> 属性 -> IP 地址 -> IP2的 -> "活动"有可能需要设置为"激活"(本人这边是设置为激活状态的,原本是未激活的)
  8. 在创建发布或订阅的过程中,有可能会因为计算机名被修改,导致创建不了。此时可使用下面语句判断计算机名称是否被修改,以及修正该问题
     IF SERVERPROPERTY('servername') <> @@SERVERNAME
    BEGIN
    DECLARE @server sysname
    SET @server = @@SERVERNAME
    EXEC sp_dropserver @server = @server
    SET @server = CAST(SERVERPROPERTY('servername') as sysname)
    EXEC sp_addserver @server = @server , @local = 'LOCAL'
    END
  9. Master 服务器需要创建别名
    a) 打开"Sql Server Configuration Manager" -> SQL Native Client 10.0 配置(32/64位) -> 别名
    b) 右键 -> 新建别名... -> 
            在别名处输入:计算机名。(如:DBServer_master)
            在端口处输入:1433
            服务器处输入:127.0.0.1
  10. Slave 服务器需要创建别名
    a) 打开"Sql Server Configuration Manager" -> SQL Native Client 10.0 配置(32/64位) -> 别名
    b) 右键 -> 新建别名... ->
            在别名处输入:DBServer_master
            在端口处输入:1433
            服务器处输入:DBServer_master 的内网IP地址
  11. Master 服务器与 Slave 服务器的服务器代理账户需要开启。下面以 Slave 服务器的 SQL Server 设置为便进行描述
    a) 打开"Microsoft SQL Server Management Studio" -> 连接数据库对象(注意:请以本地计算机登录,不要使用IP或localhost之类的登录,数据库账户可以使用 sa 账户),假如连接成功后的数据库对象为:iZir3n162rkr3iZ (SQL Server 10.50.1600 - sa) -> 右键 -> 属性
    b) 点选"安全性" -> 将"服务器代理账户"下的"启用服务器代理账户"复选框钩选 -> 输入代理账户 sql_dbuser 以及密码 -> 确定
  12. 在 Slave 服务器上如果新建好了订阅后,记得设置一下快照的信息。
    a) 右键新建好的本地订阅 -> 属性 -> 快照 -> 将"快照位置" 配置为 "备用文件夹"
    b) 将"快照文件夹" 配置为 "\\{Master cumputer name}\master_slave" 路径
  13. 在 Master 服务器上如果新建好了发布后,记得设置一下快照的信息。
    a) 右键新建好的本发发布 -> 属性 -> 快照 -> 将"快照文件的位置"下的 "将文件放入默认文件夹" 复选框的钩取消
    b) 将"快照文件的位置"下的 "将文件放入下列文件夹" 复选框的钩选中,然后指定先前创建好的共享目录路径。(如:D:\abc\master_slave)
  14. 成功新创建好本地发布与本地订阅后,可以分析并执行一下如下语句
     SELECT immediate_sync ,allow_anonymous FROM dbo .syspublications
    
     -- sp_helppublication;
    
     EXEC sp_changepublication
    @publication = 'xxxxxx_Pub', -- 此处将 xxxxxx_Pub 换成自己创建的本地发布
    @property = 'allow_anonymous' ,
    @value = 'false'
    GO
    EXEC sp_changepublication
    @publication = 'xxxxxx_Pub', -- 此处将 xxxxxx_Pub 换成自己创建的本地发布
    @property = 'immediate_sync' ,
    @value = 'false'
    GO
  15. 一个注意点:在成功建立好了发布与订阅后,对于新增的表,是没办法自动同步的,所以必需要重新单独对这些新增的表进行钩选同步才可,但记录的修改、字段的添加什么的,倒是可以的。

五、参考文献(资料)

  主要参考资料

  • https://blog.csdn.net/u012861467/article/details/76411216
    这篇文章说的是快照复制,但有许多细节、注意事项也是有提及到,对个人的帮助不少,点个赞
  • http://blog.51cto.com/46562434/1156582
    这篇文章说的是如何开启 Windows Server 2008 r2 的网络发现的
  • https://www.cnblogs.com/linyanyao/p/4513257.html
    这篇文章说的是当SQL Server安装后,计算机名称被更改了,要如何才能确认是否被修改,以及如何才能解决修正

  备用参考资料

  • https://www.cnblogs.com/songafeng/p/3839955.html
    这篇文章说的是同一局域网发布不了其他发布、订阅的解决办法。(提示:本人没用到这块处理就已经OK了,所以个人感觉这个是非必要的)

SQL Server 事务复制爬坑记的更多相关文章

  1. SQL Server 事务复制分发到订阅同步慢

    原文:SQL Server 事务复制分发到订阅同步慢 最近发现有一个发布经常出现问题,每几天就出错不同步,提示要求初始化.重新调整同步后,复制还是很慢!每天白天未分发的命令就达五六百万条!要解决慢的问 ...

  2. SQL Server事务复制搭建与同步经验

    0. 环境 无域环境 发布服务和分发服务器同一台主机 角色 主机名 IP 发布名 发布库名/订阅库名 发布服务器 Server1 192.168.1.100 test3 db1 分发服务器(与发布服务 ...

  3. SQL Server事务复制(sql 2008 r2)

    一.环境准备 1.两个虚拟服务器 主机1:XINXIBU01  作为发布和分发服务器   主 机2:XINXIBU02 192.168.1.160  作业阅服务器 2.SQL SERVER sql 2 ...

  4. [20170706]SQL Server事务复制订阅端,job不小心被删,修复

    右击还存在的订阅,生成脚本,有个过程sp_addpullsubscription_agent 执行,发现报错说distribution agent 已经存在 执行: UPDATE dbo.MSrepl ...

  5. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  6. SQL Server 2012复制教程以及复制的几种模式

    简介 SQL Server中的复制(Replication)是SQL Server高可用性的核心功能之一,在我看来,复制指的并不仅仅是一项技术,而是一些列技术的集合,包括从存储转发数据到同步数据到维护 ...

  7. 人人都是 DBA(VI)SQL Server 事务日志

    SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...

  8. sql server 本地复制订阅 实现数据库服务器 读写分离(转载)

    转载地址:http://www.cnblogs.com/echosong/p/3603270.html 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下S ...

  9. sql server 本地复制订阅 实现数据库服务器 读写分离

    再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下SQL Server的复制订阅实现数据的读写分离 比起mysql的复制,SQL server 复制相对强大 ...

随机推荐

  1. JSON.stringify()——JS转JSON字符串

    JSON.stringify() JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符 ...

  2. django框架<三>

    一.ORM操作  1.django orm创建数据库的方法 (1)指定连接pymysql(python3.x),先配置__init__.py import pymysql pymysql.instal ...

  3. 19.Remove Nth Node From End of List---双指针

    题目链接 题目大意:删除单链表中倒数第n个节点.例子如下: 法一:双指针,fast指针先走n步,然后slow指针与fast一起走,记录slow前一个节点,当fast走到链表结尾,slow所指向的指针就 ...

  4. Python多态、鸭子类型

    一.多态 多态指的是一类事物有多种形态. 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.ab ...

  5. caffe Python API 之Solver定义

    from caffe.proto import caffe_pb2 s = caffe_pb2.SolverParameter() path='/home/xxx/data/' solver_file ...

  6. web项目更改文件后缀,隐藏编程语言

    从Java EE5.0开始,<servlet-mapping>标签就可以配置多个<url-pattern>.例如可以同时将urlServlet配置一下多个映射方式: <s ...

  7. 洛谷 P2241统计方形(数据加强版) 题解

    题目传送门 说是加强版,其实可以把棋盘那道题的代码粘过来(注意要开long long): #include<bits/stdc++.h> using namespace std; ,c; ...

  8. 常用 Java Profiling 工具的分析与比较

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-profiling/index.html 在 Java 程序的开发过程中,不可避免地会遇到内存使用. ...

  9. 第 17 章 使用API

    在本章中,我们将学习如何编写一个独立的程序,并对其获取的数据进行可视化.这个程序将使用Web应用编程接口(API)自动请求网站的特定信息而不是整个网页,再对这些信息进行可视化.由于这样编写的程序始终使 ...

  10. [转]基于Protel DXP软件的PCB高级编辑技巧大全

    来源:基于Protel DXP软件的PCB高级编辑技巧大全 一.放置坐标指示 放置坐标指示可以显示出PCB板上任何一点的坐标位置. 启用放置坐标的方法如下:从主菜单中执行命令 Place/Coordi ...