用shell寫一個mysql數(shù)據(jù)備份腳本
思路
其實很簡單
寫一個shell腳本通過mysql的mysqldump,將數(shù)據(jù)導(dǎo)出成對應(yīng)的sql文件;使用linux的crontab定時運行對應(yīng)腳本,將sql,文件保存到對應(yīng)的目錄下;可想而知,隨著數(shù)據(jù)量的增加和備份的頻率都會導(dǎo)致備份服務(wù)器的硬盤資源使用率也會直線攀升;為了解決這個問題,我們就需要,定時清理備份內(nèi)容;而我還是簡單的使用了個shell腳本,通過crontab定時去清理; 注意
這里有幾個問題需要注意的:
通過mysqldump來導(dǎo)出對應(yīng)的庫表的sql,這樣必然會造成mysql服務(wù)器的資源消耗(cup,內(nèi)存,io等); mysqldump默認(rèn)的方式會造成鎖表,這個很恐怖,會導(dǎo)致線上的服務(wù)的中斷,也許時間是短暫的,但是這是致命的;(可以通過配置改成事務(wù)形式,不鎖表)隨著數(shù)據(jù)量的增大,mysqldump導(dǎo)出sql的時間也會增長;
當(dāng)然數(shù)據(jù)備份,你可以選擇對應(yīng)的時間段,按照對應(yīng)的業(yè)務(wù)的情況定義備份的周期,又或者如果 mysql服務(wù)器上庫多,根據(jù)不同業(yè)業(yè)務(wù),不同時間段備份;這也是可以的。。。看具體業(yè)務(wù)情況咯!
因為我的只是開發(fā)和測試用,數(shù)據(jù)量不會很大,所以影響就可以忽略了,只要在大家都下班了后備份就沒關(guān)系了(所以我定的是:每天深夜12點備份,一個月后吧上個月的清理了)
1.mysqldump的權(quán)限說明
mysqldump 所需要的權(quán)限說明:
對于table 來說mysqldump 最少要有select 權(quán)限。對于view 來說mysqldump 要有show view 權(quán)限。對于trrigger 來說mysqldump 要有trriger 權(quán)限。如果要產(chǎn)生一份一致的備份 mysqldump 要有l(wèi)ock tables 權(quán)限。
下面是用戶創(chuàng)建預(yù)計(有不懂的可以另行g(shù)oogle,就不多展開了):
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腳本(導(dǎo)出數(shù)據(jù)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
參數(shù)說明:
--master-data[=#]
在備份導(dǎo)出的文件里追加二進制binlog文件的位置和名稱
如果值等于1,就會添加一個CHANGE MASTER語句
如果值等于2,就會在CHAGE MASTER語句前添加注釋(不起作用了唄~)
這個參數(shù)會--lock-all-tables鎖表,除非你指定了--single-transaction
這種情況下,鎖表只會在dump開始的時候持續(xù)一小段時間,照理說 在dump的時候,任何動作都會影響到binlog文件 dump結(jié)束之后,選項會自動關(guān)閉鎖表功能
--single-transaction
以事務(wù)的形式執(zhí)行
3.shell腳本(按時批量清除N天前腳本)
#!/bin/sh find /home/mysql-backups -mtime +30 -name "*.*" -exec rm -Rf {} \;
說明:
/home/lifeccp/dicom/studies :準(zhǔn)備要進行清理的任意目錄 -mtime:標(biāo)準(zhǔn)語句寫法+10:查找10天前的文件,這里用數(shù)字代表天數(shù),+30表示查找30天前的文件 ".":希望查找的數(shù)據(jù)類型,".jpg"表示查找擴展名為jpg的所有文件,""表示查找所有文件 -exec:固定寫法 rm -rf:強制刪除文件,包括目錄 {} ; :將find的結(jié)果放到里面 4.crontab定時啟動腳本
crontab -e 0 0 * * * /home/sh/mysql-backups/dump.sh 0 0 1 * * /home/sh/mysql-backups/del.sh
相關(guān)文章
mysql 查詢重復(fù)的數(shù)據(jù)的SQL優(yōu)化方案
這篇文章主要介紹了mysql 查詢重復(fù)的數(shù)據(jù)的SQL優(yōu)化方案,非常不錯的方案推薦給大家。2015-02-02Mysql 主從數(shù)據(jù)庫同步(centos篇)
Mysql 主從數(shù)據(jù)庫同步(centos篇),需要的朋友可以參考下。2011-05-05Mysql中關(guān)于Incorrect string value的解決方案
在對mysql數(shù)據(jù)庫中插入數(shù)據(jù)的時候,直接插入中文是沒有問題的!但是用預(yù)編譯語句時,用流對數(shù)據(jù)進行處理總報incorrect string value這個異常。本篇文章教給你解決方法2021-09-09Centos7.5安裝mysql5.7.24二進制包方式部署
這篇文章主要介紹了Centos7.5安裝mysql5.7.24二進制包方式部署,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-12-12