修复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日

相关推荐

  • MySQL数据备份教程:简单高效的备份方法

    MySQL数据备份教程:简单高效的备份方法 1. 介绍 在数据库管理中,数据备份是一项至关重要的任务。本教程将介绍如何使用MySQL来备份指定数据,以保证数据安全性和可恢复性。 2. 备份方法 2.1 使用SQL语句备份数据 …

    2024年3月17日
    00
  • 有一台家用NAS服务器可以做什么?

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

    2023年4月9日
    00
  • 为什么手机存储容量永远不够?

    在数字时代,手机已经成为我们生活中不可或缺的一部分。它不仅仅是通讯工具,更是娱乐中心、工作伙伴和信息存储库。然而,随着手机功能的不断扩展和应用程序的不断增多,我们不禁要问:为什么手机存储容量永远不够…

    2023年12月13日
    00
  • 在Ubuntu 20.04上挂载硬盘

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

    2023年12月11日
    00
  • 录像数据覆盖问题:挑战与可能性的探讨

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

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

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

    2024年3月16日
    00
  • 如何选择和搭建NAS服务器:打造私人数据存储云

    引言 在这个信息爆炸的时代,我们每天都产生大量的数字数据,如照片、视频、文档等。同时,我们也需要随时访问和共享这些数据。为了满足这些需求,搭建一个NAS(网络附加存储)服务器是一个明智的选择。本文将为您…

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

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

    2023年9月26日
    00
  • 什么是RAID0?硬盘组RAID,硬盘热插拔后的数据恢复

    曾经,有一个服务器,名叫惠普ProLiant DL580 G7,它默默地运行着,托管着重要的数据。在这个数字时代,服务器就像是一座金库,里面储存着无数珍贵的宝藏。然而,有一天,一位勇敢的管理员手贱地在服务器运行的时候…

    2022年1月21日
    00
  • 如何在Windows系统下进行硬盘克隆

    在日常使用计算机的过程中,有时候我们需要将一个硬盘上的所有数据完整地克隆到另一个硬盘上,以备份数据、更换硬盘或其他目的。在Linux系统下,可以使用dd命令轻松实现这个目标,但在Windows系统下,我们需要借助…

    2023年11月18日
    00