Django管理命令,用于使用DATABASES设置备份和恢复PostgreSQL数据库。
项目描述
Django PostgreSQL Copy
该包django-pg-copy
提供Django管理命令,用于备份和恢复PostgreSQL数据库。这些命令是为了将生产数据库复制到开发环境中而开发的,以便开发人员可以共享图像或使本地开发数据库保持最新。它也可以用于为不同的分支创建不同的本地数据库,并在调整模型以符合需求后仅创建一个迁移。
我们还与Jenkins一起使用它来自动备份生产环境,并将数据恢复到预发布数据库环境中,这样我们就可以反复测试新迁移,以确保它们在生产环境中运行时能够正常工作。
安装
pip安装django-pg-copy
然后,将 'pg_copy',
添加到您的 INSTALLED_APPS
列表中。建议在所有环境(开发、生产)中使用,以便您可以使用它对数据库的不同实例进行操作。
设置
PG_COPY_BACKUP_PATH = 'db_backup'
默认情况下,PostgreSQL 文件备份将存储在运行命令的目录 db_backup
中。此设置将覆盖该位置。
如果路径位于您的版本控制仓库中,建议将此路径添加到 .gitignore
文件中。
参数
--database
:指定要备份或从其恢复的数据库的设置。--db-override
:一个用于覆盖发送给 psql 的 db 参数的值。--host-override
:一个用于覆盖发送给 psql 的 host 参数的值。--pg-home
:如果 PostgreSQL 安装不在您的路径上,则指定 PostgreSQL 安装路径。--file
,-f
:备份到的文件名或恢复的文件名。--jobs
,-j
:要运行的并行作业数。这可以显著提高备份和恢复的速度。在备份时,必须使用--directory
选项。小心! 这也将创建多个数据库连接,可能会降低您的数据库速度。--directory
,-d
:从目录恢复。当使用时将覆盖--file
。
pg_backup
仅有的备份参数
--ignore-table
,-i
:在备份过程中完全排除表。可以传递多个表:-i bigtable1 -i bigtable2
--exclude-table-data
,-e
:在备份过程中排除表数据。可以传递多个表:-e bigtable1 -e bigtable2
pg_restore
仅有的恢复参数
--no-drop
:在不执行DROP OWNED BY
操作的情况下恢复数据库。--no-confirm
:在不确认的情况下恢复数据库:小心!不要覆盖您的生产数据库!(问我怎么知道的。)
示例命令
python manage.py pg_backup
使用 DATABASES
的 default
设置在 ./db_backup/
目录(或使用 PG_COPY_BACKUP_PATH
指定的目录)中创建一个名为 [timestamp].sqlc
的备份文件,使用由 manage.py
解析的默认 Django 设置文件。
python manage.py pg_backup --directory=/tmp/pg_backup --jobs=8
此命令将在 /tmp/backup
创建一个备份目录,使用 8 个并行作业和数据库连接。这通常要快得多。
python manage.py pg_backup --settings=config.settings.production --database=default --filename=my_backup.sqlc
此命令将在与 manage.py
相同的目录中创建一个名为 my_backup.sqlc
的备份文件,使用 DATABASES
的 default
设置和位于 config/settings/production.py
的 Django 设置文件。
python manage.py pg_backup -i bigtable1 -i bigtable2
这将与前面的命令执行相同,但会省略名为 bigtable1
和 bigtable2
的表。
python manage.py pg_backup -e bigtable1 -e bigtable2
这将与前面的命令执行相同,但包括名为 bigtable1
和 bigtable2
的表的结构,而不包含任何数据。
python manage.py pg_restore
此命令将在 PG_COPY_BACKUP_PATH
中列出可以恢复的备份文件。选择一个备份文件后,它将确认用户是否想要覆盖目标数据库,显示将从中覆盖哪些服务器和数据库的设置。以下是它将看起来像什么
(venv) [django-project]$ ./manage.py pg_restore
There are 8 backup files in '/var/dev/username/django-project/db_backup'. Which would you like to restore?
1: 2020-05-27-13-33-38.sqlc
2: 2020-05-10-09-07-45.sqlc
3: 2020-05-11-13-05-49.sqlc
4: 2020-07-14-15-21-22.sqlc
5: 2020-05-15-08-31-59.sqlc
6: 2020-06-11-13-11-00.sqlc
7: 2020-06-02-13-28-09.sqlc
8: 2020-05-27-14-54-15.sqlc
Enter number of the file to restore: 4
About to restore 'django_project_db' on host 'localhost' from the file:
'/var/dev/username/django-project/db_backup/2020-07-14-15-21-22.sqlc'.
THIS WILL OVERWRITE THE DATABASE.
Type "yes" to start the restore [no]: yes
python manage.py pg_restore --filename=my_file.sqlc --no-confirm
此命令将读取 my_file.sqlc
文件,并跳过用户想要覆盖目标数据库的确认。
python manage.py pg_restore --directory=/tmp/pg_backup --jobs=8
此命令将使用 8 个并行作业和数据库连接从 /tmp/pg_backup
目录恢复。
已知问题
pg_restore
期间显示的错误
在恢复过程中,PostgreSQL的pg_restore
命令可能会输出一些警告和错误。我还没有找到可以使这些警告消失的命令行选项,但如果你阅读它们,它们很可能可以忽略。以下是一些这些错误可能的样子
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1; 3079 13792 EXTENSION plpgsql
pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of extension plpgsql
Command was: DROP EXTENSION IF EXISTS plpgsql;
pg_restore: [archiver (db)] Error from TOC entry 6; 2615 2200 SCHEMA public postgres
pg_restore: [archiver (db)] could not execute query: ERROR: must be owner of schema public
Command was: DROP SCHEMA IF EXISTS public;
pg_restore: [archiver (db)] could not execute query: ERROR: schema "public" already exists
Command was: CREATE SCHEMA public;
这些可能是未使用的扩展的错误,或者关于已经存在的默认架构的警告。
发布说明
维护者和贡献者
该软件包由 Wharton Research Data Services 的员工维护。我们很高兴 Wharton School 允许我们为开源项目做出贡献。我们根据项目的需要添加功能,并尽可能跟上问题和拉取请求。由于时间限制(我们的全职工作!),没有拉取请求的功能请求可能无法实现,但我们始终欢迎新想法,并对贡献者和用户表示感谢。