作过replication的人都知道,distribution数据库会不断的增大,特别是操做平凡,数据增加是至关吓人的。能够一会儿增长到5g以上。 sql
当时我被吓到了。不知如何是好?从新作replication的话是能够,可是不可能每次都由于distribution数据库过大就作,这样太浪费时间。 数据库
最后,我找了不少资料,也尝试了其实很简单。只须要执行sql query就ok ui
select name, log_reuse_wait, log_reuse_wait_desc
from sys.databases
where name = 'Distribution'
--(shows breakout by day, by hour. Took 2 hours on 350million rows, 100gb distribtuion db)
SELECT T.[publisher_database_id]
,datepart(mm,[entry_time]) 'month'
, datepart(dd,[entry_time]) 'day'
, datepart(hh,[entry_time]) 'hour'
,count(C.[xact_seqno]) 'count of commands'
FROM [distribution].[dbo].[MSrepl_transactions](nolock) T
JOIN [MSrepl_commands](nolock) C
ON T.[xact_seqno] = C.[xact_seqno]
GROUP BY T.[publisher_database_id]
,datepart(mm,[entry_time])
, datepart(dd,[entry_time])
, datepart(hh,[entry_time])
order by 1,2,3,4
--Or, just select oldest 10 rows and note the entry_time stamp.
--(select took 5 minutes on 350million rows, 100gb distribtuion db)
SELECT TOP 10 * FROM [distribution].[dbo].[MSrepl_transactions](nolock)
EXEC dbo.sp_MSdistribution_cleanup @min_distretention = 0, @max_distretention = 120
sp_helptext sp_MSdelete_publisherdb_trans spa
ALTER PROCEDURE sp_MSdelete_publisherdb_trans
sp_helptext sp_MSdelete_dodelete it
--以上代码只须要执行第一次就ok。 io
--下面两行代码就是要直接执行屡次,直接执行到影响的行数为0就ok了。记得要shrink distribution数据库。
DELETE TOP(20000) MSrepl_commands
delete TOP(50000) MSrepl_transactions
date