• sqlserver 实时同步(发布订阅)


    配置发布订阅手册

    不同版本须知:https://www.sqlmanager.net/en/articles/1548

    向后兼容性:参考https://docs.microsoft.com/zh-cn/sql/relational-databases/replication/replication-backward-compatibility?view=sql-server-2017

    1.环境介绍

      两台在同一局域网的PC机,这里PC1是作为分发服务器,PC2作为订阅服务器

    2.操作前准备

      检查几个设置,这是操作的关键,PC1和PC2都要进行相同的配置

      1)开共享

     

    在任务栏的计算机图标右键->打开网络和共享中心->更改高级共享设置

    在高级共享里面开启共享

     

    2)防火墙开1433 端口

    打开控制面板,选择系统与安全;打开防火墙设置中的高级设置

     

    新建一个入站规则

     

    点击新建规则->端口

     

    端口->填写开放的端口号

     

                          填写开放的端口号->选择允许连接

         

    下面的全部默认就可以

     

    3)配置管理器设置TCP/IP启用

     

    打开配置管理器,网络配置->协议->TCP/IP开启

     

    选中TCP/IP右键“属性”,在属性中把对应的ip 本机ip的Enabled设置为“是”,端口号为默认的1433

     

    4)Sql Server Browser 服务开启

    如果在SSMS工具中找不到局域网内的其他数据库服务器,可以开启这个功能

     

    5)两台机有相同的账户(用户名和密码要一致)

     

    6)数据库添加windows账户访问

    打开SSMS添加上面新建的windows账户SqlServer

     

    7)数据库开启允许远程连接

    在SSMS中开启数据库允许远程连接

     

    8)测试网络是否连接成功

    这是最关键的一步,也是下面订阅同步操作的前提,打开cmd命令窗口(windows+R 输入cmd回车)。

    先使用ping命令测试网络连接是否有问题(PC1和PC2都要ping测试是否互通)

     

    就算能ping通,只能说明局域网内存在这台机,也不代表能实现同步,还要测试端口是否可用。

    使用telnet命令测试端口是否可用 telnet 192.168.0.62 1433

    出现这个窗口表示可用

     

    3.订阅设置

    已经在PC1新建了一个新的数据库Test1,Test1里面有一张表Table_1, Table_1插入了几条测试数据,把数据库Test1备份复制到PC2机器上还原。

    1)配置PC1作为分发服务器

                    打开数据库的 复制->本地发布,右键新建发布

                   

    下面的步骤按照截图来,这里的发布数据库选择的是测试用的Test1,我们的实验就是要把PC1的Test1数据库同步到PC2的数据库Test1

     

     

     

     

    下一步。选择“在以下windows账户下运行”,填写PC1机windows账户(这里要填域账户),连接发布服务器使用的是sa账户。(这里选择“在sqlserver代理账户下运行”经过测试也是可以的)

     

     

    2)配置PC2作为订阅服务器

                设置订阅可以在分发服务器上也可以在订阅服务器上,结果是一样的,这里我们在分发服务器上设置

    右键本地订阅,新建订阅

     

    选择PC1机发布服务器的发布任务

    下一步,有两个选项,这次实验是在分发服务器运行推送订阅,选择第一项

     

    下一步,点击“添加订阅服务器”,服务器名称选择的是PC2机的名称,使用windows身份验证,这里能连接上的原因是我们两台机都有相同的用户名和密码,也是上面说明中要配置相同windows账户的原因(这里也可以使用数据库的账户登录)

     

    要订阅的是PC2机上的Test1数据库

     

    下一步,设置订阅属性

     

    选择“在以下windows账户下运行”,填写PC1机windows账户,因为我们在发布服务器上进行分发。

     

    后面的设置默认就行

     

     

     

     

    4. 测试同步订阅

                    当前PC1的Test1数据库表内容为

     

    我们插入几条数据

     

    查看PC2机的数据库Test1的表数据有没有变化

     

    详细的内容还可以查看同步状态信息,选中订阅服务器右键,查看同步状态

     

    点击“监视”

     

    还有代理状态

     

    双击右表的状态条可以查看同步的各种参数

     

    到这里同步订阅功能测试完成

    5.常见问题汇总

                1SQL Server replication requires the actual server name to make a connection to the server

     

    解决方法:(之前改过名字)

    SELECT @@SERVERNAME

    先看清楚,名称是不是和现在的名称一样。

    sp_dropserver 'old_server_name'
    GO
    sp_addserver 'current_computer_name', 'local'

    GO 

    如果不是,去掉老名字,换成新名字。

    然后,重启SQL,搞定之~~

    2)进程无法连接到 Subscriber“***”

    进程无法连接到 Subscriber“***”。 (源: MSSQL_REPL,错误号: MSSQL_REPL0)
    获取帮助: http://help/MSSQL_REPL0
    SQL Server 网络接口: 定位指定的 Server/Instance 时出错 [xFFFFFFFF].  (源: MSSQLServer,错误号: -1)
    获取帮助: http://help/-1
    与 SQL Server 建立连接时发生了与网络相关的或特定于实例的错误。找不到或无法访问服务器。请检查实例名称是否正确以及 SQL Server 是否配置为允许远程连接。有关详细信息,请参阅 SQL Server 联机丛书。 (源: MSSQLServer,错误号: -1)
    获取帮助: http://help/-1
    登录超时已过期 (源: MSSQLServer,错误号: HYT00)
    获取帮助: http://help/HYT00

         最可能的原因:发布服务器与订阅服务器之间ping不通,可能是防火墙的问题,首先ping下对应机器ip,找出ping不通的机器,再调整对应防火墙

    3)发布时出现“无法开始执行步骤 2 (原因: 验证代理 XXXX的身份时出错,系统错误: 登录失败: 未知的用户名或错误密码。).  该步骤失败。

    解决办法打SP2以上补丁。

    或者直接用内置服务

    4)使用SQL Server发布数据库快照遇到错误:对路径“xxxxx”访问被拒绝的解决方法

                    开始-> 所有程序 -> SQL Server 配置管理器 -> 在左边栏选择”SQL Server服

    务“->在右侧面板中"SQL Server 代理”一行上右击,选择“属性”,

    在弹出的对话框中选择"内置账户“->LocalSystem即可。    

    5)遇到“拒绝了对对象的 EXECUTE 权限”和“无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限”的问题

    USE 出问题的库名; 
    EXEC sp_changedbowner 'sa';

    6)发布 'xx' 的并发快照不可用,因为该快照尚未完全生成,或者日志读取器代理未运行,无法激活它。如果并发快照的生成过程中断,则必须重新启动用于该发布的快照代理,直到生成完整的快照。

    删除相关的发布订阅

    执行下列查询,如果还是存在'xx'相关的行

            select * from msdb..MSdistpublishers

            select * from distribution..MSpublisher_databases

            select * from distribution..MSpublications

            select * from distribution..MSarticles

            select * from distribution..MSsubscriptions

    删掉所有与'xx'先关的行(记得先备份表)

      delete from distribution..MSarticles where publisher_db = '<NameOfDatabase>'

      delete from distribution..MSsubscriptions where publisher_db = '<NameOfDatabase>'

    重建分发

    参考 stackoverflow

    如果没有修改过密码,就是删除分发复制时由于某些原因没删干净(上边的那些表)
    经测试,删除发布、订阅时MSsubscriptions表中的数据会自动被删掉,
    如果还存在之前的‘xx’那就是未删除干净

     

  • 相关阅读:
    HDU 1540 Tunnel Warfare (线段树区间合并)
    P2258 子矩阵
    P5021 赛道修建
    P4084 [USACO17DEC]Barn Painting
    P3914 染色计数
    比赛用模板
    P3594 [POI2015]WIL-Wilcze doły
    P5022 旅行
    P3952 时间复杂度
    P3960 列队
  • 原文地址:https://www.cnblogs.com/xiaoping1993/p/8794192.html
Copyright © 2020-2023  润新知