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)
Похожие статьи:
- Не найдено
Andrey сказал:
Может я чего не понял, но я обычно юзаю
mysqldump -x -F —opt database_name > /path/to/file.sql
Обратный процесс (т.е. импорт данных из бекапа в БД) Можно сделать 2мя способами:
Первый способ — авторизоваться и войти в оболочку mysql, после чего не хитрыми командами создать новую БД, выйти из оболочки и выполнить команду mysql database_name < /path/to/backup_file.sql
Второй способ куда проще первого:
14.03.2009, 22:54открыть бекап БД и добавить такие строки в самом начале —
CREATE DATABASE ;
USE ;
Потом сохранить файл и командой
mysql < /path/to/backup_file.sql
Импортировать бекап.
admin сказал:
в первом способе не обязательно выходить, можно и продолжить, т.е.:
mysql -u root -p
вводим пароль
use DATABASE_NAME;
или
CREATE DATABASE_NAME;
а затем
use DATABASE_NAME;
ну и втягиваем файл:
16.03.2009, 10:27source /path/to/backup_file.sql;