MySQLからPostgreSQLへの移行
このガイドでは、MySQL を使っている GitLab インスタンスを PostgreSQL データベースに移行する方法を説明します。
要件
pgloader3.4.1+ が必要です。pgloader -V
で確認してください。
Debian/Ubuntuなど、ディストリビューションから直接インストールできます:
-
バージョン検索
apt-cache madison pgloader
-
バージョンが3.4.1以上の場合は、以下の方法でインストールしてください:
sudo apt-get install pgloader
ディストリビューションのバージョンが古すぎる場合は、PostgreSQLのリポジトリを使用してください:
# Add repository sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' # Add key sudo apt-get install wget ca-certificates wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - # Install package sudo apt-get update sudo apt-get install pgloader
他のディストリビューションの場合は、PostgreSQLのダウンロードページの指示に従ってリポジトリを追加し、pgloader
をインストールしてください。
Dockerベースのインストールに移行する場合、pgloaderはコンテナイメージに含まれていないため、コンテナ内にインストールする必要があります。
-
実行中のコンテナのコンテキストでシェルセッションを開始します:
docker exec -it gitlab bash
-
pgloaderをインストールします:
apt-get update apt-get -y install pgloader
Omnibus GitLabインストール
Omnibus GitLabパッケージでは、まずバンドルされているPostgreSQLを有効にする必要があります:
-
GitLabを停止します:
sudo gitlab-ctl stop
-
/etc/gitlab/gitlab.rb
を編集して、バンドルされている PostgreSQL を有効にします:postgresql['enable'] = true
-
バンドルされているPostgreSQLを使用するために、
/etc/gitlab/gitlab.rb
を編集してください。gitlab_rails['db_adapter']
など、db_
で始まるすべての設定を確認してください。デフォルトを使用するために、それらをすべてコメントアウトすることもできます。 - 変更を有効にするために GitLab を再設定します。
-
UnicornとPostgreSQLを起動してスキーマを準備します:
sudo gitlab-ctl start unicorn sudo gitlab-ctl start postgresql
-
以下のコマンドを実行してスキーマを準備します:
sudo gitlab-rake db:create db:migrate
-
Unicornを停止して、他のデータベースアクセスがデータのロードを妨害しないようにします:
sudo gitlab-ctl stop unicorn
これらの手順が終わると、最新のスキーマを持つ新しいPostgreSQLデータベースができあがります。
次に、pgloader
、古いMySQLデータベースから新しいPostgreSQLデータベースへデータを移行します:
-
以下のスニペットを
commands.load
ファイルに保存し、MySQL データベースusername
、password
、host
で編集します:LOAD DATABASE FROM mysql://username:password@host/gitlabhq_production INTO postgresql://gitlab-psql@unix://var/opt/gitlab/postgresql:/gitlabhq_production WITH include no drop, truncate, disable triggers, create no tables, create no indexes, preserve index names, no foreign keys, data only SET MySQL PARAMETERS net_read_timeout = '90', net_write_timeout = '180' ALTER SCHEMA 'gitlabhq_production' RENAME TO 'public' ;
-
移行を開始します:
sudo -u gitlab-psql pgloader commands.load
-
移行が完了すると、次のようなサマリーテーブルが表示されます:
table name read imported errors total time ----------------------------------------------- --------- --------- --------- -------------- fetch meta data 119 119 0 0.388s Truncate 119 119 0 1.134s ----------------------------------------------- --------- --------- --------- -------------- public.abuse_reports 0 0 0 0.490s public.appearances 0 0 0 0.488s . . . public.web_hook_logs 0 0 0 1.080s ----------------------------------------------- --------- --------- --------- -------------- COPY Threads Completion 4 4 0 2.008s Reset Sequences 113 113 0 0.304s Install Comments 0 0 0 0.000s ----------------------------------------------- --------- --------- --------- -------------- Total import time 1894 1894 0 12.497s
30分以上出力がない場合、
pgloader
エラーが発生した可能性があります。詳しくはトラブルシューティングガイドをご覧ください。 -
GitLabを起動します:
sudo gitlab-ctl start
GitLab にアクセスして、すべてが期待通りに動くことを確認しましょう。
ソース・インストール
MySQLを使用するソースからのインストールでは、まずPostgreSQLをインストールしてデータベースを作成する必要があります。
データベースが作成されたら、次のステップに進みます:
-
GitLabを停止します:
sudo service gitlab stop
-
MySQLからPostgreSQLへのデータベース切り替え
cd /home/git/gitlab sudo -u git mv config/database.yml config/database.yml.bak sudo -u git cp config/database.yml.postgresql config/database.yml sudo -u git -H chmod o-rwx config/database.yml
-
PostgreSQLに関連するGemsのインストール
sudo -u git -H rm .bundle/config sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
-
以下のコマンドを実行してスキーマを準備します:
sudo -u git -H bundle exec rake db:create db:migrate RAILS_ENV=production
これらの手順が終わると、最新のスキーマを持つ新しいPostgreSQLデータベースができあがります。
次に、pgloader
、古いMySQLデータベースから新しいPostgreSQLデータベースへデータを移行します:
-
以下のスニペットを
commands.load
ファイルに保存し、MySQLusername
、password
、host
で編集してください:LOAD DATABASE FROM mysql://username:password@host/gitlabhq_production 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 SET MySQL PARAMETERS net_read_timeout = '90', net_write_timeout = '180' ALTER SCHEMA 'gitlabhq_production' RENAME TO 'public' ;
-
移行を開始します:
sudo -u postgres pgloader commands.load
-
移行が完了すると、次のようなサマリーテーブルが表示されます:
table name read imported errors total time ----------------------------------------------- --------- --------- --------- -------------- fetch meta data 119 119 0 0.388s Truncate 119 119 0 1.134s ----------------------------------------------- --------- --------- --------- -------------- public.abuse_reports 0 0 0 0.490s public.appearances 0 0 0 0.488s . . . public.web_hook_logs 0 0 0 1.080s ----------------------------------------------- --------- --------- --------- -------------- COPY Threads Completion 4 4 0 2.008s Reset Sequences 113 113 0 0.304s Install Comments 0 0 0 0.000s ----------------------------------------------- --------- --------- --------- -------------- Total import time 1894 1894 0 12.497s
30分以上出力がない場合、
pgloader
エラーが発生した可能性があります。詳しくはトラブルシューティングガイドをご覧ください。 -
GitLabを起動します:
sudo service gitlab start
GitLab にアクセスして、すべてが期待通りに動くことを確認しましょう。
トラブルシューティング
移行中または移行後にエラーが発生することがあります。
データベースエラー権限拒否
移行に使用するPostgreSQLユーザはスーパーユーザ権限を持っていなければなりません。 そうでない場合、以下のようなメッセージが表示されるかもしれません:
debugger invoked on a CL-POSTGRES-ERROR:INSUFFICIENT-PRIVILEGE in thread
#<THREAD "lparallel" RUNNING {10078A3513}>:
Database error 42501: permission denied: "RI_ConstraintTrigger_a_20937" is a system trigger
QUERY: ALTER TABLE ci_builds DISABLE TRIGGER ALL;
2017-08-23T00:36:56.782000Z ERROR Database error 42501: permission denied: "RI_ConstraintTrigger_c_20864" is a system trigger
QUERY: ALTER TABLE approver_groups DISABLE TRIGGER ALL;
移行後に500エラーが発生します。
移行後に500エラーが発生した場合は、キャッシュをクリアしてみてください:
# Omnibus GitLab
sudo gitlab-rake cache:clear
# Installations from source
sudo -u git -H bundle exec rake cache:clear RAILS_ENV=production