Перейти к содержанию

Ошибка базы PostgreSQL при старте Gitlab

Текст самой ошибки

2023-07-21_10:25:55.85115 LOG:  starting PostgreSQL 13.11 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.3.0-1ubuntu1~22.04.1) 11.3.0, 64-bit
2023-07-21_10:25:55.85618 LOG:  listening on Unix socket "/var/opt/gitlab/postgresql/.s.PGSQL.5432"
2023-07-21_10:25:55.87273 LOG:  database system was interrupted; last known up at 2023-07-21 09:59:34 GMT
2023-07-21_10:25:56.39779 LOG:  invalid resource manager ID in primary checkpoint record
2023-07-21_10:25:56.39781 PANIC:  could not locate a valid checkpoint record
2023-07-21_10:25:56.55970 LOG:  startup process (PID 519) was terminated by signal 6: Aborted
2023-07-21_10:25:56.55972 LOG:  aborting startup due to startup process failure
2023-07-21_10:25:56.56278 LOG:  database system is shut down

Решение

Заходим внутрь контейнера:
$ docker exec -it gitlab bash

Заходим под пользователем gitlab-psql
root@859f859bd7a3:/# su gitlab-psql
$

Выполняем:
$ /opt/gitlab/embedded/bin/pg_resetwal /var/opt/gitlab/postgresql/data -f

Перезапускаем контейнер.

docker container restart gitlab

Если не стартует отдельный контейнер PostgreSQL в Docker Swarm

docker exec -it $(docker ps -f name=postgres -q) gosu postgres pg_resetwal /var/lib/postgresql/data/swarm

⚠️ Предупреждение!

Утилитой pg_resetwal можно отключить механизм восстановления — база запустится, но останется в неконсистентном состоянии, то есть гарантированно повреждённой.

● Утилита pg_resetwal позволит экземпляру постгреса запуститься, даже если половины базы уже нет, а вторая половина является бессмысленным набором байтов.

● Никогда не используйте pg_resetwal, если не понимаете совершенно точно, что он делает, и какие будут последствия.

После применения pg_resetwal база непригодна для использования, из неё можно только выгрузить данные для последующей загрузки в новый кластер: только полный pg_dump/restore!

Можно попробовать сделать бэкап Gitlab:

docker exec -it $(docker ps -f name=gitlab -q | head -n 1) gitlab-backup create

Внутри контейнера архив будет располагаться по пути /var/opt/gitlab/backups/.

К началу