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.