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. leetcode.C.4. Median of Two Sorted Arrays

    4. Median of Two Sorted Arrays 这应该是最简单最慢的方法了,因为本身为有序,所以比较后排序再得到中位数. double findMedianSortedArrays(in ...

  2. GSON转换日期数据为特定的JSON数据

    通过JSON传递数据的时候经常需要传递日期,Java中可以通过GSON将日期转换为特定格式的JSON数据. 1.普通的GSON转换日期 public void query(HttpServletReq ...

  3. weblogic nmap扫描脚本

     CVE-2018-2894 / Nmap利用脚本,可批量批量快速扫描getshell.检测漏洞.利用漏洞 地址:https://github.com/Rvn0xsy/nse_vuln/tree/ma ...

  4. X86控制寄存器和系统地址寄存器

    80386控制寄存器和系统地址寄存器如下表所示.它们用于控制工作方式,控制分段管理机制及分页管理机制的实施. 控制寄存器 CRx BIT31 BIT30—BIT12 BIT11—BIT5 BIT4 B ...

  5. python3.4.3安装allure2记录

    一.安装:cmd执行命令pip install allure-pytest 二.下载allure2:2.7.0版本 https://dl.bintray.com/qameta/generic/io/q ...

  6. 关于一些对location认识的误区

    1. location 的匹配顺序是“先匹配正则,再匹配普通”. 矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”.我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释 ...

  7. group by的运用

    select a.* from zeai_photo a inner join (select max(id) mid,userid from zeai_photo group by userid) ...

  8. 关于函数strtok和strtok_r的使用要点和实现原理

    strtok函数的使用是一个老生常谈的问题了.该函数的作用很大,争议也很大.以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证.交代一下实验环境是必要的,winxp+vc ...

  9. IDEA 部署项目的时候出错:Jar not loaded错误

    2011-10-18 17:03:52 org.apache.catalina.loader.WebappClassLoader validateJarFile 信息: validateJarFile ...

  10. ASP连接读写ACCESS数据库实例(转)

    (一)   数据库的选择:有许多的数据库你可以选择,SQL SERVER.ACCESS(*.mdb).EXCEL(*.xls).FOXPRO(*.dbf)甚至普通的文本文件(*.txt)都可以达到存储 ...