shell腳本每天自動備份mysql數據庫


一、mysql提供了一個mysqldump的工具可以方便的導出導入數據庫信息;

二、使用命令行shell測試執行mysqldump,理解必備的參數,查看生成的sql備份文件是否符合需求;

/usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql

注解:
1、執行 /usr/bin/mysqldump;
2、--opt是quick,add-drop-table,add-locks,extended-insert,lock-tables幾個參數的合稱,一般都要使用,具體意思自行搜索;
3、-u數據庫用戶名 -p數據庫用戶密碼 -h數據庫地址 數據庫名 > 導出的文件路徑;
4、`date +%F`是shell中生成當前日期,格式如2015-11-05,所以成功導出時生成的文件名為 db_2015-11-05.sql;
5、下載生成的 sql文件 ,用文本編輯器打開檢查,本地導入測試數據庫,看是否有問題;

三、整理編寫比較靈活的shell腳本,方便重用;

#!/bin/sh

# Database info
DB_USER="batsing"
DB_PASS="batsingpw"
DB_HOST="localhost"
DB_NAME="timepusher"

# Others vars
BIN_DIR="/usr/bin"            #the mysql bin path
BCK_DIR="/mnt/mysqlBackup"    #the backup file directory
DATE=`date +%F`

# TODO
# /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/db_$DATE.sql

#還原數據庫
#用mysql-front導入前一天的 *.sql 文件即可恢復數據

保存到文件或上傳到 /usr/local/apache/htdocs/timepusher/sqlBak/sqlAutoBak.sh

四、測試Shell腳本

1、進入到該腳本文件目錄 chmod +x sqlAutoBak.sh 添加執行權限,否則會報錯  Permission denied
2、./sqlAutoBak.sh ,如果是在windows編寫上傳的文件可能會報錯

/bin/sh^M: bad interpreter: No such file or directory

這是不同系統編碼格式引起的:在 windows系統中編輯的 .sh文件可能有不可見字符,所以在 Linux系統下執行會報以上異常信息。可以在Windows上使用Notepad++轉換成Unix格式(菜單中選擇:編輯>檔案格式轉換>轉換成UNIX)
3、修改后上傳繼續執行 ./sqlAutoBak.sh ,沒有報錯。再查看導出的sql文件。

五、壓縮mysql的備份數據

1、查看導出來的sql文件,發現其文件大小非常大,mysqldump也提供了生成gzip壓縮文件的參數設置
2、sqlAutoBak.sh修改為如下

#!/bin/sh

# Database info
DB_USER="batsing"
DB_PASS="batsingpw"
DB_HOST="localhost"
DB_NAME="timepusher"

# Others vars
BIN_DIR="/usr/bin"            #the mysql bin path
BCK_DIR="/mnt/mysqlBackup"    #the backup file directory
DATE=`date +%F`

# TODO
# /usr/bin/mysqldump --opt -ubatsing -pbatsingpw -hlocalhost timepusher > /mnt/mysqlBackup/db_`date +%F`.sql # $BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/db_$DATE.sql
$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME | gzip > $BCK_DIR/db_$DATE.sql.zip # 還原數據庫
# 把 *.sql.zip 使用gunzip 或 本地的解壓軟件 解壓為 *.sql 文件
# 用mysql-front導入前一天的 *.sql 文件即可恢復數據

3、修改后上傳繼續執行 ./sqlAutoBak.sh ,沒有報錯。如果用文本編輯器查看導出的 *.sql.gz文件,應該是一堆亂碼。
4、下載到本地使用解壓軟件打開,解壓就能看到里面真正的 *.sql 文件了。

 

六、設置linux定時任務執行該腳本;

1、編輯定時任務列表

crontab -e

2、插入下面這一行,因為通常來說5點鍾網站的訪問量最低。

00 05 *   * * /bin/sh /usr/local/apache/htdocs/timepusher/sqlBak/sqlAutoBak.sh
#每天早上 5:00am 執行

3、查看任務是否創建成功

crontab -l

七、第二天檢查自動生成的sql文件是否符合要求

如果生成的文件和解壓出來查看沒有問題,那么這個自動定時備份數據庫的腳本就算是完成了。因為生成的文件多了會占用一定的空間,所以建議要定期(比如一個月)清理一下文件。

 

$、補充

1、如果該數據庫的用戶沒有分配 鎖表 的權限,則備份會報錯 when using LOCK TABLES 。那是因為mysqldump命令默認在導出時是要鎖定表的,所以解決方式有兩個。一個是給該用戶開放 鎖表 的權限;另一個是在命令中加上  --skip-lock-tables 這個參數。即是:

$BIN_DIR/mysqldump --opt -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME --skip-lock-tables | gzip > $BCK_DIR/db_$DATE.sql.gz


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM