Windows Server: skript pro automatickou zálohu MySQL databáze a obsahu adresářů na FTP
MyEgo.cz
Windows Server: skript pro automatickou zálohu MySQL databáze a obsahu adresářů na FTP
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
Nepřemýšlel jste o využití PowerShell? Přece jen větší možnosti, 64bit běh a integrace s Windows.
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.
[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..
[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ší :-)
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ě... :-)