PostgreSQL

本页面包含极狐GitLab 支持团队在故障排除时使用的有关 PostgreSQL 的信息。极狐GitLab 公开这些信息,以便任何人都可以利用支持团队收集的知识。

caution此处记录的一些过程可能会破坏您的极狐GitLab 实例。请自行承担风险使用。

如果您使用的是付费版本并且不确定如何使用这些命令,请联系支持以获取您遇到的任何问题的帮助。

启动数据库控制台

::Tabs

:::TabTitle Linux package (Omnibus)

推荐用于:

  • 单节点实例。
  • 在 Patroni 节点上扩展或混合环境,通常是领导者。
  • 在运行 PostgreSQL 服务的服务器上扩展或混合环境。
sudo gitlab-psql

在单节点实例或 Web 或 Sidekiq 节点上,您也可以使用 Rails 数据库控制台,但初始化时间较长:

sudo gitlab-rails db-console --database main

:::TabTitle Docker

docker exec -it <container-id> gitlab-psql

:::TabTitle Self-compiled (source)

使用 您的 PostgreSQL 安装 中的 psql 命令。

sudo -u git -H psql -d gitlabhq_production

:::TabTitle Helm chart (Kubernetes)

  • 如果您运行混合环境,并且 PostgreSQL 运行在 Linux 打包安装 (Omnibus) 上,建议的方法是在这些服务器上本地使用数据库控制台。请参阅有关 Linux 软件包的详细信息。
  • 使用您外部第三方 PostgreSQL 服务的一部分控制台。
  • 在工具箱 pod 中运行 gitlab-rails db-console

::EndTabs

要退出控制台,请键入:quit

其他极狐GitLab PostgreSQL 文档

本节用于链接到极狐GitLab 文档中其他地方的信息。

程序

支持主题

数据库死锁

参考:

  • 如果实例被推送淹没,可能会发生死锁。提供的上下文是关于极狐GitLab 代码如何在不寻常情况下产生这种意想不到的效果。
ERROR: deadlock detected

确定了三个适用的超时;我们推荐的设置如下:

deadlock_timeout = 5s
statement_timeout = 15s
idle_in_transaction_session_timeout = 60s

“如果遇到死锁,并且我们在短时间后通过中止事务来解决它,那么我们已经拥有的重试机制将使死锁的工作重新尝试,并且我们不太可能连续多次死锁。”

note在支持中,我们对重新配置超时的通用方法(也适用于 HTTP 堆栈)是暂时作为一种解决方法是可接受的。如果它使极狐GitLab 对客户可用,那么它就为更全面地理解问题、实施热修复或进行其他解决根本原因的更改赢得了时间。通常,在解决根本原因后,应将超时恢复到合理的默认值。

在这种情况下,我们从开发中得到的指导是降低 deadlock_timeoutstatement_timeout,但将第三个设置保留在 60 秒。设置 idle_in_transaction 保护数据库免于会话可能挂起数天。

PostgreSQL 默认值:

  • statement_timeout = 0(永不)
  • idle_in_transaction_session_timeout = 0(永不)

查看当前设置:

sudo gitlab-rails runner "c = ApplicationRecord.connection ; puts c.execute('SHOW statement_timeout').to_a ;
puts c.execute('SHOW deadlock_timeout').to_a ;
puts c.execute('SHOW idle_in_transaction_session_timeout').to_a ;"

可能需要一些时间来响应。

{"statement_timeout"=>"1min"}
{"deadlock_timeout"=>"0"}
{"idle_in_transaction_session_timeout"=>"1min"}

可以在 /etc/gitlab/gitlab.rb 中更新这些设置:

postgresql['deadlock_timeout'] = '5s'
postgresql['statement_timeout'] = '15s'
postgresql['idle_in_transaction_session_timeout'] = '60s'

保存后,重新配置极狐GitLab,使更改生效。

note这些是 Linux 软件包设置。如果使用外部数据库,如客户的 PostgreSQL 安装或 Amazon RDS,则这些值不会设置,必须在外部设置。

临时更改语句超时

caution以下建议不适用于启用 PgBouncer 的情况,因为更改的超时可能会影响更多事务。

在某些情况下,可能希望设置不同的语句超时,而无需重新配置极狐GitLab,这在这种情况下将重新启动 Puma 和 Sidekiq。

例如,备份可能会由于语句超时过短而在备份命令的输出中出现以下错误:

pg_dump: error: Error message from server: server closed the connection unexpectedly

您可能还会在 PostgreSQL 日志 中看到错误:

canceling statement due to statement timeout

要临时更改语句超时:

  1. 在编辑器中打开 /var/opt/gitlab/gitlab-rails/etc/database.yml
  2. statement_timeout 的值设置为 0,这将设置为无限制的语句超时。
  3. 在新的 Rails 控制台会话中确认 使用了此值:

    sudo gitlab-rails runner "ActiveRecord::Base.connection_config[:variables]"
    
  4. 执行需要不同超时的操作(例如备份或 Rails 命令)。
  5. 恢复对 /var/opt/gitlab/gitlab-rails/etc/database.yml 的编辑。

观察 (RE)INDEX 进度报告

在某些情况下,您可能希望观察 CREATE INDEXREINDEX 操作的进度。例如,您可以这样做以确认 CREATE INDEXREINDEX 操作是否处于活动状态,或检查操作处于哪个阶段。

先决条件:

  • 您必须使用 PostgreSQL 版本 12 或更高版本。

要观察 CREATE INDEXREINDEX 操作:

例如,从数据库控制台会话中运行以下命令:

SELECT * FROM  pg_stat_progress_create_index \watch 0.2

故障排除

数据库不接受命令以避免环绕数据丢失

此错误可能意味着 autovacuum 无法完成其运行:

ERROR:  database is not accepting commands to avoid wraparound data loss in database "gitlabhq_production"

或者

 ERROR:  failed to re-find parent key in index "XXX" for deletion target page XXX

要解决此错误,请手动运行 VACUUM

  1. 使用命令 gitlab-ctl stop 停止极狐GitLab。
  2. 使用以下命令将数据库置于单用户模式:

    /opt/gitlab/embedded/bin/postgres --single -D /var/opt/gitlab/postgresql/data gitlabhq_production
    
  3. backend> 提示符下,运行 VACUUM;。此命令可能需要几分钟才能完成。
  4. 等待命令完成,然后按 Control + D 退出。
  5. 使用命令 gitlab-ctl start 启动极狐GitLab。

极狐GitLab 数据库要求

请参阅数据库要求并查看和安装所需的扩展列表

production/sidekiq 日志中的序列化错误

如果您在 production/sidekiq 日志中收到类似此示例的错误,请阅读有关default_transaction_isolation 设置为已提交读取的信息,以解决问题:

ActiveRecord::StatementInvalid PG::TRSerializationFailure: ERROR:  could not serialize access due to concurrent update

PostgreSQL 复制槽错误

如果您收到类似此示例的错误,请阅读有关如何解决 PostgreSQL HA 复制槽错误的信息:

pg_basebackup: could not create temporary replication slot "pg_basebackup_12345": ERROR:  all replication slots are in use
HINT:  Free one or increase max_replication_slots.

Geo 复制错误

如果您收到类似此示例的错误,请阅读有关如何解决 Geo 复制错误的信息:

ERROR: replication slots can only be used if max_replication_slots > 0

FATAL: could not start WAL streaming: ERROR: replication slot "geo_secondary_my_domain_com" does not exist

Command exceeded allowed execution time

PANIC: could not write to file 'pg_xlog/xlogtemp.123': No space left on device

检查 Geo 配置和常见错误

在处理 Geo 问题时,您应该:

pg_dumppsql 版本不匹配

如果您收到类似此示例的错误,请阅读有关如何备份和恢复非打包的 PostgreSQL 数据库的信息:

Dumping PostgreSQL database gitlabhq_production ... pg_dump: error: server version: 13.3; pg_dump version: 14.2
pg_dump: error: aborting because of server version mismatch

扩展 btree_gist 未在允许列表中

在 Azure Database for PostgreSQL - Flexible Server 上部署 PostgreSQL 可能会导致此错误:

extension "btree_gist" is not allow-listed for "azure_pg_admin" users in Azure Database for PostgreSQL

要解决此错误,请在安装前允许列出扩展