And*_*ius 5 postgresql bash sh postgresql-9.2
我有这个脚本(每天备份数据库):
#!/bin/bash
# Location to place backups.
backup_dir="/home/user/openerp/7.0/backup/"
#String to append to the name of the backup files
backup_date=`date +%Y-%m-%d`
#Numbers of days you want to keep copie of your databases
number_of_days=7
databases=`psql -l -t | cut -d'|' -f1 | sed -e 's/ //g' -e '/^$/d'`
for i in $databases; do
if [ "$i" != "template0" ] && [ "$i" != "template1" ]; then
echo Dumping $i to $backup_dir$i\_$backup_date
pg_dump -Fc $i > $backup_dir$i\_$backup_date
fi
done
find $backup_dir -type f -prune -mtime +$number_of_days -exec rm -f {} \;
Run Code Online (Sandbox Code Playgroud)
当我运行这个脚本时,它开始正常进行数据库备份,但是当它做半数据库备份时,它只是挂起,就像在做一些长备份一样,永远不会结束。所以我的一些数据库有时最终没有备份。
我认为这是因为它试图备份像 template0 和 template1 这样的数据库。我试图查看该数据库过滤是如何工作的文档,但没有找到任何信息。
谁能告诉我如何过滤除模板 0、模板 1、postgres 等数据库之外的所有数据库。如果有人可以提供指向文档的链接,其中说明了这样的过滤,那也会很棒:
`psql -l -t | cut -d'|' -f1 | sed -e 's/ //g' -e '/^$/d'`
Run Code Online (Sandbox Code Playgroud)
按要求输出:
demo
demo_empty1
dn1
dn2
dn3
da21
da22
nbb323
nd
nd2
pf12
postgres
rub_demo1
template0
template1
test
test3
testas_3
Run Code Online (Sandbox Code Playgroud)
所以所有数据库,除了 postgres、template0 和 template1
我怀疑您对模板数据库的猜想是不正确的。pg_dump
几乎会立即倾倒它们。
您的问题更有可能pg_dump
是等待尝试锁定其他人持有ACCESS EXCLUSIVE
锁定的表。您必须查看哪个pg_dump
进程被阻止并检查该pg_locks
数据库的视图以更好地了解发生了什么。您的日志应该告诉您哪个数据库正在停止转储,并ps
会告诉您哪个pg_dump
正在运行。pg_stat_activity
会让你识别pg_dump
进程的连接。
顺便说一句,你完全没有在这个脚本中做任何错误处理。如果备份失败,您永远不会知道,除非您碰巧正在阅读日志并注意到 pg_dump 的一些有用的 stderr 输出。我个人建议使用 pgbarman 进行定期备份,尽管定期转储仍然是一个好主意。
由于您可能想要排除template0
并且template
即使它们很可能不是问题,您可以使用:
psql --tuples-only -P format=unaligned -c "SELECT datname FROM pg_database WHERE NOT datistemplate AND datname <> 'postgres'";
Run Code Online (Sandbox Code Playgroud)
而不是您的文本处理解决方案。您会发现--tuples-only
和-P format=unaligned
选项在使用psql
.
归档时间: |
|
查看次数: |
3405 次 |
最近记录: |