复制Postgres目录

时间:2019-02-25 16:56:43

标签: django postgresql django-migrations

情况

我有一个django应用程序(使用postgres作为数据库)正在生产中运行。我正在尝试评估/改善性能,我想通过将生产实例中的数据(到目前为止,在数量和质量方面具有最佳数据)复制到我的本地计算机上,然后在本地运行服务器来做到这一点。 。我将数据库在生产计算机上运行的Postgres文件夹复制到我的本地计算机上(使用scp),然后从现在的本地文件夹和本地django服务器启动数据库。从功能上讲,我可以完全正常地与该应用进行交互,而不会出现任何问题。但是,一旦我对模型进行了更改,生成了迁移并尝试迁移(再次迁移到该本地版本),就会收到错误消息:

django.db.utils.IntegrityError: duplicate key value violates unique constraint "django_content_type_app_label_model_<HASH>_uniq" DETAIL: Key (app_label, model)=(<APP_NAME>, <CONTENT_TYPE>) already exists.

<APP_NAME><CONTENT_TYPE>是应用程序的特定名称和应用程序的内容类型。 content_type是一种已经存在于数据库中很长一段时间并且不受模型更改/迁移影响的类型。当我在上一段中说该应用程序“通常运行良好”时,我的意思是说我可以毫无问题地获取有关该内容类型的数据。

总的来说,这听起来像没有任何构成当前数据库的先前迁移的记录,因此,它正在尝试重新创建所有这些content_type。据我了解,以前的迁移记录应该保存在数据库中,并且由于我正在复制整个数据库目录,因此我不确定为什么它会尝试重新创建这些数据类型。关于迁移本身,我不认为这是有问题的,它只是在其中一个模型类的几个列中添加了索引。我尝试将其快速迁移到我们的QA实例,然后将其回滚,但都没有错误。当我对QA实例尝试相同的过程时(即,在本地复制QA Postgres DB目录,以尝试在从该文件夹运行的DB上运行迁移,但在我的计算机上运行),我会遇到同样的问题。

所以我的问题是,为什么要尝试重新创建此数据类型?有没有更好的方法可以复制数据?这似乎是最详尽的方法,因为它将所有内容从数据复制到用户帐户,以重新创建我要优化的确切方案。

我尝试过的事情

1)同步数据库ID序列:尽管我不认为这是基于所见错误的问题,但我还是尝试同步id_sequence(许多SO帖子推荐)以消除可能的背景问题,但无济于事。具体来说,我跑了:

SELECT setval('django_content_type_id_seq', (SELECT MAX(id) FROM django_content_type)+1);

2)停止数据库:我担心在中间副本上进行的某些DB写操作可能导致事情不同步。因此,我尝试在复制期间停止数据库,但这似乎也无济于事。

3)明确地说,我使用了pg_dump,它工作正常,但是我正在开发的系统主要由不熟悉数据库的用户使用,因此我希望将此过程模块化尽可能(例如,“仅将postgres数据目录移动并从该文件夹中运行”)

0 个答案:

没有答案