在正常的复制世界中,会发生以下顺序:
- MAIN ASE:删除 N 行
- RS:删除发送到复制目标的 N 行
- TARGET: 删除相同的 N 行
但是,如果发生以下事件序列会怎样?
- 目标:删除 N 行(在主服务器删除它们之前)
- MAIN ASE:删除 N 行
- RS:删除发送到复制目标的 N 行
- 目标: 没有要删除的行?!?!?!
那么会发生什么?
代表服务器是否失败?主 ASE 事务是否中止?是否每个人都表现得像从未发生过并且复制有效(因为最终结果好像确实如此)?
PS 是的,我知道,通常你不应该搞这样的噱头,并且永远不应该在复制目标上更改数据。如果不是,您应该在主服务器会话上使用“设置复制关闭”。问题是“如果确实发生这种情况会发生什么,违反了‘应该’”。
从 SAP/Sybase Replication Server (SRS) 的角度来看会发生什么?
取决于 SRS 版本以及 DBA 如何配置 SRS 实例。
在 SRS 15.2 之前,“空”DELETE 不会导致任何问题,即,DELETE 将针对目标发出,没有找到/受影响的行,并且 SRS 将继续处理下一个事务。
这里的关键是没有找到任何要删除的行的 DELETE 语句只是成功完成(即没有错误),带有
@@rowcount=0
.注意:相同的“逻辑”适用于成功完成但不影响任何行的 UPDATE、INSERT/SELECT 和 SELECT/INTO。
注意:相同的“逻辑”适用于成功完成但影响不同行数的 DML 语句。
在 SRS 15.2+ 中引入了一个复制服务器错误类,主要强调注意事务何时影响目标中的不同行数……以及何时发生上述问题以引发错误(例如 5185)并暂停 DSI联系。
来自源的每个事务都标记有受影响的行数。如果事务在应用于目标时影响了不同数量的行,则 SRS 将(默认情况下)暂停 DSI 并将错误消息转储到错误日志中。
DBA 可以通过为复制服务器错误类中的相应错误编号分配不同的操作来修改默认的行计数不匹配行为(有关更多详细信息,请参阅分配操作命令)。
显然(?)DBA 应该研究任何行计数不匹配错误以确定它们是否正常/有效,或者它们是否表明目标与源不同步的问题。
DBA 想要调查的其他场景可能包括:
请记住,虽然 SRS 通常用于使 DR/备份数据库与主数据库保持同步,但 SRS 还可以用于:
最终结果是行数不匹配的发生可能正常,也可能不正常……这完全取决于各个 SRS 环境。
来自Replication Server 管理指南第 2 卷中的控制行计数验证:
我想也许,旧版本的 repserver 在进行 DSI 特定更改后需要 DSI 暂停/恢复。