Столбцы репликации и идентификатора Sql Server

У нас есть большая база данных (100 ГБ) в нашей производственной среде и два зеркала. мы используем репликацию для синхронизации нашей зеркальной базы данных (репликация транзакций на SQL Server 2012).

когда мы создали репликацию, наш администратор базы данных сначала загрузил полную резервную копию с наших серверов и восстановил ее на сервере-зеркале, а затем настроил репликацию между издателем (производственная база данных) и подписчиком (зеркало-1). Все работает нормально, зеркало и производство синхронизированы идеально.

перед каждым выпуском мы должны тестировать нашу систему на нашем сервере UAT с REAL! данные. поэтому мы создаем резервную копию с одного из наших зеркальных серверов (локальное зеркало) и восстанавливаем ее в нашей базе данных UAT.

Все таблицы в нашей базе данных имеют один ПК, например:

[ID] [int] IDENTITY(1,1) NOT NULL

В нашей базе данных UAT последняя запись таблицы OrderTransaction ID = 160.000.000, но когда наше приложение пытается вставить в эту таблицу, система обнаруживает проблему и возникает исключение.

Нарушение ограничения PRIMARY KEY «ID». Невозможно вставить повторяющийся ключ в объект ...

система пытается вставить целочисленное значение меньше 160.000.000 (ID = 145.695.000), поскольку я запросил базу данных, этот идентификатор является последним идентификатором, когда резервная копия производственной базы данных была восстановлена ​​в зеркальную базу данных и после того, как началась репликация транзакций. вся информация о производстве и зеркалировании синхронизируется правильно, а идентификаторы таблиц на обоих серверах одинаковы и идентичны.

Когда я запускаю эту команду в UAT или в зеркальной базе данных, она возвращает 145.695.000.

SELECT IDENT_CURRENT( 'OrderTransaction' )

когда я читаю MSDN, блоги и связанный с этим вопрос SO, эта проблема связана с репликацией и столбцами идентификации.

Но как я могу заставить нашу зеркальную базу данных увеличивать свою идентичность с производственной (и принимать это значение как значение локальной идентичности). Или, может быть, мы должны написать сценарий, который повторно заполняет каждую таблицу для тестирования в нашей среде UAT !?

благодаря.


person Navid    schedule 18.10.2014    source источник


Ответы (1)


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

Для более общих проблем репликации и проблемы идентификации вы можете найти эта отличная статья от Хилари Коттер на Simple-Talk полезна.

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

РЕДАКТИРОВАТЬ: это должно сбросить все идентификаторы до текущего максимального значения:

EXEC sp_MSForEachTable '
IF OBJECTPROPERTY(object_id(''?''), ''TableHasIdentity'') = 1
DBCC CHECKIDENT (''?'', RESEED)'

Это небольшая модификация Работы Пиналя Дэйва.

person Karl Kieninger    schedule 18.10.2014
comment
спасибо, я пытаюсь написать сценарий, который находит все таблицы, в которых есть столбцы идентификаторов, и повторно заполняю их, но, на мой взгляд, это должно быть последнее решение. Может быть, должен быть какой-то способ сделать это в автоматическом режиме с помощью настроек репликации SQL Server. - person Navid; 19.10.2014
comment
Скрипт должен быть достаточно лаконичным. На всякий случай выложу кряк. - person Karl Kieninger; 19.10.2014