shell腳本實現mysql數據備份

mysql數據備份

今天遇到一個很傻逼的問題,有人登上開發服務器,不知是有意仍是無意;把mysql裏面的庫所有刪除了。。。那我的結果如何,咱們就不做討論了。。。沒辦法我只能寫個shell腳本,用crontab跑下定時;作些簡單的數據備份了,順便寫個筆記

思路

其實很簡單mysql

  1. 寫一個shell腳本經過mysql的mysqldump,將數據導出成對應的sql文件;
  2. 使用linux的crontab定時運行對應腳本,將sql,文件保存到對應的目錄下;
  3. 可想而知,隨着數據量的增長和備份的頻率都會致使備份服務器的硬盤資源使用率也會直線攀升;爲了解決這個問題,咱們就須要,定時清理備分內容;而我仍是簡單的使用了個shell腳本,經過crontab定時去清理;

注意

這裏有幾個問題須要注意的:linux

  1. 經過mysqldump來導出對應的庫表的sql,這樣必然會形成mysql服務器的資源消耗(cup,內存,io等);
  2. mysqldump默認的方式會形成鎖表,這個很恐怖,會致使線上的服務的中斷,也許時間是短暫的,可是這是致命的;(能夠經過配置改爲事務形式,不鎖表)
  3. 隨着數據量的增大,mysqldump導出sql的時間也會增加;

固然數據備份,你能夠選擇對應的時間段,按照對應的業務的狀況定義備份的週期,又或者若是 mysql服務器上庫多,根據不一樣業業務,不一樣時間段備份;這也是能夠的。。。看具體業務狀況咯!web

由於個人只是開發和測試用,數據量不會很大,因此影響就能夠忽略了,只要在你們都下班了後備份就不要緊了(因此我定的是:天天深夜12點備份,一個月後吧上個月的清理了)sql


正題

1.mysqldump的權限說明

mysqldump 所須要的權限說明:shell

  1. 對於table 來講mysqldump 最少要有select 權限。
  2. 對於view 來講mysqldump 要有show view 權限。
  3. 對於trrigger 來講mysqldump 要有trriger 權限。
  4. 若是要產生一份一致的備份 mysqldump 要有lock tables 權限。

下面是用戶建立預計(有不懂的能夠另行google,就很少展開了):服務器

create user dumper@'127.0.0.1';
grant select on tempdb.* to dumper@'127.0.0.1';
grant show view on tempdb.* to dumper@'127.0.0.1';
grant lock tables on tempdb.* to dumper@'127.0.0.1';
grant trigger on tempdb.* to dumper@'127.0.0.1';

2.shell腳本(導出數據sql)

#!/bin/sh

# Database info
DB_USER="dumper"
DB_PASS="..."
DB_HOST="..."

# Database array
DB_NAME=("hotel" "food" "foodweb")

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

# create file
mkdir $BCK_DIR/$DATE

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

for var in ${DB_NAME[@]};
do
    $BIN_DIR/mysqldump --opt --single-transaction --master-data=2 -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME > $BCK_DIR/$DATE/db_$var.sql
done

參數說明: 測試

--master-data[=#] google

在備份導出的文件裏追加二進制binlog文件的位置和名稱
若是值等於1,就會添加一個CHANGE MASTER語句
若是值等於2,就會在CHAGE MASTER語句前添加註釋(不起做用了唄~)
這個參數會--lock-all-tables鎖表,除非你指定了--single-transaction
這種狀況下,鎖表只會在dump開始的時候持續一小段時間,照理說 在dump的時候,任何動做都會影響到binlog文件 dump結束以後,選項會自動關閉鎖表功能code

--single-transactioncrontab

以事務的形式執行

3.shell腳本(按時批量清除N天前腳本)

#!/bin/sh

find /home/mysql-backups -mtime +30 -name "*.*" -exec rm -Rf {} \;

說明:

  • /home/lifeccp/dicom/studies :準備要進行清理的任意目錄
  • -mtime:標準語句寫法
  • +10:查找10天前的文件,這裏用數字表明天數,+30表示查找30天前的文件
  • ".":但願查找的數據類型,".jpg"表示查找擴展名爲jpg的全部文件,""表示查找全部文件
  • -exec:固定寫法
  • rm -rf:強制刪除文件,包括目錄
  • {} ; :將find的結果放到裏面

4.crontab定時啓動腳本

crontab -e
0 0 * * * /home/sh/mysql-backups/dump.sh
0 0 1 * * /home/sh/mysql-backups/del.sh
相關文章
相關標籤/搜索