最近,我将安装了GitLab12.10的Omnibus的PostgreSQL数据库从10.12升级到了11.7
我們提供每次瀏覽都找不到的小趣聞。這篇文章是筆者個人的觀點,與作者所屬的任何組織無關。
0. 开篇
GitLab 12.10已发布了!关于该版本的发布说明中似乎提到了以下的内容。
PostgreSQL 11 现在成为 GitLab 自托管版的默认版本。
(https://about.gitlab.com/releases/2020/04/22/gitlab-12-10-released/#postgresql-11-is-now-the-default-version-of-postgresql-for-gitlab-self-managed)
基本上,從GitLab 12.10開始,預設安裝的PostgreSQL版本已經升級到11了。它提到了升級到PostgreSQL 11會提升性能並降低CPU使用率之類的事情,但我更關心以下內容。
Note that PostgreSQL 9.6 and PostgreSQL 10 will no longer be supported as of GitLab 13.0.
You will need to upgrade your PostgreSQL version prior to upgrading to 13.0.
在GitLab 13中,已不再支持PostgreSQL 9.6和10!

升级至GitLab 12.10的重要注意事项,请参阅:https://about.gitlab.com/releases/2020/04/22/gitlab-12-10-released/#upgrade
正如上述文章所提到的,终于到了必须升级到PostgreSQL 11的时候了。
这里有篇关于如何将Omnibus安装的GitLab的PostgreSQL从9.6.14升级到10.9的故事——Qiita
https://qiita.com/ynott/items/653236f1a5c2ab8cf69f

GitLab即将发布的版本 | GitLab
https://about.gitlab.com/upcoming-releases/
目前的PostgreSQL版本如下所示。

升级似乎可以通过相似的方法进行。
那么,让我们试一试吧。
把Postgresql升级到11版本。
仔细阅读文件
首先,让我们仔细阅读文件。
数据库设置 | GitLab
https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server
注意:
-
- アップグレードする前にコマンドを確認する
-
- アップグレードするときのダウンタイムを考慮する
- バックアップを取る
在升级之前,建议进行以下检查:
-
- 最新版的GitLab能够正常运行
-
- 即使运行sudo gitlab-ctl reconfigure也不会出现错误
- 能够提供足够的数据空间供迁移使用
在计划中产生停机时间是需要注意的要点。
让我们在今年的黄金周长假期间安排。
1-2. 我们要确认一下是否是最新版本的GitLab。
已经更新为最新版本了。
1-3. 确认重新配置不会有问题
$ sudo gitlab-ctl reconfigure
Starting Chef Client, version 14.14.29
resolving cookbooks for run list: ["gitlab"]
---- <中略> ---
Chef Client finished, 12/779 resources updated in 46 seconds
Warnings:
The version of the running postgresql service is different than what is installed.
Please restart postgresql to start the new version.
sudo gitlab-ctl restart postgresql
gitlab Reconfigured!
我们已经重新配置完成。
确认是否安装了PostgreSQL 11的二进制文件。
我相信他是强壮的,但为了确保,我会确认一下是否有 PostgreSQL 11 的二进制文件。
以下是错误的命令!
请运行 `sudo ls -la /opt/gitlab/embedded/postgresql/11/bin/` 来进行确认。
$ sudo ls -la /opt/gitlab/embedded/postgresql/
total 20
drwxr-xr-x 5 root root 4096 Feb 23 02:44 .
drwxr-xr-x 18 root root 4096 May 3 17:03 ..
drwxr-xr-x 5 root root 4096 May 23 2019 10
drwxr-xr-x 5 root root 4096 Feb 23 02:44 11
drwxr-xr-x 5 root root 4096 Dec 23 2018 9.6
lrwxrwxrwx 1 root root 35 Jun 12 2019 9.6.8 -> /opt/gitlab/embedded/postgresql/9.6
$ sudo ls -la /opt/gitlab/embedded/postgresql/11/bin/
total 11484
drwxr-xr-x 2 root root 4096 May 2 02:44 .
drwxr-xr-x 5 root root 4096 May 23 2019 ..
-rwxr-xr-x 1 root root 64056 May 1 00:38 clusterdb
-rwxr-xr-x 1 root root 63840 May 1 00:38 createdb
-rwxr-xr-x 1 root root 68696 May 1 00:38 createuser
-rwxr-xr-x 1 root root 59184 May 1 00:38 dropdb
-rwxr-xr-x 1 root root 59152 May 1 00:38 dropuser
-rwxr-xr-x 1 root root 941952 May 1 00:38 ecpg
-rwxr-xr-x 1 root root 132568 May 1 00:38 initdb
-rwxr-xr-x 1 root root 34128 May 1 00:38 oid2name
-rwxr-xr-x 1 root root 30640 May 1 00:38 pg_archivecleanup
-rwxr-xr-x 1 root root 116176 May 1 00:38 pg_basebackup
-rwxr-xr-x 1 root root 141152 May 1 00:38 pgbench
-rwxr-xr-x 1 root root 34152 May 1 00:38 pg_config
-rwxr-xr-x 1 root root 42952 May 1 00:38 pg_controldata
---- <後略> ---
在Postgresql 11中有一个名为/opt/gitlab/embedded/postgresql/11/bin/的目录,其中包含了二进制文件。
看起来没有问题。
1-5. 确认是否有足够的可用容量进行迁移。
※原因:由于需要同时保留旧数据和创建新的数据库,所以需要两倍的容量。
现有数据库的使用量。
$ sudo du -sh /var/opt/gitlab/postgresql/data
187M /var/opt/gitlab/postgresql/data
当前的磁盘使用量
$ sudo df -h
Filesystem Size Used Avail Use% Mounted on
/dev/xvdb 50G 17G 34G 34% /var/opt/gitlab
1-6. 备份
在发生问题时,我们要进行备份,以便可以回溯到之前的状态。可以跳过数据库以外的数据,按照以下方式进行备份将会更加轻松。
sudo gitlab-backup create SKIP=uploads,repositories,builds,artifacts,lfs,registry,pages
※注意:GitLab从版本12.1开始
执行升级命令
好了好了,心跳加速了,让我们试着升级一下吧。
如果您使用的是GitLab 12.10及更高版本,请执行以下命令。
$ sudo gitlab-ctl pg-upgrade
如果是在12.8之前的情况下,
$ sudo gitlab-ctl pg-upgrade -V 11
听说会这样。
$ sudo gitlab-ctl pg-upgrade
Checking for an omnibus managed postgresql: OK
Checking if postgresql['version'] is set: OK
Checking if we already upgraded: NOT OK
Checking for a newer version of PostgreSQL to install
Upgrading PostgreSQL to 11.7
Checking if PostgreSQL bin files are symlinked to the expected location: OK
Waiting 30 seconds to ensure tasks complete before PostgreSQL upgrade.
See https://docs.gitlab.com/omnibus/settings/database.html#upgrade-packaged-postgresql-server for details
If you do not want to upgrade the PostgreSQL server at this time, enter Ctrl-C and see the documentation for details
Please hit Ctrl-C now if you want to cancel the operation.
当您升级到PostgreSQL 10时,情况与以前的情况相同。
您将有30秒的执行时间。
哎呀,如果您忘记备份,请使用Ctrl-C来取消操作。
下面是接下来的内容。
Toggling deploy page:cp /opt/gitlab/embedded/service/gitlab-rails/public/deploy.html /opt/gitlab/embedded/service/gitlab-rails/public/index.html
Toggling deploy page: OK
Toggling services:ok: down: alertmanager: 1s, normally up
ok: down: gitaly: 0s, normally up
ok: down: gitlab-exporter: 0s, normally up
ok: down: grafana: 0s, normally up
ok: down: logrotate: 0s, normally up
ok: down: node-exporter: 1s, normally up
ok: down: postgres-exporter: 0s, normally up
ok: down: prometheus: 1s, normally up
ok: down: puma: 0s, normally up
ok: down: redis-exporter: 0s, normally up
ok: down: registry: 1s, normally up
ok: down: sidekiq: 0s, normally up
Toggling services: OK
Running stop on postgresql:ok: down: postgresql: 0s, normally up
Running stop on postgresql: OK
Symlink correct version of binaries: OK
Creating temporary data directory: OK
Initializing the new database: OK
Upgrading the data: OK
Move the old data directory out of the way: OK
Rename the new data directory: OK
Saving the old version information: OK
Configuring PostgreSQL
由於以下部分是與正常的sudo gitlab-ctl reconfigure相同的,所以省略詳細內容。
與正常的sudo gitlab-ctl reconfigure不同的是,
由於/var/opt/gitlab/postgresql/data/postgresql.conf將被改寫,因此會有大量的差異。
但是,它將根據/etc/gitlab/gitlab.rb進行重新設定,所以不需要擔心。
最后会出现这样的消息。
Running handlers:
Running handlers complete
Chef Client finished, 4/771 resources updated in 06 seconds
Running reconfigure: OK
Waiting for Database to be running.
Database upgrade is complete, running analyze_new_cluster.sh
Toggling deploy page:rm -f /opt/gitlab/embedded/service/gitlab-rails/public/index.html
Toggling deploy page: OK
Toggling services:ok: run: alertmanager: (pid 25892) 0s
ok: run: gitaly: (pid 25902) 1s
ok: run: gitlab-exporter: (pid 25921) 0s
ok: run: grafana: (pid 25923) 1s
ok: run: logrotate: (pid 25944) 0s
ok: run: node-exporter: (pid 25950) 1s
ok: run: postgres-exporter: (pid 25955) 0s
ok: run: prometheus: (pid 25963) 0s
ok: run: puma: (pid 26048) 1s
ok: run: redis-exporter: (pid 26056) 0s
ok: run: registry: (pid 26063) 1s
ok: run: sidekiq: (pid 26072) 0s
Toggling services: OK
==== Upgrade has completed ====
Please verify everything is working and run the following if so
sudo rm -rf /var/opt/gitlab/postgresql/data.10
sudo rm -f /var/opt/gitlab/postgresql-version.old
如果没有任何问题,/var/opt/gitlab/postgresql/data.10可以被删除而不会有任何问题。
1-8. 数据确认
让我们确认一下以下目录的情况:
/var/opt/gitlab/postgresql/
$ sudo ls -la /var/opt/gitlab/postgresql/
total 28
drwxr-xr-x 4 gitlab-psql root 155 May 3 17:23 .
drwxr-xr-x 23 root root 4096 May 3 17:23 ..
-rwx------ 1 gitlab-psql gitlab-psql 795 May 3 17:22 analyze_new_cluster.sh
drwx------ 19 gitlab-psql gitlab-psql 4096 May 3 17:23 data
drwx------ 19 gitlab-psql gitlab-psql 4096 May 3 17:22 data.10
-rwx------ 1 gitlab-psql gitlab-psql 52 May 3 17:22 delete_old_cluster.sh
-rw------- 1 gitlab-psql root 52 Jul 23 2017 .profile
srwxrwxrwx 1 gitlab-psql gitlab-psql 0 May 3 17:22 .s.PGSQL.5432
-rw------- 1 gitlab-psql gitlab-psql 81 May 3 17:22 .s.PGSQL.5432.lock
有两个数据,data和data.10。
data.10是一个过时的目录。
我会检查容量。
$ sudo du -sh /var/opt/gitlab/postgresql/data
107M /var/opt/gitlab/postgresql/data
比之前更加紧凑…(嗯,还可以吧)
1-9. 检查执行二进制文件
让我们确认一下是否正在运行 PostgreSQL 11。
$ ps axwwu | grep bin/postgres
gitlab-+ 25509 0.0 1.3 1100208 55676 ? Ss 17:22 0:00 /opt/gitlab/embedded/bin/postgres -D /var/opt/gitlab/postgresql/data
由于仅凭这个信息无法得知,我将确认/opt/gitlab/embedded/bin/postgres正在查看哪个位置。
$ ls -la /opt/gitlab/embedded/bin/postgres
lrwxrwxrwx 1 root root 47 May 3 17:22 /opt/gitlab/embedded/bin/postgres -> /opt/gitlab/embedded/postgresql/11/bin/postgres
我确认/opt/gitlab/embedded/postgresql/11/bin/postgres没有问题。
2. 核实动作
让我们确认一下相关的行为。

一切沒問題,PostgreSQL已更新至11.7版。
4. 删除旧数据
只需要删除旧数据,但由于我天生胆小,所以只会做移动操作。
sudo mv /var/opt/gitlab/postgresql/data.10 /root/backup