Docker容器中的Postgresql備份腳本異常解決辦法
本文基于K8S中Docker容器對(duì)postgres數(shù)據(jù)庫(kù)進(jìn)行備份的操作,編寫(xiě)好腳本后,手動(dòng)執(zhí)行腳本是正常的,但是crontab定時(shí)實(shí)行卻報(bào)錯(cuò),報(bào)錯(cuò)信息為kubectl command not found,提示沒(méi)有找到kubectl指令。
本文主要介紹對(duì)該報(bào)錯(cuò)信息的分析及其解決辦法。詳細(xì)內(nèi)容請(qǐng)參考下文。
一、查看數(shù)據(jù)庫(kù)環(huán)境
1、獲取數(shù)據(jù)庫(kù)所在節(jié)點(diǎn)
2、進(jìn)入數(shù)據(jù)庫(kù)對(duì)接節(jié)點(diǎn)容器
二、編寫(xiě)數(shù)據(jù)庫(kù)備份腳本
1、執(zhí)行指令# vim pgbackup.sh
#!/bin/bash
#設(shè)置系統(tǒng)變量
source /etc/profile
filename="`date +%F`_bak.sql"
#備份數(shù)據(jù)腳本
cat > /usr/local/backup/exportPG.sh <<EOF
#!/bin/bash
export PGUSER=****
export PGPASSWORD='******'
export PGHOST=172.**.**.**
export PGPORT=324**
#備份整個(gè)集群庫(kù)中的數(shù)據(jù)
#pg_dumpall -a > ${filename}
#備份整個(gè)集群庫(kù)包含建庫(kù)建表操作
pg_dumpall > ${filename}
EOF
#給執(zhí)行權(quán)限
chmod +x /usr/local/backup/exportPG.sh
#將服務(wù)器上的備份腳本復(fù)制到對(duì)應(yīng)容器中去
kubectl cp /usr/local/backup/exportPG.sh sso/********:/exportPG.sh
#在容器外執(zhí)行該腳本
kubectl exec -it ******** -n sso -- /exportPG.sh
#將備份后的數(shù)據(jù)文件復(fù)制到容器外
kubectl cp sso/********:${filename} /usr/local/backup/${filename}
2、授予備份腳本執(zhí)行權(quán)限
執(zhí)行指令# chmod +x
/usr/local/backup/pgbackup.sh
3、測(cè)試數(shù)據(jù)庫(kù)備份腳本
說(shuō)明:測(cè)試數(shù)據(jù)庫(kù)備份腳本,手動(dòng)執(zhí)行# sh pgbackup.sh的時(shí)候,備份正常。但是在使用crontab執(zhí)行任務(wù)定時(shí)執(zhí)行的時(shí)候,報(bào)kubectl command not found的錯(cuò)誤信息。
4、分析定時(shí)執(zhí)行的報(bào)錯(cuò)信息
說(shuō)明:crontab執(zhí)行計(jì)劃任務(wù)的時(shí)候并不知道所需要的特殊環(huán)境變量。所以要保證在shelll腳本中提供所有必要的路徑和環(huán)境變量,除了一些自動(dòng)設(shè)置的全局變量。
特別需要注意如下三點(diǎn):
(1)腳本中涉及文件路徑時(shí)寫(xiě)全局路徑;
比如:
上文所提到的數(shù)據(jù)備份腳本問(wèn)題,就是kubectl指令沒(méi)有寫(xiě)全路徑,正確的做法是,通過(guò)執(zhí)行指令# which kubectl查看指令kubectl的所在位置,讓后將腳本的指令路徑補(bǔ)全。
(2)腳本執(zhí)行要用到程序或其他環(huán)境變量時(shí),通過(guò)source命令引入環(huán)境變量;
比如:
在root的crontab文件中加入:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
(3)、如上文所述,當(dāng)手動(dòng)執(zhí)行腳本正常,但是crontab定時(shí)執(zhí)行報(bào)錯(cuò)的情況。就是環(huán)境變量問(wèn)題,可以在crontab中直接引入環(huán)境變量解決。
0 * * * * /etc/profile;/bin/bash /home/scripts/test.sh >/dev/null 2>&1
5、修改后的備份腳本
說(shuō)明:執(zhí)行指令# vim pgbackup.sh修改數(shù)據(jù)庫(kù)備份腳本,修改后的腳本如下