SQL Server 2005/2008复制可恢复被中断的快照传递
背景
在很多情况下,客户可能会有一个很大的数据库被发布,创建这个大数据库的快照通常会是比较困难的。而且,即使被发布数据库的大小在可管理范围之内,网络的速度和可靠性也可能会使问题变得复杂。
从SQL Server 2005之后,快照传递可以从之前的中断恢复了。这对于前面我们描述的那种情况来说,是一个很大的改进。
SQL Server 2005/2008中新的系统表MSsnapshotdeliverprogess,就是用来跟踪快照传递过程的。该表居于订阅数据库,包含了关于哪些快照文件被应用到订阅方的必要细节信息。对于每个成功传递到订阅方的快照文件,都会通过合并或分发代理向该表中添加一行。(关于MSsnapshotdeliverprogress表的说明,请查阅:https://msdn.microsoft.com/en-us/library/ms187398.aspx)
工作机制
当中断的快照传递被重新启动时,复制(分发/合并)代理会像往常一样,在所有需要应用到订阅方的快照文件中迭代;但是有了该恢复机制之后,分发/合并代理将会检查Mssnapshotdeliveryprogress表,查看是否有快照文件已经被中断之前的快照分发转递到了订阅方。如果Mssnapshotdeliveryprogress上记录表明某个文件已经被之前中断的快照分发应用了,分发/合并代理将会跳过这个文件。
表结构(参照联机丛书)
名称 |
数据类型 |
描述 |
session_token |
nvarchar(260) |
标识从中成功传递文件的快照文件夹的路径。 对于使用参数化筛选器的发布,将在此值后追加字符串 dynsnap。 |
progress_token_hash |
int |
根据 progress_token 的值生成的哈希值,用于提高给定 progress_token 值的查找效率。 |
progress_token |
nvarchar(500) |
标识已成功传递的文件,其值为文件名和路径的组合。 |
progress_timestamp |
datetime |
datetime 值,指示成功传递快照文件的时间。 |
什么是不可恢复的?
以下快照文件是不可恢复的:
- 索引创建(.idx)文件
- 声明引用完整性(.dri)文件——仅在合并复制下
- 应用到只使用DTS订阅方的.bcp文件
- 任何用户自定义的脚本
如何复位MSsnapshotdeliveryprogress表
在需要重启整个快照过程时,就有复位Mssnapshotdeliveryprogress表的需要了。
我们可以执行订阅数据库上的sp_resetsnapshotdeliveryprogress存储过程来移除Mssnapshotdeliveryprogress表中所有的行来重置快照传递 (仅适用于请求订阅模式)。