PostgreSQL拡張機能の管理
このガイドでは、外部のPostgreSQLデータベースを使用したインストールでPostgreSQL拡張を管理する方法を説明します。
以下の拡張機能をメインの GitLab データベース(デフォルトはgitlabhq_production
)にロードする必要があります:
エクステンション | GitLab の最小バージョン |
---|---|
pg_trgm | 8.6 |
btree_gist | 13.1 |
plpgsql | 11.7 |
GitLab Geoを使用している場合、以下の拡張機能をすべてのセカンダリトラッキングデータベースにロードする必要があります(デフォルトはgitlabhq_geo_production
):
エクステンション | GitLab の最小バージョン |
---|---|
plpgsql | 9.0 |
拡張機能をインストールするために、PostgreSQLはユーザーにスーパーユーザー権限を要求します。通常、GitLabデータベースユーザーはスーパーユーザーではありません。そのため、通常のデータベースマイグレーションはエクステンションのインストールには使用できず、代わりにGitLabを新しいバージョンにアップグレードする前にエクステンションを手動でインストールする必要があります。
PostgreSQL拡張機能の手動インストール
PostgreSQL拡張をインストールするには、以下の手順に従ってください:
-
GitLab PostgreSQL データベースにスーパーユーザーなどで接続します:
sudo gitlab-psql -d gitlabhq_production
-
CREATE EXTENSION
を使って拡張モジュール ( この例ではbtree_gist
) をインストールします:CREATE EXTENSION IF NOT EXISTS btree_gist
-
インストールされた拡張機能を確認します:
gitlabhq_production=# \dx List of installed extensions Name | Version | Schema | Description ------------+---------+------------+------------------------------------------------------------------- btree_gist | 1.5 | public | support for indexing common datatypes in GiST pg_trgm | 1.4 | public | text similarity measurement and index searching based on trigrams plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows)
システムによっては、特定の拡張機能を利用できるようにするために、追加のパッケージ (例えばpostgresql-contrib
) をインストールする必要があるかもしれません。
典型的な障害シナリオ
以下は、拡張機能が先にインストールされていないために GitLab の新規インストールに失敗した例です。
---- Begin output of "bash" "/tmp/chef-script20210513-52940-d9b1gs" ----
STDOUT: psql:/opt/gitlab/embedded/service/gitlab-rails/db/structure.sql:9: ERROR: permission denied to create extension "btree_gist"
HINT: Must be superuser to create this extension.
rake aborted!
failed to execute:
psql -v ON_ERROR_STOP=1 -q -X -f /opt/gitlab/embedded/service/gitlab-rails/db/structure.sql --single-transaction gitlabhq_production
以下は、マイグレーションを実行する前に拡張機能がインストールされていない場合の例です。このシナリオでは、データベースマイグレーションで、権限が不十分なために拡張機能btree_gist
の作成に失敗します。
== 20200515152649 EnableBtreeGistExtension: migrating =========================
-- execute("CREATE EXTENSION IF NOT EXISTS btree_gist")
GitLab requires the PostgreSQL extension 'btree_gist' installed in database 'gitlabhq_production', but
the database user is not allowed to install the extension.
You can either install the extension manually using a database superuser:
CREATE EXTENSION IF NOT EXISTS btree_gist
Or, you can solve this by logging in to the GitLab database (gitlabhq_production) using a superuser and running:
ALTER regular WITH SUPERUSER
This query will grant the user superuser permissions, ensuring any database extensions
can be installed through migrations.
マイグレーションの失敗から回復するには、スーパーユーザーによって手動で拡張機能をインストールし、データベースマイグレーションを再実行することでGitLabのアップグレードを完了する必要があります:
sudo gitlab-rake db:migrate