1. ホーム
  2. Linux

centos - centos7でcrontabを使用してmysqlのスケジュールバックアップを行う。

2022-02-20 09:15:09

1. mysql3306_backup.sh ファイルを作成する。

ファイル名とパスはカスタマイズ可能ですが、個人的にはスクリプト、スクリプトログ、バックアップデータをmysqlのデータパス下に置いて、見つけやすくしています。

mysql3306_backup.shの内容です。

#! /bin/bash

# Please change the following configuration information yourself
mysql_user="USER" #MySQL backup user
mysql_password="PASSWORD" #MySQL backup user's password
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8" #MySQL encoding
backup_db_arr=("db1" "db2") #The name of the database to be backed up, multiple separated by spaces such as ("db1" "db2" "db3")
backup_location=/opt/mysql # backup data storage location, please do not end with "/", this can keep the default, the program will automatically create the folder
expire_backup_delete="ON" #Whether to turn on expired backup delete ON is ON OFF is OFF
expire_days=3 #Expire time days The default is three days, this is only valid when expire_backup_delete is on

# No need to change the following from this line
backup_time=`date +%Y%m%d%H%M` #Define the detailed backup time
backup_Ymd=`date +%Y-%m-%d` # Define the year, month and day time in the backup directory
backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #Date before 3 days
backup_dir=$backup_location/$backup_Ymd #Full path to the backup folder
welcome_msg="Welcome to use MySQL backup tools!" #Welcome message

# Determine if MYSQL is started, if mysql is not started then backup exits
mysql_ps=`ps -ef |grep mysql |wc -l`
mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`
if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then
        echo "ERROR:MySQL is not running! backup stop!"
        exit
else
        echo $welcome_msg
fi

# Connect to mysql database, if you can't connect then backup stop
mysql -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password <<end
use mysql;
select host,user from user where user='root' and host='localhost';
exit
end

flag=`echo $? `
if [ $flag ! = "0" ]; then
        echo "ERROR:Can't connect mysql server! backup stop!"
        exit
else
        echo "MySQL connect ok! Please wait...... "
        # Determine if there is a database defined for backup, if so, start backup, otherwise quit backup
        if [ "$backup_db_arr" ! = "" ];then
                #dbnames=$(cut -d ',' -f1-5 $backup_database)
                #echo "arr is (${backup_db_arr[@]})"
                for dbname in ${backup_db_arr[@]}
                do
                        echo "database $dbname backup start... "
                        `mkdir -p $backup_dir`
                        `mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip > $backup_ dir/$dbname-$backup_time.sql.gz`
                        flag=`echo $? `
                        if [ $flag == "0" ];then
                                echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz"
                        else
                                echo "database $dbname backup failed!"
                        fi
                        
                done
        else
                echo "ERROR:No database to backup! backup stop"
                exit
        fi
        # If delete expired backups are enabled, then do the delete operation
        if [ "$expire_backup_delete" == "ON" -a "$backup_location" ! = "" ];then
                 #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;`
                 `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf`
                 echo "Expired backup data delete complete!"
        fi
        echo "All database backup success!
        exit
Thank you!

2. シェルファイルに実行可能なパーミッションを与える

# Set the owner can read and write, others cannot read and write to execute
chmod 600 /data/mysql3306_backup.sh

#Give "executable" privileges
chmod +x /data/mysql3306_backup.sh

3. crontabを使って毎日午前1時にシェルファイルを実行し、出力ログを/data/mysql3306_backup.logにカスタマイズする。

コマンドとコンフィギュレーションです。

crontabコマンドが見つかりませんでした。crontabがすでにインストールされているかどうかを確認してください。

#Convenient editing of timed tasks
crontab -e

#Configure
00 01 * * * * /data/mysql3306_backup.sh >> /data/mysql3306_backup.log 2>&1

4. 4. 時限タスクの編集を終えたら、忘れずに保存: wqし、crondを再度読み込み、時限タスクが正常に設定されているかどうか確認します。

コマンドです。

# Reload crond again
systemctl reload crond.service

#View tasks
crontab -l

備考

1. mysql3306_backup.log ログに "mysql: command not found" または "mysqldumpl: command not found" と記録されている。

その理由は以下の通りです。
デフォルトでは、/usr/bin以下のコマンドを探すようになっており、mysqlやmysqldumplはこのディレクトリにないため、見つからないと表示されるのです。
そこで、/usr/bin ディレクトリにソフト接続する必要があります。
コマンドを実行します。

ln -s /apps/mysql/bin/mysql /usr/bin 
ln -s /apps/mysql/bin/mysqldumpl /usr/bin

apps/mysql がある場所: mysql がインストールされているパス

2. Linuxコマンドのreloadとrestartの違いについて

類似点 どちらも設定ファイルを再読み込みする
相違点
reload (再読み込み), reloadは設定ファイルを再読み込みします、サービスが中断されることはありません。そして、reloadはconfの構文などをテストし、何か問題があれば、最後に正しい設定ファイルでロールバックし、正常に動作するようにします。スムーズな再起動とも呼ばれ、すでに接続されているサービスには影響を与えません。
restart (再起動) (停止してから起動), サービスを再起動します。この再起動は一瞬のサービスの停止を引き起こし、設定ファイルのエラーによってサービスの起動に失敗した場合は、より長い時間のサービスの停止となります。
注意:設定ファイルを修正する前に、必ずバックアップをとってください オンラインサービスの高可用性を確保するために、reloadを使用することをお勧めします。