それは開発用サーバーのSQLServer2005で、ちょっと前から困っていたことのお話。
問題:ディスクは50GBしかないのに、msdbが33GBもある。そのせいで、テストモジュールを最低限まで削ってもテスト動かすとすぐに残り容量100MB以下に。うーん、でいんじゃらす。
なので、ちょっと本気を出して、msdbの圧縮について、対処することにした。
まずは原因となっているだろうテーブルの洗い出し。
SELECT isnull(sum( p.rows ),0) as RowCounts,s.name as TableName
FROM sys.partitions p
INNER JOIN sys.objects s ON s.object_id = p.object_id
LEFT JOIN sys.allocation_units a ON p.partition_id = a.container_id
WHERE p.index_id in(0,1) and p.rows is not null and a.type = 1
group by s.name
order by isnull(sum( p.rows ),0) desc
で、msdbの全テーブルの行数をテーブルごとに列挙してみると、行数が800万件超えてるテーブルを発見
問題のテーブルは sysxmitqueue
ServiceBroker の処理キューを貯めておくところなんだけどどうやら未処理のままデータを溜め込んでいるらしい。そういや、このサーバーでBrokerのテストしたことあったなー。って、ずいぶん前だな、、つか、そのせいかorz
なので、さくっとBroker再構築
ALTER DATABASE [msdb] SET SINGLE_USER
WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [msdb] SET NEW_BROKER
WITH ROLLBACK IMMEDIATE
GO
ALTER DATABASE [msdb] SET MULTI_USER
GO
で、その後、msdbを圧縮。おおっ!33GB→6MBに!
ディスクが空いた。一安心w