Няколко пъти SQL Server може да е причината за космическия проблем на дисковете. В тази статия ще видим кои са основните причини за този проблем и как можем да го отстраним.
Вашият SQL Server се нуждае от пространство.
Много пъти SQL Server ще се нуждаят от дисково пространство. Това може да се дължи на нарастващи данни във вашата база данни или на невградени регистрационни файлове или на изтрити архивни файлове или на изтрити, нежелани файлове на базата данни. Каквато и да е причината, на a SQL Server, пространството на диска е много важно за транзакциите с база данни.
Задачата за почистване не работи
Ако използвате собствените планове за поддръжка на SQL за архивиране на вашия SQL server бази данни, може да има шанс модулът за почистване в тези планове за поддръжка да не изпълнява задачите си. Когато на диска остане място, ще разберете, че старите архивни файлове не са правилно почистени. Бихте включили модула за почистване в плана за поддръжка. Въпреки всичко това, чудите ли се защо не работи?
Проверете дали сте споменали правилната папка за изтриване на архивни файлове, проверете дали сте споменали правилното разширение на файла, за да изтриете архивни файлове, опитайте с точка “.” и без точка в разширението на файла.
Регистрационните файлове са огромни от файловете с бази данни
Най-честата причина за проблеми с пространството SQL Server са необслужваните лог файлове и tempdb файлове. Въпреки че tempdb ще се свие до оригиналния размер при рестартиране на SQL услугата, добра практика е да се следи растежът на tempdb и да се свие, когато е на път да изяде цялото дисково пространство. Подобно на tempdb, лог файловете трябва винаги да се проверяват. Уверете се, че имате резервно копие на лог файловете, за да поддържате винаги минимален размер на лог файловете.
Неизползвани файлове на база данни
Може да има много неизползвани и необвързани файлове с база данни, които седят на вашия диск и губят място. Изпълнете скрипта на вашия SQL Server например да идентифицира такива файлове заедно с пътя им. След бърз анализ, ако все още сте сигурни, че тези файлове вече не са необходими, изтрийте ги и спестете място.
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 Повреда на базата данни
В допълнение към наблюдението и поддържането на дисковото пространство, наблюдавайте и здравето на диска. Нездравословният диск може да повреди вашия SQL Server бази данни. Ако това се случи, моля използвайте инструмент за възстановяване на база данни като DataNumen SQL Recovery да се корекция повредена SQL Server.
Въведение на автора:
Нийл Варли е експерт по възстановяване на данни в DataNumen, Inc., която е световен лидер в технологиите за възстановяване на данни, включително поправяне на корупция на имейл в Outlook и excel софтуерни продукти за възстановяване. За повече информация посетете WWW.datanumen.com