注意:
- 以下為對PostgreSQL13.16版本數據庫備份shell腳本參考
- 請確認備份節點上psql和pgdump的版本不至于太低,建議>=13.16
- 該腳本目前是對于整庫、(默認針對public這個schema,如果有其他schema,請自行添加一層循環)庫下各表都做了備份,若不需要對各表進行備份,去除關于備表的for循環即可
一.腳本內容?
#!/bin/bash# 定義連接pg的用戶、密碼、地址、端口
export pg_user="postgres"
export pg_pass="SLBpg2025"
export pg_host="192.168.2.199"
export pg_port="25432"
# 備份主目錄
bak_path="/data/pg/back"
# 備份數據保留周期(單位:天)
retain_days=3
# 時間格式
date="$(date +"%Y-%m-%d")"
# 日志存放目錄
log_file="$bak_path/$date/backup.log"
# 忽略備份的數據庫
exdbname=' template0| template1| postgres'
# 獲取所有數據庫名
dbname=$(PGPASSWORD=$pg_pass psql -h$pg_host -p$pg_port -U$pg_user -c "SELECT datname FROM pg_database;" | sed -n '3,$p'|head -n -2 | grep -Ev "^($exdbname)$")
echo $dbname
if [ -z "$dbname" ]; thenecho "未獲取到有效的數據庫列表,請檢查 PGSQL 連接和權限。" > $log_fileexit 1
fifor db in $dbname; do# 創建數據庫對應的備份目錄db_backup_dir="$bak_path/$date/$db"if [ ! -d "$db_backup_dir" ]; thenmkdir -p "$db_backup_dir"fi# 備份整個數據庫PGPASSWORD=$pg_pass pg_dump -h$pg_host -p$pg_port -U$pg_user $db | gzip > $db_backup_dir/${db}_$(date +%F).sql.gzif [ $? -ne 0 ]; thenecho "備份數據庫 $db 失敗。" >> $log_fileelseecho "數據庫 $db 備份成功,存放路徑 $db_backup_dir/${db}_$(date +%F).sql.gz" >> $log_filefi# 獲取數據庫中的表列表tb_list=$(PGPASSWORD=$pg_pass psql -h$pg_host -p$pg_port -U$pg_user -d"$db" -tAc "SELECT tablename FROM pg_tables WHERE schemaname = 'public';")# 檢查是否獲取到表列表if [ -z "$tb_list" ]; thenecho "未獲取到數據庫 $db 中的表列表。" >> $log_filecontinuefi# 對每個表進行操作for tb in $tb_list; do# 備份單個表PGPASSWORD=$pg_pass pg_dump -h$pg_host -p$pg_port -U$pg_user -d"$db" -t"$tb" -F p | gzip > "$db_backup_dir/${db}_${tb}_$(date +%F).sql.gz"if [ $? -ne 0 ]; thenecho "備份表 $db.$tb 失敗。" >> $log_fileelseecho "表 $db.$tb 備份成功,存放路徑 $db_backup_dir/${db}_${tb}_$(date +%F).sql.gz" >> $log_filefidone
donefind $bak_path -mtime +$retain_days -exec rm -f {} \;
二.執行效果
[root@master01 back]# bash back.sh
slb
[root@master01 back]# ll
total 4
drwxr-xr-x 3 root root 35 Feb 17 22:10 2025-02-17
-rw-r--r-- 1 root root 2157 Feb 17 22:10 back.sh
[root@master01 back]# cd 2025-02-17/
[root@master01 2025-02-17]# ll
total 4
-rw-r--r-- 1 root root 299 Feb 17 22:10 backup.log
drwxr-xr-x 2 root root 112 Feb 17 22:10 slb
[root@master01 2025-02-17]# cat backup.log
數據庫 slb 備份成功,存放路徑 /data/pg/back/2025-02-17/slb/slb_2025-02-17.sql.gz
表 slb.students 備份成功,存放路徑 /data/pg/back/2025-02-17/slb/slb_students_2025-02-17.sql.gz
表 slb.employees 備份成功,存放路徑 /data/pg/back/2025-02-17/slb/slb_employees_2025-02-17.sql.gz
三.創建定時任務
[root@master01 2025-02-17]# tail -1 /etc/crontab
0 2 * * * root /usr/bin/bash /data/pg/back/back.sh