Проверка, имеют ли 2 таблицы (на разных серверах) одинаковые точные данные


10

Таким образом, похоже, что у компании, которая размещает наши SQL-серверы, возникли некоторые проблемы с репликацией с рабочего сервера на сервер резервного копирования ... Я полагаю, что некоторые таблицы были реплицированы правильно. Репликация производится ежедневно (в нерабочее время).

Можно ли сравнить 2 одинаковые таблицы, 1 из резервной копии и 1 с рабочего сервера, чтобы увидеть, сработала ли репликация прошлыми ночами?

Единственный способ, который я смог найти, - запустить следующий запрос на обоих серверах и посмотреть, соответствует ли результат, который «может» означать, что две таблицы содержат одинаковую информацию.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

используя приведенный выше код, кажется, что таблица успешно реплицировалась, так как значения контрольной суммы одинаковы, но я не уверен, насколько надежен этот метод.

Кто-нибудь знает лучший способ проверить это, или это хороший способ?

Я использую SQL Server 2008 на компьютере с Windows Server 2008.

Спасибо.

Ответы:


11

Я считаю, что вы ищете инструмент tablediff, который позволяет вам делать именно это - сравнивайте две реплицированные таблицы на предмет различий. Вы можете найти эту статью полезной, чтобы начать.

Вот графический интерфейс для tablediff


Круто, спасибо. Мне нужно кое-что почитать. Также спасибо за ссылку на графический интерфейс, это должно сделать намного проще, действительно ценю это!
Хуан Велес


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семейства функций, поскольку вы можете использовать хэши лучшего качества, чтобы вы были более уверены, что они получаются равными. Это требует больше ресурсов ЦП, но для больших объемов данных вы будете связаны с вводом / выводом, а не с ЦП, так что многие запасные циклы будут свободными (а для небольших объемов это просто не будет иметь значения).

В качестве середины между сравнением всех данных символьно-символьных данных и сравнением единой контрольной суммы, охватывающей все данные, вы можете экспортировать данные SELECT <pk>, HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>из каждой базы данных и сравнивать эти результаты, чтобы увидеть, являются ли они идентичными (или SELECT HASHBYTES('SHA1', <all-other-fields-concatenated>) ORDER BY <pk>уменьшить объем данных текущий, но наличие PK в выводе будет означать, что вы можете идентифицировать строки, которые отличаются, если таковые имеются, с меньшим количеством дальнейших запросов). Конечно, этот последний вариант не имеет смысла, если данные в средней строке меньше, чем результирующий хеш, в этом случае опция «сравнить все » будет более эффективной.


2

Хотя tablediff сравнивает только таблицы в действующих базах данных, существует множество сторонних инструментов, которые могут сравнивать резервную копию базы данных с работающей базой данных.

Вы также можете выполнить следующий сценарий, чтобы увидеть данные, которые существуют в одной таблице и не существуют в другой, но вы можете сделать это только для двух действующих баз данных:

SELECT * FROM MyTest.dbo.testtable ГДЕ НЕ СУЩЕСТВУЕТ (SELECT * FROM MyTest2.dbo.TestTable ГДЕ MyTest2.dbo.testtable.f1 = MyTest.dbo.testtable.f1)


Спасибо за информацию! Я посмотрю на это. Этот скрипт будет полезен!
Хуан Велес

я часто использовал следующее except: select id, name from Table1 except select id, name from Table2даст вам все в Таблице 1, но не в Таблице 2
Адам
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.