0

我们最近升级了操作系统:

$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 7.6 (Maipo)

升级后,我们在 GitLab(主要是 Postgres)方面面临很多问题。

我们的 GitLab 是 dockerized 即 GitLab(及其所有内部服务,包括 PostgreSQL)在单个容器中运行。容器没有它自己的glibc,所以它使用来自操作系统的容器。

错误:由于语句超时而取消语句

声明:
选择 relnamespace::regnamespace 作为 schemaname,relname 作为 relname,pg_total_relation_size(oid) bytes FROM pg_class WHERE relkind = 'r';

超时消息不断出现,这导致用户在访问 GitLab 时面临 502 错误。

我检查了数据库上设置的语句超时。

gitlabhq_production=# show statement_timeout;
 statement_timeout
-------------------
 1min
(1 row)

我不知道该怎么做。这可能是默认设置。这是postgres的问题吗?这是什么意思?我能做些什么来解决这个问题?

编辑:

检查pg_stat_activity并没有看到任何锁,因为服务器之前已重新启动。相同的查询现在运行良好,但我们间歇性地看到这个问题。

跑来\d pg_class检查表是否使用任何索引并检查字符串列。

gitlabhq_production=# \d pg_class
         Table "pg_catalog.pg_class"
       Column        |   Type    | Modifiers
---------------------+-----------+-----------
 relname             | name      | not null
 relnamespace        | oid       | not null
 reltype             | oid       | not null
 reloftype           | oid       | not null
 relowner            | oid       | not null
 relam               | oid       | not null
 relfilenode         | oid       | not null
 reltablespace       | oid       | not null
 relpages            | integer   | not null
 reltuples           | real      | not null
 relallvisible       | integer   | not null
 reltoastrelid       | oid       | not null
 relhasindex         | boolean   | not null
 relisshared         | boolean   | not null
 relpersistence      | "char"    | not null
 relkind             | "char"    | not null
 relnatts            | smallint  | not null
 relchecks           | smallint  | not null
 relhasoids          | boolean   | not null
 relhaspkey          | boolean   | not null
 relhasrules         | boolean   | not null
 relhastriggers      | boolean   | not null
 relhassubclass      | boolean   | not null
 relrowsecurity      | boolean   | not null
 relforcerowsecurity | boolean   | not null
 relispopulated      | boolean   | not null
 relreplident        | "char"    | not null
 relfrozenxid        | xid       | not null
 relminmxid          | xid       | not null
 relacl              | aclitem[] |
 reloptions          | text[]    |
Indexes:
    "pg_class_oid_index" UNIQUE, btree (oid)
    "pg_class_relname_nsp_index" UNIQUE, btree (relname, relnamespace)
    "pg_class_tblspc_relfilenode_index" btree (reltablespace, relfilenode)

重新索引所有表和可能的alter表会有所帮助吗?

4

1 回答 1

2

您应该检查我们的查询是否运行了一分钟,或者它是否被数据库锁阻塞。这可以从pg_stat_activity后端的行中看出,它将显示查询是否正在等待锁定(state=active并且wait_event_typewait_event表示锁定)。

如果是锁,则摆脱锁定事务。这可能是一个准备好的交易,所以也要检查这些。

如果没有锁定故障,则可能是您的索引已因操作系统升级而损坏:

由于 PostgreSQL 使用操作系统排序规则,字符串上的数据库索引按排序规则排序,并且由于 C 库中的错误修复,操作系统升级可能(并且经常会)导致排序规则更改,因此您应该在此之后重建字符串列上的所有索引升级。

您显示的语句不使用索引扫描,因此它不应该受到影响,但其他语句可能会受到影响。

另外,如果您使用的是 Docker,可能是您的容器使用了自己的未升级的 glibc,然后您不受影响。

于 2019-06-21T05:29:56.120 回答