GitLab 16.7.6 备份恢复踩坑实录:从PostgreSQL权限错误到logrotate超时,我这样搞定

张开发
2026/4/19 7:10:32 15 分钟阅读

分享文章

GitLab 16.7.6 备份恢复踩坑实录:从PostgreSQL权限错误到logrotate超时,我这样搞定
GitLab 16.7.6 备份恢复实战那些官方文档没告诉你的坑上周五凌晨2点当我接到生产环境GitLab服务器硬盘故障的告警时整个人瞬间清醒。作为团队唯一的DevOps工程师我必须在天亮前完成数据迁移和恢复。本以为按照官方文档操作就能轻松搞定没想到接下来12小时里我接连遭遇了PostgreSQL权限错误、logrotate服务崩溃、扩展丢失等一系列惊喜。这篇文章就是我的完整踩坑记录希望能帮你少走弯路。1. 环境检查与准备工作在开始恢复前有几个关键点必须确认这些细节往往被大多数教程忽略版本一致性检查不要只看主版本号小版本差异也可能导致问题。我用了这个命令获取完整版本信息sudo cat /opt/gitlab/version-manifest.txt | grep -E gitlab-ce|postgresql输出示例gitlab-ce-16.7.6 postgresql-13.12特别注意如果你的备份来自不同架构的服务器比如x86到ARM还需要检查PostgreSQL二进制兼容性。服务停止顺序官方文档只说停止相关服务但顺序很重要先停Puma和Sidekiqsudo gitlab-ctl stop puma sudo gitlab-ctl stop sidekiq等待30秒后再停PostgreSQLsudo gitlab-ctl stop postgresql错误示范直接运行gitlab-ctl stop可能导致数据库损坏特别是在大型实例上。2. 备份文件处理的艺术2.1 备份文件验证拿到备份包后别急着恢复先用这个命令检查完整性sudo tar -tf /var/opt/gitlab/backups/1750765308_2025_06_24_16.7.6_gitlab_backup.tar | head -n 10健康备份应该包含这些关键目录db/repositories/uploads/2.2 配置文件迁移的隐藏陷阱迁移/etc/gitlab时这个命令可能毁掉你的系统sudo tar -xzf gitlab_conf.tar -C /正确做法是sudo mkdir -p /etc/gitlab sudo tar -xzf gitlab_conf.tar -C /etc/gitlab --strip-components1参数解释--strip-components1去掉压缩包中的顶级目录-C指定解压目标目录3. 最棘手的PostgreSQL权限问题当看到这个错误时我差点崩溃ERROR: must be owner of extension pg_trgm ERROR: must be owner of extension btree_gist3.1 根本原因GitLab使用的PostgreSQL扩展在备份恢复后所有权会重置为执行备份的用户而不是gitlab用户。3.2 我的解决方案分步操作更安全# 进入PostgreSQL管理控制台 sudo gitlab-psql # 检查扩展状态 \dx # 移除问题扩展如果存在 DROP EXTENSION IF EXISTS pg_trgm; DROP EXTENSION IF EXISTS btree_gist; # 退出 \q # 重新创建扩展 sudo gitlab-psql -d gitlabhq_production -c CREATE EXTENSION pg_trgm; sudo gitlab-psql -d gitlabhq_production -c CREATE EXTENSION btree_gist; # 验证所有权 sudo gitlab-psql -c \dx pg_trgm关键点必须在恢复操作之后执行这些命令否则会被恢复过程覆盖。4. logrotate服务崩溃之谜执行gitlab-ctl reconfigure时出现runit_service[logrotate] ... timeout: down: /opt/gitlab/service/logrotate/log: 0s4.1 问题根源旧系统的logrotate状态文件与新版本不兼容导致服务无法启动。4.2 完整修复流程# 彻底清理旧状态 sudo rm -rf /opt/gitlab/service/logrotate sudo rm -rf /var/log/gitlab/logrotate # 重建服务链接 sudo gitlab-ctl restart logrotate # 强制重新配置 sudo gitlab-ctl reconfigure # 验证状态应该显示running sudo gitlab-ctl status logrotate如果问题依旧可以临时禁用logrotatesudo gitlab-ctl stop logrotate sudo touch /etc/gitlab/skip-auto-logrotate5. 恢复后的必检清单不要被恢复成功的提示迷惑必须检查这些检查项命令预期输出数据库连接sudo gitlab-rake gitlab:db:check无错误仓库完整性sudo gitlab-rake gitlab:check无严重警告Sidekiq队列sudo gitlab-rake gitlab:sidekiq:check无积压证书有效性sudo openssl x509 -in /etc/gitlab/ssl/yourdomain.crt -noout -dates证书在有效期内6. 性能调优建议恢复后可能出现性能下降这是我的调优参数根据32GB内存服务器调整# /etc/gitlab/gitlab.rb 关键参数 postgresql[shared_buffers] 8GB puma[worker_processes] 8 sidekiq[concurrency] 20 unicorn[worker_timeout] 120应用配置sudo gitlab-ctl reconfigure sudo gitlab-ctl restart7. 备份策略优化经历这次事故后我改进了备份方案多级备份策略本地每小时增量备份保留7天异地每日全量备份保留30天对象存储每周全量备份保留1年验证脚本示例#!/bin/bash BACKUP_FILE$1 TEMPDIR$(mktemp -d) # 解压检查 tar -xf $BACKUP_FILE -C $TEMPDIR if [ $? -ne 0 ]; then echo 备份文件损坏! exit 1 fi # 关键文件检查 for f in db/database.sql.gz repositories/hashed; do if [ ! -f $TEMPDIR/$f ]; then echo 关键文件$f缺失! exit 1 fi done echo 备份验证通过 rm -rf $TEMPDIR这次恢复经历让我深刻体会到文档只是理想情况下的路线图真实环境总会给你惊喜。建议每个季度做一次完整的灾难恢复演练把问题暴露在非紧急时期。现在我的团队已经建立了更完善的监控体系包括定期自动验证备份可用性。

更多文章