Windows Server: skript pro automatickou zálohu MySQL databáze a obsahu adresářů na FTP

MyEgo.cz

home foto blogy mywindows.cz kontakt

Windows Server: skript pro automatickou zálohu MySQL databáze a obsahu adresářů na FTP

PHP 28.10.14

Ideální hosting pro větší projekty, které nepotřebují vlastní dedikovaný server, je dle mého VPS s Windows. Snadno se administruje, nabízí vysoký výkon (v případě cloudu téměř neomezený), a spustíte na něm vše - od IIS, přes Apache, MySQL po SQL Server 2014.

Za pomoci jen integrovaných Windows nástrojů (Command line a ftp.exe) a 7Zipu je na takovémto serveru snadné napsat zálohování na externí FTP.

Osobně používám skript, který v pravidelném intervalu (X hodin) udělá kompletní dump MySQL databáze, nahraje jej zašifrovaný na FTP server, a jak lokálně tak na FTP serveru smaže staré zálohy, aby tam bylo místo pro nové. Podobně pracuji s adresáři, zazipují se, zašifrují, a nahrají na FTP server, se smazáním těch nejstarších.

Slouží mi pro to pár jednoduchých BAT souborů. Zálohu MySQL jsem převzal a upravil z Redolive.com.

Budu rád, pokud tyto zálohovací skripty použijete, když mi dáte vědět.

Skripty počítají s formátem data "xx dd. mm. yyyy" (česká instalace Windows Server 2012 R2), pokud máte na serveru jinak nastavené národní prostředí, skripty pracující s datumem upravte. Samozřejmě je potřeba nastavit [hodnoty v hranatých závorkách]. Na FTP skript předpokládá existenci adresářů /db a /media.

[config.bat] Konfigurační soubor

@echo off
SET FTPUSER=[ftp_uzivatel]
SET FTPPASSWORD=[ftp_heslo]
SET FTPPORT=[ip_adresa_a_port_ve_tvaru_10,0,0,1,5,25]
SET FTPHOST=[ftp_host]
IF %1 NEQ "" SET FTPDIR=%1
SET DaysToKeep=7

:: ------------------------------------
:: DATUM ocekavano jako "xx dd. mm. yyyy"
:: ------------------------------------
set year=%DATE:~11,4%
set day=%DATE:~3,2%
set mnt=%DATE:~7,2%
set hr=%TIME:~0,2%
set min=%TIME:~3,2%

IF %day% LSS 10 SET day=0%day:~1,1%
IF %mnt% LSS 10 SET mnt=0%mnt:~1,1%
IF %hr% LSS 10 SET hr=0%hr:~1,1%
IF %min% LSS 10 SET min=0%min:~1,1%

[mysqlbackup.bat] Záloha MySQL databáze

:: Auto MySQL Backup For Windows Servers By Matt Moeller  v.1.5
:: RED OLIVE INC.  - www.redolive.com

@echo off
setlocal enabledelayedexpansion enableextensions
call config.bat db

set backuptime=%year%-%day%-%mnt%-%hr%-%min%
echo %backuptime%

:: SETTINGS AND PATHS 
set dbuser=[db_user]
set dbpass=[db_password]
set errorLogPath="dumperrors.txt"
set mysqldumpexe="[path_to]mysqldump.exe"
set backupfldr="[backup_to_folder]"
set datafldr="[mysql_data_folder]"
set zipper="[path_to]7za.exe"
set retaindays=3

:: GO FORTH AND BACKUP EVERYTHING!
pushd %datafldr%
echo "Pass each name to mysqldump.exe and output an individual .sql file for each"

FOR /D %%F IN (*) DO (
IF NOT [%%F]==[performance_schema] (
SET %%F=!%%F:@002d=-!
%mysqldumpexe% --user=%dbuser% --password=%dbpass% --databases --routines --log-error=%errorLogPath% %%F > "%backupfldr%%%F.%backuptime%.sql"
)
)

echo "Zipping all files ending in .sql in the folder"
%zipper% a -p%dbpass% -tzip "%backupfldr%FullBackup-%backuptime%.zip" "%backupfldr%*.sql"

echo "Deleting all the files ending in .sql only"
del "%backupfldr%*.sql"

echo "Deleting zip files older than X days now"
Forfiles -p %backupfldr% -s -m *.* -d -%retaindays% -c "cmd /c del /q @path"

:: UPLOAD na FTP
echo user %FTPUSERDISALLOWED (ftpup.dat
echo %FTPPASSWORD)>ftpup.dat
IF defined FTPDIR echo cd %FTPDIRDISALLOWED (>ftpup.dat
echo binary>>ftpup.dat
echo put FullBackup-%backuptime%.zip>>ftpup.dat
echo quit>>ftpup.dat
ftp -n -s:ftpup.dat %FTPHOST%
del ftpup.dat
echo "done"

::return to the main script dir on end
popd

:: FTP delete staré soubory
call ftpdelete.bat db 7

endlocal

[mediabackup.bat] Záloha obsahu adresářů

@echo off
setlocal enabledelayedexpansion enableextensions
call config.bat media

set backuptime=%year%-%day%-%mnt%-%hr%-%min%
echo %backuptime%

:: SETTINGS AND PATHS 
set backupsource=[dir_what_to_backup]
set backupdest=[dir_where_to_backup]
set zipper="]path_to]7za.exe"
set retaindays=3
set archivepass=[zip_password]

:: GO FORTH AND BACKUP EVERYTHING!
echo "Zipping all media files"
%zipper% a -p%archivepass% -r -tzip "%backupdest%FullBackup-%backuptime%.zip" "%backupsource%" > NUL

echo "Deleting zip files older than X days now"
Forfiles -p %backupfldr% -s -m *.* -d -%retaindays% -c "cmd /c del /q @path"

:: UPLOAD na FTP
echo user %FTPUSER)ftpup.dat
echo %FTPPASSWORDDISALLOWED (>ftpup.dat
IF defined FTPDIR echo cd %FTPDIR)>ftpup.dat
echo binary>>ftpup.dat
echo put FullBackup-%backuptime%.zip>>ftpup.dat
echo quit>>ftpup.dat
ftp -n -s:ftpup.dat %FTPHOST%
del ftpup.dat
echo "done"

:: FTP delete staré soubory
call ftpdelete.bat media 3

endlocal

[ftpdelete.bat] Automatické smazání starých souborů na FTP

@echo off
setlocal enabledelayedexpansion enableextensions
IF NOT defined FTPUSER call config.bat %1
IF %1 NEQ "" SET FTPDIR=%1
IF %2 NEQ "" SET DaysToKeep=%2
echo FTPDELETE %FTPDIR% %DaysToKeep%
:: ------------------------------------
:: Dnesni datum
:: ------------------------------------
echo System date: %date%
SET dd=!day!
SET mm=!mnt!
SET yyyy=!year!
SET origyyyy=!year!
SET origmonth=!mnt!
echo Current date: !dd!.!mm!.!yyyy!
call :days 
SET /A today=!days!
:: ------------------------------------
:: Listing FTP adresare
:: ------------------------------------
echo user %FTPUSERDISALLOWED (ftpdir.dat
echo %FTPPASSWORD)>ftpdir.dat
IF defined FTPDIR echo cd %FTPDIRDISALLOWED (>ftpdir.dat
IF defined FTPPORT echo literal port %FTPPORT)>ftpdir.dat
echo dir *.zip ftplist.txt >>ftpdir.dat
echo quit>>ftpdir.dat
ftp -n -s:ftpdir.dat %FTPHOST%
del ftpdir.dat
:: ------------------------------------
:: Smazani starsich souboru nez X dnu
:: ------------------------------------
echo user %FTPUSERDISALLOWED (ftpdel.dat
echo %FTPPASSWORD)>ftpdel.dat
IF defined FTPDIR echo cd %FTPDIRDISALLOWED (>ftpdel.dat
::
for /f "tokens=6,7,8,*" %%a in )

Komentáře

  1. 1 Pavel Máca 28.10.14, 12:10:48
    FB

    Nepřemýšlel jste o využití PowerShell? Přece jen větší možnosti, 64bit běh a integrace s Windows.

  2. 2 Jiří Adámek 08.02.15, 11:02:28
    FB

    Jediný přínos vidím ve skriptu pro zálohování MySQL. Zbytek je naprosto zbytečný, když existuje Cobian Backup, který je zadarmo a umí snad vše, co si dokáže člověk představit.

  3. 3 Radek Hulán 17.02.15, 10:02:28
    FB

    [2] existují zjevně lidé, co nechtějí instalovat, aktualizovat a konfigurovat freewarové utilitky s potencionálními bugy, když to jde řešit v rámci Windows..

  4. 4 Honza Suomec 16.04.15, 03:04:15
    FB

    [3] Myslím, že ve Windowsech těch bugů bude víc. Ale taky jsem programátor a rád si občas napíšu něco, co už udělali jiní. Konec konců, proč nevymýšlet vymyšlené, může to být lepší :-)

  5. 5 Jan Sukničkář 07.05.15, 10:05:46
    FB

    používám sqlcmd.exe -S server/data -U sa -P password -Q "backup database mojeneco to disk="c:\zaloha_%date%.bak" with name =N"zaloha_neco""
    Naplánuji v plánovači úloh. Tak proč to dělat složitě... :-)