2010-01-13 9 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 
相關問題