{{< details >}}
- Tier: 基础版,专业版,旗舰版
- Offering: 私有化部署
{{< /details >}}
本页面包含极狐GitLab 支持团队在故障排除时使用的有关 PostgreSQL 的信息。极狐GitLab 公开此信息,以便任何人都可以利用支持团队收集的知识。
{{< alert type=”warning” >}}
此处记录的某些过程可能会破坏您的极狐GitLab 实例。使用风险自负。
{{< /alert >}}
如果您使用的是付费版本,并且不确定如何使用这些命令,请联系支持以获得您所遇到的任何问题的帮助。
启动数据库控制台
{{< tabs >}}
{{< tab title=”Linux package (Omnibus)” >}}
推荐用于:
- 单节点实例。
- 扩展或混合环境中的 Patroni 节点,通常是主节点。
- 扩展或混合环境中运行 PostgreSQL 服务的服务器。
sudo gitlab-psql
在单节点实例或 Web 或 Sidekiq 节点上,您也可以使用 Rails 数据库控制台,但初始化时间较长:
sudo gitlab-rails dbconsole --database main
{{< /tab >}}
{{< tab title=”Docker” >}}
docker exec -it <container-id> gitlab-psql
{{< /tab >}}
{{< tab title=”Self-compiled (source)” >}}
使用 您的 PostgreSQL 安装中的 psql
命令。
sudo -u git -H psql -d gitlabhq_production
{{< /tab >}}
{{< tab title=”Helm chart (Kubernetes)” >}}
- 如果您运行混合环境,并且 PostgreSQL 在 Linux 打包安装 (Omnibus) 上运行,推荐的方法是在这些服务器上本地使用数据库控制台。请参阅 Linux 软件包的详细信息。
- 使用您外部第三方 PostgreSQL 服务的一部分控制台。
- 在工具箱 pod 中运行
gitlab-rails db-console
。- 有关详细信息,请参阅我们的 Kubernetes 备忘单。
{{< /tab >}}
{{< /tabs >}}
要退出控制台,请输入:quit
。
其他极狐GitLab PostgreSQL 文档
本节用于链接到极狐GitLab 文档中其他地方的信息。
程序
-
Linux 包安装的数据库程序,包括:
- SSL:启用、禁用和验证。
- 启用预写日志 (WAL) 归档。
- 使用外部(非 Omnibus)PostgreSQL 安装;并备份。
- 使用 TCP/IP 监听,或者同时使用套接字。
- 在其他位置存储数据。
- 破坏性地重新播种极狐GitLab 数据库。
- 更新打包的 PostgreSQL 的指南,包括如何阻止其自动更新。
-
从CI runner 中使用 PostgreSQL。
-
PostgreSQL 扩展
- 包括 故障排除
gitlab-ctl patroni check-leader
和 PgBouncer 错误。
- 包括 故障排除
-
开发人员数据库文档,其中一些绝对不适用于生产环境。包括:
- 理解 EXPLAIN 计划。
支持主题
数据库死锁
参考资料:
- 如果实例被推送泛滥,可能会发生死锁。提供了有关极狐GitLab 代码在不寻常情况下如何产生这种意外效果的背景信息。
ERROR: deadlock detected
我们推荐的设置如下:
deadlock_timeout = 5s
statement_timeout = 15s
idle_in_transaction_session_timeout = 60s
“如果遇到死锁,并且我们通过在短时间后中止事务来解决它,那么我们已经拥有的重试机制将使死锁的工作再次尝试,而不太可能连续多次死锁。”
{{< alert type=”note” >}}
在支持中,我们对重新配置超时(也适用于 HTTP 堆栈)的总体方法是,临时作为解决方案是可以接受的。如果它使极狐GitLab 对客户可用,那么它就为更全面地理解问题、实施热修复或进行其他解决根本原因的更改争取了时间。通常,在解决根本原因后,超时应恢复到合理的默认值。
{{< /alert >}}
在这种情况下,我们从开发中得到的指导是降低 deadlock_timeout
或 statement_timeout
,但将第三个设置保持在 60 秒。设置 idle_in_transaction
可以保护数据库免受可能挂起的会话影响。
PostgreSQL 默认值:
-
statement_timeout = 0
(永不) -
idle_in_transaction_session_timeout = 0
(永不)
对于所有 Linux 软件包安装,这两者都应至少设置为几分钟的时间(以免无限期挂起)。但是,statement_timeout
为 15 秒非常短,只有在底层基础设施非常高效的情况下才有效。
查看当前设置:
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 以使更改生效。
{{< alert type=”note” >}}
这些是 Linux 软件包设置。如果使用外部数据库,例如客户的 PostgreSQL 安装或 Amazon RDS,这些值不会被设置,必须在外部设置。
{{< /alert >}}
暂时更改语句超时
{{< alert type=”warning” >}}
以下建议不适用于启用PgBouncer的情况,因为更改的超时可能会影响比预期更多的事务。
{{< /alert >}}
在某些情况下,可能希望设置不同的语句超时,而无需重新配置极狐GitLab ,这在这种情况下将重启 Puma 和 Sidekiq。
例如,备份可能会因输出中的以下错误而失败备份命令,因为语句超时太短:
pg_dump: error: Error message from server: server closed the connection unexpectedly
您还可能在PostgreSQL 日志中看到错误:
canceling statement due to statement timeout
要暂时更改语句超时:
- 在编辑器中打开
/var/opt/gitlab/gitlab-rails/etc/database.yml
- 将
statement_timeout
的值设置为0
,这设置为无限制的语句超时。 -
在新的 Rails 控制台会话中确认该值已被使用:
sudo gitlab-rails runner "ActiveRecord::Base.connection_config[:variables]"
- 执行您需要不同超时的操作(例如备份或 Rails 命令)。
- 恢复对
/var/opt/gitlab/gitlab-rails/etc/database.yml
的编辑。
观察 (RE)INDEX 进度报告
在某些情况下,您可能希望观察 CREATE INDEX
或 REINDEX
操作的进度。例如,您可以这样做以确认 CREATE INDEX
或 REINDEX
操作是否处于活动状态,或检查操作处于哪个阶段。
先决条件:
- 您必须使用 PostgreSQL 版本 12 或更高版本。
要观察 CREATE INDEX
或 REINDEX
操作:
- 使用内置的
pg_stat_progress_create_index
视图。
例如,从数据库控制台会话中,运行以下命令:
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
:
- 使用命令
gitlab-ctl stop
停止极狐GitLab 。 -
使用以下命令将数据库置于单用户模式:
/opt/gitlab/embedded/bin/postgres --single -D /var/opt/gitlab/postgresql/data gitlabhq_production
- 在
backend>
提示符下运行VACUUM;
。此命令可能需要几分钟才能完成。 - 等待命令完成,然后按 Control + D 退出。
- 使用命令
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 问题时,您应:
- 查看常见的 Geo 错误。
-
查看您的 Geo 配置,包括:
- 重新配置主机和端口。
- 查看并修复用户和密码映射。
pg_dump
和 psql
版本不匹配
如果您收到类似此示例的错误,请阅读有关如何备份和恢复非打包的 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 - 灵活服务器上部署 PostgreSQL 可能会导致此错误:
extension "btree_gist" is not allow-listed for "azure_pg_admin" users in Azure Database for PostgreSQL