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”);
}