bash – PostgreSQL – 过滤数据库列表
我有这个脚本(每天备份数据库):
#!/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 {} ; 当我运行这个脚本时,它会开始正常进行数据库备份,但是当它像半数据库备份一样时,它只是挂起就像它正在做一些长备份而永远不会结束它.因此,有些时候我的某些数据库最终没有备份. 我认为这是因为它试图备份像template0和template1这样的数据库.我试着在文档中查看这个数据库过滤是如何工作的,但没有找到任何信息. 任何人都可以告诉我如何过滤除了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之外的所有数据库 解决方法
我怀疑你对模板数据库的推测是不正确的. pg_dump几乎会立即转储它们.
更有可能的是,你的问题是pg_dump正在等待试图锁定其他人持有ACCESS EXCLUSIVE锁定的表.您必须查看哪个pg_dump进程被阻止,并检查该数据库上的pg_locks视图,以便更好地了解发生了什么.您的日志应告诉您哪个数据库停止转储,ps将告诉您哪个pg_dump正在运行. pg_stat_activity可以让你识别pg_dump进程的连接. 顺便说一句,你完全没有在这个脚本中做任何错误处理.如果备份失败,你将永远不会知道,除非你碰巧正在阅读日志并注意到pg_dump的一些有用的stderr输出.我个人建议使用pgbarman进行常规备份,但定期转储仍然是个好主意. 由于您可能希望排除template0和模板,即使它们很可能不是问题,您可以使用: psql --tuples-only -P format=unaligned -c "SELECT datname FROM pg_database WHERE NOT datistemplate AND datname <> 'postgres'"; 而不是你的文字处理解决方案.当脚本使用psql时,你会发现–tuples-only和-P format = unaligned选项非常有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |