在实际应用项目开发中,应用数据基本上都存储在数据库中,针对数据库的操作有增删改查操作。
有时为了解决并发大数据访问问题,我们需要使用数据库读写分离,主库用来实现应用数据的增删改操作,而从数据库主要用来进行查询操作。
接下来我们将利用SQL Server 2012进行主从数据库的订阅和发布,实现数据库读写分离操作。

SQL SERVER 发布订阅注意

 发布和订阅服务器都要创建相同的帐户(用户名和密码一致),其次service-sqlserver代理必须使用这个相同的帐号和密码,否则会发生无权限读取发布服务器的快照错误。
 发布和订阅,本质就是主-从模式,写入和读取分离,架构DB的基础。

一、 准备工作:

    打开SQL Server 2012,创建一个数据库BaiInfoBase;

    确保Windows服务中SQL Server代理服务是开启的,并且启动模式是自动的,如下图所示:

    

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器

 

 

二、 配置本地发布

    1. 右键SQL Server Management Studio根节点下的“复制”->“本地发布”,选择“新建发布”,如下图所示:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_02

 

 

    2. 右键-新建发布向导-下一步

    3. 选择SQL代理为自动启动,需要完成前边的准备工作:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_03

 

 

    4. 配置好共享文件夹和访问用户名密码,以供生成、读取快照使用:

       

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_04

 

 

    5. 选择发布的主数据库BaiInfoBase:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_05

 

 

    6. 选择事务发布:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_06

 

 

    7. 勾选要发布的表、存储过程或整库,然后下一步:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_07

 

 

    8. 下一步,选择立即创建快照,下一步:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_08

 

 

    9. 点击“快照代理”的“安全设置”,选择SQL代理帐户运行和SQL名称登录,确定:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_09

 

         

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_10

 

 

    10. 然后一路下一步,立即创建完成,成功后应如下图,若有报错按提示处理:    

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_11

 

 

三、 配置本地订阅

    1. 在订阅服务器下-新建订阅:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_12

 

 

    2. 选择查找SQL发布服务器,在弹出窗口输入SQL帐户和密码,选择BaiInfoBase库:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_13

 

         

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_14

 

 


    3. 选择分发类型,下一步:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_15

 

         

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_16

 

 


    4. 配置订阅时的安全性帐户和密码,这里一点要输订阅服务器本身的帐户和密码:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_17

 

  

    5. 一路下一步,立即订阅,完成,如下图:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_18

 

 

四、 发布/订阅的检查、排错和快照初始化:

  1.快照初始化:

    有时候发现数据不同步或同步有故障时,需要手动重新生成新的快照同步,这时就需要如下操作:

    SSMS中找到复制-右键-启动复制监视器:

    

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_19

    选中要重新生成快照的发布项目,这里右键后有2种生成快照的方式,如下图:

    推荐第1种, 1是完全初始化订阅库重新同步数据,2是单纯只生成新快照。

    

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_20

    选择”重新初始化所有订阅”后, 选择”使用新快照”并勾选”立即生成新快照”, 点击”标记为要重新初始化”按钮, 开始初始化快照:

    

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_21

    此时点开”代理”标签页, 应该能看到生成快照的完成度百分比, 等待它100%时表示快照生成完毕.

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_22

 

  2.发布/订阅的检查:

    再点开”所有订阅”双击当前订阅, 弹出详细的发布/订阅项目记录, 在这里可以很清晰的看到所有的同步记录, 仔细查看有没有错误:

    1)“分发服务器到订阅服务器的历史记录”: 可以查看传递过去多少表和记录等.

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_23

    2)“发布服务器到分发服务器的历史记录”: 查看发布服务器生成快递和日志错误.

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_24

    3)“未分发的命令”: 查看当前还有多少条事务没有同步到订阅服务器上.

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_服务器_25

    4) 使用”跟踪令牌”查看发布/订阅库的实际延迟:

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_26

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_27

    5) 确认发布/订阅中数据库的所有表的发布状态:

      有时候创建好发布/订阅, 有的表缺少一些属性会导致发布自动过滤掉一些表, 所以每当创建好新的发布/订阅后, 我们都应该再确认一次数据库中所有表都正常发布出去了.

      确认方式如下, 打开-ssms实例-复制-发布项目-右键-属性:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_28

      找到项目-表, 这里一点要双击展开, 因为有时是折叠的, 不展开看不到未正常发布的表, 如下:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_29

      以后有新加表或存储过程等, 也可以来这里勾选上增加发布的新表, 然后重新初始化生成快照.

    6)生产日常使用中经常会创建新表, 新表是不会自动发布的, 需要手动勾选再重新生成快照, 如下:

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_30

      勾选新表确定发布, 然后去生成新快照:

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_31

        

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_数据库_32

      以上二种操作方式生成快照都可以.

  3.  一些常见的错误排查:

    1) 权限不足:

      

sql server 订阅 不允许启动新事物 sqlserver2012发布订阅_SQL_33

    解决方法:

    

USE [数据库名]
GO
sp_changedbowner 'sa'

 

 

 

  • 完成