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 sie z baza
$db = Mysql->connect($conf_host, $conf_database, $conf_user, $conf_pw);

# sprawdzamy polaczenie
if (!$db) {
print „Nie udalo sie 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”);
}