>> HOME >> FC5 MENU >> MySQL でオンラインバックアップ (mysqlhotcopy)
MySQL データベースのオンラインバックアップを行ないます。
ここでは、mysqlhotcopy を用いて、MySQL の全てのデータベースをサーバー内の別ディレクトリへバックアップします。

1. MySQL のオンラインバックアップの設定
 1 ) バックアップスクリプトの作成
 2 ) スケジューラ(cron)への登録
2. MySQL のリストア方法
3. MySQL バグ対処
1. MySQL のオンラインバックアップの設定
1 ) バックアップスクリプトの作成
[root@linux ~]# vi mysql-backup.sh 

#!/bin/sh

# パスの設定
PATH=/usr/local/sbin:/usr/bin:/bin
# バックアップ先ディレクトリ
BKUP_DIR=/work/backup/mysql
# MySQL root パスワード
PASSWD=xxxxxxxx

# バックアップ先ディレクトリ無ければ作成
if [ -d $BKUP_DIR ]; then
    :
else
    mkdir -p $BKUP_DIR
fi

# データベース名取得
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /`

# データベースごとにバックアップ
for dbname in $DBLIST
do
    mysqlhotcopy $dbname -u root -p $PASSWD $BKUP_DIR --allowold --keepold
done


[root@linux ~]# chmod 700 mysql-backup.sh 
2 ) スケジューラ(cron)への登録
[root@linux ~]# crontab -e 

# 毎日 00:00 に自動実行します。
00 00 * * * /root/clamav.sh > /dev/null 2>&1
2. MySQL のリストア方法
ここでは、testdb データベースをリストア(単純にコピー)します。
※ testdb データベースは上の方法で既にバックアップが取られているものとします。
[root@linux ~]# /bin/cp -Rf /work/backup/mysql/testdb/ /var/lib/mysql/ 


# testdb データベース関連ファイルの所有者と権限を再設定します。
[root@linux ~]# chown -R mysql:mysql /var/lib/mysql/testdb/ 
[root@linux ~]# chmod 700 /var/lib/mysql/testdb/ 
[root@linux ~]# chmod 660 /var/lib/mysql/testdb/* 
3. MySQL バグ対処
MySQL のバグ により、mysqlhotcopyが下記のようなエラーメッセージを出力する場合の対処

DBI::db=HASH(0x954d4a0)->disconnect invalidates 1 active statement handle (either destroy statement handles or call finish on them before disconnecting) at /usr/bin/mysqlhotcopy line 537.
[root@linux ~]# vi /usr/bin/mysqlhotcopy 

# --- get variables from database ---
my $sth_vars = $dbh->prepare("show variables like 'datadir'");
$sth_vars->execute;
while ( my ($var,$value) = $sth_vars->fetchrow_array ) {
    $mysqld_vars{ $var } = $value;
}
# 追加
$sth_vars->finish();
my $datadir = $mysqld_vars{'datadir'}
    || die "datadir not in mysqld variables";
    $datadir= $opt{chroot}.$datadir if ($opt{chroot});
$datadir =~ s:/$::;

# --- resolve database names from regexp ---
if ( defined $opt{regexp} ) {
    my $t_regex = '.*';
    if ( $opt{regexp} =~ s{^/(.+)/\./(.+)/$}{$1} ) {
        $t_regex = $2;
    }

    my $sth_dbs = $dbh->prepare("show databases");
    $sth_dbs->execute;
    while ( my ($db_name) = $sth_dbs->fetchrow_array ) {
        next if $db_name =~ m/^information_schema$/i;
        push @db_desc, { 'src' => $db_name, 't_regex' => $t_regex } if ( $db_name =~ m/$opt{regexp}/o );
    }
    # 追加
    $sth_dbs->finish();
}