Перевірка наявності 2 таблиць (на різних серверах) однакових точних даних


10

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

Чи є спосіб я порівняти 2 з тих же таблиць, 1 із резервного копіювання та 1 з виробничого сервера, щоб побачити, чи спрацювала реплікація минулої ночі?

Єдиний спосіб, який я міг знайти, це запустити наступний запит на обох серверах і побачити, чи збігається результат, який "може" означати, що до 2 таблиць містять однакову інформацію.

SELECT CHECKSUM_AGG(BINARY_CHECKSUM(*))
        FROM   (

                    SELECT  * 
                    FROM    table_to_compare
               ) t1

Використовуючи наведений вище код, схоже, що таблиця успішно повторювалась, оскільки значення контрольної суми однакові, але я не впевнений, наскільки надійний цей метод.

Хто-небудь знає кращий метод перевірити це чи це хороший спосіб?

Я запускаю SQL Server 2008 на комп'ютері з Windows Server 2008.

Дякую.

Відповіді:


11

Я вважаю, що ви шукаєте таблицю інструментів, яка дозволяє вам зробити саме це - порівняйте дві повторювані таблиці для відмінностей. Ця стаття може бути корисною для початку.

Ось GUI для 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>зменшити кількість даних) поточний, але наявність ПК у висновку означатиме, що ви можете визначити рядки, які відрізняються, якщо такі є, меншими подальшими запитами). Звичайно, цей останній варіант є безглуздим, якщо дані в середньому рядку менше, ніж отриманий хеш, і в цьому випадку варіант "порівняти все " буде більш ефективним.


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дасть вам усе в таблиці1, але не в таблиці2
Адам,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.