Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
Запускаем в тестовую эксплуатацию merge-репликацию.
Имеется 2 SQL Server 2005+SP2+hf3152.
Делаю Merge репликацию с инициализацией через snapshot - отрабатывает на ура, базы синхронизируются.
По BOL делаю "Initializing a Merge Subscription Without a Snapshot" (публикация без параметризованных фильтров).
Создаю Publication точно такую же, как и в 1-м случае. Делаю snapshot. Делаю бекап реплицируемой БД, с ней никто не работает, изменений никаких не вносится. Поднимаю базу на подписчике. Создаю push-подписку (не забыв очистить Initialize check box). До этого момента всё нормально. И, наконец, запускаю Merg-агента.
Джоб останавливается со следующей ошибкой:

Command attempted:
{call sp_MSsetconflicttable (N'sysdiagrams', N'MSmerge_conflict_TestPub_sysdiagrams', N'ORACLE', N'exempt_replication', N'TestPub')}

Error messages:
Неправильный синтаксис около конструкции "name". (Source: MSSQLServer, Error number: 102)
Get help: http://help/102
The merge process was unable to deliver the snapshot to the Subscriber. If using Web synchronization, the merge process may have been unable 
to create or write to the message file. When troubleshooting, restart the synchronization with verbose history logging and specify
 an output file to which to write. (Source: MSSQL_REPL, Error number: MSSQL_REPL-2147201001)
Get help: http://help/MSSQL_REPL-2147201001
Есть соображения, что за "неправильный синтаксис около конструкции "name""? Сталкивался ли кто-нибудь с подобной проблемой?
5 апр 07, 17:22    [3986244]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Надо профайлером посмотреть, где именно облажалось.

1. Запустите на обоих серверах (паблишере и подписчике) профайлер, выберите новый трейс.
2. Выберите шаблон TSQL-SPs
3. Перейдите на закладку Events selection, пометьте галку "Show all columns", отметьте галки в колонке ApplicationName для всех доступных в этом шаблоне событий
4. Запустите трейс (кнопка Run). (на обоих серверах, не забыли?)
5. Перезапустите мерж-агент, дождитесь появления сообщения об ошибке.
6. Застопьте оба трейса.
7. Сохраните в файл (Menu->File->Save As->Trace File). Назовите файлы так, чтобы понятно было, кто из них трейс паблишера, а кто - трейс подписчика
8. Запакуйте и приложите к посту. Если даже в запакованном виде слишком много получилось, пришлите мне на почту (см. в профиле), только скажите здесь, что послали, я тот ящик не слишком часто проверяю.

Посмотрим, что за запрос там неправильно строится...
5 апр 07, 19:52    [3987158]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
Утро доброе, GreenSunrise! Спасибо, что откликнулись!
Создаю 2 поста (чтобы архивы меньше 100кб получились). Сделал всё по Вашей инструкции:)
В этом посте прикреплён трейс с паблишера и дистрибьютора (они у меня на одной машине).

К сообщению приложен файл (Publisher_and_distibutor.rar - 84Kb) cкачать
6 апр 07, 10:04    [3988182]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
А вот трейс с подписчика

К сообщению приложен файл (Subscriber.rar - 54Kb) cкачать
6 апр 07, 10:05    [3988186]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
На всякий случай поясню задачу - минимизация трафика при инициализации репликации. Ладно бы обычная (с инициализацией через snapshot) не работала - так нет, всё замечательно:)
Насколько я знаю, эту задачу как раз и решает инициализация из backup. Может есть обходные пути?
6 апр 07, 13:27    [3989875]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Файлы скачались, распаковались без проблем. Сегодня займусь. Очень быстрого ответа не ждите, это займет какое-то время.
6 апр 07, 15:03    [3990635]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
GreenSunrise, заранее спасибо! Быстро не жду:)
Сделал подписку, состоящую всего лишь из одной таблицы + подписчика перенёс на другой сервер. Таблица 10 строк, без FK. Текст ошибки изменился, что наталкивает на определённые мысли (fk_id - 1-е поле публикуемой таблички):
Command attempted:
{call sp_MSsetconflicttable (N'TParam', N'MSmerge_conflict_TestPub_TParam', N'ORACLE', N'exempt_replication', N'TestPub')}

Error messages:
Incorrect syntax near 'fk_id'. (Source: MSSQLServer, Error number: 102)
Дальше то же самое, что и в 1-м случае

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

К сообщению приложен файл (Dist_Pub.rar - 63Kb) cкачать
6 апр 07, 15:14    [3990732]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
Прикреплён trace с Subscriber'a

К сообщению приложен файл (Subscriber.rar - 52Kb) cкачать
6 апр 07, 15:15    [3990746]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
Прошёл от начала до конца по обоим трейсам. Все скрипты, где встречалось поле fk_id, выполнил ещё раз после дропа существующих объектов:
alter table [dbo].[TParam] with NOCHECK add CONSTRAINT repl_identity_range_9EF0DF80_9656_4DF9_B192_5DC8B654B2A2 check NOT FOR REPLICATION (([fk_id] > 274 and [fk_id] <= 374) or ([fk_id] > 374 and [fk_id] <= 474))

CREATE TABLE [dbo].[MSmerge_conflict_TestPub_TParam](
	[fk_id] [smallint] NOT NULL,
	[fc_name] [varchar](255) NOT NULL,
	[fc_value] [varchar](255) NOT NULL,
	[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL
)
Выполняются без ошибок. Уф...
6 апр 07, 15:30    [3990882]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Там в общем-то понятно, что грохнулось. Явно формируется динамический скрипт, потом отправляется на выполнение, и он-то и падает. Причем с ооочень большой долей вероятности проблема просто-напросто в том, что скрипт получился длинным, и он при склейке обрезался по длине переменной. Отсюда и incorrect syntax near...

Есть еще вариант, что у вас имена таблиц содержат такие символы, как пробел или тире или что-то в этом роде, что квотировать надо, а где-то забыли проквотировать.

Короче, все найдем :-) Чуток терпения...
6 апр 07, 17:36    [3991920]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Раскручиваем историю с конца. Ошибка возникает при выполнении процедуры sp_MSsetconflicttable. Смотрим, где именно. В конце ее есть вызов процедуры sp_MSgetconflictinsertproc.

В процедуре sp_MSgetconflictinsertproc есть код
exec @retcode = sys.xp_execresultset @command, @dbname
который и заканчивается ошибкой.

Теперь смотрим более подробно, где ошибка.
Туда передается динамический запрос, поэтому не совсем удобно смотреть, но тем не менее видно, что идет выполнение процедуры sp_MSmakeconflictinsertproc.
В ней создается временная таблица
create table #tempcmd
куда напихиваются команды для дальнейшего выполнения. Эти команды вставляются как в самой sp_MSmakeconflictinsertproc, так и в процедурах, которые вызываются из нее (в том числе в sp_MScreatedupkeyupdatequery).

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


В принципе, самое правильное в данной ситуации - обратиться в техподдержку Microsoft, потому что это явный баг.

Но, если хотите, мы можем дальше поисследовать, какие именно скрипты генерятся, и увидеть этот ошибочный скрипт своими глазами. Существует вероятность, что мы поймем, что именно толкает сиквел на создание ошибочного скрипта (например, отсутствие квотирования, слишком много колонок, слишком много индексов, слишком длинные имена таблиц или колонок и т.д.), и тем самым найдем workaround (например, дать таблицам имена, не требующие квотирования, сократить количество колонок, называть их покороче и т.д.). Но также есть вероятность, что это ошибка настолько кривая, что и workaround'а не найдем. А править системные процедуры, особенно в базе Resource - вещь не особо доступная, это вам не 2000.

Так что смотрите сами. Я могу еще помочь с более точным выяснением проблемы, но даже ее четкое описание может ничем вам не помочь - разве что успокоить, что вы все делаете правильно, а баг действитетельно в сиквеле. Но есть и некоторый шанс нахождения приемлемого workaround'а. Что вы предпочтете?
6 апр 07, 20:36    [3992592]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
GreenSunrise, я предпочитаю сказать Вам большое человеческое СПА-СИ-БО! (читать по слогам, вслух, громко:) За отклик, реальную помощь, поддержку и потраченное на меня время!
Начну с самого конца - создал тестовую БД, в ней одну табличку, с одним полем и одной записью. Никаких пробелов и дефисов в названиях. Этого и на боевых БД у нас нет. Ошибка та же... Начал призывать японских богов и отгонять злых духов от рабочего места.
Пробую ещё раз. Перечитываю уже зачитанную до дыр статью из BOL.
Цитата: (3-й пункт статьи "Initializing a Merge Subscription Without a Snapshot"):

Restore the backup at the Subscriber or copy data using another method. If you restore a backup, do not specify the KEEP_REPLICATION option

Поднимаю дамп из Management Studio, вопреки прочитанному чекаю опцию "Preserve the replication settings". И... вот оно, счастье!
А вот теперь я хочу знать - неужели я разучился читать по английски? Или всё же истина где-то рядом?
6 апр 07, 20:52    [3992611]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Хз... Вообще довольно странная рекомендация в статье. Если не сохранять репликационные настройки, то в восстановленной базе не будет репликационных триггеров, не будет таблиц для хранения метаданных и т.д. Если их не восстанавливать из бэкапа, значит, их надо пересоздавать. В принципе, судя по трейсу, так оно и происходит, только с ошибками. По меньшей мере, таблицы конфликтов точно пытались создаваться заново.

У меня нет уверенности, что в вашем случае репликация будет работать нормально... То, что первый запуск мерж-агента прошел без ошибок, еще не означает, что репликация работает верно. Вы на всякий случае потестируйте, нормально ли ходят в обе стороны изменения. Если да - супер. Повезло :-)
6 апр 07, 23:18    [3992866]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
GreenSunrise
Вы на всякий случае потестируйте, нормально ли ходят в обе стороны изменения. Если да - супер. Повезло :-)

Ходят. Туда и обратно ходят)
7 апр 07, 11:54    [3993322]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10716
Блог
В тему: http://forums.microsoft.com/TechNet-RU/ShowPost.aspx?PostID=1444994&SiteID=40&mode=1
7 апр 07, 13:24    [3993397]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Ошибка Merge репликации при инициализации через backup  [new]
andrey.moscow
Member

Откуда: Москва
Сообщений: 24
Benetton,

сначала делаем бэкап, а потом настраивать репликацию :)

MSDN

To initialize a merge subscription from a backup or using another method, use the following steps:

1. Add a uniqueidentifier column with the rowguid and not null column attributes to the tables that will be used in merge replication.

2. Perform a backup of the database that you will use to initialize the subscriber.

3. Create a publication and generate the snapshot for the publication.
Although the schema and data from published tables in the snapshot will not be used, the snapshot is still required because it includes system objects and metadata required by replication.
These objects and metadata are copied to the Subscriber during the initial synchronization.

4. Restore the backup at the Subscriber or copy data using another method. If you restore a backup, do not specify the KEEP_REPLICATION option.
This option is designed to maintain replication settings during restore;
the backup came from the Publisher, so you want to remove the Publisher settings from the database.
The restored database will have the necessary Subscriber settings after the initial synchronization.

5. Create a subscription, specifying that the subscription will be initialized manually.

6. Perform an initial synchronization with the Merge Agent to copy the objects and metadata required by replication.
The Subscriber is now synchronized and ready to accept incremental changes from the Publisher.

http://msdn.microsoft.com/en-us/library/ms152488.aspx
2 дек 09, 15:50    [8009230]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка Merge репликации при инициализации через backup  [new]
Benetton
Member

Откуда: Taganrog
Сообщений: 531
andrey.moscow,

1. Вы подняли тему "всего лишь" 2.5 летней давности, которая давно успешно решена и закрыта

2. Читайте все посты в данном топике внимательнее. Бэкап делался до начала репликации (ох, как давно это было!)
2 дек 09, 16:02    [8009358]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить