Postgres:在重新创build/从bash脚本重新填充之前清除整个数据库

我正在写一个shell脚本(将成为一个cronjob),将:

1:转储我的生产数据库

2:将转储导入到我的开发数据库

在步骤1和2之间,我需要清除开发数据库(删除所有表?)。 从shell脚本如何最好地完成? 到目前为止,它看起来像这样:

#!/bin/bash time=`date '+%Y'-'%m'-'%d'` # 1. export(dump) the current production database pg_dump -U production_db_name > /backup/dir/backup-${time}.sql # missing step: drop all tables from development database so it can be re-populated # 2. load the backup into the development database psql -U development_db_name < backup/dir/backup-${time}.sql 

如果您实际上不需要备份以纯文本.sql脚本文件格式转储到磁盘上的数据库,则可以通过pipe道将pg_dumppg_restore直接连接在一起。

要删除并重新创build表,可以使用pg_dump--clean命令行选项发出SQL命令来清理(删除)数据库对象,然后再创build它们(的命令)。 (在重新创build数据库之前,这不会丢失整个数据库,只是每个表/序列/索引等)。

上面的两个看起来像这样:

 pg_dump -U username --clean | pg_restore -U username 

我只是删除数据库,然后重新创build它。 在UNIX或Linux系统上,应该这样做:

 $ dropdb development_db_name $ createdb developmnent_db_name 

事实上,我就是这么做的。

虽然下面一行是从Windows批处理脚本中获取的,但该命令应该非常相似:

 psql -U username -h localhost -d postgres -c "DROP DATABASE \"$DATABASE\";" 

该命令用于清除整个数据库,实际上是将其删除。 在命令中的$DATABASE (在Windows中应该是%DATABASE% )是一个windows风格的环境variables,其值为数据库名称。 您需要用您的development_db_namereplace它。

我用过:

 pg_restore -c -d database_name filename.dump 

转储:

 pg_dump -Fc mydb > db.dump 

恢复:

 pg_restore --verbose --clean --no-acl --no-owner -h localhost -U myuser -d my_db db/latest.dump