2014-01-10 145 views
26

我有一個使用Postgres數據庫的Django應用程序。我需要能夠備份和恢復數據庫 - 以確保數據不會丟失,並且能夠在測試期間將數據從生產服務器複製到開發服務器。如何備份django數據庫

似乎有是幾個不同的方式來做到這一點:

1)直接與數據庫交互剛。因此,對於Postgres,我可能會使用pg_dumpall和psql編寫腳本。

2)使用Django附帶的「sqlclear/sqlall」命令。

3)使用Django附帶的「dumpdata/loaddata」命令。因此,從要備份的數據庫創建新的固件,然後將它們加載到要恢復的數據庫中。

4)使用像django-dbbackup這樣的Django插件。

我真的不明白這些不同技術的優缺點。

就在我頭頂的選項1是數據庫特定的,而選項3似乎更適合設置初始數據。但我仍然不確定選項4比選項2有什麼優點。

謝謝。

+0

爲什麼不的作者你只是創建一個整個數據庫的副本? http://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP – karthikr

+2

django-dbbackup甚至可以工作嗎?我清楚地看到那裏的代碼,但沒有機會工作:https://bitbucket.org/mjs7231/django-dbbackup/src/4702d2cf91987fd8a4122b95afca5d42cd477d00/dbbackup/storage/s3_storage.py?at=default#cl-56 – vartec

+0

@karthikr - 這將工作,但這些命令是特定於Postgres的;如果基礎數據庫發生變化,我將不得不重寫腳本。 – trubliphone

回答

16

對於定期備份,我會選擇使用PostgreSQL自帶的本地工具,因爲它可能是最有效的。

我認爲選項2主要涉及創建表和加載初始數據,因此不適合備份。

選項3可以用於備份,如果您需要遷移到另一個數據庫平臺,由於數據以非SQL形式(即Django可以理解的JSON)轉儲,因此特別有用。

選項4插件似乎使用DB自己的備份工具(按選擇1),但另外提供了幫助您備份推入雲存儲在亞馬遜S3或Dropbox的

+1

我最終編寫了自己的Python腳本來備份/恢復數據庫。他們從Django的設置模塊中讀取數據,找出它的類型。目前,它只支持postgres。但有其他格式的鉤子。 – trubliphone

17

與選擇1-3的問題該媒體文件(任何通過FileField上傳的內容)都是不包含在備份中的。可以單獨備份包含媒體文件的目錄。但是,由於Django在不再被FileField引用時不會刪除文件,因此您不可避免地會在備份中生成不需要存在的文件。

這就是爲什麼我會選擇#4。特別是,我推薦django-archive*。它的一些特性包括:

  • 轉儲所有重要車型的內容(默認情況下ContentTypePermissionSession被排除在外,因爲它們是由manage.py migrate填充),並允許您選擇其他車型排除。

  • 包括由FileFieldImageField字段引用的媒體文件。請注意,只有包含數據庫中的行引用的文件;被刪除行留下的文件將被忽略。

  • 生成包含數據庫備份和媒體文件的單個存檔。

  • 提供用於自定義存檔應該存儲的位置,文件名格式和存檔類型(gzbz2)的選項。

安裝是如果需要的話加入django_archiveINSTALLED_APPS和設置在settings.py選項一樣簡單。安裝後,您可以立即運行創建整個數據庫(包括媒體文件)的歸檔:

./manage.py archive 

* 免責聲明:我的包

+1

這是一個很好的觀點。對於我的特定項目,我不必擔心媒體文件。但其他用戶可能會發現你的軟件包有用。 – trubliphone