SQLServer 使用sp_repldone标识所有未分发的事务为已分发

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文:SQLServer 使用sp_repldone标识所有未分发的事务为已分发 对于发布数据库的数据大量操作时,会使日志扫描并读取太多,会导致分发堵塞很久。也有一些解决方法,参考 《SqlServer 复制中将大事务分成小事务分发》 , 《SqlServer大量更新引起同步链延时问题》 。
原文: SQLServer 使用sp_repldone标识所有未分发的事务为已分发

对于发布数据库的数据大量操作时,会使日志扫描并读取太多,会导致分发堵塞很久。也有一些解决方法,参考 《SqlServer 复制中将大事务分成小事务分发》 , 《SqlServer大量更新引起同步链延时问题》 。当然也可以使这些数据不分发,尤其是新表,数据尚未让用户使用,可以在日志读取器跳过扫描标识为 “复制” 的事务。


注: 以下模拟操作,操作都在发布数据库执行!


1. 将队列读取器代理  -Continuous 去掉,使日志读取器不连续扫描事务日志
2. 更新数据
3. 启用日志读取器,数据正常同步到订阅中
4. 再次更新数据,执行以下操作


将队列读取器代理  -Continuous 去掉的操作如下:



过程脚本如下,不详细说明:

--  因为日志读取器停止,分发表还没有刚才更新的记录
SELECT * FROM distribution.dbo.MSrepl_commands
SELECT * FROM distribution.dbo.MSrepl_transactions


--  但是事务日志中标识为复制(REPLICATE) 的日志增多了
SELECT count(*) FROM ::fn_dblog(NULL, NULL) WHERE Description='REPLICATE'


--  查看最早的分布式和非分布式复制事务
--  https://msdn.microsoft.com/zh-cn/library/ms182792.aspx
DBCC OPENTRAN() WITH TABLERESULTS; 


REPL_DIST_OLD_LSN	    (535:23:10)
REPL_NONDIST_OLD_LSN    (535:26:1)


--  转换上面的整数为16进制
SELECT cast(cast(535 as int) as binary(4)) + cast(cast(23 as int) as binary(4)) + cast(cast(10 as int) as binary(2))
SELECT cast(cast(535 as int) as binary(4)) + cast(cast(26 as int) as binary(4)) + cast(cast(1 as int) as binary(2))

(534:2536:18) >>> 0x00000217:00000017:000A
(534:2552:1) >>>  0x00000217:0000001A:0001


--  在事务日志中的记录
select [Current LSN],[Operation],[Transaction ID],Left([Description],20)
from::fn_dblog('0x00000217:00000017:000A','0x00000217:0000001A:0001')
  
  
--  将事务日志中标识为复制的记录全部标记为已分发,之后日志读取器将不扫描这些记录
--  ( 只有当 xactid 和 xact_seqno 都为 NULL 时,reset 才有效。)
--  https://msdn.microsoft.com/zh-cn/library/ms173775.aspx
exec sp_repldone @xactid = NULL, @xact_segno = NULL, @numtrans = 0, @time = 0, @reset = 1

@reset = 1 则日志中所有复制的事务将标记为已分发;
@reset = 0 则事务日志将重置为第一个复制的事务,事务将重新读取和发布;



--  查看当前没有分发的事务(保留在事务日志中尚未发送到分发服务器的事务)
--  https://msdn.microsoft.com/zh-cn/library/ms175114.aspx
exec sp_replshowcmds


--  再查看打开的事务,事务也不存在了
dbcc opentran () with tableresults; 


--  刷新项目缓存(为提高效率,项目定义存储在缓存中)
--  https://msdn.microsoft.com/zh-cn/library/ms174992(v=sql.120).aspx
exec sp_replflush

--  此时再次更新其他行数据,启用日志读取器代理,该行数据能正常同步到订阅;之前未同步的,则不会同步.

最后把 -Continuous 添加会日志读取器中!完成!(或者停止日志读取器代理也可以)


参考:Using sp_repldone to mark all pending transactions as having been Replicated


相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
6月前
|
存储
SQLServer存储过程中事务的创建
SQLServer存储过程中事务的创建
48 0
|
9月前
|
SQL 安全 关系型数据库
SqlServer事务详解(事务隔离性和隔离级别详解)(下)
SqlServer事务详解(事务隔离性和隔离级别详解)(下)
|
9月前
|
SQL Oracle 关系型数据库
SqlServer事务详解(事务隔离性和隔离级别详解)(上)
SqlServer事务详解(事务隔离性和隔离级别详解)
|
SQL 存储 数据库
处理令人心烦的数据库事务日志 (SQL Server Transaction Log Files)
经常, 我们会被过快增长的数据库事务日志Transaction Log而困扰, 如果我们没有正确及时的处理, 可能会造成数据库交易无法进行, 服务器磁盘空间占光等问题. 在SQL Server的使用过程中, 我经常帮助用户和数据库的维护人员处理日志Transaction Log太大后造成的系统瘫痪的问题. 其实这个问题很容易避免. 今天我给大家分享下, 是什么造成了日志增长过大的问题. 和如何避免这种问题再次发生. 该文章的语句适用于SQL Server 2015 及其以后的版本 每一个数据库至少有两个文件: 一个是数据文件(Data file), 一个是事务日志文件(Transaction
670 0
|
存储 数据库连接 数据库
连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法
原文:连接SQLServer时,因启用连接池导致孤立事务的原因分析和解决办法   本文出处:http://www.cnblogs.com/wy123/p/6110349.html    之前遇到过这么一种情况:   连接数据库的部分Session会出现不定时的阻塞,这种阻塞时长时短,有时候持续较长时间,有时间持续时间较短,没有什么规律。
1527 0
|
SQL 监控 数据库
sql server 备份与恢复系列二 事务日志概述
原文:sql server 备份与恢复系列二 事务日志概述   1.1  日志文件与数据文件一致性  在上一章备份与恢复里了解到事务日志的重要性,这篇重点来了解事务日志。 事务日志记录了数据库所有的改变,能恢复该数据库到改变之前的任意状态。
1085 0
|
SQL 数据库
sql server 锁与事务拨云见日(中)
原文:sql server 锁与事务拨云见日(中) 一.事务的概述    上一章节里,重点讲到了锁,以及锁与事务的关系。离上篇发布时间好几天了,每天利用一点空闲时间还真是要坚持。听《明朝那些事儿》中讲到"人与人最小的差距是聪明,人与人最大的差距是坚持"很经典的一句话一直记得。
1078 0
|
SQL 存储 数据库
sql server 锁与事务拨云见日(上)
原文:sql server 锁与事务拨云见日(上)  一.概述   讲到sql server锁管理时,感觉它是一个大话题,因为它不但重要而且涉及的知识点很多,重点在于要掌握高并发要先要掌握锁与事务,涉及的知识点多它包括各式各样的锁,锁的组合,锁的排斥,锁延伸出来的事务隔离级别, 锁住资源带来的阻塞,锁之间的争用造成的死锁,索引数据与锁等。
1429 0
|
SQL
sql server 完整备份、差异备份、事务日志备份
原文:sql server 完整备份、差异备份、事务日志备份 一、 理解:        完整备份为基础, 完整备份可以实物回滚还原,但是由于完整备份文件过大,对硬盘空间比较浪费这是就需要差异备份 或者 事务日志备份。
2035 0