Таким образом, похоже, что у компании, которая размещает наши SQL-серверы, возникли некоторые проблемы с репликацией с рабочего сервера на сервер резервного копирования ... Я полагаю, что некоторые таблицы были реплицированы правильно. Репликация производится ежедневно (в нерабочее время).
Можно ли сравнить 2 одинаковые таблицы, 1 из резервной копии и 1 с рабочего сервера, чтобы увидеть, сработала ли репликация прошлыми ночами?
Единственный способ, который я смог найти, - запустить следующий запрос на обоих серверах и посмотреть, соответствует ли результат, который «может» означать, что две таблицы содержат одинаковую информацию.
SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
FROM (
SELECT *
FROM table_to_compare
) t1
используя приведенный выше код, кажется, что таблица успешно реплицировалась, так как значения контрольной суммы одинаковы, но я не уверен, насколько надежен этот метод.
Кто-нибудь знает лучший способ проверить это, или это хороший способ?
Я использую SQL Server 2008 на компьютере с Windows Server 2008.
Спасибо.
источник
Я нашел эту статью особенно интересной: http://networkprogramming.wordpress.com/2011/01/14/binary_checksum-vs-hashbytes-in-sql/
«Если вам нужна скорость, а не точность - используйте CHECKSUM, а не BINARY_CHECKSUM.
Если вам нужна точность, превышающая скорость - используйте ХАШБИТЫ. "
источник
Насколько велики данные и насколько быстрыми являются связи между базами данных и друг с другом (и вами)? Есть ряд идей:
Если данные достаточно малы, чтобы это практично, запустите их
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 в выводе будет означать, что вы можете идентифицировать строки, которые отличаются, если таковые имеются, с меньшим количеством дальнейших запросов). Конечно, этот последний вариант не имеет смысла, если данные в средней строке меньше, чем результирующий хеш, в этом случае опция «сравнить все » будет более эффективной.источник
Хотя 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