检查2个表(在不同服务器上)是否具有相同的准确数据


10

因此,托管我们的SQL Server的公司似乎在从生产服务器到备份服务器的复制中遇到了一些麻烦……我相信某些表已被正确地复制了。复制每天进行一次(数小时后)。

有什么方法可以比较两个相同的表,一个是备份中的表,另一个是生产服务器中的表,以查看昨晚复制是否有效?

我能找到的唯一方法是在两台服务器上运行以下查询,并查看结果是否与哪个“可能”匹配意味着2个表包含相同的信息。

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

使用上面的代码,似乎表已成功复制,因为校验和值相同,但是我不确定此方法的可靠性。

有谁知道更好的方法来检查这一点,或者这是否是一个好方法?

我在Windows Server 2008计算机上运行SQL Server 2008。

谢谢。

Answers:


11

我相信您正在寻找的工具tablediff可以让您完全做到这一点-比较两个复制的表之间的差异。您可能会发现这篇文章对入门很有用。

这是 tablediff 的GUI


太好了,谢谢。我对此做了一些阅读。也感谢您到GUI的链接,它应该使事情变得容易得多,非常感谢!
— Juan Velez


4

数据有多大,数据库之间(以及您与彼此之间)的链接有多快?有很多想法:

如果数据足够小,可以SELECT * FROM <table> ORDER BY <pk>在每个数据库上运行,然后将结果保存到制表符或逗号分隔的文件中(未对齐空格,因为这样会严重破坏生成的文件大小),然后将生成的输出与首选的diff类型进行比较实用程序,例如winmerge。这样,您就可以比较所有数据。

如果数据库可以看到彼此(很可能因为它们能够作为复制伙伴而工作)并且它们之间的链接足够高的带宽和足够低的延迟,则可以使用链接服务器功能(请参阅http://msdn.microsoft .com / en-us / library / ms190479.aspx和相关文档)来比较两个SQL语句(列出其中<table>没有相同行的行,<linked_server>.<db>..<table>反之亦然)中的表内容并进行比较您将比较两个本地表的内容。这可能是一个相对较慢的选项,但可能是强大的自动化检查。

如果由于要大大减少需要传输的数据量而需要使用校验和,请使用函数HASHBYTES而不是CHECKSUM函数系列,因为可以使用质量更好的哈希,这样可以确保它们相等。这会占用更多的CPU资源,但是对于大量数据,无论如何,您将受I / O约束,而不受CPU约束,因此将有很多空闲周期(对于少量数据,这根本没有关系)。

作为比较所有字符数据与比较覆盖所有数据的单个校验和之间的中间立场,您可以SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>从每个数据库导出并比较这些结果以查看它们是否相同(或SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>减少数据量)。流动,但在输出中包含PK意味着您可以确定行有所不同的行(如果有的话),而无需进行更多查询)。当然,如果平均行中的数据小于生成的哈希,则最后一个选项毫无意义,在这种情况下,“ compare everything ”选项将更加有效。


2

虽然tablediff仅比较实时数据库中的表,但是有许多第三方工具可以将数据库备份与实时数据库进行比较。

您还可以执行以下脚本来查看一个表中存在的数据,而另一个表中不存在的数据,但是您只能对2个活动数据库执行此操作:

选择*从MyTest.dbo.testtable中不存在(选择*从MyTest2.dbo.TestTable中,MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


谢谢(你的)信息!我会调查的。该脚本会有所帮助!
— 胡安·贝莱斯

我经常使用的东西是except:select id, name from Table1 except select id, name from Table2将为您提供Table1中的所有内容,但不会为您提供Table2中的所有内容
— Adam
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.