案例一、備份MySQL數據庫

本腳本的核心知識點是如何備份所有的庫。


一臺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文檔。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章