bash : MySQLをバックアップ

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

MySQLをバックアップするスクリプトです。
すべてのデータベースを対象にdumpを作成します。

bashスクリプト

cd
vi ./cron/mysql_dump.sh
#!/bin/sh

# --------------------------------------------------
# MySQLバックアップ 実行
#
# MySQLデータベースをバックアップ
#
# --------------------------------------------------
# $ cd
# $ ./mysql_dump.sh
#
# $ crontab -e
# 0 2 * * * /backup/mysql_dump.sh > /dev/null 2>&1
#
# --------------------------------------------------
# package    aulta sh
# author     takashi shinohara
# copyright  Copyright (c) 2008, takashi shinohara
# link       https://aulta.co.jp/
# license    https://aulta.co.jp/licensed.html
# version    0.0.1
# --------------------------------------------------

START=`date +%s`
ST=`date +%s`

# MYSQL_PATH=/usr/local/lib/mysql-5.7.34/bin/mysql
MYSQL_PATH=/usr/bin/mysql
MYSQL_DUMP_PATH=/usr/bin/mysqldump

# MySQLユーザー
# MYSQL_USER=root

# バックアップ先のディレクトリ
# バックアップ先のディレクトリは手動で作成し適切なパーミッションにしておいてください
PATH_BACKUP_BASE=/home/backup/backup/mysql

# バックアップファイルのオーナー
OWNER_BACKUP=backup:backup


PATH_CREATE_DATABASE=$PATH_BACKUP_BASE/_create_database.sql
echo "" >$PATH_CREATE_DATABASE

PATH_IMPORT_DATABASE=$PATH_BACKUP_BASE/_import_database.sh
echo "#!/bin/sh" >$PATH_IMPORT_DATABASE

echo "" >> $PATH_IMPORT_DATABASE
echo "MYSQL_USER=root" >> $PATH_IMPORT_DATABASE
echo "MYSQL_PWD=password" >> $PATH_IMPORT_DATABASE
echo "" >> $PATH_IMPORT_DATABASE
echo "mysql -u \$MYSQL_USER --password=\$MYSQL_PWD < $PATH_CREATE_DATABASE" >> $PATH_IMPORT_DATABASE
echo "" >> $PATH_IMPORT_DATABASE
echo "function importDb(){" >> $PATH_IMPORT_DATABASE
echo "  PATH_SQL=$PATH_BACKUP_BASE/\$1.sql" >> $PATH_IMPORT_DATABASE
echo "  mysql -u \$MYSQL_USER --password=\$MYSQL_PWD \$1 < \$PATH_SQL" >> $PATH_IMPORT_DATABASE
echo "}" >> $PATH_IMPORT_DATABASE
echo "" >> $PATH_IMPORT_DATABASE

function backupDb(){
    echo "CREATE DATABASE /*!32312 IF NOT EXISTS*/ $2 /*!40100 DEFAULT CHARACTER SET utf8 */;" >> $PATH_CREATE_DATABASE
    echo "importDb \"$2\"" >> $PATH_IMPORT_DATABASE
    if [ "$1" -ge 1 ]; then
        ST=`date +%s`
        PATH_SQL=$2.sql
        rm -f $PATH_SQL.tar.gz

        if [ "$1" -eq 1 ]; then
            $MYSQL_DUMP_PATH --defaults-extra-file=./mysql_backup.conf $2 --lock-tables --no-create-db > $PATH_SQL
        elif [ "$1" -eq 2 ]; then
            $MYSQL_DUMP_PATH --defaults-extra-file=./mysql_backup.conf --no-data $2 --lock-tables --no-create-db > $PATH_SQL
        fi

        tar czf $PATH_SQL.tar.gz $PATH_SQL
        chown $OWNER_BACKUP $PATH_SQL.tar.gz
        rm $PATH_SQL
        END=`date +%s`
        SS=$[$END - $ST]
        echo "${SS}s."
    fi
}

cd $PATH_BACKUP_BASE

echo "### BACKUP MYSQL ########################################################"
echo ""


for DATABASE in `$MYSQL_PATH --defaults-extra-file=/root/mysql_backup.conf -N -s -e"show databases;"`; do

    echo -n $DATABASE" ... "

    if test $DATABASE = "information_schema"; then
        echo "skip"
        continue
    fi

    if test $DATABASE = "mysql"; then
        echo "skip"
        continue
    fi

    if test $DATABASE = "performance_schema"; then
        echo "skip"
        continue
    fi

    if test $DATABASE = "sys"; then
        echo "skip"
        continue
    fi

    if test $DATABASE = "example_cache"; then
        backupDb 2 $DATABASE
        continue
    fi

    if test $DATABASE = "example_logs"; then
        backupDb 2 $DATABASE
        continue
    fi

    backupDb 1 $DATABASE
done

chown $OWNER_BACKUP $PATH_CREATE_DATABASE
chown $OWNER_BACKUP $PATH_IMPORT_DATABASE


END=`date +%s`
SS=`expr ${END} - ${START}`
echo ""
echo "total time :  ${SS} seconds."
echo ""
echo "#########################################################################"
echo ""
echo ""
exit

MySQLのパスワード

--defaults-extra-file=./mysql_backup.conf
ここでMySQLパスワードを別ファイルにしています。

cd
vi ./mysql_backup.conf
[client]
user = root
password = AAAAAAAAAAAAAAAAA

説明

backupDb 1 $DATABASE
1 はデータベース構造とデータ

backupDb 2 $DATABASE
2 はデータベース構造のみ