Kako odpraviti težave s prostorom, ki jih povzroča SQL Server

Skupna raba zdaj:

Nekajkrat SQL Server je lahko razlog za težave s prostorom na diskih. V tem članku bomo videli, kaj so glavni vzroki za to težavo in kako jo lahko odpravimo.

Vaša rutina za SQL Server potrebuje prostor.

Težave s prostorom, ki jih povzroča SQLVelikokrat SQL Server bo potreboval prostor na disku. To je lahko posledica naraščajočih podatkov v vaši zbirki podatkov ali neskrčenih dnevniških datotek ali neizbrisanih varnostnih kopij ali neizbrisanih, neželenih datotek baze podatkov. Ne glede na razlog, na a SQL Server, je prostor na disku zelo pomemben za transakcije baze podatkov.

Naloga čiščenja ne deluje

Če za varnostno kopiranje uporabljate izvorne načrte vzdrževanja SQL SQL server baze podatkov, morda obstaja možnost, da modul za čiščenje v teh načrtih vzdrževanja ne opravlja svoje naloge. Ko bo na disku zmanjkalo prostora, boste ugotovili, da stare varnostne kopije niso pravilno očiščene. V načrt vzdrževanja bi vključili modul za čiščenje. Se ob vsem tem sprašujete, zakaj ni delovalo?

Preverite, ali ste omenili pravilno mapo za brisanje datotek varnostne kopije, preverite, ali ste omenili pravilno končnico datoteke za brisanje datotek varnostne kopije, poskusite s piko “.” in brez pike v končnici datoteke.

Datoteke dnevnika so velike kot datoteke baze podatkov

SQL Server Baze podatkovMost pogost vzrok za vprašanje prostora SQL Server so nenadzorovane dnevniške datoteke in datoteke tempdb. Čeprav se bo tempdb skrčil na izvirno velikost, kadar koli bo storitev SQL Restarts, je dobra praksa, da spremljate rast tempdb in jo krčite, ko bo pojedla ves prostor na disku. Podobno kot pri tempdb bi morale biti datoteke dnevnika vedno pod nadzorom. Zagotovite, da imate varnostno kopijo dnevnika, da bodo dnevniške datoteke vedno najmanjše.

Neuporabljene datoteke baze podatkov

Na vašem disku je lahko veliko neuporabljenih in nepritrjenih datotek baze podatkov, ki zapravljajo prostor. Izvedite skript na svojem SQL Server primerek za prepoznavanje takih datotek skupaj z njihovo potjo. Če ste po hitri analizi še vedno prepričani, da teh datotek ne potrebujete več, jih izbrišite in prihranite prostor.

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 Korupcija baze podatkov

Poleg spremljanja in vzdrževanja prostora na disku spremljajte tudi zdravje vašega diska. Nezdrav disk lahko poškoduje vaš SQL Server baze podatkov. Če se to zgodi, uporabite orodje za obnovitev baze podatkov, kot je DataNumen SQL Recovery do popravek poškodovan SQL Server.

Uvod avtorja:

Neil Varley je strokovnjak za obnovitev podatkov v DataNumen, Inc., ki je vodilna na svetu na področju tehnologij za obnovitev podatkov, vključno z popravite poškodovano e-pošto Outlook in excel programske izdelke za obnovitev. Za več informacij obiščite www.datanumen.com

Skupna raba zdaj:

Komentarji so zaprti.