Односторонняя репликация в другую схему

#sql-server #sql-server-2012 #replication #database-replication #database-administration

#sql-сервер #sql-server-2012 #репликация #база данных-репликация #база данных-администрирование

Вопрос:

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

Текущая настройка: DB1 — существует три экземпляра этой базы данных. Это большая реляционная база данных, схема одинакова для каждого, но они представляют собой отдельные хранилища данных (без репликации). Две базы данных на сервере 2012 года и одна на сервере 2014 года

DB2 — Есть два экземпляра этой базы данных на отдельных серверах (Европа, Америка), и данные реплицируются слиянием между ними. Издателем является сервер 2014.

введите описание изображения здесь

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

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

Должна быть односторонняя репликация из нескольких отдельных DB1 в DB2. Как быстро это происходит, не слишком важно.

Важные вещи:

  • Обратная репликация не происходит из DB2s> DB1s (данные передаются только из DB1s в один из DB2s)
  • Действия создания, обновления и удаления должны выполняться в DB2 на основе результатов сравнения с DB1 (односторонняя репликация)

Текущий подход: в настоящее время у меня есть плоское представление sql для каждой базы данных DB1, которая имеет ту же схему, что и таблица в DB2 db, в которую должны входить данные.

Серверы также объединяются как связанные серверы.

Моя идея заключалась в том, чтобы создать что-то вроде написанного вручную сценария репликации в одной из баз данных DB2, который вызывает представления из DB1 и выполняет действия CUD на временной основе.

Мне кажется, что должен быть более простой способ !?

Любые мысли о том, как это сделать, были бы очень признательны.

Имейте в виду, что, поскольку на сервере SQL 2012 существует несколько DB1, могут возникнуть некоторые проблемы, поскольку 2012 может быть запрещено использовать в качестве издателя для репликации на сервер 2014.

Комментарии:

1. Если таблицы, которые вы хотите реплицировать в DB2, имеют первичный ключ, вы можете использовать транзакционную репликацию.

2. Привет, Бен, спасибо за предложение. Я попытался выполнить репликацию транзакций для этого, но в нем утверждается, что таблицы, ссылающиеся на представление из DB1, должны существовать в DB2. Поскольку база данных DB2 по сути представляет собой единую таблицу, а реляционные таблицы, которые формируют представление для DB1 = 6, похоже, что это добавит много беспорядка и размера DB2.

3. Если вы не реплицируете таблицы, что вы реплицируете? Исходя из всего вышесказанного, я предполагал, что вы хотите реплицировать таблицы (т.Е. «Данные»). Вы можете реплицировать представление, но либо это будет только определение представления, либо, если это индексированное представление, вы можете реплицировать материализованное состояние представления.

4. Таким образом, все DB1 имеют одну и ту же схему, реляционную, много таблиц. Все DB2 также имеют одну и ту же схему, в основном только одну таблицу. Я создал представление в DB1s, которое имеет ту же схему, что и таблица DB2, в которую должны поступать данные. Итак, да, я хочу реплицировать «данные» одним способом из представления DB1 (в настоящее время 3 отдельных db) в таблицу DB2. Что касается ключей, есть один, на который я могу ссылаться, это будет FK в DB2.