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


    0. 环境

    1. 无域环境
    2. 发布服务和分发服务器同一台主机
    角色 主机名 IP 发布名 发布库名/订阅库名
    发布服务器 Server1 192.168.1.100 test3 db1
    分发服务器(与发布服务器同一实例) Server1 192.168.1.100 - -
    订阅服务器 Client1 192.168.1.200 - db1

    1. 修改host文件

    在发布服务器和订阅服务器都修改C:WindowsSystem32driversetc文件,加入IP和主机名。如果是请求订阅,则发布服务器不用修改也要可以;如果是推送请求,则必需设置。因为SQL Server复制不能通过IP进行相关的设置。

    2. 创建快照文件夹及相应的用户和权限

    比如快照文件在发布服务器的D:ReplData下。在发布服务器和订阅服务器创建相同的Windows用户( 如果不想发布服务器创建新的Windows用户,则需要在发布服务器开启Guest用户),如repl_admin,并加入各自的administrator组中,并设置密码不能过期,不能修改密码。设置D:ReplData文件对于新建的用户repl_admin完全读写权限,并设置共享此文件夹。

    这里,可能会有疑问为什么repl_admin已经是administrator组的用户,对D:ReplData文件夹是读取权限的,为什么还要设置repl_admin完全读写权限?后来测试在生成快照文件时,无法在文件夹\Server1ReplData写入。后面第4步会提到\Server1ReplData这个文件夹。

    3. 设置SQL Server Agent的启动用户

    在发布服务器设置SQL Server Agent的启动用户为repl_admin(最好是在SQL Server Configuration Manager进行设置),并重启Agent。同样,在订阅服务器也做同样的步骤。注意,重启Agent可能会影响SQL Job的计划任务,生产环境上请检查重启带来的影响。

    4. 在发布服务器新建发布和分发

    在SSMS上,根据向导一步一步创建新的发布。如果没有分发服务器,在向导中,会进行创建。(分发的属性)设置快照文件为\Server1ReplData。最后可以生成创建发布的SQL脚本,可以保存起来,以后再重启创建,或是其他服务器需要创建发布,只需要修改一下脚本,再执行即可。

    为什么不直接设置D:ReplData?其实是可以的,但默认使用\Server1ReplData这个文件的话,在订阅端默认也是读取这个快照文件夹\Server1ReplData,这样比较方便。

    当然,可以手动再修改(可以单独修改发布的快照文件夹路径,也可以修改订阅时的快照文件夹路径),不过还是建议使用分发的设置的默认文件的网络路径格式。

    也可以使用FTP或其他方法把快照文件复制到订阅服务器做初始化即可。SQL Server复制也支持备份数据库的方式进行订阅的初始化。

    在第1步中,默认快照文件夹也是可以放到真正的网络盘上,而不是发布服务器上。考虑到直接写到网络盘,但需要考虑这可能会造成网络影响,如果在生成很大的快照过程中,造成网络阻塞,甚至中断,对生产造成影响。

    5. 在订阅服务器新建订阅

    在SSMS上,根据向导一步一步创建新的订阅(以请求订阅pull subcription为例)。在Distribution Agent Security这一步,设置是这样的:

    • Run under the SQL Server Agent service account
    • Connect to the Distribution: Using the following SQL Server login
      这里使用了发布服务器的sa用户和密码。当然也可以另外创建专门的SQL Server复制账号来连接。
    • Connect to the Subscriber: By impersonating the process account

    如果是推送push subcription的话,第2,3个选项是相反的。即Using the following SQL Server login填写的是订阅服务器的SQL Server账号,让分发服务器有权限推送数据到订阅服务器。

    6. 设置添加新项目不初始化整个快照

    在发布服务器经常会新创建表或其他数据库对象,如存储过程或函数等,如果要把这些新的项目加入到已经存在的订阅中时,需要初始化这些项目。但默认的设置是初始化整个快照所有项目的。这对于大的快照来说,成本很高。

    下面设置只初始化新添的项目。

    use db1;
    GO
    
    EXEC sys.sp_changepublication 
    	@publication = 'test3', 
        @property = N'immediate_sync', 
        @value = N'false'
    GO
    
    EXEC sys.sp_changepublication 
    	@publication = 'test3', 
        @property = N'allow_anonymous',
        @value = N'false'
    GO
    

    然后再启动快照代理即可对新添加的项目生成快照。
    (右键选择发布,选择“查看快照代理状态”——“启动”)

    相当于运行以下脚本:

    EXEC sys.sp_startpublication_snapshot
    @publication = 'test3'
    go
    
  • 相关阅读:
    Java线程volatile(二)
    Java线程synchronized(一)
    Java 平衡二叉树和AVL
    Data striping
    分布式系统的事务处理
    什么是面向对象
    Redis为什么是单线程
    spring 自定义事物同步器(一): TransactionSynchronizationManager 解析
    understand EntityManager.joinTransaction()
    spring 拾遗
  • 原文地址:https://www.cnblogs.com/fishparadise/p/9189219.html
Copyright © 2020-2023  润新知