freebsd下實現mysql的自動備份

溝通很重要,溝通的渠道很重要。當團隊須要配合的時候,要想辦法將本身當下作的事情,以最有效的方式通知給團隊其它成員,以免沒必要要的傷害。html

好比,剛剛發生了以下事情:
有一測試系統,歷史的任務是完成上線前的最後一次測試,而後:
A 爲了給客戶演示系統的使用方法,在此係統上添加了大量的供演示用的支撐數據。
B 爲了刪除生產環境下冗餘數據,用生產環境下的數據覆蓋了測試的數據。mysql

致使:
A很無奈:覆蓋數據前居然不和我打招呼!
B很無辜:測試系統不就是用來測試而能夠隨時覆蓋的嗎?git

以上是閒談,若是咱們每日都對數據進行備份呢?是否是就能夠解決A、B兩我的的問題?github

腳本

#!/bin/sh
#注意:liunx 系統請將上一行修改成:!/bin/bash
# 備份數據庫腳本

# 設置變量
MyUSER="用戶名。建議單獨創建個用戶,給查詢權限,防止權限問題"    # DB_USERNAME
MyPASS="密碼"    # DB_PASSWORD
MyHOST="主機名"    # DB_HOSTNAME
Port="端口號" # 例3306

# 設置備份路徑(該路徑必須存在,且可寫)
DEST="/請使用實際的絕對路徑" # 好比:/home/username/backups/DB

# 接收通知的郵件
EMAIL="3792535@qq.com"

# 備份保留天數
DAYS=8

# 查找mysql、MYSQLDUMP、GZIP的位置 (該腳本依賴於GZIP,若是沒有安裝的話,先安裝)
MYSQL="/usr/local/bin/mysql"
MYSQLDUMP="/usr/local/bin/mysqldump"
GZIP="/usr/bin/gzip"

# liunx系統請替換爲(注意去除註釋)
# MYSQL="$(which mysql)"
# MYSQLDUMP="$(which mysqldump)"
# GZIP="$(which gzip)"

# 以 年-月-日 的格式來獲取當前日期
NOW="$(date +"%Y-%m-%d_%s")"

# 建立備份文件夾 目標文件夾/時間/mysql
MBD="$DEST/$NOW/mysql"
install -d $MBD

# 須要備份的數據表
SKIP="schedule
measurement"

# 獲取全部的數據表
DBS="$($MYSQL -h $MyHOST -u $MyUSER -p$MyPASS -P $Port -Bse 'show databases')"

# 備份數據表
for db in $DBS
do
    skipdb=-1
    if [ "$SKIP" != "" ];
    then
        for i in $SKIP
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi
 
    if [ "$skipdb" == "1" ] ; then
        FILE="$MBD/$db.sql"
    $MYSQLDUMP -h $MyHOST -u $MyUSER -p$MyPASS $db > $FILE
    fi
done

# 壓縮、歸檔,發送郵件通知
cd $DEST
tar -cf $NOW.tar $NOW
$GZIP -9 $NOW.tar

echo "MySQL backup is completed! Backup name is $NOW.tar.gz" | mail -s "MySQL backup" $EMAIL
rm -rf $NOW

# 刪除歷史的冗餘備份文件
find $DEST -mtime +$DAYS -exec rm -f {} \;

使用方法

將上面的代碼保存爲sqlbak.sh -> 在sqlbak.sh的同級目錄下,執行bash sqlbak.sh。執行後將在目錄文件夾中生成以下文件:sql

2019-07-02_1562042395.tar.gz

即爲備份文件數據庫

恢復備份

備份通過了1次打包(tar),一次壓縮(gzip)。在使用時,先進行解壓,再解包。bash

# gzip -d 2019-07-02_1562042395.tar.gz 
# ls
2019-07-02_1562042395.tar
# tar -zxvf 2019-07-02_1562042395.tar
# ls
x 2019-07-02_1562042395/
x 2019-07-02_1562042395/mysql/
x 2019-07-02_1562042395/mysql/schedule.sql
x 2019-07-02_1562042395/mysql/measurement.sql

有了sql文件,恢復相信不成問題了吧。測試

FREEBSD定時任務

sqlbak.sh加入執行權限
chmod +x sqlbak.shcode

設置定時任務
% crontab -e
若是是初次使用,請加入如下信息:htm

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute    hour    mday    month    wday    command

而後,加入咱們須要執行的sh腳本,以及設置執行的時間。假設我天天晚上4:38執行一次。

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
# Order of crontab fields
# minute    hour    mday    month    wday    command
38          4        *       *       *     /mengyunzhi/databak/sqlbak.sh

其中:/mengyunzhi/databak/sqlbak.sh爲腳本的絕對路徑。

加入後,咱們須要使用如下命令測試本身的腳本在執行自動任務時是否出錯:
env -i SHELL=/bin/sh PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin HOME=/home/panjie LOGNAME=panjie /usr/home/dru/bin/mycustomscript.sh

HOME=/home/panjie LOGNAME=panjie應該分別設置爲本身用戶的路徑及用戶名。

執行後若是發現錯誤信息,請參考修正。

參考

https://www.freebsd.org/doc/h...
https://gist.github.com/NARKO...

相關文章
相關標籤/搜索