У меня есть две базы данных SQL Server. Один - клиент (приложение Windows), а второй - на сервере. Я хочу синхронизировать эти две базы данных очень часто (например, каждые 2 минуты!).
Я читал о различных способах синхронизации, таких как репликация, отметка времени, таблицы журналов с использованием триггеров, Microsoft Sync Framework и так далее.
На самом деле я не люблю использовать метод синхронизации, который может быть черным ящиком (например, репликация), потому что я не хочу, чтобы определенные таблицы SQL Server блокировались, пока я обновляю их и синхронизирую с сервером.
Какой метод вы думаете, что я должен использовать в таких обстоятельствах? Помните, что каждые несколько минут я должен отправлять несколько изменений таблицы с клиента на сервер и получать также два изменения таблицы с сервера.
Я нашел метод, который странный, но новый. Возможно ли, чтобы я регистрировал все выполненные (для конкретных предпочтительных) хранимых процедур в клиенте, отправлял их с параметрами в
.sql
файле на сервер и выполнял там? То же самое произойдет на сервере и отправлено клиенту. Как вы думаете, это простой, но полезный метод или нет?Пожалуйста, предложите мне любой полезный подход, если можете. Огромное спасибо.
РЕДАКТИРОВАТЬ: Помните, что это синхронизация в реальном времени, и это делает его особенным. Это означает, что когда пользователь клиента использует таблицу, процесс синхронизации с сервером должен происходить каждые несколько минут, поэтому ни одна из таблиц не должна быть заблокирована.
источник
Ответы:
Ну, я могу не получить это, но я пытаюсь ответить на это.
Вы сказали, что вам нужно высокопроизводительное решение, которое запускается часто (минимум все 2 минуты), и вам нужен хороший подход, который должен быть быстрым без блокировки. Но вы не хотите систему черного ящика.
Вместо системы черного ящика, которая используется на миллионах установок с хорошими результатами, вы пытаетесь снова изобрести колесо и создать собственное решение? Хм, звучит немного странно.
На самом деле это мои предложения.
ISOLATION LEVEL
вREAD_COMMITTED_SNAPSHOT
. Вы можете прочитать больше об этом здесь . Это израсходует часть вашей базы данных tempdb, но ваша таблица всегда доступна для чтения и записи, и репликация может работать в фоновом режиме.Смотрите пример ниже:
CDC
может быть хрупким в некоторых обстоятельствах.CDC
захватит все данные в отслеживаемой таблице (вам нужно указать каждую отслеживаемую таблицу вручную). После этого вы получите значение до и значение после того, какINSERT
,UPDATE
илиDELETE
.CDC
будет удерживать эту информацию в течение определенного периода времени (вы можете указать ее самостоятельно). Подход может состоять в том, чтобы использоватьCDC
на определенных таблицах, которые вам нужно наблюдать, и вручную реплицировать эти изменения в другую базу данных. Кстати,CDC
тоже использует SQL Server Replication под капотом. ;-) Подробнее об этом можно прочитать здесь .Ну, это мои 2 цента. Надеюсь, у вас есть хороший обзор, и, возможно, вы нашли одно решение, которое работает для вас.
источник
Я постараюсь перечислить некоторые варианты здесь с преимуществами и недостатками, как я их понимаю:
Microsoft Sync Framework - мне кажется больше подходит для небольших баз данных мобильных приложений. Он добавляет довольно много таблиц в вашу базу данных и не так эффективен, как репликация. Поскольку он реализован вне SQL Server как компонент, его будет сложнее настроить. У меня нет никакого опыта с этим, только попробовал это и решил не использовать это.
Отслеживание изменений базы данных . Это встроенная функция SQL Server, которая позволяет отслеживать изменения, включая вставки, обновления и удаления. Все остальное, как отправка и применение изменений, разрешение конфликтов и т. Д., Вам придется кодировать самостоятельно.
CDC, как упомянуто в ответе Ionic - у меня нет опыта работы с ним, поскольку он доступен только в редакциях Enterprise или Developer.
Использование вашего собственного трюка с журналированием выполненных хранимых процедур - очень сильно зависит от природы вашего приложения базы данных. Но когда процедуры становятся немного другими, там вы можете получить большой беспорядок в данных. А как бы вы справились с конфликтами?
Из вашего вопроса кажется, что вам нужно синхронизировать только несколько таблиц, а не целые большие базы данных. Для этого вам следует проанализировать свои потребности более подробно, чем указано в вопросе, например:
Если вы в конечном итоге обнаружите, что удаление и конфликты не являются вашей проблемой и что ваша структура не изменится сильно, вы можете написать свою собственную логику, но она может легко вырасти до 1000 строк кода.
источник
Спасибо всем за ваш отзыв.
Я успешно решил процесс синхронизации, записывая выполненные хранимые процедуры не как кучу, а одну за другой, что прекрасно работало в моем случае. Поскольку целостность и все тщательно продуманы, система работала в режиме реального времени до сих пор.
источник
Поздний ответ, но это может быть полезно для обсуждения темы
У меня была похожая проблема, когда я пытался распределить данные по разным серверам, и решил ее с помощью сторонних инструментов ( Diff для изменений схемы и DataDiff для синхронизации изменений данных) и следовал сценарию PowerShell, необходимому для автоматизации процесса:
Этот метод планирует сравнение между двумя базами данных и синхронизирует найденные изменения в режиме реального времени. Вот несколько статей, предлагающих пошаговые инструкции:
https://solutioncenter.apexsql.com/automatics-compare-and-synchronize-sql-server-data/ https://solutioncenter.apexsql.com/how-to-automatics-keep-two-sql-server-database- схемы-в-SYNC /
источник