PowerShell · 09.12.2022

Бэкап папки средствами PS1

Данный пост ни разу не руководство по бэкапингу чего-либо. Автору (т.е. мне) была удобна такая реализация и именно по этой причине появился этот эпос.

На одном из Linux-серверов с MySQL с помощью SqlDump и Cron еженедельно производится дампирование базы данных в общую smb-папку на том же сервере. Метод бэкапинга, конечно, спорный, но открывать настежь ради нескольких файлов дампа базы данных доступ в сетевую папку на общей шаре — ещё более спорный вариант.

Решил всецело замкнуть резервное копирование на планировщиках и скриптах. С одной стороны работает Bash и Cron, а с другой «Планировщик заданий» и PowerShell.

Допустим Cron запускает скрипт в 5:00 и производится дампирование базы, а «Планировщик заданий» забирает дамп в 6:00 и копирует его в нужную папку.

# Папка источник #
$source = "\\192.168.1.100\backup"

# Папка назначения #
$destination = "D:\backup"

# Файлы в папке источнике #
$sourcefiles = Get-ChildItem -Path $source

# Получение имени файлов в папке назначения #
$destinationfiles = (Get-ChildItem -Path $destination).Name

# Цикл перебора файлов в папке источнике #
foreach($file in $sourcefiles)
{
    # Получение имени файла в папке источнике #
    $filename = $file.Name;

    # Условие, если папка назначения не содержит файла из папки источника #
    if($destinationfiles -notcontains $filename)
    {
        # Копирование файла #
        Copy-Item -Path $file.FullName -Destination $destination -Force
    }
}

## Удаление бэкапов 2х месячной давности из папки источника - Опционально ##
# Get-ChildItem $source -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-60) | Remove-Item -Force

## Удаление бэкапов 4х месячной давности из папки назначения - Опционально ##
# Get-ChildItem $destination -Recurse -File | Where CreationTime -lt (Get-Date).AddDays(-120) | Remove-Item -Force

Опционально: можете раскомментировать командлеты для удаления устаревших файлов бэкапа. Из папки источника удаляются файлы, созданные 60+ дней назад, а из папки назначения — 120+.

В качестве послесловия — вот этой командой я создавал дамп базы данных MySQL:

mysqldump -uDBADMIN -pDBADMINPASSWORD DBNAME > /backup/$(date +"%Y-%m-%d").sql

Уточню:

  • DBADMIN — имя администратора базы данных;
  • DBADMINPASSWORD — пароль администратора базы данных;
  • DBNAME — имя базы данных.