Flera gånger SQL Server kan vara orsaken till rymdproblemet på diskar. I den här artikeln kommer vi att se vad orsakerna till det här problemet är och hur vi kan åtgärda det.
Dina SQL Server behöver utrymme.
Många gånger SQL Server behöver diskutrymme. Detta kan bero på växande data i din databas eller oklippta loggfiler eller återupptagna säkerhetskopieringsfiler eller återupptagna, oönskade databasfiler. Oavsett orsaken är, på en SQL Server, utrymme på disken är mycket viktigt för databastransaktioner.
Rensningsuppgiften fungerar inte
Om du använder SQL: s egna underhållsplaner för att säkerhetskopiera din SQL server databaser kan det finnas chanser att saneringsmodulen i dessa underhållsplaner inte gör sin uppgift. När disken tar slut på plats kommer du att inse att gamla säkerhetskopierade filer inte rengörs ordentligt. Du skulle ha inkluderat saneringsmodulen i underhållsplanen. Trots allt detta undrar du varför det inte fungerade?
Kontrollera om du har nämnt rätt mapp för att radera säkerhetskopierade filer, kontrollera om du har nämnt rätt filtillägg för att radera säkerhetskopieringsfiler, försök med punkten “.” och utan prick i filtillägget.
Loggfiler är enorma än databasfiler
Most vanlig orsak till rymdfråga den SQL Server är de obevakade loggfilerna och tempdb-filerna. Även om tempdb krymper till originalstorleken när SQL Service restarts, det är en bra praxis att övervaka tempdb-tillväxt och krympa den när den ska äta hela diskutrymmet. På samma sätt som tempdb bör loggfilerna alltid vara under kontroll. Se till att du har loggbackup på plats för att alltid hålla loggfilerna i minimal storlek.
Oanvända databasfiler
Det kan finnas många oanvända och obefogade databasfiler som sitter på din disk och slösar bort utrymme. Kör manuset på din SQL Server exempel för att identifiera sådana filer tillsammans med deras sökväg. Efter en snabb analys, om du fortfarande är säker på att dessa filer inte längre behövs, raderar du dem och sparar utrymme.
DECLARE @dpth NVARCHAR(512)
EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
,N'Software\Microsoft\MSSQLServer\MSSQLServer'
,N'DefaultData'
,@dpth OUTPUT
DECLARE @lpth NVARCHAR(512)
EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
,N'Software\Microsoft\MSSQLServer\MSSQLServer'
,N'DefaultLog'
,@lpth OUTPUT
DECLARE @bk NVARCHAR(512)
EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
,N'Software\Microsoft\MSSQLServer\MSSQLServer'
,N'BackupDirectory'
,@bk OUTPUT
DECLARE @md NVARCHAR(512)
EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
,N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters'
,N'SqlArg0'
,@md OUTPUT
SELECT @md = substring(@md, 3, 255)
SELECT @md = substring(@md, 1, len(@md) - charindex('\', reverse(@md)))
DECLARE @ml NVARCHAR(512)
EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE'
,N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters'
,N'SqlArg2'
,@ml OUTPUT
SELECT @ml = substring(@ml, 3, 255)
SELECT @ml = substring(@ml, 1, len(@ml) - charindex('\', reverse(@ml)))
SET @dpth = isnull(@dpth, @md)
SET @lpth = isnull(@lpth, @ml)
PRINT @dpth
PRINT @lpth
EXEC sp_configure 'show advanced'
,1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell'
,1
RECONFIGURE
IF object_id('tempdb.dbo.#table1') IS NOT NULL
DROP TABLE #table1
CREATE TABLE #table1 (
[filename] VARCHAR(2000)
,depth INT
,isFile INT
)
SET @dpth = 'DIR ' + @dpth + '\*.mdf /b /s'
SET @lpth = 'DIR ' + @lpth + '\*.ldf /b /s'
INSERT INTO #table1
EXEC xp_DirTree @dpth
,1
,1
INSERT INTO #table1
EXEC xp_DirTree @lpth
,1
,1
DELETE
FROM #table1
WHERE isFile <> 1
UPDATE #table1
SET filename = rtrim(filename)
CREATE TABLE t_list (
filepath VARCHAR(2000)
,sizeinmb DECIMAL(18, 2)
)
INSERT INTO t_list (filepath)
SELECT otable.filename AS orphaned_files
FROM #table1 otable
LEFT OUTER JOIN master.dbo.sysaltfiles db ON rtrim(db.filename) = otable.filename
WHERE db.dbid IS NULL
ORDER BY 1
DECLARE @sizeingb AS DECIMAL(18, 2)
DECLARE @filepath AS VARCHAR(2000)
DECLARE db_cursor CURSOR
FOR
SELECT filepath
FROM t_list
OPEN db_cursor
FETCH NEXT
FROM db_cursor
INTO @filepath
WHILE @@FETCH_STATUS = 0
BEGIN
CREATE TABLE t_temp (c1 VARCHAR(2000))
DECLARE @cmd AS VARCHAR(3000)
SET @cmd = 'dir ' + @filepath
PRINT @cmd
INSERT INTO t_temp
EXEC master.dbo.xp_cmdshell @cmd
DELETE
FROM t_temp
WHERE c1 NOT LIKE '%1 File(s)%bytes'
DECLARE @size AS DECIMAL(18, 2)
SET @size = (
SELECT TOP 1 replace(replace(replace(c1, ' 1 File(s) ', ''), ',', ''), ' bytes', '')
FROM t_temp
WHERE c1 IS NOT NULL
)
SET @size = cast((@size / (1024 * 1024)) AS DECIMAL(18, 2))
DROP TABLE t_temp
UPDATE t_list
SET sizeinmb = @size
WHERE filepath = @filepath
FETCH NEXT
FROM db_cursor
INTO @filepath
END
CLOSE db_cursor
DEALLOCATE db_cursor
SELECT *
FROM t_list
DROP TABLE t_list
EXEC sp_configure 'show advanced'
,1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell'
,0
RECONFIGURE
SQL Server Databaskorruption
Förutom att övervaka och underhålla ditt diskutrymme, övervaka också hårddiskens hälsa. Ohälsosam disk kan skada din SQL Server databaser. Om detta händer, använd databasåterställningsverktyget som DataNumen SQL Recovery till fix skadad SQL Server.
Författarintroduktion:
Neil Varley är en dataåterställningsexpert i DataNumen, Inc., som är världsledande inom teknik för återställning av data, inklusive reparera Outlook-korruption och Excel-programvara för återställningsprogramvara. För mer information besök www.datanumen.com