情况 我有一个 postgresql 9.2 数据库,它一直都在大量更新。因此系统受 I/O 限制,我目前正在考虑进行另一次升级,我只需要一些关于从哪里开始改进的指导。
以下是过去 3 个月情况的图片:

如您所见,更新操作占磁盘利用率的大部分。这是另一张更详细的 3 小时窗口中情况的图:

如您所见,峰值写入速率约为 20MB/s
软件
服务器运行 ubuntu 12.04 和 postgresql 9.2。更新类型通常在由 ID 标识的单个行上进行小更新。例如UPDATE cars SET price=some_price, updated_at = some_time_stamp WHERE id = some_id。我已经尽可能多地删除和优化了索引,并且服务器配置(linux 内核和 postgres conf)也非常优化。
硬件 硬件是一个专用服务器,带有 32GB ECC ram、RAID 10 阵列中的 4 个 600GB 15.000 rpm SAS 磁盘,由带有 BBU 的 LSI RAID 控制器和英特尔至强 E3-1245 四核处理器控制。
问题
- - - - - - - - - - - - - - - 更新 …
令我大吃一惊(而且令人担忧)的是,我刚刚意识到我的表有数百万行,只有几行,其中主键 (ID) 是重复的!我不明白这怎么会发生,以及我将来如何防止它?
保存主键的列是,并且一直受制于 CONSTRAINT fruits_pkey PRIMARY KEY(id);
我在 ubuntu 上运行 postgreql 9.3.4。
更新
@Mat:数据类型是integer
@ypercube:是的,select count(*) from (select count(*) from fruits group by id having count(*) > 1) as t1返回41。
@Craig:是的,我之前做过故障转移,我的slave实际上是9.3.3
似乎我被 postgresql 9.3.4 的发行说明中描述的第一个错误所困扰:http : //www.postgresql.org/docs/devel/static/release-9-3-4.html
我现在有例如重复的主键。对所有约束(pkeys、fkeys)进行重新检查循环的最佳方法是什么 -> 修复问题 -> 再次检查以确保我的数据正常?
更新
我决定通过删除所有约束来解决问题,然后使用以下方法重新创建它们http://blog.hagander.net/archives/131-Automatically-dropping-and-creating-constraints.html。但是我目前被困在一条错误消息上,试图重新创建一个 pkey:
ERROR: failed to find parent tuple for heap-only tuple at (1192248,5) in table "fruits"
CONTEXT: SQL statement "ALTER TABLE "pm"."fruits" ADD CONSTRAINT "fruits_pkey" PRIMARY KEY (id)"
Run Code Online (Sandbox Code Playgroud)
这是什么意思,我该如何解决这个问题(如果可以的话,我可以忍受删除它)?
另一个问题:如果我只是通过删除重复行来摆脱它们,然后执行 pg_dump,并从该转储中恢复数据库,那么我的数据实际上是否一切正常。它会重建数据结构 - 对吗?
postgresql foreign-key constraint primary-key postgresql-9.3
我正在运行一个汽车搜索引擎。它由 postgresql 9.3 安装支持。
现在我不确定对前端搜索进行索引优化的最佳方法/策略。
问题:
包含汽车的表包含大约 150 万行。搜索汽车的人需要不同的搜索条件。有的按品牌/型号搜索,有的按年份搜索,有的按里程搜索,有的按价格搜索,有的按特殊设备搜索,等等 - 通常他们将一大堆标准结合在一起。当然,有些,如品牌/模式和价格,比其他的使用频率更高。我们总共提供:9 个类别标准,如品牌/型号或车身类型,加上 5 个数字标准,如价格或里程数,以及 12 个布尔标准,如设备。最后,人们可以按不同的列(年份、价格、里程和我们为汽车创建的分数)对结果进行排序。默认情况下,我们按照自己生成的分数进行排序。
到目前为止我所做的:
我已经“轻松”分析了标准的使用,并创建了一些索引(10)。其中包括例如价格、里程和品牌/型号的组合指数。由于我们只对显示实际待售汽车的结果感兴趣,因此将索引作为销售状态列上的部分索引。
问题:
我有一个流式复制热备用设置,它似乎运行良好。我可以登录,执行选择,结果似乎与主人是最新的。但是在备用的日志中,我看到了很多这样的:
cp: cannot stat `/mnt/wal_drive/wals/0000000100004BA800000070': No such file or directory
2014-02-28 16:00:37 CET LOG: record with zero length at 4BA8/70DD79D0
2014-02-28 16:00:37 CET LOG: started streaming WAL from primary at 4BA8/70000000 on timeline 1
2014-02-28 16:02:59 CET FATAL: could not receive data from WAL stream: SSL error: sslv3 alert unexpected message
Run Code Online (Sandbox Code Playgroud)
这些分别是什么意思,我应该担心它们中的任何一个吗?
附注。在 master 中,我看到了其中一些,我希望它们与 SSL 相关:
2014-02-28 16:10:33 CET LOG: SSL renegotiation failure
2014-02-28 16:10:33 CET LOG: SSL error: unexpected record
Run Code Online (Sandbox Code Playgroud)
我在 ubuntu 12.04 上运行 postgresql 9.3
编辑
关于 …
有谁知道设置 postgresql 9.3 从属设备来从 postgresql 9.2 主设备进行流式复制是否有问题?
postgresql ×6
performance ×2
replication ×2
constraint ×1
foreign-key ×1
hardware ×1
index ×1
index-tuning ×1
primary-key ×1
update ×1