Использование скрипта PowerShell для удаления старых файлов на SQL Server

Using a PowerShell Script to delete old files for SQL ServerДанный материал является переводом оригинальной статьи "MSSQLTips : Using a PowerShell Script to delete old files for SQL Server".

Многие клиенты используют в SQL Server собственные хранимые процедуры или сторонние инструменты для бэкапов БД в рабочей среде, вместо использования Планов обслуживания БД. Одним из моментов, является управление числом файлов бэкапов, существующих на диске, чтобы не исчерпать всё дисковое пространство.  Есть несколько методик удаления устаревших файлов, но в данной статье мы покажем, как можно делать это через PowerShell.

Хотя есть много процессов удаления файлов, что можно использовать в SQL Server, мы покажем, как можно делать это через PowerShell.

PowerShell это мощный инструмент сценариев, позволяющий администраторам и разработчикам автоматизировать администрирование серверов и разработку приложений. Скрипты PowerShell поддерживают более сложную логику, чем скрипты Transact-SQL, давая администраторам SQL Server создавать надежные скрипты для автоматизации и администрирования.

Ниже некоторые из наиболее используемых процессов, чтобы удалять старые файлы бэкапов:

Здесь мы покажем два разных варианта выполнить скрипт PowerShell, который будет удалять файлы, основываясь на том, насколько старый файл из расчета в днях.

Примечание: чтобы удалить файлы из папки бэкапа, аккаунт должен иметь права на чтение, запись и удаление подпапок и файлов.


Вариант 1 - Использование SSMS / T-SQL

Главное преимущество использования скрипта PowerShell то, что можно легко запустить его изнутри SSMS, или любой хранимой процедуры и не требуется развертывания скрипта на сервере.

Для запуска скрипта PowerShell с использованием SSMS или из хранимой процедуры, должна быть включена опция XP_CMDSHELL. Можно включить ее, используя скрипт ниже.

-- Скрипт включения XP_CMDSHELL
-- Чтобы изменить дополнительные параметры.
EXEC sp_configure 'show advanced options', 1
GO
-- Чтобы обновить текущее настроенное значение для расширенных параметров.
RECONFIGURE
GO
-- Чтобы включить функцию.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- Чтобы обновить текущее настроенное значение для расширенных параметров.
RECONFIGURE
GO

В приведенном далее скрипте вы должны передать значения (ниже):

  • targetpath - здесь вы должны передать полный путь к файлу, который вы хотите удалить..
  • olddays - удалить файлы старше числа дней. Например, если хотите удалить файлы старше 5 дней, передайте -5
  • extension - расширение файлов, которые нужно удалить.
-- Скрипт для удаления старых файлов
DECLARE @pscmd varchar(1000)
DECLARE @targetpath varchar(8000)
DECLARE @olddays int
DECLARE @extension varchar(5)
DECLARE @cmdstring varchar(1000)
-- Задание значений параметрам, вы можете настроить по своим нуждам
SET @targetpath = 'D:\Dtest\'
SET @olddays = -5 -- Передайте дни с отрицательным значением 
SET @extension = 'txt'
SET @pscmd = '"& '+
'Get-ChildItem ' + Quotename(@targetpath,'''') + ' | '+
'where {$_.lastWriteTime -lt ((Get-Date).AddDays('+ CAST(@olddays as varchar) +')) 
-and ($_.Extension -match ' + QUOTENAME(@extension,'''')+ ') } | ' +
'Remove-Item  -force " '
SET @cmdstring = ' ""powershell.exe" '+ @pscmd
exec master..xp_cmdshell @cmdstring

 

Можно сделать задание агента по расписанию, просто вставляя код выше в шаг задания. Убедитесь, что аккаунт SQL Agent Service имеет разрешения на Чтение, Запись и Удаление в каталоге.

Run T-SQL code in SQL Server Agent Job


Вариант 2 – Создание и развертывание файла скрипта PowerShell

Скопируйте скрипт ниже и сохраните его, как "deleteoldfiles.ps1".

#----- declare parameters -----#
param([string]$targetpath=$(Throw `
"Parameter missing: -targetpath targetpath"),`
[int]$days=$(Throw "Parameter missing: `
-days days"), `
[string]$Extension=$(Throw "Parameter missing: -Extension Extension"))

$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
#----- get files based on lastwrite filter in the specified folder ---#
#----- Remove the write-host line from the below code if you want to schedule it using SQL Agent Job ---#
$Files = Get-Childitem $targetpath -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
    {
    if ($File -ne $NULL)
        {
        write-host "Deleting File $File" -ForegroundColor "Red"
        Remove-Item $File.FullName | out-null
        }
    else
        {
        Write-Host "No files to delete!" -foregroundcolor "blue"
        }
    }

Необходимо передать параметры ниже в скрипт PowerShell.

  • targetpath - Здесь надо передать полный путь к расположению файла, который вы хотите удалить.
  • days - удалить файлы старше числа дней.
  • Extension - расширение файлов, которые нужно удалить.
SL "D:\PowershellScript"
.\deleteoldfiles.ps1 -targetpath "D:\SQLMonitor\SQLMon\DelFiletest" -days "3" -Extension "*.txt"

 

Run PS script for SQL Server in Windows Powershell console

 

Можно задать расписание задания SQL Agent для способа выше. Если вы хотите использовать вариант с файлом скрипта, вы должны удалить раздел Write-Host из файла скрипта.

Run PoweShell script in SQL Server Agent Job Step


Вариант 3 -  Задание SQL Agent со скриптом PowerShell

Можно также выполнять скрипт PowerShell напрямую из задания SQL Agent без развертывания файла скрипта. Мы немного изменили код, вместо передачи параметров, как в файле скрипта, назначаем значения.

#----enter path---#
$targetpath = "C:\jspace\"
#----enter the days---#
$days = 5
#----extension of the file to delete---#
$Extension = "*.txt"
$Now = Get-Date
$LastWrite = $Now.AddDays(-$days)
#----- get files based on lastwrite filter in the specified folder ---#
$Files = Get-Childitem $targetpath -Include $Extension -Recurse | Where 
{$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
    {
    if ($File -ne $NULL)
        {
      
        Remove-Item $File.FullName | out-null
        }
    }

Можно задать расписание для этого кода напрямую в шаге задания SQL Agent без установки файла скрипта.

Run PoweShell code in SQL Server Agent Job Step

 

Добавить комментарий