Hur man fixar de rymdproblem som orsakas av SQL Server

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.

Utrymmesproblem orsakade av SQLMå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

SQL Server DatabasMost 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

Kommentarer är stängda.