我正在使用 Django,但每隔一段时间我就会收到此错误:
IntegrityError:重复键值违反唯一约束“myapp_mymodel_pkey”
详细信息:键(id)=(1)已经存在。
我的 Postgres 数据库实际上有一个主键为 1的myapp_mymodel对象。
为什么 Postgres 会尝试再次使用该主键?或者,这很可能是我的应用程序(或 Django 的 ORM)导致的吗?
刚才这个问题又连续出现了3次。我发现,当它确实发生时,对于给定的表,它会连续发生一次或多次,然后不会再次发生。它似乎在每张桌子完全停止数天之前发生,当它确实发生时每张桌子至少发生一分钟左右,并且只是间歇性地发生(不是所有桌子都立即发生)。
这个错误是如此间歇性的(在 2 周内仅发生 3 次左右 - 数据库上没有其他负载,只是我测试了我的应用程序)这一事实让我对低级问题如此警惕。
我想在位于我的主要物理数据库服务器下的物理服务器上设置一个备份数据库。我正在使用 Postgres 9.2,并且我想使用同步流复制(用于原子性),但我完全不知道诸如A)初始表设置如何从服务器 1 传输到服务器 2(例如,我运行syncdb
来自我的 Django 应用程序,它在服务器 1) 上创建了一系列表),以及B)如何将持续的架构更改从服务器 1 传送到服务器 2(例如,我运行 Django South 迁移,它发送ALTER TABLE
查询,以及添加/删除索引等)。这些事情是通过流式复制透明地处理的,还是我必须做些什么才能影响两台服务器之间的这种变化?
apt-get
安装了 Postgres 9.2.4(使用 PPA)。pg_dropcluster --stop 9.2 main
删除默认的数据库集群,因为我打算在刚刚挂载的单独 SSD 卷(一个 Rackspace 块存储卷)上创建一个新集群。ps
显示为该新集群运行的所有正常 Postgres 进程,我能够打开 Postgres shell 并运行 SQL - 即它运行良好)。现在,当我运行时pg_lsclusters
,没有列出任何内容。main
在我删除它之前,集群列出得很好。为什么我的新集群不显示,即使它正在运行?我什至重新启动了服务器(以防万一)。
我有一个animal
带有的表name
varchar(255)
,并且我添加了具有以下值的行:
Piranha
__Starts With 2
Rhino
Starts With 1
0_Zebra
_Starts With 1
Antelope
_Starts With 1
Run Code Online (Sandbox Code Playgroud)
当我运行此查询时:
zoology=# SELECT name FROM animal ORDER BY name;
name
-----------------
0_Zebra
Antelope
Piranha
Rhino
_Starts With 1
_Starts With 1
Starts With 1
__Starts With 2
(8 rows)
Run Code Online (Sandbox Code Playgroud)
注意行是如何按顺序排序的,这意味着使用前导_
将_Starts With 1
行放在行之前Starts
,但__
in__Starts With 2
似乎忽略了这一事实,好像2
末尾比前两个字符更重要。
为什么是这样?
如果我用 Python 排序,结果是:
In [2]: for animal in sorted(animals):
....: print …
Run Code Online (Sandbox Code Playgroud) 多年来我注意到的一种常见模式是,人们倾向于随着数据大小的增加而不断增加工作内存,因此更复杂的查询仍然可以充分利用内存速度,但对于某些极端任务(例如,报告)。
仅对一些很少运行的异常查询大幅增加该数字可能是有利的。例如,我可能想保持work_mem
在例如。8 MB 用于正常操作,然后使用具有 250 MB 工作内存之类的特定客户端/用户运行特定查询,以便我可以在单个会话期间完全在内存中快速执行重大操作。
这可能吗?我是否完全不考虑将其视为解决方案?
postgresql ×5
constraint ×1
memory ×1
natural-sort ×1
order-by ×1
primary-key ×1
replication ×1
schema ×1