Материал из Wiki.X-news.org
Перейти к: навигация, поиск

Backup MySQL database / Бекапим базу MySQL

FreeBSD сервера используют не только как роутеры, но и нередки те случаи, когда их используют для поднятия web серверов и в основном используют MySQL в качестве Базы Данных.

Раз используется база данных значит перед вами встанет задача в её бекапа (database backup).

Как сделать бекап базы данных ? В этой статье я постораюсь “пролить свет” на этот вопрос.

Пример perl скрипта который сдампит (dump) (сохранит) указанные вами БД, при этом каждая таблица этих БД будет в отдельном файле.

Для того, что бы скрипт работал вам нужно установить один из нижеперечисленных портов в соответствии с версией вашего MySQL сервера:

/usr/ports/databases/p5-DBD-mysql40/ /usr/ports/databases/p5-DBD-mysql41/ /usr/ports/databases/p5-DBD-mysql50/ /usr/ports/databases/p5-DBD-mysql51/ /usr/ports/databases/p5-DBD-mysql60/

#!/usr/bin/perl

use DBD::mysql;

#Задаем вывод дебага, значения: 0 или 1

my $debug=0;

#Перечисляем названия баз для бекапа

my @databases=("blog","mydb","mysql");

#Аутентификационные данные для коннекта к серверу sql

my $host="localhost"; my $user="root"; my $password="root-password"; my $port="3306";

#Путь до программы mysqldump

my $sqldump_path="/usr/local/bin/mysqldump";

#В какую папку кладем бекапы

my $backup_dir="usr/backup/sql-tables";

$mkdir=0; my $dtime=`date +%Y-%m-%d/%H`; chomp($dtime); for ($i=0;$i<@databases;$i++){

   my $bdir=sprintf("%s/%s/%s",$backup_dir,$databases[$i],$dtime);
   opendir(D,$bdir) or $mkdir=1 ;
   closedir(D);
   if ($mkdir){
         #Если папки, куда будет положен бекап, ещё не существует - создать её
       `/bin/mkdir -p $bdir`;
   }
   $bdir[$i]=$bdir;

}

$scr_st_date=`/bin/date "+%d.%m.%Y %H:%M:%S"`; chomp($scr_st_date); if ($debug){print "Script starting at: $scr_st_date \n\n";} my $cs;

#Задаем кодировку для указанной базы, если не указать по умолчанию будет кодировка cp1251

%charset=("blog"=>"utf8");

for ($i=0;$i<=$ #databases;$i++){

   $db=$databases[$i];
   if (!exists($charset{$db})){
       $cs="cp1251";
       $qc=mys("set names cp1251",$dbh);
       $qc2=mys("SET character_set_client = cp1251;",$dbh);
   }else{
       $cs=$charset{$db};
   }
   print "DB: $db [$cs]\n";
   my $dsn = "DBI:mysql:database=$db;host=$host;port=$port";
   my $dbh = DBI->connect($dsn, $user, $password);
    #Узнаем, из каких таблиц состоит данная база
   $q=mys("SHOW TABLES",$dbh);
   while (@t=$q->fetchrow){
       if (!exists($no_backup{$t[0]})){
           if ($debug){
               print "DB $db => $t[0]\n";
               print "$t[0]\n$sqldump_path --host=$host --port=$port --user=$user -p$password --opt $database[$i] $t[0] > $bdir[$i]/$t[0].sql\n";
           }
           `$sqldump_path --host=$host --port=$port --user=$user -p$password --default-character-set=$cs --opt $db $t[0] > $bdir[$i]/$t[0].sql`;
           if ($debug){print "Done\n";}
       }
   }

}

#Функция для обращения к sql серверу

sub mys {

       my $q=shift;
       my $dbh=shift;
       my $a;
       $a = $dbh->prepare($q);
       $a->execute;
       return $a;
   }

$scr_ed_date=`/bin/date "+%d.%m.%Y %H:%M:%S"`; chomp($scr_ed_date); if ($debug){print "Script end at: $scr_ed_date \n\n";}После отработки скрипта, в папке указанной в переменной $backup_dir, появится папка с названием базы, а в ней папка с текущий_год-текущий_месяц-текущий_день/текущий_час

Например: /usr/backup/sql-tables/blog/2008-08-23/16

Импортируем данные из бекапа в базу, на примере БД blog:

Создаем пустую базу blog, а затем выполняем скрипт:

#!/usr/bin/perl
#Задаем путь к нужному бекапу

my $srclogdir='/usr/backup/sql-tables/blog/2008-08-23/16';

#Задаем название базы

my $db="blog";

#Аутентификационные данные для коннекта к серверу sql

my $user="root"; my $pass="root-password";

#Задаем расширение искомых файлов

my $filemask='.sql$';

opendir DIR,$srclogdir or die "Can't open logdir\n"; my @f=grep /$filemask/, readdir DIR or print "Can't read logdir\n"; closedir DIR or print "Can't close logdir\n"; @f=sort @f; for ($i=0;$i<=$ #f;$i++){

   $f[$i]=~s/\.sql$//;
    #Импортируем найденные .sql файлы в нашу базу
   $tmp=sprintf "mysql -u %s --password=%s -e \"use %s; set names utf8; source %s/%s.sql;\"",$user,$pass,$db,$srclogdir,$f[$i];
   print "$tmp\n";
  `$tmp`;

}


Заметка: 1. Не забудьте после создания скриптов сделать их исполняемыми ! пример корманды: chmod a+x /path/to/backup-sql-script.pl

2. Скрипт можно поставить в cron, чтобы бекап делался автоматически



Удачного вам бекапа !