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. Impala笔记之通用命令

    help help命令用于查询其它命令的用法 [quickstart.cloudera:21000] > help select; Executes a SELECT... query, fet ...

  2. PHP解决并发问题的几种实现

    对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了 在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制. 方案一:使用文件锁排它锁 f ...

  3. HDU 2112 Today(Dijkstra+map)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意: 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050 ...

  4. poj 1077(BFS预处理+康托展开)

    Eight Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 29935   Accepted: 13029   Special ...

  5. 教你如何更改android应用的包名

    Android 源码自带了很多应用程序,想改个包名方便修改?很简单,两步搞定,以packages/apps/Settings为例: 1.打开AndroidManifest.xml,把 <mani ...

  6. Android学习笔记(三) UI布局

    每一个布局都有其适合的方式,另外,这几个布局元素可以相互嵌套应用,做出美观的界面. 一.线性布局(LinearLayout) 线性布局,这个东西,从外框上可以理解为一个div,他首先是一个一个从上往下 ...

  7. 纯js的N级联动列表框 —— 基于jQuery

    多个列表框联动,不算是啥大问题,但是却挺麻烦,那么怎么才能够尽量方便一点呢?网上搜了一下,没发现太好用的,于是就自己写了一个.基于jQuery,无限级联动,支持下拉列表框和列表框. 先说一下步骤和使用 ...

  8. [笔记] 几个前端bug的解决方案

    jQuery UI下被拖动的元素上飘 症状出现在几乎所有浏览器里.使用 1.10.x 的draggable,在滚动栏下移(即非处于页面顶部)的时候拖动draggable的元素,它会向上跳一段距离.解决 ...

  9. ubuntu访问win10下的磁盘

    在ubuntu下访问win10的磁盘时,提示出错. 先用命令查看一下磁盘挂载情况. sudo fdisk -l 会看到一些信息 我要访问的是E盘,也就是 /dev/sda6 这个分区 使用命令ntfx ...

  10. bzoj 1101 莫比乌斯反演

    最裸的莫比乌斯 #include<bits/stdc++.h> #define LL long long #define fi first #define se second #defin ...