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

Откуда:
Сообщений: 12310
Пример предельно упрощенный, так что не задавайте вопросов про цель нижеследующих манипуляций. Меня интересует, почему не работает. Как избежать ситуации в целом, я знаю.

Создаем таблицу
create table t1(
    id uniqueidentifier not null rowguidcol constraint DF_t1_id default newid(),
    f1 int,
    constraint PK_t1_id primary key (id)
)

Делаем две публикации на одну таблицу. Каждая без джойнов/фильтров, единственное изменение дефолтных настроек - для статьи на закладке снапшот выбираем "Delete data in the existing table that matches the row filter statement" или "Delete all data in the existing table".

Делаем по одной подписке (все равно, push или pull - дальнейшее поведение одинаково в обоих случаях) на каждую публикацию, указывая опцию "Yes, initialize the schema and data".

Результат: первый мерж агент отрабатывает нормально, второй валится с ошибкой
The process could not drop one or more tables because the tables are being used by other publications.
(Source: Merge Replication Provider (Agent); Error number: -2147200976)
-------------------------------------------------
Это была собственно проблема. Основной вопрос - зачем делается попытка удалить таблицы, если опции подразумевают только удаление данных?

Обходные пути:
- включать каждую таблицу в только одну публикацию
или
- при добавлении подписчика указывать опцию "No, the Subscriber already has the schema and data"

Забавная деталь: если при создании публикации указать "Keep the existing table unchanged", а при создании подписки - "Yes, initialize the schema and data", то ошибка все равно БУДЕТ. "The process could not drop..."
-------------------------------------------------
Это наводит на мысль, что реально до удаления таблиц дело не доходит. Должна быть какая-то проверка, которая, возможно, к удалению таблиц вообще отношения не имеет.

Запускаем профайлер и смотрим, что делает мерж агент. Непосредственно перед записью ошибки в хистори происходит выполнение процедуры sp_MSunmarkifneeded. Смотрим на ее текст:
CREATE PROCEDURE sp_MSunmarkifneeded(
@object				sysname,
@pubid				uniqueidentifier,
@pre_command 		int = 0,
@publisher			sysname,
@publisher_db		sysname
)AS
declare @table_in_use	int
declare @retcode 		int

select @table_in_use = 0
--if pre-creation_command is 'drop (1)' or 'truncate (3)', then disallow this deployment if there is already an article using that table.
--other commands like 'delete, truncate, none are fine'

if exists (select * from sysmergearticles where objid=object_id(@object) and pubid in
	(select pubid from sysmergepublications where LOWER(publisher)=LOWER(@publisher) and 
		publisher_db=@publisher_db and pubid<>@pubid))
	OR
	((@pre_command=1 or @pre_command=3) and 
		EXISTS (select * from sysmergearticles where objid=object_id(@object) and pubid <> @pubid and pubid not in
			(select pubid from sysmergepublications where LOWER(publisher)=LOWER(@@SERVERNAME) and publisher_db=db_name())))  
begin
	select @table_in_use = 1
	select @table_in_use
	return (0)
end
exec @retcode = sp_MSunmarkreplinfo @object
if @retcode <>0 or @@error<>0
	return (1)
select @table_in_use 
return (0)

GO
Естественно, условие выполняется, потому что настройка статьи (@pre_command) уже не играет роли, когда статья входит в несколько публикаций - and pubid<>@pubid.
-------------------------------------------------
Microsoft SQL Server  2000 - 8.00.818 (Intel X86) 
	May 31 2003 16:08:15 
	Copyright (c) 1988-2003 Microsoft Corporation
	Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4)
-------------------------------------------------
Единственная статья с таким сообщением об ошибке: FIX: Merge Agent Fails During Synchronization of Rollup Subscriber
Описанная там ситуация чем-то издалека похожа. Но, во-первых, статья для SQL 7.0, к тому же баг пофикшен во 2-м SP, а во-вторых, описанный workaround не работает.
-------------------------------------------------
Так вот. Это больше "информация по факту". Хочется другое. Хочется увидеть подтверждение в документации тому факту, что включение таблицы больше чем в одну публикацию возможно только при настройке "No, the Subscriber already has the schema and data". Либо, если это баг, увидеть официальное подтверждение, что это баг.
7 фев 05, 14:40    [1304862]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10752
Блог
Обалдеть, а ведь в таком дублеже издания и подписки есть очень хорошее свойство, которым можно воспользоваться... Т.е. у каждой подписки и каждого агента есть свои собственные настройки и своя конфигурация, т.о. можно организовать резервирование агентов и путей передачи трафика репликации и т.п. А по началу, мне показалось, что это только гипотетическое рассуждение
16 фев 05, 14:29    [1324916]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Да я вот уже вторую неделю в оффлайне напряженно бодаюсь за этот баг с техсаппортом :-)

Говорят - типа мы и не собирались, чтобы такой вариант работал. Ну ладно. Не работает - это не страшно. Workaround у меня есть, жизнь продолжается. Хочется-то всего-ничего:

1. Чтобы ошибка вылезала не при работе мерж-агента, а настолько раньше, насколько это возможно. Идеально - при sp_addmergearticle, если статья уже участвует в другой публикации.

2. Чтобы ошибка была ПОНЯТНОЙ. Вот кто из присутствующих может во фразе "The process could not drop one or more tables because the tables are being used by other publications" опознать то, что таблица добавляется во вторую публикацию??? Я не могу. Какие <censored> удаления таблиц? Я ж выставляю "Delete data in the existing table that matches the row filter statement". Знаете, сколько у меня ушло времени на то, чтобы понять истинную причину? Обрыдаться можно. 2 дня.

Это прочитав название топика, всем сразу все ясно. После моих двух дней, которые его породили :-) Правильно заданный вопрос - это наполовину решенная задача.

Теперь о "реальности" задач. Естественно, пример максимально упрощен, чтобы показать ошибку так просто, как это только возможно, потому и выглядит надуманным. Поэтому привожу чуть более реалистичный:
---------------------------------------------------------
У меня есть три таблицы. Первая – справочник, вторая его использует, третья тоже использует его же. С внешними ключами, все чисто-красиво. Справочник – всем папа.

Публикаций две. Так надо, чтобы две. Они у меня разные, для разных целей, с разными расписаниями, для разных подписчиков и т.д. Короче, ДВЕ.

Структура участников репл. группы:
Паблишер: все три таблицы
Подп1: первая и вторая
Подп2: первая и третья

Первая публикация: таблица1 и таблица2
Вторая публикация: таблица1 и таблица3

Понятное дело, что таблицу1 пришлось включать в публикации, поскольку 2 и 3 от нее зависят.

Да, я знаю воркэраунд – сделать три публикации, вытащив реплицирование таблицы1 в отдельную. Но он мне не нравится. Во-первых, логическая целостность систем теряется. Во-вторых, появляются дополнительные затраты на сопровождение – 3 публикации вместо 2. В-третьих, когда я хочу снести одну из публикаций, как было бы в нормальной ситуации, мне нужно чесать левой ногой за правым ухом – удалить «дочернюю» публикацию целиком, а у «родительской» удалить одну подписку. Это коряво.
---------------------------------------------------------
Саша, ваш пример я, честно говоря, не понимаю. Вы могли бы пояснить подробнее?
16 фев 05, 16:49    [1325612]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10752
Блог
Ну, например:

1. Каждая публикация может иметь свой FTP или свой каталог для снапшота, а также дистрибутора, пусть он и нужен только для передачи снимка. Т.е. подписчик может получить снимок, даже если один из FTP недоступен.
2. Агенты подписчика могут запускаться в разных местах (например, один на издателе, другой на подписчике), тогда их расписание можно настроить на работу во время простоя системы, или (если запускать на выделенном дистрибуторе) можно настроить расписания так, что бы дистрибутор был больше загружен, а подписчик или издатель делал только "контрольные" сеансы, на случай, если дистрибутору поплохеет.

Т.е. Ваш метод даёт дополнительную возможность резервирования компонент, обеспечивающих репликацию.
16 фев 05, 17:24    [1325777]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
А не пересекается ли это слегка с моей проблемой?
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=68130&hl=
Попробую в баг-инфо добавить...
16 фев 05, 17:34    [1325821]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
2Александр Гладченко: ага, дошло. Да, идея хорошая. Посмотрим, что скажут разработчики. Хорошо, если обеспечат функциональность. Но есть вариант, что просто напишут статью "так делать нельзя".

2Ray D: особой связи не вижу. "Table %s does not exist in the Subscriber database" - это, сдается мне, из совсем другой оперы. Моя проблема четко описана в названии топика.
16 фев 05, 18:07    [1325978]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
Дело в том, что мне не совсем понятно, зачем делается попытка DROP, если таблицы на подписчике нет. Из какой это может быть оперы??? Посмотрим, может ответят чего-нибудь.
16 фев 05, 18:17    [1326017]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10752
Блог
GreenSunrise
2Александр Гладченко: ага, дошло. Да, идея хорошая. Посмотрим, что скажут разработчики. Хорошо, если обеспечат функциональность. Но есть вариант, что просто напишут статью "так делать нельзя".


Ну, дык, по их просьбе я к этой теме и вернулся Надеюсь, совместными усилиями мы сможем убедить их в том, что этим стоит заняться...
16 фев 05, 19:59    [1326279]     Ответить | Цитировать Сообщить модератору
 Re: Merge replication. Несколько публикаций на одну таблицу  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Пока что мне удалось их убедить хотя бы статью написать... Про функциональность сказали, что "такое не задумывалось и ваще бред" :-)
17 фев 05, 11:08    [1327269]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить