SQL Server 事务复制爬坑记

时间:2023-11-22 09:09:02

  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了,所以个人感觉这个是非必要的)