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.
Monta 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
Most 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