Как создать резервную копию django db

У меня есть приложение Django, использующее Postgres db. Мне нужно иметь возможность резервного копирования и восстановления db - как для того, чтобы не потерять данные, так и иметь возможность копировать данные с производственного сервера на сервер разработки во время тестирования.

Кажется, есть несколько способов сделать это:

1) Просто взаимодействуйте с db напрямую. Итак, для Postgres я могу написать script с помощью pg_dumpall и psql.

2) Используйте команды "sqlclear/sqlall", которые поставляются с Django.

3) Используйте команды "dumpdata/loaddata", которые поставляются с Django. Итак, создайте новые светильники из db, которые вы хотите создать, и затем загрузите их в db, который хотите восстановить.

4) Используйте плагин Django, например django-dbbackup.

Я действительно не понимаю плюсы и минусы этих разных методов.

Как раз в верхней части моей головы вариант 1 имеет значение db, а опция 3 больше подходит для настройки исходных данных. Но я все еще не уверен, какие преимущества у опции 4 есть над вариантом 2.

Спасибо.

Ответ 1

Для регулярных резервных копий я бы выбрал вариант 1, используя собственный собственный инструмент PostgreSQL, так как он, вероятно, наиболее эффективен.

Я бы сказал, что вариант 2 в первую очередь связан с созданием таблиц и загрузкой исходных данных, поэтому не подходит для резервного копирования.

Вариант 3 может использоваться для резервного копирования и будет особенно полезен, если вам нужно будет перейти на другую платформу базы данных, поскольку данные будут сбрасываться в форме, отличной от SQL, то есть JSON, понятной Django.

В варианте 4 плагин, по-видимому, использует собственные средства резервного копирования db (в соответствии с опцией 1), но дополнительно предоставляет помощь для резервного копирования ваших резервных копий в облачное хранилище в Amazon S3 или Dropbox

Ответ 2

Проблема с вариантами 1-3 заключается в том, что медиа файлы (все, что загружено через FileField) не включены в резервную копию. Можно отдельно зарезервировать каталог, содержащий файлы мультимедиа. Однако, поскольку Django не удаляет файлы, когда они больше не ссылаются на FileField, вы неизбежно окажетесь в резервных копиях, которые не должны быть там.

Вот почему я бы пошел с опцией №4. В частности, я рекомендую django-archive *. Некоторые из его функций включают в себя:

  • Сбрасывает содержимое всех важных моделей (по умолчанию ContentType, Permission и Session исключаются, так как они заполняются manage.py migrate) и позволяют выбирать дополнительные модели для исключения.

  • Включает медиафайлы, на которые ссылаются поля FileField и ImageField. Обратите внимание, что включены только файлы, на которые ссылаются строки в базе данных; файлы, оставленные удаленными строками, игнорируются.

  • Создает один архив, содержащий как резервные копии базы данных, так и медиафайлы.

  • Предоставляет параметры для настройки места хранения архивов, формата имени файла и типа архива (gz и bz2).

Установка выполняется так же просто, как добавление django_archive в INSTALLED_APPS и настройка параметров в settings.py при необходимости. После установки вы можете сразу создать архив всей своей базы данных (включая медиафайлы), выполнив:

./manage.py archive

* Отказ от ответственности: Я являюсь автором пакета