Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Вопросы и ответы по MS SQL Server" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
MS SQL Server - дело тонкое...
Информационный Канал Subscribe.Ru |
#161<< #162 |
СОДЕРЖАНИЕ
Очистка метаданных в репликации слиянием По материалам статьи: Michael R. Hotek " Purging Merge Metadata"
Таблица MSmerge_contents может стать проблемой для любого администратора баз данных, который обслуживает репликацию
слиянием (Merge) достаточно много времени. Проблема состоит в том, что MSmerge_contents будет постоянно расти,
если этим не управлять. Merge репликация очень интенсивно использует MSmerge_contents, что и вызывает проблемы,
поскольку её размер неуклонно растёт. Это обычно проявляется в виде взаимоблокировок и существенного замедления
обмена изменений в репликации. Происходит это потому, что время поиска искомых строк в таблице метаданных
увеличивается вместе с увеличением её размера.
Это огромный объем работы. Выполняя чистку старых метаданных, Вы ускоряете этот процесс, сокращая количество
данных, которые агент слияния должен обработать. Это также снижает вероятность появления тупиковых блокировок в
течение сеанса репликации.
Далее, создаётся процедура, sp__mergepurgemetadata. Эта процедура произведет очистку старых метаданных,
ориентируясь на период задержки, который ей передаётся.
Если Вы придерживаетесь этих ограничений, не возникнет никаких проблем. Если не делать этого, можно столкнуться с проблемами, которые не просто решить. Автор не несёт ответственности за результаты использования представленного ниже скрипта и за любые повреждения или потери, которую он может вызвать. Используйте этот скрипт на свой страх и риск и только после того, как Вы полностью осознает то, что Вы делаете, и чем эти действия грозят. use master go create database admin on (name = admin_dat, filename = 'c:\mssql7\data\admindat.mdf', size = 10) log on (name = 'admin_log', filename = 'c:\mssql7\data\adminlog.ldf', size = 5MB) go use admin go create table mergepurgeflag (PurgeFlag bit not null, DatabaseName varchar(128)not null) go create table mergepurgehistory (PurgeDate datetime not null, DatabaseName varchar(128) not null, NumRows int not null) go create procedure sp__mergepurgemetadata @numdays int = 14 as /****************************************************************************/ /* Stored Procedure: sp__mergepurgemetadata */ /* Creation Date: 1/12/00 */ /* Copyright: Michael Hotek */ /* Written by: Michael Hotek */ /* */ /* Purpose: This procedure will clean out generations from MSmerge_contents*/ /* that are older than the specified number of days */ /* */ /* Input Paramters: */ /* @numdays Number of days to retain history in MSmerge_contents */ /* */ /* Output Parameters: None */ /* */ /* Return Status: None */ /* */ /* Usage: exec sp__mergepurgemetadata 21 */ /* */ /* Local Variables: */ /* @purgedate Cutoff date for the purge */ /* @command The SQL statement that is dynamically executing */ /* @database Database to purge */ /* @numrows Number of rows purged */ /* */ /* Called By: */ /* SQL Server Agent */ /* */ /* Calls: None */ /* */ /* Data Modifications: */ /* Deletes from MSmerge_contents */ /* Deletes from MSmerge_genhistory */ /* Updates mergepurgeflag */ /* Inserts into mergepurgehistory */ /* */ /* Updates: */ /* Date Author Purpose */ /* 1/12/00 Mike Hotek Created */ /* */ /****************************************************************************/ declare @purgedate datetime, @command varchar(1000), @database varchar(128), @numrows int create table #temp (NumRows int) select @purgedate = dateadd(dd, -1 * @numdays + 1, getdate()) declare curdb cursor for select DatabaseName from mergepurgeflag where PurgeFlag = 1 open curdb fetch curdb into @database while @@fetch_status = 0 begin --Get the number of rows to remove select @command = 'select count(*) from ' + @database + '..MSmerge_contents a, ' + @database + '..MSmerge_genhistory b where a.generation = b.generation and ' + "b.coldate < '" + convert(char(10),@purgedate,101) + "'" insert into #temp exec(@command) select @numrows = NumRows from #temp truncate table #temp --Remove the specified generations from MSmerge_contents select @command = 'delete ' + @database + '..MSmerge_contents from ' + @database + '..MSmerge_contents a, ' + @database + '..MSmerge_genhistory b where a.generation = b.generation and ' + "b.coldate < '" + convert(char(10),@purgedate,101) + "'" + ' and a.generation > 0' begin transaction exec(@command) commit transaction --Remove the specified generations from MSmerge_genhistory select @command = 'delete ' + @database + '..MSmerge_genhistory where coldate < "' + convert(char(10),@purgedate,101) + '" and pubid is not null' begin transaction exec(@command) commit transaction insert into admin..mergepurgehistory select getdate(), @database, @numrows update admin..mergepurgeflag set PurgeFlag = 0 where DatabaseName = @database fetch curdb into @database end close curdb deallocate curdb drop table #temp go
Статьи на русском языке
Доступ к аналитике: новые интерфейсы для OLAP
Новые и обновлённые технические статьи Microsoft
Adovcsp.exe Demonstrates Using Stored Procedures with ADO
Save Database Trips
Самые популярные темы недели
Новые упражнения на http://sql.ipps.ru
Перезапуск SQLя
|
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||