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 %FTPUSER%>ftpup.dat
echo %FTPPASSWORD%>>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"
 
::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 %FTPPASSWORD%>>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 %FTPUSER%>ftpdir.dat
echo %FTPPASSWORD%>>ftpdir.dat
IF defined FTPDIR echo cd %FTPDIR%>>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 %FTPUSER%>ftpdel.dat
echo %FTPPASSWORD%>>ftpdel.dat
IF defined FTPDIR echo cd %FTPDIR%>>ftpdel.dat
::
for /f "tokens=6,7,8,*" %%a in (ftplist.txt) do (
call :month %%a
SET dd=%%b
SET /A yyyy=!origyyyy!
if !mm! LSS !origmonth! SET /A yyyy=!origyyyy!-1
call :days
SET /A age=!today!-!days!
IF !age! GEQ !DaysToKeep! (
echo DEL %%d >>ftpdel.dat
echo %%d is !age! days old .. deleting it
) else (
echo %%d is !age! days old .. keeping it
)
)
:: 
echo quit>>ftpdel.dat
ftp -n -s:ftpdel.dat %FTPHOST%
del ftpdel.dat
del ftplist.txt
endlocal
goto :eof
:: ------------------------------------
:: Pomocne rutiny - cislo mesice
:: ------------------------------------
:month
SET map=Jan-01;Feb-02;Mar-03;Apr-04;Mai-05;Jun-06;Jul-07;Aug-08;Sep-09;Oct-10;Nov-11;Dec-12
set v=%1
set v=%v:~0,3%
CALL SET v=%%map:*%v%-=%%
SET mm=%v:~0,2%
goto :eof
:: ------------------------------------
:: Pomocne rutiny - cislo dne
:: ------------------------------------
:days
SET /A Month1=((1!mm! %% 100)-14)/12
SET /A Year1=!yyyy!+4800
SET /A days=(1461*(%Year1%+%Month1%)/4+367*((1!mm! %% 100)-2-12*%Month1%)/12-(3*((%Year1%+%Month1%+100)/100))/4+(1!dd! %% 100)-32075)
SET Month1=
SET Year1=
goto :eof
:: KONEC
:eof 

Komentáře

  1. 1 Pavel Máca 28.10.14, 12:48:27

    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, 23:28:35

    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, 22:28:47

    [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, 15:15:00

    [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, 22:46:13

    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ě... :-)

Nový komentář

Pro přidání komentáře se musíte nejdříve  registrovat Facebookem

Banan.cz