Tech Racho エンジニアの「?」を「!」に。
  • 開発

GitLab MySQLからPostgreSQLへの移行手順

こんにちは。弊社では自社でリポジトリサーバを立てておりGitLabを利用しています。
今年5月にGitLabのアップグレード作業をしましたので、そのことについてまとめてみようかと思います。

はじめに

アップグレード前の弊社の環境は以下のようなものでした。

  • GitLab CE 11.0.2
  • MySQL(5.7)で動いている
  • ソースインストール版を使っている
  • 700以上のリポジトリ、200以上のユーザーが存在

GitLab 12.1以降、MySQLのサポートがなくなりPostgreSQLのみがサポートされるようになりました。Subgroupsなどの機能はPostgreSQLのみでしか使えません。最新版の機能を使うためにはPostgreSQLへ移行する必要があります。

また、GitLabはソースファイルを使って手動でセットアップしインストールするソースインストール版と、パッケージを使ってインストールするオムニバスパッケージ版があります。
公式ではオムニバスパッケージ版を推奨しており、オムニバスパッケージ版はソースインストール版に比べてアップグレードも簡単にできます。

そのため今回のアップグレードではPostgreSQLへの移行、オムニバスパッケージ版への移行も同時に行いました。

この記事ではMySQLからPostgreSQLへの移行手順について紹介します。OSはUbuntu 16.04.4 LTSです。

MySQLからPostgreSQLへ移行

移行のためにやることは以下です。

  • PostgresSQLをインストール
  • PGloaderをインストール
  • スキーマ更新
  • データ移行

GitLabの公式ドキュメントにMySQLからPostgreSQLへの移行手順が紹介されているので、それを元にやっていきます。

PostgreSQLをインストール

PostgreSQLをインストールします。
拡張機能を使用する必要があるため、少なくともPostgreSQL 9.2が必要です。
作業時点のPostgresSQLの最新バージョンは9.5だったのでそれをインストールしました。

# PostgreSQLのパッケージをインストールする
sudo apt-get install -y postgresql postgresql-client libpq-dev postgresql-contrib

# GitLab用のデータベースユーザーを作成する
sudo -u postgres psql -d template1 -c "CREATE USER git CREATEDB;"

# 全文検索モジュールのpg_trgmを読み込む
sudo -u postgres psql -d template1 -c "CREATE EXTENSION IF NOT EXISTS pg_trgm;"

# Production環境のデータベースを作成する
sudo -u postgres psql -d template1 -c "CREATE DATABASE gitlabhq_production OWNER git;"

sudo -u git -H psql -d gitlabhq_production
ALTER USER git WITH PASSWORD 'secure password';

PGloaderをインストール

MySQLのデータをPostgresSQLへ移行するにはPGLoaderを使います。GitLabでは3.4.1以上を推奨しています。
作業時点の最新バージョンは3.5.2だったのでそれをインストールしました。

# リポジトリを追加
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'

# キーを追加
sudo apt-get install wget ca-certificates
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -

# PGloaderをインストール
sudo apt-get update
sudo apt-get install pgloader

# PGloaderのログ出力でパーミッションエラーを防ぐための変更
sudo chown postgres:postgres /tmp/pgloader

スキーマ更新

GitLabのデータベースをPostgreSQLへ切り替えます。

sudo service gitlab stop

sudo su - git

cd /home/git/gitlab

# PostgreSQL用のdatabase.ymlを使うように変更
mv config/database.yml config/database.yml.bak
cp config/database.yml.postgresql config/database.yml
chmod o-rwx config/database.yml

# Postgresqlに関連するGemをインストールする
rm .bundle/config
bundle install --deployment --without development test mysql aws kerberos

# 変更したconfig/database.ymlを読み込んでデータベース、テーブルを作成
bundle exec rake db:create db:migrate RAILS_ENV=production

データ移行

データ移行のために pgloader コマンドを実行します。

移行用のスニペットとしてcommands.loadファイルを作成し、それを pgloader コマンドの引数として渡して実行します。MySQLのユーザ名、パスワード、ホストは環境に合わせて変更してください。

データサイズによってはPGloaderのオプションに prefetch rows を指定しないと、 Heap exhausted, game over になるので適切な値を指定する必要があるかもしれません。

以下では prefetch rows = 10000 を指定しています。

# commands.loadを作成
sudo tee -a commands.load <<'EOF'
LOAD DATABASE
FROM mysql://gitlab:gitlab@unix://var/run/mysqld/mysqld.sock:/gitlab
INTO postgresql://postgres@unix://var/run/postgresql:/gitlabhq_production

WITH include no drop, truncate, disable triggers, create no tables,
create no indexes, preserve index names, no foreign keys,
data only, prefetch rows = 10000

ALTER SCHEMA 'gitlab' RENAME TO 'public'

;
EOF

# commands.loadファイルを指定してpgloaderを実行する。
sudo -u postgres pgloader commands.load

# 移行が終わるとコンソールに以下のような概要表が出力される。

                                   table name     errors       rows      bytes      total time
-----------------------------------------------  ---------  ---------  ---------  --------------
                                fetch meta data          0        119                     0.388s
                                       Truncate          0        119                     1.134s
-----------------------------------------------  ---------  ---------  ---------  --------------
                           public.abuse_reports          0          0                     0.490s
                             public.appearances          0          0     0.1 kB          0.488s
                                       .
                                       .
                                       .
                           public.web_hook_logs          0          0     1.3 MB          1.080s
-----------------------------------------------  ---------  ---------  ---------  --------------
                        COPY Threads Completion          0          4                     2.008s
                                Reset Sequences          0        113                     0.304s
                               Install Comments          0          0                     0.000s
-----------------------------------------------  ---------  ---------  ---------  --------------
                              Total import time          ?    2117341     2.1 GB       2m44.631s

MySQLのデータが移行されているか確認

データ移行が終わったのでGitLabを起動してPostgreSQLに切り替わっているか、データが移行されているかを管理画面などから確認すると良いです。

sudo service gitlab start

まとめ

今回はソースインストール版GitLabのMySQLからPostgreSQLへの移行手順について紹介しました。

GitLabの更新頻度は高いため、実際に移行作業する際は公式ドキュメントを一度確認するのが良いです。この記事の内容もすぐに古くなるかもしれません。

関連記事

GitLab自社運用のための注意点とノウハウ(2018/06版)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。