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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原文: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
目录
相关文章
|
存储
SQLServer存储过程中事务的创建
SQLServer存储过程中事务的创建
72 0
|
5月前
|
SQL 数据库 数据安全/隐私保护
SQL Server数据库Owner导致事务复制log reader job无法启动的解决办法
【8月更文挑战第14天】解决SQL Server事务复制Log Reader作业因数据库所有者问题无法启动的方法:首先验证数据库所有者是否有效并具足够权限;若非,使用`ALTER AUTHORIZATION`更改为有效登录名。其次,确认Log Reader使用的登录名拥有读取事务日志所需的角色权限。还需检查复制配置是否准确无误,并验证Log Reader代理的连接信息及参数。重启SQL Server Agent服务或手动启动Log Reader作业亦可能解决问题。最后,审查SQL Server错误日志及Windows事件查看器以获取更多线索。
|
4月前
|
SQL 存储 监控
SQLServer事务复制延迟优化之并行(多线程)复制
【9月更文挑战第12天】在SQL Server中,事务复制延迟会影响数据同步性。并行复制可通过多线程处理优化这一问题,提高复制效率。主要优化方法包括:配置分发代理参数、优化网络带宽、调整系统资源、优化数据库设计及定期监控维护。合理实施这些措施可提升数据同步的及时性和可靠性。
148 0
|
4月前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
236 0
|
5月前
|
SQL 监控 供应链
|
5月前
|
SQL 数据库连接 网络安全
SQLServer非默认端口下事务复制代理作业服务无法启动的处理
【8月更文挑战第14天】若SQL Server非默认端口下的事务复制代理作业无法启动,可按以下步骤解决:1) 确认服务器连接字符串正确无误,包括非默认端口号;2) 检查防火墙设置,确保允许非默认端口的连接;3) 核实SQL Server配置已启用非默认端口;4) 查阅代理作业日志寻找错误详情;5) 重启SQL Server与Agent服务;6) 使用工具测试非默认端口的连接性。如问题持续,请寻求专业支持。
|
5月前
|
SQL 关系型数据库 MySQL
SQL Server 事务执行、回滚
SQL Server 事务执行、回滚
57 0
SQL Server——事务
那么,你有没有思考过这样一个问题呢?如果这个过程中的某一个步骤错误了,比如,删除了原来信息,但添加时因为某种原因却没有将数据添加进去,这时是不是数据就出现了缺失?那时的你将会惊慌失措,痛恨自己手抖。
|
SQL 存储 数据库
SQL server的事务锁--概念篇
在我看来,锁,就是一种手段,在现实生活中的意义就是锁住你不想让别人看到的或者不让别人进去的某个事物,具有一定的私密性。
|
SQL 安全 关系型数据库
SqlServer事务详解(事务隔离性和隔离级别详解)(下)
SqlServer事务详解(事务隔离性和隔离级别详解)(下)