本腳本的核心知識點是如何備份所有的庫。
一臺MySQL服務器,跑着5個數據庫,沒有做主從,需要對這5個數據庫進行備份,具體要求如下:
1)每天備份一次,所有數據庫
2)備份數據存到/data/backup/下
3)備份文件名格式示例:database_name-2019-07-01.sql
4)對1天以前的所有sql文件進行壓縮,格式爲gzip
5)本地數據保留1周
6)備份的數據同步到遠程備份中心,本機可以用rsync命令同步,同步目標地址爲rsync://10.10.20.100/mysqlbak/
7)遠程備份數據保留一個月
本案例參考腳本:
#!/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文檔。