[分享] 极狐GitLab使用外置数据库时的备份和恢复

[分享]极狐GitLab使用外置数据库时的备份和恢复

本文针对极狐GitLab Omnibus/HA安装方式

官方文档中内置数据库称为Packaged PostgreSQL,外置数据库称为Non-packaged PostgreSQL

极狐GitLab13.10版本开始,每个Major版本下的非首个版本(即 Major.0版本)默认内置两个最新版本的PostgreSQL数据库程序,具体参考。一般情况下,我们可以直接使用极狐GitLab内置的PostgreSQL数据库,这样在软件日常使用和升级维护方面都会比较方便。但是在某些特定场景下,例如已经购买了某些厂商的RDS,这种情况下是完全可以使用RDS的,在配置上面会略有不同,但是整体依然比较简便。

极狐GitLab 在使用外置数据库的进行软件升级时,其实相对于使用内置数据库,并没有增加复杂性。常见的升级方式中,比较保守的做法是将外置数据库的数据备份恢复到内置数据库中,然后统一进行升级。其实在我们了解了PostgreSQL各版本之间的兼容性后,我们会发现,只要版本间相互兼容,极狐GitLab示例就可以正常工作。


举个例子:

当前实例版本: 13.12.x (内置数据库版本11/12)
外置PostgreSQL的版本:12.6
目标版本: 14.2.x (内置数据库版本12/13)
标准的升级路径: 13.12.x > latest 13.12.z > latest 14.0.z > latest 14.y.z

那么在整个升级过程中,其实主要需要对数据库做的就是 – 做好备份。然后正常升级**极狐GitLab **实例即可。升级完成后登录数据库可能会看到这样的提示psql (12.7, server 12.6),这种提示是不会影响实例正常运行的。实例端仍然可以对外置数据库进行正常的备份和还原,且不存在不可预知的隐患。

因为通过升级路径可以看出,升级的所有软件版本都是包含兼容12.6的外置数据库版本的(仅需要Major版本相同即可)。

以上例子是**极狐GitLab 实例可以正常管理外置数据库的情况,还存在一种情况,就是外置数据库的版本比较高(例如:PostgreSQL 14.0)此种情况下,在实例升级时依然是可以跳过数据库升级的,但是外置数据库的备份和恢复都需要手动来处理,因为极狐GitLab **软件内部目前不包含PostgreSQL14.0及以上的程序,无法正常对超过版本数据库进行备份和还原。如果想通过实例管理外置数据库,官方提供了手动创建软链接到实例目录下,详细参考


TroubleShooting

在执行数据库备份时,可能会出现类似以下的数据库备份出错,首先需要明晰数据库备份时所使用的用户权限:

实例备份命令gitlab-backup create备份数据库就是调用了类似下面的pg_dump命令,通过命令可以看出备份时使用的是gitlab数据库用户,此用户是数据库gitlabhq_production的所有者。

# 备份数据库
su - git
cd /var/opt/gitlab/backups
/opt/gitlab/embedded/bin/pg_dump -h ip -p 5432 -c -U gitlab -d gitlabhq_production -f database.sql

# 恢复数据库
su - git
cd /var/opt/gitlab/backups
/opt/gitlab/embedded/bin/psql -h ip -p 5432 -U gitlab -d gitlabhq_production -f database.sql

因此当出现类似以下错误时,首先应排查gitlabhq_production数据库中是否存在其他用户创建的对象,而gitlab用户没有权限操作。

一般解决方式有多种:

方式一:清除误创建的用户对象

方式二:手动调用命令使用gitlab-psql用户备份数据库

方式三:gitlab用户提权,备份后恢复gitlab用户权限