Miten korjata avaruusongelmat SQL Server

Useita kertoja SQL Server saattaa olla syy levyjen avaruusongelmaan. Tässä artikkelissa näemme, mitä ongelman perimmäiset syyt ovat ja miten voimme korjata sen.

Sinun SQL Server tarvitsee tilaa.

SQL: n aiheuttamat avaruusongelmatMonta kertaa SQL Server tarvitsee levytilaa. Tämä voi johtua siitä, että tietokannassasi on yhä enemmän tietoja, puremattomia lokitiedostoja, poistamattomia varmuuskopiotiedostoja tai poistamattomia, ei-toivottuja tietokantatiedostoja. Mikä tahansa syy on, a SQL Server, levytila ​​on erittäin tärkeä tietokantatapahtumien kannalta.

Siivous ei toimi

Jos varmuuskopioit SQL: n alkuperäisiä ylläpitosuunnitelmia SQL server tietokannoissa, voi olla mahdollista, että näiden huoltosuunnitelmien puhdistusmoduuli ei tee tehtäviään. Kun levyltä loppuu tila, huomaat, että vanhoja varmuuskopiotiedostoja ei ole puhdistettu kunnolla. Olisit sisällyttänyt puhdistusmoduulin huoltosuunnitelmaan. Kaikesta tästä huolimatta ihmettelet, miksi se ei toiminut?

Tarkista, oletko maininnut oikean kansion varmuuskopiotiedostojen poistamiseksi, tarkista, että olet maininnut oikean tiedostotunnisteen varmuuskopiotiedostojen poistamiseksi, yritä pisteellä "." ja ilman pistettä tiedostopääteessä.

Lokitiedostot ovat valtavia kuin tietokantatiedostot

SQL Server tietokantaMost yhteinen syy avaruuskysymykseen SQL Server on valvomaton lokitiedosto ja tempdb-tiedosto. Vaikka tempdb kutistuu alkuperäiseen kokoon aina, kun SQL-palvelu uudelleentarts, on hyvä käytäntö seurata tempdb-kasvua ja kutistaa sitä, kun se syö koko levytilaa. Samoin kuin tempdb, lokitiedostojen tulisi olla aina tarkistettavissa. Varmista, että sinulla on lokitietovarmuuskopio, jotta lokitiedostot ovat aina mahdollisimman pieniä.

Käyttämättömät tietokantatiedostot

Levyllä voi olla paljon käyttämättömiä ja kiinnittämättömiä tietokantatiedostoja, jotka tuhlaavat tilaa. Suorita komentosarja SQL Server esimerkiksi tunnistaa tällaiset tiedostot niiden polun kanssa. Pika-analyysin jälkeen, jos olet edelleen varma, että kyseisiä tiedostoja ei enää tarvita, poista ne ja säästä tilaa.

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 Tietokannan vioittuminen

Levytilan seurannan ja ylläpidon lisäksi seuraa myös levyn kuntoa. Epäterveellinen levy voi vioittaa SQL Server tietokannat. Jos näin tapahtuu, käytä tietokannan palautustyökalua, kuten DataNumen SQL Recovery että korjata vioittunut SQL Server.

Tekijän esittely:

Neil Varley on tietojen palauttamisen asiantuntija DataNumen, Inc., joka on maailman johtava tietojen palautustekniikoissa, mukaan lukien korjata Outlook-sähköpostivirheitä ja Excel-palautusohjelmistotuotteet. Lisätietoja osoitteessa www.datanumen.com

Kommenttien lisääminen on estetty.