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