[英]Django backup strategy with dumpdata and migrations
在這個問題中 ,我為我的數據庫設置了一個基於dumpdata
的備份系統。 該設置類似於運行調用dumpdata
的cron腳本並將備份移動到遠程服務器,目的是簡單地使用loaddata
來恢復數據庫。 但是,我不確定它是否適合遷移 。 loaddata
現在有一個ignorenonexistent
開關來處理已刪除的模型/字段,但它無法解決使用一次性默認值添加列或應用RunPython
代碼的情況。
我看到它的方式,有兩個子問題需要解決:
dumpdata
輸出文件 我不知道如何在不引入大量開銷的情況下解決第一個問題。 是否足以為每個包含{app_name: migration_number}
映射的備份保存額外文件?
一旦第一個問題得到解決,我認為第二個問題就更容易了,因為這個過程大致是:
loaddata
這個問題中有一些代碼(從錯誤報告中鏈接),我認為可以為此目的進行調整。
由於這些是數據庫的相當規則/大型快照,因此我不希望將它們作為數據遷移使遷移目錄混亂。
我正在采取以下步驟在我的項目的任何實例之間備份,恢復或傳輸我的postgresql數據庫:
我們的想法是保持盡可能少的遷移,就像第一次在空數據庫上運行manage.py makemigrations
。
假設我們的開發環境有一個工作數據庫。 此數據庫是生產數據庫的當前副本, 不應對任何更改開放 。 我們添加了模型,更改了屬性等,這些操作已經生成了額外的遷移。
現在,數據庫已准備好遷移到生產環境 - 如前所述 - 不向公眾開放,因此不會以任何方式進行更改。 為了實現這個目標:
我們在開發環境中進行了更改。 生產數據庫中不應發生任何更改,因為它們將被覆蓋 。
在其他任何事情之前,我有一個項目目錄的備份(其中包括一個requirements.txt文件),數據庫的備份和 - 當然 - git
是我的一個朋友。
我需要一個dumpdata
備份以備dumpdata
。 但是, dumpdata
在內容類型,權限或應使用自然外鍵的其他情況下有一些嚴重的 限制 :
./manage.py dumpdata --exclude auth.permission --exclude contenttypes --exclude admin.LogEntry --exclude sessions --indent 2 > db.json
我使用pg_dump
備份:
pg_dump -U $user -Fc $database --exclude-table=django_migrations > path/to/backup-dir/db.dump
我刪除了每個應用程序的所有遷移。
在我的例子中, migrations
文件夾是符號鏈接,因此我使用以下腳本:
#!/bin/bash for dir in $(find -L -name "migrations") do rm -Rf $dir/* done
我刪除並重新創建數據庫:
例如,bash腳本可以包含以下命令:
su -l postgres -c "PGPASSWORD=$password psql -c 'drop database $database ;'" su -l postgres -c "createdb --owner $username $database" su -l postgres -c "PGPASSWORD=$password psql $database -U $username -c 'CREATE EXTENSION $extension ;'"
我從轉儲中恢復數據庫:
pg_restore -Fc -U $username -d $database path/to/backup-dir/db.dump
我通過以下方式創建遷移:
./manage.py makemigrations <app1> <app2> ... <appn>
...使用以下腳本:
#!/bin/bash apps=() for app in $(find ./ -maxdepth 1 -type d ! -path "./<project-folder> ! -path "./.*" ! -path "./") do apps+=(${app#??}) done all_apps=$(printf "%s " "${apps[@]}") ./manage.py makemigrations $all_apps
我使用虛假遷移進行遷移:
./manage.py migrate --fake
如果出現問題,一切都是***,(確實會發生這種情況),我可以使用備份將所有內容恢復到以前的工作狀態。 如果我想使用第一步中的db.json
文件,它會像這樣:
我執行的步驟:
然后:
應用遷移:
./manage.py migrate
從db.json加載數據:
./manage.py loaddata path/to/db.json
然后我試着找出為什么我之前的努力沒有成功。
成功執行這些步驟后,我將項目復制到服務器並對該框執行相同的操作。
這樣,我總是保持最少的遷移次數,並且我能夠將pg_dump
和pg_restore
用於共享同一項目的任何框。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.