簡體   English   中英

具有dumpdata和遷移的Django備份策略

[英]Django backup strategy with dumpdata and migrations

這個問題中 ,我為我的數據庫設置了一個基於dumpdata的備份系統。 該設置類似於運行調用dumpdata的cron腳本並將備份移動到遠程服務器,目的是簡單地使用loaddata來恢復數據庫。 但是,我不確定它是否適合遷移 loaddata現在有一個ignorenonexistent開關來處理已刪除的模型/字段,但它無法解決使用一次性默認值添加列或應用RunPython代碼的情況。

我看到它的方式,有兩個子問題需要解決:

  • 使用每個應用程序的當前版本標記每個dumpdata輸出文件
  • 將夾具拼接到遷移路徑中

我不知道如何在不引入大量開銷的情況下解決第一個問題。 是否足以為每個包含{app_name: migration_number}映射的備份保存額外文件?

一旦第一個問題得到解決,我認為第二個問題就更容易了,因為這個過程大致是:

  1. 創建一個新數據庫
  2. 將遷移運行到每個應用程序的適當位置
  3. 使用給定的fixture文件調用loaddata
  4. 運行其余的遷移

這個問題中有一些代碼(從錯誤報告中鏈接),我認為可以為此目的進行調整。

由於這些是數據庫的相當規則/大型快照,因此我不希望將它們作為數據遷移使遷移目錄混亂。

我正在采取以下步驟在我的項目的任何實例之間備份,恢復或傳輸我的postgresql數據庫:

我們的想法是保持盡可能少的遷移,就像第一次在空數據庫上運行manage.py makemigrations

假設我們的開發環境有一個工作數據庫。 此數據庫是生產數據庫的當前副本, 不應對任何更改開放 我們添加了模型,更改了屬性等,這些操作已經生成了額外的遷移。

現在,數據庫已准備好遷移到生產環境 - 如前所述 - 不向公眾開放,因此不會以任何方式進行更改。 為了實現這個目標:

  • 我在開發環境中執行正常的過程
  • 我將項目復制到生產環境。
  • 我在生產環境中執行正常的過程

我們在開發環境中進行了更改。 生產數據庫中不應發生任何更改,因為它們將被覆蓋

正常程序

在其他任何事情之前,我有一個項目目錄的備份(其中包括一個requirements.txt文件),數據庫的備份和 - 當然 - git是我的一個朋友。

  1. 我需要一個dumpdata備份以備dumpdata 但是, dumpdata在內容類型,權限或應使用自然外鍵的其他情況下有一些嚴重的 限制

     ./manage.py dumpdata --exclude auth.permission --exclude contenttypes --exclude admin.LogEntry --exclude sessions --indent 2 > db.json 
  2. 我使用pg_dump備份:

     pg_dump -U $user -Fc $database --exclude-table=django_migrations > path/to/backup-dir/db.dump 
  3. 我刪除了每個應用程序的所有遷移。

    在我的例子中, migrations文件夾是符號鏈接,因此我使用以下腳本:

     #!/bin/bash for dir in $(find -L -name "migrations") do rm -Rf $dir/* done 
  4. 我刪除並重新創建數據庫:

    例如,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 ;'" 
  5. 我從轉儲中恢復數據庫:

     pg_restore -Fc -U $username -d $database path/to/backup-dir/db.dump 
  6. 我通過以下方式創建遷移:

     ./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 
  7. 我使用虛假遷移進行遷移:

     ./manage.py migrate --fake 

如果出現問題,一切都是***,(確實會發生這種情況),我可以使用備份將所有內容恢復到以前的工作狀態。 如果我想使用第一步中的db.json文件,它會像這樣:

當pg_dump或pg_restore失敗時

我執行的步驟:

  • 3(刪除遷移)
  • 4(刪除並重新創建數據庫)
  • 6(makemigrations)

然后:

  • 應用遷移:

     ./manage.py migrate 
  • 從db.json加載數據:

     ./manage.py loaddata path/to/db.json 

然后我試着找出為什么我之前的努力沒有成功。

成功執行這些步驟后,我將項目復制到服務器並對該框執行相同的操作。

這樣,我總是保持最少的遷移次數,並且我能夠將pg_dumppg_restore用於共享同一項目的任何框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM