Jak opravit problémy s prostorem způsobené SQL Server

Sdílej nyní:

Několikrát SQL Server může být důvodem problému s prostorem na discích. V tomto článku uvidíme, jaké jsou hlavní příčiny tohoto problému a jak jej můžeme opravit.

váš SQL Server potřebuje prostor.

Problémy s prostorem způsobené SQLMnohokrát SQL Server bude potřebovat místo na disku. Může to být způsobeno rostoucími daty uvnitř vaší databáze nebo nezrušenými soubory protokolu nebo neobnovenými záložními soubory nebo neobnovenými nevyžádanými databázovými soubory. Ať už je důvod jakýkoli, na a SQL Server, místo na disku je velmi důležité pro databázové transakce.

Úkol čištění nefunguje

Pokud k zálohování používáte nativní plány údržby SQL SQL server databáze, může existovat šance, že modul čištění v těchto plánech údržby nedělá svůj úkol. Když na disku dojde místo, uvědomíte si, že staré záložní soubory nejsou správně vyčištěny. Modul vyčištění byste zahrnuli do plánu údržby. Navzdory tomu všemu se divíte, proč to nefungovalo?

Zkontrolujte, zda jste uvedli správnou složku pro mazání záložních souborů, zkontrolujte, zda jste uvedli správnou příponu pro mazání záložních souborů, zkuste s tečkou „.“ a bez tečky v příponě souboru.

Soubory protokolu jsou obrovské než soubory databáze

SQL Server DatabázeNejčastější příčina problémů s prostorem SQL Server jsou soubory protokolů a soubory tempdb bez obsluhy. Přestože se tempdb při každém restartu služby SQL zmenší na původní velikost, je vhodné sledovat růst tempdb a zmenšit ji, když se blíží k zaplnění celého místa na disku. Podobně jako u tempdb by měly být soubory protokolů neustále kontrolovány. Ujistěte se, že máte zálohu protokolů, aby se jejich velikost vždy minimalizovala.

Nepoužité databázové soubory

Na vašem disku může být mnoho nevyužitých a nepřipojených databázových souborů a plýtvání místem. Spusťte skript na vašem SQL Server instance k identifikaci takových souborů spolu s jejich cestou. Po rychlé analýze, pokud jste si stále jisti, že tyto soubory již nejsou potřeba, odstraňte je a ušetřete místo.

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 Poškození databáze

Kromě monitorování a udržování místa na disku také sledujte jeho zdraví. Nezdravý disk může poškodit váš SQL Server databáze. Pokud k tomu dojde, použijte prosím nástroj pro obnovu databáze jako DataNumen SQL Recovery na opravit poškozené SQL Server.

Úvod autora:

Neil Varley je odborníkem na obnovu dat DataNumen, Inc., která je světovým lídrem v oblasti technologií pro obnovu dat, včetně opravit poškození e-mailu aplikace Outlook a excelové softwarové produkty pro obnovu. Pro více informací navštivte www.datanumen.com

Sdílej nyní:

Komentáře jsou uzavřeny.