shell 備份數(shù)據(jù)庫(kù)、代碼上線的腳本
Shell 腳本
Shell 腳本(shell script),是一種為 shell 編寫的腳本程序。 業(yè)界所說的 shell 通常都是指 shell 腳本,但讀者朋友要知道,shell 和 shell script 是兩個(gè)不同的概念。
備份MySQL數(shù)據(jù)庫(kù)
場(chǎng)景:
一臺(tái)MySQL服務(wù)器,跑著5個(gè)數(shù)據(jù)庫(kù),在沒有做主從的情況下,需要對(duì)這5個(gè)庫(kù)進(jìn)行備份
需求:
1)每天備份一次,需要備份所有的庫(kù)
2)把備份數(shù)據(jù)存放到/data/backup/下
3)備份文件名稱格式示例:dbname-2019-11-23.sql
4)需要對(duì)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ù)庫(kù)并導(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ī)器存放的備份文件以庫(kù)名-日期的具體日命名,就實(shí)現(xiàn)了自動(dòng)保留30天(比如15號(hào)備份的文件db1-15.sql下個(gè)月1號(hào)的備份文件將會(huì)覆蓋該文件)
2.當(dāng)數(shù)據(jù)庫(kù)較大時(shí),使用mysqldump備份速度會(huì)非常慢,這時(shí)該使用xtarbackup工具備份或mysql主從復(fù)制
代碼上線發(fā)布腳本
生產(chǎn)環(huán)境中一個(gè)業(yè)務(wù)通常跑在多臺(tái)服務(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)如下:
這種架構(gòu)的優(yōu)點(diǎn)是方便維護(hù),比如有代碼更新時(shí),只需要更新一臺(tái)機(jī)器上的代碼,則其他機(jī)器上都會(huì)跟著更新。缺點(diǎn)是,機(jī)器量大了的話,共享存儲(chǔ)會(huì)成為瓶頸,甚至由于對(duì)文件的爭(zhēng)搶造成性能問題。還有一點(diǎn),共享存儲(chǔ)這里是一個(gè)很大的單點(diǎn)隱患,不出故障一切都OK,一旦出了故障,則整個(gè)業(yè)務(wù)都掛掉,影響非常大。
2.分布式
既然通過共享的方式有不少缺點(diǎn),那么就選擇另外一種方式,即把代碼存到每一臺(tái)WEB服務(wù)器本地磁盤上,如下圖所示:
這樣做的好處是,沒有存儲(chǔ)性能問題,沒有資源爭(zhēng)搶沖突,也沒有單點(diǎn)故障的隱患。缺點(diǎn)是,每次代碼更新需要對(duì)所有web機(jī)器進(jìn)行更新,比較繁瑣。雖然步驟繁瑣,但大多數(shù)企業(yè)都會(huì)選擇該方式。
通過shell腳本+expect批量發(fā)布代碼到多臺(tái)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)請(qǐng)輸入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 #定義檢測(cè)文件是否存在的函數(shù) if_file_exist() { if [ ! -f $1 ] then echo "文件$1不存在,請(qǐng)檢查。" 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
注意:在每臺(tái)web服務(wù)器上創(chuàng)建的代碼同步用戶需要有代碼所在目錄的寫入權(quán)限
總結(jié)
到此這篇關(guān)于shell 備份數(shù)據(jù)庫(kù)、代碼上線的腳本的文章就介紹到這了,更多相關(guān)shell 備份數(shù)據(jù)庫(kù)代碼上線內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- shell腳本實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)雙機(jī)定時(shí)備份的方法
- shell腳本定時(shí)備份MySQL數(shù)據(jù)庫(kù)數(shù)據(jù)并保留指定時(shí)間
- 使用shell腳本每天對(duì)MySQL多個(gè)數(shù)據(jù)庫(kù)自動(dòng)備份的講解
- MySQL數(shù)據(jù)庫(kù)的shell腳本自動(dòng)備份
- 兩個(gè)備份數(shù)據(jù)庫(kù)的shell腳本
- Shell腳本實(shí)現(xiàn)MySQL、Oracle、PostgreSQL數(shù)據(jù)庫(kù)備份
相關(guān)文章
shell腳本學(xué)習(xí)指南[二](Arnold Robbins & Nelson H.F. Beebe著)
這篇文章主要介紹了shell腳本學(xué)習(xí)指南[二](Arnold Robbins & Nelson H.F. Beebe著),需要的朋友可以參考下2014-02-02bash shell獲取當(dāng)前腳本的絕對(duì)路徑(pwd/readlink)
有時(shí)候,我們需要知道當(dāng)前執(zhí)行的輸出shell腳本的所在絕對(duì)路徑,本文主要介紹了bash shell獲取當(dāng)前腳本的絕對(duì)路徑,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02linux awk高級(jí)應(yīng)用實(shí)例
今天看到unix shell 范例精解上有道awk的題目 做了以后拿來和大家分享下2016-08-08一句話Shell命令關(guān)閉不需要的隨機(jī)啟動(dòng)服務(wù)
這篇文章主要介紹了一句話Shell命令關(guān)閉不需要的隨機(jī)啟動(dòng)服務(wù),使用本文的一句話命令,可以達(dá)到優(yōu)化系統(tǒng)的目的,其中要保留的服務(wù)可以自己定義,需要的朋友可以參考下2014-12-12shell腳本操作mysql數(shù)據(jù)庫(kù)刪除重復(fù)的數(shù)據(jù)
今天小編就為大家分享一篇關(guān)于shell腳本操作mysql數(shù)據(jù)庫(kù)刪除重復(fù)的數(shù)據(jù),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03shell腳本轉(zhuǎn)發(fā)80端口數(shù)據(jù)包給Node.js服務(wù)器
開發(fā)基于Node.js的WEB應(yīng)用很方便,但是服務(wù)端口問題,由于Linux內(nèi)核規(guī)定普通用戶只能使用大于1024的端口號(hào),所以使用普通用戶運(yùn)行Node.js服務(wù)就不80端口2014-03-03linux shell自定義函數(shù)(定義、返回值、變量作用域)介紹
linux shell 可以用戶定義函數(shù),然后在shell腳本中可以隨便調(diào)用。下面說說它的定義方法,以及調(diào)用需要注意那些事項(xiàng)2013-02-02