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_dump
和pg_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_name
replace它。
我用过:
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