SQLServer 可更新订阅的订阅库数据未同步到发布库查看
2015-11-10 10:59
302 查看
刚更新几行数据,同事查到一个分库的数据未同步到总库。于是想到是不是同步出现什么错误了。
在发布实例中打开 “复制监视器” ,没发现有错误,队列读取器、日志读取器、分发都正常同步数据。
发布数据库没有错误,想到可能是订阅数据传递堵住了。
查看订阅数据库等待同步到发布的事务和命令数:
果然,有堵住,该订阅分库的队列一直在增加。是不是资源正在被其他进程访问?
也没有堵塞,是不是CPU申请不到?看看当前在执行什么操作:
发现等待的类型是 ASYNC_NETWORK_IO ,意思是数据已经准备好了,但是网络并没有完全取走结果集。suspended 表示CPU正等待资源。而等待的 sql 语句为 sys.sp_replsqlqgetrows ,即表示正在从等待同步的事务表和命令表中获取数据,是什么命令导致等待?
(在订阅库)从队列表中按时间查看最早插入到该表的事务,确定为该事务正在执行中…………
(在订阅库)找到该事务,看看执行了什么命令
结果近6万行数据需要同步,command 中有一个存储过程 create procedure [dbo].[sp_MSsync_upd_10C4B6FD_0596_42B0_862B_ED17BFD4BB97] ,但是看不到是哪个表的数据。现在到发布数据库,查看该存储过程的定义。
在存储过程内部查看一下,都可以找到相关表的信息。
知道是该表,也就确定了,因为这个表是数据库中最大的表,分页也会很多,突然更新6万行数据,同步时当然会较久了。十几分钟后,数据同步完整,等待同步的队列也就减少了。没什么问题,虚惊一场!~
在发布实例中打开 “复制监视器” ,没发现有错误,队列读取器、日志读取器、分发都正常同步数据。
发布数据库没有错误,想到可能是订阅数据传递堵住了。
查看订阅数据库等待同步到发布的事务和命令数:
SELECT COUNT(*) FROM [Platform].[dbo].[MSrepl_queuedtraninfo](NOLOCK) SELECT COUNT(*) FROM [Platform].[dbo].[MSreplication_queue](NOLOCK)
果然,有堵住,该订阅分库的队列一直在增加。是不是资源正在被其他进程访问?
--检查当前存在的堵塞(blocked =0 为堵塞的session,多执行几次查看) select p.*,s.text from master.dbo.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) s where blocked > 0 or spid in(select blocked from master.dbo.sysprocesses where blocked > 0)
也没有堵塞,是不是CPU申请不到?看看当前在执行什么操作:
SELECT [session_id], [blocking_session_id] AS '正在阻塞其他会话的会话ID', [request_id], [start_time] AS '开始时间', [status] AS '状态', [command] AS '命令', dest.[text] AS 'sql语句', DB_NAME([database_id]) AS '数据库名', [wait_type] AS '等待资源类型', [wait_time] AS '等待时间', [wait_resource] AS '等待的资源', [reads] AS '物理读次数', [writes] AS '写次数', [logical_reads] AS '逻辑读次数', [row_count] AS '返回结果行数' FROM sys.[dm_exec_requests] AS der CROSS APPLY sys.[dm_exec_sql_text](der.[sql_handle]) AS dest WHERE [session_id]>50 AND DB_NAME(der.[database_id])='platform' and session_id<>@@SPID ORDER BY [cpu_time] DESC select p.*,s.text from master.dbo.sysprocesses p cross apply sys.dm_exec_sql_text(p.sql_handle) s where spid=154
发现等待的类型是 ASYNC_NETWORK_IO ,意思是数据已经准备好了,但是网络并没有完全取走结果集。suspended 表示CPU正等待资源。而等待的 sql 语句为 sys.sp_replsqlqgetrows ,即表示正在从等待同步的事务表和命令表中获取数据,是什么命令导致等待?
(在订阅库)从队列表中按时间查看最早插入到该表的事务,确定为该事务正在执行中…………
SELECT top 5 * FROM [Platform].[dbo].[MSreplication_queue](NOLOCK)order by insertdate
(在订阅库)找到该事务,看看执行了什么命令
-- tranid 为上面查到的事务id exec sys.sp_replqueuemonitor 'publisher','publisher_db','publication','tranid',0
结果近6万行数据需要同步,command 中有一个存储过程 create procedure [dbo].[sp_MSsync_upd_10C4B6FD_0596_42B0_862B_ED17BFD4BB97] ,但是看不到是哪个表的数据。现在到发布数据库,查看该存储过程的定义。
sp_helptext [sp_MSsync_upd_10C4B6FD_0596_42B0_862B_ED17BFD4BB97]
在存储过程内部查看一下,都可以找到相关表的信息。
知道是该表,也就确定了,因为这个表是数据库中最大的表,分页也会很多,突然更新6万行数据,同步时当然会较久了。十几分钟后,数据同步完整,等待同步的队列也就减少了。没什么问题,虚惊一场!~
相关文章推荐
- sql union和union all的用法及效率
- mysql驱动注册机制演变
- Redis缓存和RabbitMQ消息解决购车问题(用户登录,用户未登录和购物车合并)
- 超强、超详细Redis数据库入门教程
- 查询索引中的碎片和重建SQL server索引
- 数据库外连接,自然连接,内连接,条件连接,等值连接关系及详解
- SQL中的联合查询
- 常用SQL语句
- Innodb锁机制
- ADO连接SqlServer的两种方式
- MySQL index hint
- 配置master/slave主从数据库
- MYSQL查询今天昨天本周本月等的数据
- mysql乐观锁总结和实践
- Oracle 12.1.0.2 对JSON的支持
- SQL大圣之路笔记——把数据库中表里的数据导出成Excel(Copy时,会因分隔符问题导致许多数据存放在一个单元格中)
- MYSQL加锁的测验
- 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错我的开发环境是Win7旗舰64位+VS2003.Net,经常卡pdb错误,文末给出一个完美的解决
- Oracle数据库rownum和row_number的不同点
- SQL Server 2008中删除errorlog文件的方法