事务复制涉及三3个Job(代理) 1、快照, 这个 只在要求初始化的情况下执行一次 2、日志读取, 读取配置复制之后的数据变化, 并生成复制命令, 这个一直在运行状态 3、分发代理, 这个负责把复制命令同步到订阅服务器, 这个也一直在运行状态。 4、除此之外,还有清
事务复制涉及三3个Job(代理)
1、快照, 这个 只在要求初始化的情况下执行一次
2、日志读取, 读取配置复制之后的数据变化, 并生成复制命令, 这个一直在运行状态
3、分发代理, 这个负责把复制命令同步到订阅服务器, 这个也一直在运行状态。
4、除此之外,还有清除过期的命令的作业(REPL-清除分发)和清除快照的作业(REPL-清除快照)。
--------------------------------------------------------------------------------------------------------------------
(1)事务命令过多导致日志读取器读取事务命令超时(或者服务器性能下降导致日志读取器读取事务命令超时)
--------------------------------------------------------------------------------------------------------------------
前几天,有一台服务器的复制出现问题,日志读取器的作业失败, 重试之后依然失败,在作业的历史记录中,报错消息只有以下错误信息:
the process could not execute 'sp_replcmds' on 'server name'
打开复制监视器之后,发现错误信息依然是:the process could not execute 'sp_replcmds' on 'server name' ,但是下面多了一行错误信息:
错误消息:
超时已过期(源:MSSQLServer,错误号:1003)
我们看下sp_replcmds 这个命令是干什么用的。
sp_replcmds:将在给定的数据库内运行 sp_replcmds 的第一个客户端视为日志读取器。返回被标记为复制的事务的命令。此存储过程在发布服务器的发布数据库上执行。
看来sp_replcmds 是取复制的命令的,结合上面的超时已过期的错误,可以想到该日志读取器在读取日志的时候超时了,即日志读取器的运行的查询的sql在运行时超时了。联想到最近我这台服务器有性能问题,因此查询消耗时间过长,也并非没有什么不可能的了。当然,也有可能是MSrepl_commands的命令比较多,可以在distribution库中运行以下代码查询数据量:
select count(1) from MSrepl_commands with(nolock) --目前我的数据库中有将近500w数据量,比较多,而其他的服务器就20w~30w的数据量。
确定原因之后,就需要把已经设置好的超时时间修改的长一点,以使日志读取器能在查询超时之前将标记为复制的事务的命令取出来。
1.启动复制监视器
2.右键-代理配置文件
3. 新建一个代理配置文件,将querytimeout的值修改为65533,这个是位置的最大值。
重启日志读取器的作业,作业就正常运行了。
对于这方面的一些资料,可以参考:
http://blogs.msdn.com/b/repltalk/archive/2010/07/13/using-verbose-history-agent-profile-while-troubleshooting-replication.aspx
http://www.tuicool.com/articles/IV3QRr
--------------------------------------------------------------------------------------------------------------------
(2)REPL-清除分发 作业运行时间过长导致锁表,造成日志读取器读取事务命令超时
--------------------------------------------------------------------------------------------------------------------
日志读取作业一直失败并报the process could not execute 'sp_replcmds' on 'server name' 错误。
在遇到这种情况的时候,尝试重启服务器的sql 代理,然后日志读取器可以正常工作一段时间(我遇到的情况是几个小时),但每天都会失败,并导致日志读取器作业失败。由于晚上也会失败,但由于订阅服务器需要及时取得数据,因此当时写了个作业每天在凌晨3点钟重启发布服务器的sql agent,这样才使得事务复制可以正常工作。
发布服务器是sql server 2000,重启sql server agent的脚本如下:
--开启xp_cmdshell
sp_configure 'show advanced options',1
reconfigure
go
sp_configure 'xp_cmdshell',1
reconfigure
go
--重启sql server agent
--停止
use master
go
xp_cmdshell 'net stop SQLSERVERAGENT'
--启动
use master
go
xp_cmdshell 'net start SQLSERVERAGENT'
但这种方法只是暂时的方法,在度娘和谷歌之后,找到以下原因:
之前出现的发布服务器重启Agent才能够把数据复制到订阅服务器是因为以下原因:
1、第二步日志读取操作,会将发布服务器中的各种insert,update和delete操作的命令存放在MSrepl_commands表中。(这句话中的“第二步” 请查看本文章的开头)
2、清除过期的命令的作业(REPL-清除分发)是每隔十分钟运行一次,每次会自动清除MSrepl_commands表中的过期命令。
3、REPL-清除分发 作业是调用sp_MSdelete_publisherdb_trans存储过程来清除过期的命令,sp_MSdelete_publisherdb_trans这个存储过程是每次用游标只取2000条数据,然后删除。
现发现MSrepl_commands表已经有11106751条数据,因此,需要删除的数据量过大,导致 REPL-清除分发 作业一直在运行,从而一直在删除MSrepl_commands表的数据,造成MSrepl_commands表经常被锁住。
4、日志读取操作这个步骤需要将新的命令插入到表MSrepl_commands中,而此表因为删除操作被长时间锁住之后,无法插入新的命令。而在游标所取出来的2000条数据被删除之后,游标再次取2000条数据之前,这时候表MSrepl_commands没有被锁住, 日志读取操作 作业这时候可以将新的命令插入到表MSrepl_commands中。如果表MSrepl_commands被锁住的时间过长,则日志读取操作 作业将会超时失败,然后重试运行这个作业,直到重试十次之后,该作业失败。这时候就不会有新的数据复制到订阅服务器中的业务库中。
5、此时重启sql server agent,日志读取操作这个作业将会重启,然后重复上面的步骤,这时候就会 有新的数据复制到订阅服务器中的业务库中。
解决方法:
存储过程sp_MSdelete_publisherdb_trans 中的删除逻辑是每次取2000条数据,然后删除,一直循环直到删除完毕。
将这个存储过程每次取2000条数据修改为每次取100000条数据,在经过一天的删除操作之后,数据量又11106751变为三十多万。此时REPL-清除分发作业只需要几秒的时间就可以完成,不会再锁住表MSrepl_commands,其他作业可以顺利执行。
备注:
存储过程sp_MSdelete_publisherdb_trans中调用了存储过程sp_MSdelete_publisherdb_trans 来做的删除操作,因此修改的存储过程实际上是sp_MSdelete_publisherdb_trans。在表MSrepl_commands中的大部分数据被删除之后,我将参数100000修改回2000了。
微软亚太地区数据库技术支持组的一些博客也详细说了复制的一些问题,可以参考一下:
http://blog.itpub.net/25175503/viewspace-705405/ ----性能故障排除工具
http://blog.itpub.net/25175503/viewspace-705413/ ----日志读取器读者线程延迟
http://blog.itpub.net/25175503/viewspace-705826/ ---- 日志读取器写者线程延迟
http://blog.itpub.net/25175503/viewspace-705827/ ----分发代理读者线程延迟
http://blog.itpub.net/25175503/viewspace-706127/ ----分发代理写者线程延迟

MySQL是一种开源的关系型数据库管理系统,主要用于快速、可靠地存储和检索数据。其工作原理包括客户端请求、查询解析、执行查询和返回结果。使用示例包括创建表、插入和查询数据,以及高级功能如JOIN操作。常见错误涉及SQL语法、数据类型和权限问题,优化建议包括使用索引、优化查询和分表分区。

MySQL是一个开源的关系型数据库管理系统,适用于数据存储、管理、查询和安全。1.它支持多种操作系统,广泛应用于Web应用等领域。2.通过客户端-服务器架构和不同存储引擎,MySQL高效处理数据。3.基本用法包括创建数据库和表,插入、查询和更新数据。4.高级用法涉及复杂查询和存储过程。5.常见错误可通过EXPLAIN语句调试。6.性能优化包括合理使用索引和优化查询语句。

选择MySQL的原因是其性能、可靠性、易用性和社区支持。1.MySQL提供高效的数据存储和检索功能,支持多种数据类型和高级查询操作。2.采用客户端-服务器架构和多种存储引擎,支持事务和查询优化。3.易于使用,支持多种操作系统和编程语言。4.拥有强大的社区支持,提供丰富的资源和解决方案。

InnoDB的锁机制包括共享锁、排他锁、意向锁、记录锁、间隙锁和下一个键锁。1.共享锁允许事务读取数据而不阻止其他事务读取。2.排他锁阻止其他事务读取和修改数据。3.意向锁优化锁效率。4.记录锁锁定索引记录。5.间隙锁锁定索引记录间隙。6.下一个键锁是记录锁和间隙锁的组合,确保数据一致性。

MySQL查询性能不佳的原因主要包括没有使用索引、查询优化器选择错误的执行计划、表设计不合理、数据量过大和锁竞争。 1.没有索引导致查询缓慢,添加索引后可显着提升性能。 2.使用EXPLAIN命令可以分析查询计划,找出优化器错误。 3.重构表结构和优化JOIN条件可改善表设计问题。 4.数据量大时,采用分区和分表策略。 5.高并发环境下,优化事务和锁策略可减少锁竞争。

在数据库优化中,应根据查询需求选择索引策略:1.当查询涉及多个列且条件顺序固定时,使用复合索引;2.当查询涉及多个列但条件顺序不固定时,使用多个单列索引。复合索引适用于优化多列查询,单列索引则适合单列查询。

要优化MySQL慢查询,需使用slowquerylog和performance_schema:1.启用slowquerylog并设置阈值,记录慢查询;2.利用performance_schema分析查询执行细节,找出性能瓶颈并优化。

MySQL和SQL是开发者必备技能。1.MySQL是开源的关系型数据库管理系统,SQL是用于管理和操作数据库的标准语言。2.MySQL通过高效的数据存储和检索功能支持多种存储引擎,SQL通过简单语句完成复杂数据操作。3.使用示例包括基本查询和高级查询,如按条件过滤和排序。4.常见错误包括语法错误和性能问题,可通过检查SQL语句和使用EXPLAIN命令优化。5.性能优化技巧包括使用索引、避免全表扫描、优化JOIN操作和提升代码可读性。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

记事本++7.3.1
好用且免费的代码编辑器

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境