ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

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, чтобы бекап делался автоматически 😉


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

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)

Похожие статьи:

    Не найдено

Прочитано: 14 576 раз(а)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

комментария 2

  1. Andrey сказал:

    Может я чего не понял, но я обычно юзаю
    mysqldump -x -F —opt database_name > /path/to/file.sql

    Обратный процесс (т.е. импорт данных из бекапа в БД) Можно сделать 2мя способами:
    Первый способ — авторизоваться и войти в оболочку mysql, после чего не хитрыми командами создать новую БД, выйти из оболочки и выполнить команду mysql database_name < /path/to/backup_file.sql

    Второй способ куда проще первого:
    открыть бекап БД и добавить такие строки в самом начале —
    CREATE DATABASE ;
    USE ;
    Потом сохранить файл и командой
    mysql < /path/to/backup_file.sql
    Импортировать бекап.

  2. admin сказал:

    в первом способе не обязательно выходить, можно и продолжить, т.е.:
    mysql -u root -p
    вводим пароль
    use DATABASE_NAME;
    или
    CREATE DATABASE_NAME;
    а затем
    use DATABASE_NAME;

    ну и втягиваем файл:
    source /path/to/backup_file.sql;

Добавить комментарий

Вам следует авторизоваться для размещения комментария.