2010-01-13 43 views
78

我在写一个shell脚本(将成为一个cronjob)将:Postgres的:明确整个数据库之前重新创建/重新填充,从bash脚本

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 
+2

oneliner人着急:'数据库名= 'DB_NAME' && $ DROPDB DBNAME && $ CREATEDB DBNAME &&的psql -d $ DBNAME -f dump.sql' – ruuter 2016-12-28 00:23:47

+0

这oneliner需要你有权限创建/删除数据库。作者正在尝试的方法不需要特殊的权限。 – ribamar 2017-12-14 15:26:38

回答

120

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

$ dropdb development_db_name 
$ createdb developmnent_db_name 

这就是我如何做到这一点,其实。

+0

我也是这么做的。然后只需恢复到新创建的数据库中。 – 2010-01-13 17:13:43

+3

是的。这是更好的,因为可能有不属于正在恢复的转储的对象。在这种情况下,他们肯定会被杀死。 – pstanton 2010-05-23 03:30:29

+0

谢谢,来自具有MySQL经验的背景,我一直在忘记PostGres的命令行工具。 – David 2013-05-01 19:31:34

9

虽然下面一行是从Windows批处理脚本拍摄,命令应该是很相似的:

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

这个命令是用来清除整个数据库,通过实际放弃它。该命令中的$DATABASE(在Windows中应该是%DATABASE%)是一个windows风格的环境变量,其值为数据库名称。您需要用您的development_db_name替代。

+3

Windows风格的变量...... – zxq9 2013-04-08 16:17:43

+0

那么为什么不使用已有的'dropdb'和'createdb'命令?如果你可以运行psql,你也可以运行它们。 – 2017-08-22 18:15:20

77

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

要删除并重新创建表,您可以使用--clean命令行选项pg_dump发出SQL命令,以在创建(删除)数据库对象之前(删除)数据库对象。我用

pg_dump -U username --clean | pg_restore -U username 
+1

我喜欢这个解决方案,因为我确实需要一个备份副本,我现在正在执行此操作: pg_dump -Ft -U production_db_name> /backup/dir/backup-${time}.tar pg_restore -U development_db_name -d development_db_name -O -​​-clean /backup/dir/backup-${time}.tar 就像一个魅力,感谢您的帮助! – Hoff 2010-01-27 16:52:03

+26

请注意:--clean选项只会删除还原文件中的关系。这意味着如果您添加一个表进行测试,然后想要将其删除(例如与生产数据库同步),它将不会被删除。 – 2012-08-16 16:19:40

+5

请记住pg_dump的* - clean *选项仅适用于纯文本备份,这一点很重要。正如文档清楚地在http://www.postgresql.org/docs/9.4/static/app-pgdump.html所述,您需要在pg_restore上使用--clean来进行归档备份。 – 2015-02-01 22:33:27

4

:(这并不会删除整个数据库,只是每个表/顺序/索引/等等重建之前。)

以上两个会是这个样子

pg_restore -c -d database_name filename.dump 
1

转储:

pg_dump -Fc mydb > db.dump 

恢复:

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