三路服务器表检查

时间:2014-12-11 08:32:29

标签: sql sql-server tsql sql-server-2008-r2

我有三个他们复制的链接服务器。然后每两个小时。我想仔细检查一个高度事务性的表,以确保它是同步的。所以服务器A =服务器B,服务器B =服务器C.所以我有一个脚本,由于时间的原因,现在又一次失败(选择来自...... A,B,C的计数它们是否匹配)。由于声明是几毫秒的漂移,因为它是顺序运行的,最后是+/-行是在计算总数时。我的问题是有一种方法可以同时查询三台服务器上的表,或者是时间快照选项或任何其他最佳实践,以便同时在三台服务器上敏锐地检查三个表。 (表在SQL Server 2008 R2上有大约4百万行)

2 个答案:

答案 0 :(得分:0)

如果您有一个存储添加记录的日期/时间的列,那么您可以使用它来获取整个数据库中某个时间点的准确计数。

首先设置一个变量来保存datetime检查点:

declare @dateTimeCutOff datetime = GETDATE()

由于您没有提供任何代码,我不确定您是如何运行检查的,但您可以使用此值来查询服务器上的数据库:

SELECT COUNT(1) 
FROM TransactionTable
WHERE DateAdded <= @dateTimeCutOff

如果对具有相同变量值的3个数据库表运行此查询(仅设置一次并在检查之间共享),它们应该产生相同的结果。

答案 1 :(得分:0)

如果您只检查3台服务器上的count表,我可能会在链接服务器上执行PROCEDURE的服务器上创建COUNT

CREATE PROCEDURE spc_GetTableCount @TableName sysname AS
DECLARE @RowVal int,
        @SQLString nvarchar(max)
SET @SQLString = N'Select @RN=COUNT(*) from ' + @TableName + ' WITH (NOLOCK)'
EXEC sp_executesql @SQLString, N'@RN int OUTPUT', @RN = @RowVal OUTPUT
RETURN ISNULL(@RowVal, 0)

然后您可以从任何链接服务器执行此操作

DECLARE @RN int
exec @RN = servername.dbname.dbo.spc_GetTableCount 'TABLENAME'
Select @RN

WITH (NOLOCK)将确保您在选择

时不会锁定表格