本腳本的核心知識點是如何備份全部的庫。mysql
一臺MySQL服務器,跑着5個數據庫,沒有作主從,須要對這5個數據庫進行備份,具體要求以下:sql
1)天天備份一次,全部數據庫shell
2)備份數據存到/data/backup/下數據庫
3)備份文件名格式示例:database_name-2019-07-01.sql安全
4)對1天之前的全部sql文件進行壓縮,格式爲gzipbash
5)本地數據保留1周服務器
6)備份的數據同步到遠程備份中心,本機能夠用rsync命令同步,同步目標地址爲rsync://10.10.20.100/mysqlbak/ssh
7)遠程備份數據保留一個月ide
本案例參考腳本:工具
#!/bin/bash ##該腳本用來備份本機數據庫 ##本地保留一週,遠程保留一個月 ##做者: ##日期: ##版本:v0.1 mysqldump="/usr/local/mysql/bin/mysqldump" bakuser="backup" passwd="34KpmyzUp" bakdir="/data/backup" remote_dir="rsync://10.10.20.100/mysqlbak" d1=`date +%F` d2=`date +%d` #定義日誌 exec &> /tmp/mysql_bak.log echo "mysql backup begin at `date`" #對全部數據庫進行遍歷 for db in db1 db2 db3 db4 db5 do $mysqldump -u$bakuser -p$passwd $db > $bakdir/$db-$d1.sql done #對一天前的全部sql文件壓縮 find $bakdir -type f -name "*.sql" -mtime +1 |xargs gzip #查找一週前的老文件,並刪除 find $bakdir -type f -mtime +7 |xargs rm #把當天的備份文件備份到遠程 for db in db1 db2 db3 db4 db5 do rsync -a $bakdir/$db-$d1.sql $remote_dir/$db-$d2.sql done echo "mysql backup end at `date`"
說明:
1)全部以#開頭的行都是爲解釋說明的文字,爲了便於理解,使用了中文,儘量用英文,由於中文可能會出現亂碼。這些註釋文字用來對該腳本的描述,一般會寫腳本的做用、做者以及時間或者版本等信息。
2)shell腳本中,可使用反引號來引用一條命令的結果,而後將其保存到變量中。
3)&>,指定正確輸出和錯誤輸出到/tmp/mysql_bak.log
4)在shell腳本中,一旦遇到exec命令,則它會接管該shell腳本中後續全部的命令,能夠理解爲從exec那行如下全部命令都「被拉到一個盒子裏去執行」,而這個盒子就是exec自己,因此exec &> 1.txt,就能夠理解爲這個盒子裏全部操做的輸出所有都到了1.txt中。
5)shell腳本中,循環遍歷,可以使用for,語法爲:for ... ; do ... ; done
6)本例中要求遠程備份文件保存一個月,因爲腳本不能到遠程機器上執行find命令,因此在此想了個辦法,date +%d表示日期,一個月的全部日期就都有了,天天一個新的sql文件。例如,本月15日sql文件將會覆蓋上月15日的,同理,下個月會覆蓋本月相同日期的文件,由於文件名是同樣的。但不管如何,總能保存一個月。
7)本例中,並無考慮要把當天的sql文件壓縮後再同步到遠程機器上,若是想要壓縮,也能夠這樣作:1)壓縮;2)同步;3)解壓縮。不壓縮的話,若是數據大,傳輸就是一個問題。
知識點一:MySQL數據庫備份
假設已知備份數據的用戶爲backup,密碼爲34KpmyzUp,要備份5個庫分別爲db1-db5。備份數據庫的命令爲:
mysqldump -ubackup -p34KpmyzUp db1 > db1.sql
若是是遠程MySQL服務,要加上IP和port,例如:
mysqldump -ubackup -p34KpmyzUp -h192.168.100.100 -P3308 db1 > db1.sql
mysqldump工具經常使用用法,以下:
1)只備份表結構,不備份數據
mysqldump -ubackup -p34KpmyzUp -h192.168.100.100 -P3308 -d db1 > db1.sql
2)只備份數據,不備份表結構
mysqldump -ubackup -p34KpmyzUp -h192.168.100.100 -P3308 -t db1 > db1.sql
3)只備份指定表
mysqldump -ubackup -p34KpmyzUp -h192.168.100.100 -P3308 db1 tb1 > db1_tb1.sql
4)導出所有數據庫
mysqldump -ubackup -p34KpmyzUp -h192.168.100.100 -P3308 -A > all_db.sql
5)導出指定多個庫
mysqldump -ubackup -p34KpmyzUp -h192.168.100.100 -P3308 -B db1 db2 > db1_2.sql
6)--master-data
咱們在使用mysqldump工具有份時,偶爾會用到--master-data選項,它能夠在導出時增長binlog文件的位置和change master語句(這樣有利於咱們作從庫)。
這個選項有兩個值,分別爲--master-data=1和--master-data=2。
當值等於1,就會添加一個CHANGE MASTER語句;
當值等於2,就會在CHANGE MASTER語句前添加註釋,這個參數會--lock-all-tables鎖表,除非你指定了--single-transation。
若MySQL數據量很大,好比有幾十GB,使用mysqldump備份工具會很慢,推薦使用percona-xtrabackup備份工具該工具官方下載地址爲https://www.percona.com/software/mysql-database/percona-xtrabackup,它包含兩個備份工具:xtrabackup和innobackupex。若是數據引擎爲myisam或者個別表的數據引擎爲myisam,則須要使用innobackupex。
知識點二:date命令
date命令:在Linux系統裏能夠顯示當前的系統日期和時間,示例:
# date 2019年 07月 01日 星期一 19:16:52 CST
在shell腳本中,date命令很是有用,就好比本例,要求備份文件名稱要帶日期。
date +%F 2019-07-01 日期
date +%T 18:29:10 時間
date +%Y 2019 年份(四位數)
date +%y 19 年份(兩位數)
date +%m 07 月
date +%d 01 日
date +%H 18 小時
date +%M 29 分鐘
date +%S 10 秒鐘
date +%s 1561980346 時間戳(距離1970-01-01 00:000:00 GMT過去多少秒)
date +%w 1 周幾
date +%W 26 本年度第幾周
date -d"-1 day" +%F 2019-06-30 昨天的日期
date -d"1 month ago" +%F 2019-06-01 一個月之前的日期
date -d"-1 min" +%Y:%H:%M 2019:19:31 格式化輸出指定日期和時間
知識點三:find命令
在Linux系統裏找文件有一個很厲害的工具—find。經常使用用法示例:
1)找到logs目錄下一週之前的文件
find logs/ -type f -mtime +7
2)找到/etc/目錄下全部文件爲.cnf結尾的文件
find /etc/ -type f -name "*.cnf"
3)找到當前目錄下全部權限爲777的目錄
find . -type d -perm 777
4)找到/tmp/下大小超過1MB的文件
find /tmp/ -type f -size +1M
5)找到當前目錄下10天前的文件並刪除
find . -type f -mtime +10 -exec rm -f {} \;
還可使用管道+xargs命令的形式:
find . -type f -mtime +10 |xargs rm
本例中,要求把一天前的備份文件找到:
find /data/backup/ -name "*.sql" -mtime +1
知識點四:gzip壓縮
gzip支持壓縮文件,但不支持壓縮目錄,壓縮文件的命令:
gzip file
此時文件被壓縮爲file.gz,該文件被壓縮後也會被刪除掉。解壓.gz的文件,使用-d選項,如:
gzip -d file.gz
本例中,把一天前的備份文件壓縮,命令爲:
find /data/backup/ -name "*.sql" -mtime +1 |xargs gzip
知識點五:rsync
rsync同步數據有兩種方式,一種是經過ssh協議,須要知道對方機器的用戶密碼或者經過密鑰認證,此方式相對來講安全性較差,畢竟知道了對方機器的密碼或者創建了密鑰認證,那麼就能登陸到對方機器上執行命令。
另外一種是經過在遠程機器上開啓一個rsyncd的服務,經過它特有的通訊協議進行數據傳輸,該方式不用密碼或創建密鑰認證,但能夠設置虛擬用戶及密碼,這樣就安全多了。本例中給出的遠程備份地址,屬於第二種方式。
平時使用rsync同步數據時,使用-a選項基本上就能夠達到咱們想要的效果了,只是有時候會有個別需求,會用到-a --no-OPTION,-u,-L,--delete,--exclude及--progress這些,若是遇到特殊需求了,能夠查一下rsync的man文檔。