簡體   English   中英

Kubernetes cronjob 為 Django 應用程序轉儲和恢復 postgres 數據庫時出錯

[英]Error in Kubernetes cronjob to dump and restore postgres database for Django application

我需要為特定團隊創建一個測試環境,以使用我們的 Django 應用程序對數據庫進行測試。 該數據庫必須與生產數據庫有點同步。 考慮到我們有兩個集群productionstaging ,我的方法如下:

  • 在登台 Postgres 服務器中創建一個db_test
  • db_test將定期與db_prod同步。 這樣做:
  • 在連接到生產數據庫的staging集群中創建一個 cronjob,執行pg_dump ,然后對db_test執行pg_restore (使用localhost因為它是通過 pgbouncer 連接的)。
  • 我運行遷移以確保表是最新的
  • 下一步:我需要運行一個管理命令,該命令將從該副本中刪除一些客戶數據(以符合 GDPR)。

期望的行為:

  • pg_dumppg_restore成功,新數據庫清除客戶信息

實際行為:

  • pg_dumppg_restore成功。 我可以psql進入新創建的數據庫,一切看起來都很好。
  • migrate命令失敗,回溯如下
  • clean_db失敗,因為它找不到一些表(它們在我用psql檢查時存在。

這是我在 cronjob 中運行的簡單 shell 腳本:

#!/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
  • 這是之前沒有migrateclean_db的錯誤
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...
                     ^

有沒有人遇到過類似的錯誤並知道這是怎么回事? 或者更好的是,您對我如何以不同的方式執行此操作有什么建議嗎?

您是否更改了 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,
    }
}

暫無
暫無

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

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