脚本功能
应对多个库多个表需要定期逻辑备份的场景
需要备份的数据库较多时按数据库并行执行备份
脚本使用示例
database.list 为需要备份的数据库信息,文件内容为竖线分隔:ip|port|database|user|passwd|app_name
test.table_list 为需要备份的表名,此示例文件名里的”test“为database.list中的database名,多个database时需要创建多个文件
可以在文件内容中每行开头添加“#”来注释掉不需要备份的数据库或表
[postgres@mydb1a pg_dump_parallel]$ ls -ltr
总用量 8
-rw-------. 1 postgres postgres 3031 9月 18 23:42 pg_dump_parallel.sh
drwx------. 2 postgres postgres 4096 9月 18 23:56 config
[postgres@mydb1a pg_dump_parallel]$ cat config/database.list
192.168.8.11|5432|test|postgres|postgres|test_dump
[postgres@mydb1a pg_dump_parallel]$ cat config/test.table_list
test
test_1
[postgres@mydb1a pg_dump_parallel]$ sh pg_dump_parallel.sh
[postgres@mydb1a pg_dump_parallel]$ cat logs/telepg_dump_test_dump.log.20240918
2024-09-18__23:56:54--fun start...... 192.168.8.11:5432/test
2024-09-18__23:56:54--fun 192.168.8.11:5432/test connect check ok
2024-09-18__23:56:54--fun begin create data dir /home/postgres/pg_dump_parallel/data/test_dump/20240918
2024-09-18__23:56:54--fun begin dump test to /home/postgres/pg_dump_parallel/data/test_dump/20240918/test.20240918
COPY 0
2024-09-18__23:56:54--fun begin dump test_1 to /home/postgres/pg_dump_parallel/data/test_dump/20240918/test_1.20240918
COPY 10
2024-09-18__23:56:54--fun begin clear 20240911 data dir /home/postgres/pg_dump_parallel/data/test_dump/20240911
rm: 无法删除 '/home/postgres/pg_dump_parallel/data/test_dump/20240911': 没有那个文件或目录
2024-09-18__23:56:54--fun end...... 192.168.8.11:5432/test
[postgres@mydb1a pg_dump_parallel]$ ll data/test_dump/20240918/*
-rw-------. 1 postgres postgres 27 9月 18 23:56 data/test_dump/20240918/test_1.20240918.csv
-rw-------. 1 postgres postgres 953 9月 18 23:56 data/test_dump/20240918/test_1.20240918.sql
-rw-------. 1 postgres postgres 0 9月 18 23:56 data/test_dump/20240918/test.20240918.csv
-rw-------. 1 postgres postgres 750 9月 18 23:56 data/test_dump/20240918/test.20240918.sql
复制
pg_dump_parallel.sh
#!/bin/bash
dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)
if [ -f $dir/config/database.list ];then
dbfile=$dir/config/database.list
else
echo "database.list file does not exists!"
echo "eg: ip|port|database|user|passwd|app_name"
exit;
fi
today=`date +"%Y%m%d"`
clear_day=`date -d '7 day ago' +"%Y%m%d"`
log_dir=$dir/logs
mkdir -p $log_dir
db_connect_timeout=300
write_log(){
msg="$1"
log_file="$2"
echo "`date +%Y-%m-%d__%H:%M:%S`--$msg" >> $log_file
}
#check db connection
check_connect(){
url="$1"
res=`psql "$url" -Atc "select 1" 2>/dev/null`
if [ -n $res ] && [[ $res -eq 1 ]];then
return 1;
fi
}
#dump table def to *.sql,and copy data to *.csv
dump(){
url="$1"
table_name="$2"
file_name="$3"
log_file="$4"
pg_dump $url -s -t $table_name -f ${file_name}.sql >>$log_file 2>&1
psql $url -Atc "\copy (select * from $table_name) to ${file_name}.csv " >>$log_file 2>&1
# echo "pg_dump $url -s -t $table_name -f ${file_name}.sql"
# echo "psql $url -Atc \"\copy (select * from $table_name) to ${file_name}.csv \""
}
#loop db list,get table list
fun(){
for conn_info in `cat $dbfile|grep -v "^#"`
do
( #get db connection info from database.list
ip=`echo $conn_info|awk -F '|' '{print $1}'`
port=`echo $conn_info|awk -F '|' '{print $2}'`
database=`echo $conn_info|awk -F '|' '{print $3}'`
user=`echo $conn_info|awk -F '|' '{print $4}'`
passwd=`echo $conn_info|awk -F '|' '{print $5}'`
app_name=`echo $conn_info|awk -F '|' '{print $6}'`
log_file=$log_dir/telepg_dump_$database_$app_name.log.$today
url="postgresql://$user:$passwd@$ip:$port/$database?connect_timeout=$db_connect_timeout"
write_log "${FUNCNAME} start...... $ip:$port/$database" "$log_file"
if [ -f $dir/config/${database}.table_list ];then
table_file=$dir/config/${database}.table_list
check_connect "$url"
if [ $? -eq 1 ];then
write_log "${FUNCNAME} $ip:$port/$database connect check ok" "$log_file"
data_dir=$dir/data/$app_name/$today
write_log "${FUNCNAME} begin create data dir $data_dir" "$log_file"
mkdir -p $data_dir >>$log_file 2>&1
#get table list from db.table_list
for table_name in `cat $table_file|grep -v "^#"`
do
file_name=$data_dir/${table_name}.${today}
write_log "${FUNCNAME} begin dump $table_name to $file_name" "$log_file"
dump "$url" "$table_name" "$file_name" "$log_file"
done
#clear 7 days ago data
clear_data_dir=$dir/data/$app_name/$clear_day
write_log "${FUNCNAME} begin clear $clear_day data dir $clear_data_dir" "$log_file"
rm -r $clear_data_dir >>$log_file 2>&1
else
write_log "${FUNCNAME} connect check is not ok,$ip:$port/$database connect fail" "$log_file"
fi
else
write_log "${FUNCNAME} ${database}.table_list does not exists!" "$log_file"
fi
write_log "${FUNCNAME} end...... $ip:$port/$database" "$log_file"
)& done
}
fun
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
外国CTO也感兴趣的开源数据库项目——openHalo
小满未满、
1323次阅读
2025-04-21 16:58:09
9.9 分高危漏洞,尽快升级到 pgAdmin 4 v9.2 进行修复
严少安
383次阅读
2025-04-11 10:43:23
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
368次阅读
2025-04-15 14:48:05
转发有奖 | PostgreSQL 16 PGCM高级认证课程直播班招生中!
墨天轮小教习
174次阅读
2025-04-14 15:58:34
中国PostgreSQL培训认证体系新增PGAI应用工程师方向
开源软件联盟PostgreSQL分会
142次阅读
2025-05-06 10:21:13
SQL 优化之 OR 子句改写
xiongcc
130次阅读
2025-04-21 00:08:06
融合Redis缓存的PostgreSQL高可用架构
梧桐
111次阅读
2025-04-08 06:35:40
告别老旧mysql_fdw,升级正当时
NickYoung
110次阅读
2025-04-29 11:15:18
PostgreSQL的dblink扩展模块使用方法
szrsu
95次阅读
2025-04-24 17:39:30
pgsql+pgpool高可用配置示例
(*´I`*)
91次阅读
2025-04-15 10:43:30