修复GitLab-CE数据库丢失的全过程

在2023年4月24日,我收到了GitLab的升级通知,于是开始了升级操作,然而,这次例行升级引发了一个严重的问题,导致GitLab数据库丢失。这篇文章将记录我是如何修复GitLab的,同时也会提及一些我在这个过程中犯下的错误。虽然中途有一些操作没有及时记录截图,但我会尽量用备份的一些场景来还原过程。

基本情况

  • 当前版本:GitLab-CE 15.9.5
  • 升级版本:GitLab-CE 15.11.0
  • 操作系统:Linux Debian 10
  • 硬件配置:2核8GB内存50GB硬盘
  • 500+仓库和13个GitLab Runner用于执行任务

问题出现

一切都开始于一次升级操作,我执行了升级命令,但不幸的是,一旦升级完成,问题就接踵而至。这是我犯下的第一个错误,没有在升级前对虚拟机进行快照备份,而是直接升级了内部应用。以前的升级都没有问题,因此我没有太多的警觉性。此外,由于我使用Docker部署GitLab已经有5年之久,每次更新都是按照相同的步骤进行,所以我没有过多地考虑到备份的必要性。以下是我执行的命令:

docker rm -f docker && docker pull gitlab/gitlab-ce:latest && docker run -it --log-opt max-size=10m --log-opt max-file=3 -p 443:443 --name gitlab --restart always -v /root/gitlab/config:/etc/gitlab -v /root/gitlab/logs:/var/log/gitlab -v /root/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce:latest

第一次报错

然而,升级命令执行后,我遇到了第一个错误,错误信息如下:

SELECT COUNT(*) FROM container_repositories WHERE migration_state = 'import_skipped'
ERROR:  column "migration_state" does not exist at character 51

错误信息明确指出了解决方法,它建议我添加一个参数 -e GITLAB_SKIP_UNMIGRATED_DATA_CHECK=true 来重新启动实例,以绕过升级检查。于是我添加了这个参数,重新启动了GitLab实例。

第二次报错

然而,第二次启动后,又出现了问题,错误信息如下:

Starting the database
Error starting the database. Please fix the error before continuing
Expected process to exit with [0], but received '1'

这次的错误是关于数据库启动的问题,GitLab试图升级PostgreSQL版本,但出现了问题。它提供了另一个解决方案,要求我添加 -e GITLAB_SKIP_PG_UPGRADE=true 参数来跳过数据库升级。于是我使用了GitLab之前的版本 gitlab/gitlab-ce:15.9.5-ce.0 来重新启动。

第三次报错

第三次启动后,我遇到了文件权限的问题,错误信息如下:

failed to read meta.json for a block during repair process; skipping" dir=/var/opt/gitlab/prometheus/data/01GYSNK1JKD2X5125MP0ZRPKFH err="open /var/opt/gitlab/prometheus/data/01GYSNK1JKD2X5125MP0ZRPKFH/meta.json: permission denied"

通过分析日志,我发现只是一个权限问题,于是我毫不犹豫地将相关目录的权限设置为777:

chmod -R 777 /root/gitlab/config
chmod -R 777 /root/gitlab/logs
chmod -R 777 /root/gitlab/data

然后进行了第三次重启。

第四次报错

第四次启动后,我遇到了与邮件

通知相关的错误,错误信息如下:

Could not determine email for job (please check DB for incomplete objects)

这个错误并没有提供直接的解决方案,但它暗示了可能存在数据库问题。在这一点上,我开始感到紧张,因为我没有数据库备份。但我决定尝试一个解决方案,我执行了以下命令:

sudo gitlab-rake gitlab:db:bootstrap

这个命令似乎修复了一些数据库问题,然后我进行了第四次重启。

第五次报错

第五次启动后,终于没有再次报错,GitLab看起来正常运行了。我尝试登录,并确保所有存储库和项目都存在。但是,当我尝试访问一个项目时,我遇到了一个新的问题,即无法获取存储库的内容,错误信息如下:

The repository could not be found.

这个问题让我感到非常焦虑,因为我拥有的存储库非常重要。我开始寻找解决方法,但在这个过程中,我再次犯了一个错误,没有停止GitLab容器,而是继续尝试解决问题。这导致了我在一次数据恢复尝试中误删除了存储库数据。

数据恢复

在数据丢失之后,我感到非常沮丧,但我没有放弃。我开始尝试从GitLab备份文件中恢复数据。幸运的是,我之前有一个定期备份GitLab数据的任务,这些备份文件位于 /root/gitlab/backups 目录下。我决定尝试从这些备份中恢复数据。

恢复备份

首先,我列出了可用的备份文件,使用以下命令:

ls /root/gitlab/backups

然后,我选择了最近的一个备份文件,执行了以下命令来恢复数据:

docker exec -t gitlab gitlab-backup restore BACKUP=xxx

在这里,xxx 是我选择的备份文件名。恢复过程可能需要一些时间,因为它涉及到将数据从备份文件还原到数据库中。

恢复存储库

一旦数据恢复完成,我还需要恢复存储库的数据。由于我之前误删了存储库数据,我只能尝试从GitLab Runner的备份中恢复存储库。这是我犯下的又一个错误,因为我应该在执行任何操作之前停止GitLab容器以防止进一步的数据丢失。

我列出了GitLab Runner的备份文件,使用以下命令:

ls /root/gitlab/data/gitlab-runner/data

然后,我选择了最近的一个备份文件,执行了以下命令来恢复数据:

docker run --rm -v /root/gitlab/data/gitlab-runner/data:/data ubuntu cp -R /backup /data

这将备份文件从Runner容器复制到了宿主机的Runner数据目录中。

修复存储库

然而,这还不够,因为存储库数据仍然无法访问。我需要执行以下命令来修复存储库数据:

docker exec -t gitlab gitlab-rake gitlab:storage:rollback ORIG_STORAGE=/var/opt/gitlab/git-data/backups/

这个命令将存储库数据从备份中还原到正确的位置。

结论

经过多次尝试和一些错误,我终于成功地修复了GitLab数据库丢失的问题,并且成功恢复了存储库数据。这次经历教训深刻,我意识到了数据备份的重要性,以及在遇到问题时要及时停止容器以防止进一步的损失。同时,我也学到了如何从GitLab备份中恢复数据,以及如何修复存储库数据。希望这篇文章对其他遇到类似问题的人有所帮助。

下一步计划

在修复了GitLab的问题后,我计划进一步改进我的GitLab部署策略,确保数据的安全性和可恢复性。我还会继续学习并提升自己的技术能力,以更好地应对类似问题。同时,我也会分享这次经历和教训,希望能够帮助其他人避免类似的困境。

本文由作者 王大神 原创发布于 大神网的AI博客。

转载请注明作者:王大神

原文出处:修复GitLab-CE数据库丢失的全过程

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2023年10月5日
下一篇 2023年10月5日

相关推荐

  • 录像数据覆盖问题:挑战与可能性的探讨

    引言 视频监控技术在现代社会中扮演着至关重要的角色,然而,随着时间的推移,录像数据的覆盖问题成为了监控系统管理者和使用者面临的一项重要挑战。本文将深入探讨录像数据覆盖的问题,探讨恢复可能性,并提供预防…

    2023年9月7日
    00
  • 在Ubuntu 20.04上挂载硬盘

    在日常使用计算机的过程中,我们可能会需要将额外的硬盘挂载到操作系统中,以扩展存储空间或进行数据备份。本教程将详细介绍在Ubuntu 20.04操作系统上如何挂载硬盘,以及一些相关的基本操作。 1. 准备工作 在开始挂…

    2023年12月11日
    00
  • 有一台家用NAS服务器可以做什么?

    假设你是一个忙碌的家庭主妇/主夫,每天都要应对家庭的各种事务。你拥有多个智能家居设备,但它们分别使用不同的应用程序和云服务。你还担心家庭照片和重要文件的安全备份,以及想要开始自己的个人博客网站。此外,…

    2023年4月9日
    00
  • 家用NAS:为什么它是备份、共享和访问数据的最佳选择?

    在一个寒冷的冬夜,小明坐在电脑前,突然听到了一声可怕的“咔嚓”声,他的硬盘坏了。心惊胆战的他,想起了硬盘里存放的珍贵照片、重要文件和回忆录。他深感无助,因为他曾亲身经历数据丢失的痛苦。然而,正是在这个…

    2023年4月20日
    00
  • 挂载后的Linux文件系统:探寻lost+found目录的奥秘

    对于使用Linux操作系统的用户来说,挂载是一个常见但却充满了神秘感的概念。当你挂载一个新的存储设备或分区时,你可能会惊讶地发现,只有一个名为"lost+found"的目录出现在你的文件系统中。这个目录似乎…

    2023年12月26日
    00
  • 静电对正在开机使用的笔记本电脑会有多严重的影响?

    静电是一种在日常生活中常见的现象,尤其是在干燥的天气条件下,人们容易积累静电电荷。当我们坐下、走动或触摸物体时,静电电荷可能会在我们身体和周围的物体之间产生电击或放电现象。对于正在开机使用的笔记本电…

    2023年12月3日
    00
  • 谷歌云端硬盘数据异常:用户数据丢失引发关切

    近期,一则关于谷歌云端硬盘(Google Drive)异常导致数据丢失的消息引发了广泛的关注和担忧。据谷歌官方论坛的消息,韩国用户首先发现他们的云端硬盘数据出现异常,导致数据回滚至2023年5月份的状态,使所有新增文…

    2023年12月3日
    00
  • 家用NAS,存储升级的新选择

    在数字化时代,数据如同我们生活的一部分,无论是工作文件、家庭照片还是娱乐视频,其数量正以前所未有的速度增长。对于像我这样既是摄影爱好者又是PT玩家的人来说,对存储需求的满足已经远远超出了普通硬盘的能力…

    2024年3月16日
    00
  • 实现与优化ESXi硬盘热插拔

    硬盘热插拔是一项关键的功能,允许您在不关闭ESXi服务器的情况下添加或移除硬盘。这不仅提高了系统的可用性,还简化了硬件维护。在本教程中,我们将深入探讨如何在ESXi上实现硬盘热插拔,并提供一些优化建议。 了解…

    2023年9月7日
    00
  • 如何低成本持久备份几十TB的小文件数据?

    在现代数字化时代,数据的重要性无法被低估。对于个人用户或小型组织来说,持久备份几十TB的小文件数据可能是一个挑战。然而,随着技术的不断发展,有许多低成本的备份解决方案可供选择,让我们来探讨一下吧。 开篇…

    2023年9月26日
    00