Кілька разів SQL Server може бути причиною космічної проблеми на дисках. У цій статті ми побачимо основні причини цієї проблеми та способи її усунення.
вашу SQL Server потребує простору.
Багато разів SQL Server знадобиться місце на диску. Можливо, це пов’язано зі збільшенням кількості даних у вашій базі даних або незменшеними файлами журналів, або видаленими файлами резервних копій, або видаленими, небажаними файлами бази даних. Якою б не була причина, на 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