3

У меня есть два SQL-сервера, которые мне нужно иметь одинаковые. Синхронизация должна происходить, может быть, пару раз в день, автоматически. У двух серверов нет «прямого» соединения между ними, поэтому никаких связанных db и т. Д. (Они находятся на полностью разных компьютерах, сетях, доменах, с брандмауэрами между ними). ​​Вы можете использовать Интернет, хотя, например, веб-сервис, FTP. .Синхронизация данных между двумя Diff SQL-серверами

CopyFromDB содержит много таблиц, но только около 20 таблиц (только данные, без изменений схемы на данный момент) должны быть синхронизированы с CopyToDB. Только около половины таблиц будут иметь новые/обновленные строки каждый день. Остальные пару раз в год. Я предполагаю, что это всего лишь пара тысяч строк в день прямо сейчас. Это может, однако, расти в будущем, примерно до 100 000 строк в день. Так что, может быть, не слишком много данных, я думаю.

А также (пока что может измениться) данные должны быть синхронизированы в одну сторону, от CopyFromDB до CopyToDB. Было бы также неплохо, если бы он не «ломался» только потому, что кто-то добавляет дополнительный столбец в таблицу на CopyFromDB, но этот новый col не должен синхронизироваться с CopyToDB автоматически. (Только копии, которые должны синхронизироваться, находятся на CopyToDB, могут быть другие столбцы, которые не должны синхронизироваться)

Он должен вставить, обновить или вставить. В худшем случае я предполагаю, что это может привести к полному удалению и вставке, но мне это не нравится. (Есть, конечно, FK и т. Д., Поэтому данные должны быть вставлены в правильном порядке)

На данный момент существует только один «CopyToDB», но это может увеличиться. Решение также должно быть довольно простым и не слишком сложным. :-)

Мой вопрос: что было бы лучшим способом добиться этого? У меня есть несколько идей ниже.

  • WS на стороне CopyToDB, вызываемой со стороны CopyFromDB службой или чем-то еще? Нажатие данных происходит только с момента последней синхронизации.
  • FTP на стороне CopyToDB, которая принимает «sql-файл» с изменениями. Как Вставить/Обновить/Удалить. Это выталкивается там CopyFromDB.
  • Что-то еще? Встроенный инструмент, который уже делает это? Или инструмент 3d-части? Что-то вроде Red Data SQL Data Compare, только автоматически.

Спасибо за ваши мысли и/или ответы!


Я искал форум для моего вопроса. Но я могу только найти вопросы, где у двух серверов есть какое-то «прямое» соединение между ними, или вы делаете резервное копирование/восстановление. Но если на вопрос уже был дан ответ, я прошу прощения, и не могли бы вы рассказать мне, где? :)

+0

Ну, я не нашел никаких «коротких сокращений», поэтому я выбрал первый способ, используя WS. (Ошибка sql-file-way не удалась, возможно, он мог ее решить, но потребовалось слишком много времени) В CopyFromDB в каждой таблице есть столбец DateTime - «update». Я использую это для проверки новых данных. Новые данные затем помещаются в DTO, сериализуются, сжимаются и отправляются на WS на стороне CopyToDB. CopyToDB берет данные, если он уже существует, он выполняет обновление или же выполняет вставку. Ну, в этом есть больше логики, но в основном так оно и решается. – Rolle

ответ

0

Вы можете использовать FTP доставку с репликацией SQL Server: How to: Deliver a Snapshot Through FTP (Replication Transact-SQL Programming)

+0

Спасибо! Я никогда не использовал Snapshot, я посмотрю на это. Но это берет все данные? Думаю, не только изменения с последнего времени? – Rolle

+0

Я просмотрел снимки, я не думаю, что это сработает для меня. Требуется моментальный снимок всего БД (который, я думаю, я мог бы пропустить), но и исходная БД необходима или должна быть зеркальной. Для моей проблемы я думаю, что снимки - это слишком много работы, чтобы заставить ее работать. (В моем случае есть и другие недостатки, http://msdn.microsoft.com/en-us/library/ms189940%28v=SQL.90%29.aspx) – Rolle

1

Web Service Write для него и использовать утилиту как TableDiff для данных & OpenDBDiff для схемы. Другого более простого способа нет.

+0

Спасибо за информацию об инструментах. Я не слышал о них, довольно интересно. Я проверил TableDiff, но, похоже, только сравнение двух БД может быть достигнуто «напрямую», по крайней мере, из одного из них? Или я что-то пропустил? В любом случае быстрый поиск в Google не предлагал ничего другого. Как это можно сделать с помощью WS? – Rolle

+0

упс! Я забыл, что вы не можете использовать связанный сервер. Единственный путь, который вы оставили, - написать свой собственный код, чтобы сравнить таблицу один за другим, используя два разных объекта ADO.NET, и вам нужно идти по строкам для сравнения (может быть, с CURSOR?) Но это будет слишком медленно, я думаю, производительность не будет такой хорошей. – gery128

1

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

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

0

Если у вас есть доступ к проектам Visual Studio DataBase, вы можете настроить задачу сборки (если вы используете систему сборки), которая может генерировать T-SQL diff. Затем речь идет о доставке разностей и их применении, но это намного проще (WCF, электронная почта, что угодно).

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

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

Erick

2

Late один, но, надеюсь, другие читатели найдут полезным ...

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

Я успешно использовал ApexSQL Data Diff для подобных проектов, где необходима ежедневная синхронизация данных.

Оба инструмента имеют верхнюю насечку. Вы не можете пойти не так, как в любом случае ... Красные ворота, похоже, имеют лучшую удобство использования, но у Apex больше возможностей и выполняется немного быстрее.

Отказ от ответственности: Я не являюсь аффилированным лицом ни с одним из двух поставщиков, упомянутых в этом сообщении, но у меня была возможность использовать как в компаниях, в которых я работал.

Смежные вопросы