Практическая задача- сдуть очередь на полуживой сервер

добавлено: 02 сен 15
понравилось:0
просмотров: 1024
комментов: 0

теги:

Автор: Дмитрий Горчилин

Периодически возникала проблема- некий сервер помирает, его бы отписать, да накопившиеся в очереди транзакции не дают. В принципе, очередь можно просто сдуть. Но по ряду причин этот метод не всегда хорош, лучше бы оно отработало штатно. Еще один вариант- в базе побило несколько таблиц, транзакции по ним мешают. Именно по этим таблицам репликацию бы и отписать бы, но очередь не дает. Хочется сохранить очередь, выборочно удалив транзакции по некоторым таблицам. После их можно будет пересоздать, изменить структуру, закачать bcp. Иногда даже подкладывали вместо умершего сервера базу учебного сервера, и он быстренько сдувал очередь. Сделать то надо всего ничего- по таблицам идущим в эту базу создать пустой fsc, поднять. Репсервер честно все их применит- пустые. В базе при этом сами таблицы не нужны, достаточно репликационных объектов (вроде rs_lastcommit).
В литературе мне этот метод не встречался, но практически использовался часто.


/* Этот чудесный и замечательный скрипт позволяет сливать данные из очереди при полудохлой базе,
не выполняя каких-либо действий на sql-сервере и не очищая очередь силовыми методами*/

declare @dsname varchar(30),@dbname varchar(30)
select @dsname='%'
select @dbname='%'
select 'alter connection to "'+@dsname+'"."'+@dbname+'"'+char(10)+'set function string class to empty_function_class'

select 'create function string '+objname+
".rs_insert for empty_function_class with overwrite output language '/*empty*/'"+char(10)+'go',
char(10)+'create function string '+objname+
".rs_update for empty_function_class with overwrite output language '/*empty*/'"+char(10)+'go',
char(10)+'create function string '+objname+
".rs_delete for empty_function_class with overwrite output language '/*empty*/'"+char(10)+'go'
from rs_subscriptions,rs_objects,rs_articles,rs_databases
where rs_subscriptions.objid=rs_articles.articleid and
rs_articles.objid=rs_objects.objid and
rs_databases.dbid=rs_subscriptions.dbid and
dsname like @dsname and dbname like @dbname

select 'resume connection to "'+@dsname+'"."'+@dbname+'"'+char(10)+'go'
print 'Успехов и процветания, дорогой Дмитрий Ильич!'

Комментарии




Необходимо войти на сайт, чтобы оставлять комментарии