Flere ganger SQL Server kan være årsaken til plassproblemet på disker. I denne artikkelen vil vi se hva som er årsakene til dette problemet og hvordan vi kan fikse det.
Din SQL Server trenger plass.
Mange ganger SQL Server vil trenge diskplass. Dette kan være på grunn av voksende data inne i databasen eller ukrympede loggfiler eller uopprettede sikkerhetskopifiler eller uønskede databasefiler. Uansett hva grunnen er, på en SQL Server, er plass på disken veldig viktig for databasetransaksjoner.
Oppryddingsoppgaven fungerer ikke
Hvis du bruker SQLs opprinnelige vedlikeholdsplaner for å sikkerhetskopiere din SQL server databaser, kan det være sjanser for at oppryddingsmodulen i disse vedlikeholdsplanene ikke gjør oppgaven sin. Når disken går tom for plass vil du innse at gamle sikkerhetskopifiler ikke er ordentlig renset. Du ville ha inkludert oppryddingsmodulen i vedlikeholdsplanen. Til tross for alt dette lurer du på hvorfor det ikke fungerte?
Sjekk om du har nevnt riktig mappe for å slette sikkerhetskopifiler, sjekk om du har nevnt riktig filtype for å slette sikkerhetskopifiler, prøv med punktum "." og uten en prikk i filtypen.
Loggfiler er store enn databasefiler
Vanligste årsaken til plassproblemer SQL Server er de uovervåkede loggfilene og tempdb-filene. Selv om tempdb krympes til opprinnelig størrelse hver gang SQL-tjenesten starter på nytt, er det lurt å overvåke tempdb-veksten og krympe den når den er i ferd med å bruke opp all diskplass. I likhet med tempdb bør loggfilene alltid kontrolleres. Sørg for at du har sikkerhetskopier av loggfiler for alltid å holde loggfilene på minimal størrelse.
Ubrukte databasefiler
Det kan være mange ubrukte og ikke-tilknyttede databasefiler som sitter på disken din og kaster bort plass. Utfør skriptet på din SQL Server forekomst for å identifisere slike filer sammen med banen deres. Etter en rask analyse, hvis du fortsatt er sikker på at disse filene ikke er nødvendige lenger, slett dem og spar plass.
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 Databasekorrupsjon
I tillegg til å overvåke og vedlikeholde diskplassen din, overvåk også diskens helse. Usunn disk kan ødelegge din SQL Server databaser. Hvis dette skjer, vennligst bruk databasegjenopprettingsverktøy som DataNumen SQL Recovery til reparasjon ødelagt SQL Server.
Forfatterintroduksjon:
Neil Varley er en datagjenopprettingsekspert innen DataNumen, Inc., som er verdensledende innen datagjenopprettingsteknologier, inkludert reparere e-postkorrupsjon i Outlook og excel-programvareprodukter for gjenoppretting. For mer informasjon besøk www.datanumen. Med