CentOS 7 MySQL自動備份shell腳本


  在數(shù)據(jù)庫的日常維護工作中,除了保證業(yè)務的正常運行以外,就是要對數(shù)據(jù)庫進行備份,以免造成數(shù)據(jù)庫的丟失,從而給企業(yè)帶來重大經濟損失。
  通常備份可以按照備份時數(shù)據(jù)庫狀態(tài)分為熱備和冷備,按照備份數(shù)據(jù)庫文件的大小分為增量備份、差異備份和全量備份。
  這里,我們講解一種全量備份的方法,來實現(xiàn)定時備份數(shù)據(jù)到mysql腳本文件,并且支持過期刪除。

系統(tǒng)環(huán)境:
CentOS7 64位 Minimal版(VMware)
MySQL5.7

原理與工具:
shell腳本
mysqldump程序
crontab命令


1、新建shell腳本

vi /opt/mysqlBackup.sh
#!/bin/bash

# 以下配置信息請自己修改
mysql_user="USER" #MySQL備份用戶
mysql_password="PASSWORD" #MySQL備份用戶的密碼
mysql_host="localhost"
mysql_port="3306"
mysql_charset="utf8" #MySQL編碼
backup_db_arr=("db1" "db2") #要備份的數(shù)據(jù)庫名稱,多個用空格分開隔開 如("db1" "db2" "db3")
backup_location=/opt/mysql  #備份數(shù)據(jù)存放位置,末尾請不要帶"/",此項可以保持默認,程序會自動創(chuàng)建文件夾
expire_backup_delete="ON" #是否開啟過期備份刪除 ON為開啟 OFF為關閉
expire_days=3 #過期時間天數(shù) 默認為三天,此項只有在expire_backup_delete開啟時有效

# 本行開始以下不需要修改
backup_time=`date +%Y%m%d%H%M`  #定義備份詳細時間
backup_Ymd=`date +%Y-%m-%d` #定義備份目錄中的年月日時間
backup_3ago=`date -d '3 days ago' +%Y-%m-%d` #3天之前的日期
backup_dir=$backup_location/$backup_Ymd  #備份文件夾全路徑
welcome_msg="Welcome to use MySQL backup tools!" #歡迎語

# 判斷MYSQL是否啟動,mysql沒有啟動則備份退出
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

# 連接到mysql數(shù)據(jù)庫,無法連接則備份退出
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......"
        # 判斷有沒有定義備份的數(shù)據(jù)庫,如果定義則開始備份,否則退出備份
        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 fail!"
                        fi
                        
                done
        else
                echo "ERROR:No database to backup! backup stop"
                exit
        fi
        # 如果開啟了刪除過期備份,則進行刪除操作
        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! Thank you!"
        exit
fi

注意:如果這個sh文件是在win下編輯的,需要用編輯器轉換為unix格式,否則sh會執(zhí)行不成功,如圖:

2、修改shell腳本屬性,賦予執(zhí)行權限

chmod 600 /opt/mysqlBackup.sh
chmod +x /opt/mysqlBackup.sh

3、定時執(zhí)行腳本

方式一:

執(zhí)行crontab -e命令,創(chuàng)建當前用戶級別的定時任務

crontab -e

輸入以下內容,設置每天凌晨3:00定時自動備份

00 03 * * * /opt/mysqlBackup.sh

生成的配置文件位于/var/spool/cron/root

日志記錄在/var/spool/mail/root中,可查看日志記錄

vi /var/spool/mail/root

crontab文件概要:
用戶所建立的crontab文件中,每一行都代表一項任務,每行的每個字段代表一項設置,它的格式共分為六個字段,前五段是時間設定段,第六段是要執(zhí)行的命令段,格式如下:
minute hour day month week command
 分  時  日  月   周   命令
其中:
minute: 表示分鐘,可以是從0到59之間的任何整數(shù)。(每分鐘可用*或者*/1表示)
hour:表示小時,可以是從0到23之間的任何整數(shù)。(0表示0點)
day:表示日期,可以是從1到31之間的任何整數(shù)。
month:表示月份,可以是從1到12之間的任何整數(shù)。
week:表示星期幾,可以是從0到7之間的任何整數(shù),這里的0或7代表星期日。
command:要執(zhí)行的命令,可以是系統(tǒng)命令,也可以是自己編寫的腳本文件。
在以上各個字段中,還可以使用以下特殊字符:
星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件后每月都執(zhí)行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”
中杠(-):可以用整數(shù)之間的中杠表示一個整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執(zhí)行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執(zhí)行一次。

方式二:

配置全局定時任務文件

vi /etc/crontab

etc中加入如下內容,讓其每天凌晨3:00自動執(zhí)行任務。

00 03 * * * root /opt/mysqlBackup.sh

全局定時任務配置相比于用戶級別的任務配置多了一項執(zhí)行用戶user-name

日志記錄在/var/log/cron

4、MySQL恢復

mysql -u username -p databse < backup.sql

特別感謝 @astaxie @羽飛 @vpsrr

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,166評論 2 33
  • Linux定時任務Crontab命令詳解 linux 系統(tǒng)則是由 cron (crond) 這個系統(tǒng)服務來控制的。...
    孫燕超閱讀 1,891評論 0 4
  • Linux定時任務Crontab命令詳解linux 系統(tǒng)則是由 cron (crond) 這個系統(tǒng)服務來控制的。L...
    時待吾閱讀 450評論 0 0
  • Linux 系統(tǒng)提供了使用者控制計劃任務的命令 :crontab 命令。 一、crond簡介 crond是linu...
    happeace閱讀 1,874評論 0 53
  • 簡單列舉一下: bool char:需要注意的地方它是32位的 i8 i16 i32 i64 u8 u16 u32...
    BIGHAI閱讀 425評論 0 0

友情鏈接更多精彩內容