MS SQL Server Veritabanı Bakım Planında Neler Olmalı?

Birkçok bakım planı sihirbaz kullanılarak görev olarak tanımlanabilmekte. Ancak 7/24 çalışan sitemlerde bu görevleri çalıştıracak boşluklar bulmak oldukça zor olabilmektedir. Zira bazı bakım işlemleri ya sistemin tüm kaynaklarını istemekte veya sistemin hiç kullanılmamasını istemektedir. Bu yüzden özelikle resmi tatillerde veritabanının kullanılmadığı zamanlarda bu bakımları yapmak sistemciler için önemlidir. Hangi sırada ve hangi bakımlar yapılmalıdır MS SQL sunucunuzda. Burada yazacaklarım tamamen veritabanının bakımı ile ilgili görevlerdir. Tabiki  sunucunun işletim sistemi ve donanım bakımları da yapılmalıdır.

1. Beckup Transaction Log: Logların yedeği alınmalı.

2. Beckup User Database: Bakım yapılacak kullanıcı veritabanları yedeklenmeli.

3. Check Database Integrity: Yedeği alınan veritabanlarının bütünkükleri kontrol edilmeli.

EXEC sp_msforeachdb 'DBCC CHECKDB(''?'')'

4. Shrink Database: Yedeği alınan veritabanları sıkıştırılmalı.

EXEC sp_MSForEachDB 'DBCC SHRINKDATABASE (''?'' , 0)'

5. Rebuild Index: Indexler yeniden yaratılmalı.

SET NOCOUNT ON
GO
--Set the fillfactor
DECLARE @FillFactor TINYINT
SELECT @FillFactor=80
DECLARE @StartTime DATETIME
SELECT @StartTime=GETDATE()
if object_id('tempdb..#TablesToRebuildIndex') is not null
begin
drop table #TablesToRebuildIndex
end
DECLARE @NumTables VARCHAR(20)
SELECT
s.[Name] AS SchemaName,
t.[name] AS TableName,
SUM(p.rows) AS RowsInTable
INTO #TablesToRebuildIndex
FROM
sys.schemas s
LEFT JOIN sys.tables t
ON s.schema_id = t.schema_id
LEFT JOIN sys.partitions p
ON t.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 ) -- 0 heap table , 1 table with clustered index
AND p.rows IS NOT NULL
AND a.type = 1 -- row-data only , not LOB
GROUP BY
s.[Name],
t.[name]
SELECT @NumTables=@@ROWCOUNT
DECLARE RebuildIndex CURSOR FOR
SELECT
ROW_NUMBER() OVER (ORDER BY ttus.RowsInTable),
ttus.SchemaName,
ttus.TableName,
ttus.RowsInTable
FROM
#TablesToRebuildIndex AS ttus
ORDER BY
ttus.RowsInTable
OPEN RebuildIndex
DECLARE @TableNumber VARCHAR(20)
DECLARE @SchemaName NVARCHAR(128)
DECLARE @tableName NVARCHAR(128)
DECLARE @RowsInTable VARCHAR(20)
DECLARE @Statement NVARCHAR(300)
DECLARE @Status NVARCHAR(300)
FETCH NEXT FROM RebuildIndex INTO @TableNumber, @SchemaName, @tablename, @RowsInTable
WHILE ( @@FETCH_STATUS = 0 )
BEGIN
SET @Status='Table '+@TableNumber+' of '+@NumTables+': Rebuilding indexes on '+@SchemaName+'.'+@tablename + ' ('+@RowsInTable+' rows)'
RAISERROR (@Status, 0, 1) WITH NOWAIT --RAISERROR used to immediately output status
SET @Statement = 'ALTER INDEX ALL ON ['+@SchemaName+'].['+@tablename +'] REBUILD WITH (FILLFACTOR = '+CONVERT(VARCHAR(3), @FillFactor)+' )'
EXEC sp_executesql @Statement
FETCH NEXT FROM RebuildIndex INTO @TableNumber, @SchemaName, @tablename, @RowsInTable
END
CLOSE RebuildIndex
DEALLOCATE RebuildIndex
drop table #TablesToRebuildIndex
Print 'Total Elapsed Time: '+CONVERT(VARCHAR(100), DATEDIFF(minute, @StartTime, GETDATE()))+' minutes'
GO

6. Reorganize Index: Indexler yenilenmeli.

7. Update Statistics: Güncellenmeli.

8. Beckup System Database: Sistem veritabanları güncellenmeli.

9. History Cleanup: Temizlik.

USE msdb
GO
DECLARE @DaysToKeepHistory DATETIME
SET @DaysToKeepHistory = CONVERT(VARCHAR(10), DATEADD(dd, -30,GETDATE()), 101)
EXEC sp_delete_backuphistory @DaysToKeepHistory
GO

10. Mainteance Cleanup: Eski bakım ve yedeklerin temizlenmesi.