案例1、備份MySQL數據庫

本腳本的核心知識點是如何備份全部的庫。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文檔。

相關文章
相關標籤/搜索