PostgreSQL - 过滤数据库列表

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

Cra*_*ger 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'";
Run Code Online (Sandbox Code Playgroud)

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