溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用shell腳本怎么備份數(shù)據(jù)庫

發(fā)布時(shí)間:2021-06-08 15:38:58 來源:億速云 閱讀:398 作者:Leah 欄目:開發(fā)技術(shù)

今天就跟大家聊聊有關(guān)使用shell腳本怎么備份數(shù)據(jù)庫,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

Shell 腳本

Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。 業(yè)界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個(gè)不同的概念。

備份MySQL數(shù)據(jù)庫

場景:

一臺MySQL服務(wù)器,跑著5個(gè)數(shù)據(jù)庫,在沒有做主從的情況下,需要對這5個(gè)庫進(jìn)行備份

需求:

1)每天備份一次,需要備份所有的庫
2)把備份數(shù)據(jù)存放到/data/backup/下
3)備份文件名稱格式示例:dbname-2019-11-23.sql
4)需要對1天以前的所有sql文件壓縮,格式為gzip
5)本地?cái)?shù)據(jù)保留1周
6)需要把備份的數(shù)據(jù)同步到遠(yuǎn)程備份中心,假如本機(jī)可以直接通過rsync命令同步,同步目標(biāo)地址為192.168.234.125,數(shù)據(jù)存放目錄:/data/mysqlbak/
7)遠(yuǎn)程備份數(shù)據(jù)要求保留1個(gè)月

腳本:

#!/bin/bash
mysqldump="/usr/local/mysql/bin/mysqldump"
bakdir="/data/backup"
bakuser="backup"
passwd="backup123"
d1=`date +%F`
d2=`date +%d`
#將后面所有的輸出都寫入到日志
exec &> tmp/bak.log
echo "mysql bakup begin at `date`"
#循環(huán)遍歷數(shù)據(jù)庫并導(dǎo)出
for db in db1 db2 db3 db4 db5
do
 $mysqldump -u$bakuser -p$passwd $db > $bakdir/$db-$d1.sql
done
#壓縮一天前的備份文件
find $bakdir -type f -name "*.sql" -mtime +1 |xargs gzip
#刪除一周前的被封文件
find $bakdir -type f -mtime +7 |xargs rm
#把當(dāng)天的備份文件同步到遠(yuǎn)程機(jī)器
for db in db1 db2 db3 db4 db5
do
 rsync -a $bakdir/$db-$d1.sql rsuser@192.168.234.125::/data/mysqlbak/$db-$d2.sql
done
echo "mysql bakup end at `date`"

補(bǔ)充:

1.遠(yuǎn)程機(jī)器存放的備份文件以庫名-日期的具體日命名,就實(shí)現(xiàn)了自動(dòng)保留30天(比如15號備份的文件db1-15.sql下個(gè)月1號的備份文件將會(huì)覆蓋該文件)
2.當(dāng)數(shù)據(jù)庫較大時(shí),使用mysqldump備份速度會(huì)非常慢,這時(shí)該使用xtarbackup工具備份或mysql主從復(fù)制

代碼上線發(fā)布腳本

生產(chǎn)環(huán)境中一個(gè)業(yè)務(wù)通常跑在多臺服務(wù)器上,也就是所謂的負(fù)載均衡,那么這些機(jī)器上運(yùn)行的代碼必須要保持一致,如何實(shí)現(xiàn)一致呢?有兩種方案

1.通過共享的方式

如果機(jī)器量不多,可以使用NFS實(shí)現(xiàn),當(dāng)然如果要求穩(wěn)定性最好是使用專業(yè)的存儲(chǔ)設(shè)備(NAS、SAN等),這種方式架構(gòu)如下:

使用shell腳本怎么備份數(shù)據(jù)庫

這種架構(gòu)的優(yōu)點(diǎn)是方便維護(hù),比如有代碼更新時(shí),只需要更新一臺機(jī)器上的代碼,則其他機(jī)器上都會(huì)跟著更新。缺點(diǎn)是,機(jī)器量大了的話,共享存儲(chǔ)會(huì)成為瓶頸,甚至由于對文件的爭搶造成性能問題。還有一點(diǎn),共享存儲(chǔ)這里是一個(gè)很大的單點(diǎn)隱患,不出故障一切都OK,一旦出了故障,則整個(gè)業(yè)務(wù)都掛掉,影響非常大。

2.分布式

既然通過共享的方式有不少缺點(diǎn),那么就選擇另外一種方式,即把代碼存到每一臺WEB服務(wù)器本地磁盤上,如下圖所示:

使用shell腳本怎么備份數(shù)據(jù)庫

這樣做的好處是,沒有存儲(chǔ)性能問題,沒有資源爭搶沖突,也沒有單點(diǎn)故障的隱患。缺點(diǎn)是,每次代碼更新需要對所有web機(jī)器進(jìn)行更新,比較繁瑣。雖然步驟繁瑣,但大多數(shù)企業(yè)都會(huì)選擇該方式。

通過shell腳本+expect批量發(fā)布代碼到多臺web服務(wù)器:

前提:

1)提供一個(gè)存放所有web服務(wù)器的IP列表文件ip.list
2)假設(shè)所有web服務(wù)器上有一個(gè)普通用戶user,密碼為user123,該用戶為同步代碼用戶
3)每次代碼上線會(huì)提供一個(gè)文件列表file.list(即要更改的文件的列表)

腳本:

#/bin/bash

#提醒用戶,是否更新了要上線的代碼列表文件
read -p "你是否已經(jīng)更新了文件列表./file.list?確認(rèn)請輸入y或者Y,否則按其他任意鍵退出腳本。" c
#如果直接按回車,也會(huì)退出腳本
if [ -z "$c" ]
then
 exit 1
fi
if [ $c == "y" -o $c == "Y" ]
then
 echo "腳本將在2秒后,繼續(xù)執(zhí)行。"
 #每秒輸出一個(gè).共輸出兩個(gè).
 for i in 1 2
 do
 echo -n "."
 sleep 1
 done
 echo
else
 exit 1
fi
#判斷有無./rsync.exp文件
[ -f ./rsync.exp ] && rm -f ./rsync.exp
#定義rsync.exp
cat >./rsync.exp <<EOF
#!/usr/bin/expect
set passwd "user123"
set host [lindex \$argv 0]
set file [lindex \$argv 1]
spawn rsync -avR --files-from=\$file / user@\$host:/
expect {
 "yes/no" {send "yes\r"}
 "password:" {send \$passwd\r}
}
expect eof
EOF
chmod a+x ./rsync.exp
#定義檢測文件是否存在的函數(shù)
if_file_exist()
{
 if [ ! -f $1 ]
 then
 echo "文件$1不存在,請檢查。"
 exit 1
}
#ip.list為所有WEB機(jī)器的ip列表
#file.list為要同步的文件列表
if_file_exist ./ip.list
if_file_exist ./file.list
for ip in `cat ./ip.list`
do
 ./rsync.exp $ip ./file.list
done
#善后處理
rm -f ./rsync.exp

注意:在每臺web服務(wù)器上創(chuàng)建的代碼同步用戶需要有代碼所在目錄的寫入權(quán)限

看完上述內(nèi)容,你們對使用shell腳本怎么備份數(shù)據(jù)庫有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI