Ошибка в Kubernetes cronjob для дампа и восстановления базы данных postgres для приложения Django
Мне нужно создать среду тестирования для определенной команды, чтобы использовать наше приложение Django для тестирования на базе данных. Эта база данных должна быть в некоторой степени синхронизирована с нашей производственной базой данных. Учитывая, что у нас есть два кластера production
и staging
, мой подход заключается в следующем:
- Создайте
db_test
на промежуточном сервере Postgres .
db_test
будет периодически синхронизироваться сdb_prod
. Для этого:- Создайте cronjob в кластере
staging
, который подключается к производственной базе данных, делаетpg_dump
, а затем делаетpg_restore
кdb_test
(используяlocalhost
, поскольку он подключен через pgbouncer). - Запускаю миграции, чтобы убедиться, что таблицы актуальны .
- Далее: Мне нужно выполнить команду управления, которая сотрет некоторые данные клиентов из этой копии (чтобы соответствовать GDPR).
Желаемое поведение:
pg_dump
иpg_restore
успешно завершены, и новая база данных очищена от информации о клиентах .
Актуальное поведение:
pg_dump
иpg_restore
прошли успешно. Я могуpsql
войти во вновь созданную базу данных и все выглядит нормально.migrate
команда терпит неудачу с трассировкой нижеclean_db
не работает, потому что не может найти некоторые таблицы (которые существуют, как я проверил с помощьюpsql
.
Вот простой сценарий оболочки, который я запускаю в cronjob:
#!/bin/bash
# Dump the database locally
pg_dump --host=mydb.postgres.database.azure.com \
--username=myuser@production \
--no-owner \
--verbose \
-Ft db_prod > $HOME/db_prod-$(date +%F).tar &&
sleep 30 &&
# Restore the database
pg_restore --no-owner \
--no-acl \
--host='localhost' \
--user=myuser@staging \
--port=5432 \
--clean \
--dbname=db_test \
$HOME/db_prod-$(date +%F).tar \
--verbose &&
python manage.py migrate &&
python manage.py clean_db
- Это ошибка
clean_db
безmigrate
перед
relation "uploader_somemodel" does not exist
2
LINE 1: SELECT COUNT(*) AS "__count" FROM "uploader_somemodel...
Но это журнал создания таблицы
pg_restore: processing data for table "public.uploader_somemodel"```
- А это журнал ошибок команды
migrate
Running all migrations...
Operations to perform:
Apply all migrations: admin, auth, axes, contenttypes, django_mfa, myapp, reversion, sessions, uploader, userapi
Running migrations:
Traceback (most recent call last):
File "/opt/venv/lib/python3.8/site-packages/django/db/migrations/recorder.py", line 67, in ensure_schema
editor.create_model(self.Migration)
File "/opt/venv/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 307, in create_model
self.execute(sql, params or None)
File "/opt/venv/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 137, in execute
cursor.execute(sql, params)
File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 67, in execute
return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
return executor(sql, params, many, context)
File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
return self.cursor.execute(sql, params)
File "/opt/venv/lib/python3.8/site-packages/django/db/utils.py", line 89, in __exit__
raise dj_exc_value.with_traceback(traceback) from exc_value
File "/opt/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 82, in _execute
return self.cursor.execute(sql)
django.db.utils.ProgrammingError: no schema has been selected to create in
LINE 1: CREATE TABLE "django_migrations" ("id" serial NOT NULL PRIMA...
^
Кто-нибудь сталкивался с подобной ошибкой и знает, в чем дело? Или, еще лучше, есть ли у вас предложение, как я могу выполнить это по-другому?
Вы изменили ИМЯ db в вашей переменной env? Чтобы получить этот результат в вашем django settings.py:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': db_test,
'USER': POSTGRES_USER,
'PASSWORD': POSTGRES_PASSWORD,
'HOST': POSTGRES_HOST,
'PORT': 5432,
}
}