5

我有这个脚本(每天备份数据库):

#!/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 {} \;

当我运行这个脚本时,它开始正常进行数据库备份,但是当它确实喜欢半个数据库备份时,它只是挂起,就像它正在做一些长时间的备份并且永远不会结束它。所以我的一些数据库有时最终没有备份。

我认为这是因为它尝试备份模板0 和模板1 等数据库。我试图在文档中查看这个数据库过滤是如何工作的,但没有找到任何信息。

谁能告诉我如何过滤除template0、template1、postgres 等数据库之外的所有数据库。如果有人可以提供指向文档的链接,其中提到了这样的过滤,那也很棒:

`psql -l -t | cut -d'|' -f1 | sed -e 's/ //g' -e '/^$/d'`

按要求输出:

demo
demo_empty1
dn1
dn2
dn3
da21
da22
nbb323
nd
nd2
pf12
postgres
rub_demo1
template0
template1
test
test3
testas_3

所以所有数据库,除了 postgres、template0 和 template1

4

1 回答 1

5

我怀疑您对模板数据库的猜想是不正确的。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'";

而不是您的文本处理解决方案。您会发现--tuples-only-P format=unaligned选项在使用psql.

于 2013-04-19T01:20:15.423 回答