Prosty backup serwera MySQL

Potrzeba matką wynalazków, więc jak zwykle podczas mojej dziwnej pracy pojawił się problem robienia jakiegoś ładnego i prostego backupu całego serwera MySQL – oczywiście można zastosować mysql-dump, ale to nam zrzuca wszystko, zwykle potrzebne nam są poszczególne bazy danych, a zdrugiej strony wpisywanie każdego usera i hasła z palca mija się z celem.

Założenia są znane, chcemy mieć kopię wszystkich tabel w osobnych plikach, do tego znamy hasło roota MySQLa. Przykładowy skrypt który tutaj pokazuje, napisany jest w perlu bo, bo tak mi było najwygodniej. Nie jest optymalny, jest baaardzo prosty, ale doskonale się sprawdza. Backup tworzony jest w strukturze data_wykonania/nazwa_tabeli.sql.gz w zadanym katalogu.

Potrzebujemy dwoch bibliotek perlowych, MySQL i DateTime, w Debianie możemy je ściągnąc przez polecenia:

apt-get install libdbd-mysql-perl 
apt-get install libdatetime-perl 

We FreeBSD trzeba też dociągnąć sobie odpowiednie biblioteki.

/usr/ports/databases/p5-Mysql 

Sam skrypt znajduje się poniżej, celowo nie zrobiłem go jako załacznik bo wymaga kilku linijek konfiguracji:

#!/usr/bin/perl -w

use strict;  
use Mysql;  
use DateTime;

\# troche zmiennych  
$conf_host = 127.0.0.1;  
$conf_user = root;  
$conf_pw = “”;  
$conf_database = mysql’;

\# troche sciezek  
$conf\_backup\_dir = /mnt/mysql/;  
$conf_mysqldump = /usr/local/bin/mysqldump’;  
$conf_gzup = /bin/gzip’;

\# laczymy sięz baza  
$db = Mysql->connect($conf\_host, $conf\_database, $conf\_user, $conf\_pw);

\# sprawdzamy polaczenie  
if (!$db) {  
    print Nie udalo siępolaczyc z baza;  
    die();  
}

\# pobieram dzisiejsza date i robie katalog  
$dt = DateTime->now;  
$data = $dt->ymd(-);

#sklejamy sciezke  
$backup\_dir = $conf\_backup_dir . $data;  
mkdir($backup_dir);

\# listuje bazy danych i robie dump  
$execute = $db->query(SHOW DATABASES;);  
while (@results = $execute->fetchrow()) {  
    $baza = $results[0];  
    print Baza: $baza\n;  
    print system($conf\_mysqldump .  -u $user -p$pw $baza > $backup\_dir/$baza.sql);  
    print system($conf\_gzip .  $backup\_dir/$baza.sql);  
}