MySQLからPostgreSQLへの移行

このガイドでは、MySQL を使っている GitLab インスタンスを PostgreSQL データベースに移行する方法を説明します。

要件

注:MySQLのサポートはGitLab 12.1で削除されました。この手順はGitLab 12.1をインストールする前に行ってください。

pgloader3.4.1+ が必要です。pgloader -Vで確認してください。

Debian/Ubuntuなど、ディストリビューションから直接インストールできます:

  1. バージョン検索

    apt-cache madison pgloader
    
  2. バージョンが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はコンテナイメージに含まれていないため、コンテナ内にインストールする必要があります。

  1. 実行中のコンテナのコンテキストでシェルセッションを開始します:

    docker exec -it gitlab bash
    
  2. pgloaderをインストールします:

    apt-get update
    apt-get -y install pgloader
    

Omnibus GitLabインストール

Omnibus GitLabパッケージでは、まずバンドルされているPostgreSQLを有効にする必要があります:

  1. GitLabを停止します:

    sudo gitlab-ctl stop
    
  2. /etc/gitlab/gitlab.rb を編集して、バンドルされている PostgreSQL を有効にします:

    postgresql['enable'] = true
    
  3. バンドルされているPostgreSQLを使用するために、/etc/gitlab/gitlab.rb を編集してください。gitlab_rails['db_adapter']など、db_で始まるすべての設定を確認してください。デフォルトを使用するために、それらをすべてコメントアウトすることもできます。

  4. 変更を有効にするために GitLab を再設定します。
  5. UnicornとPostgreSQLを起動してスキーマを準備します:

    sudo gitlab-ctl start unicorn
    sudo gitlab-ctl start postgresql
    
  6. 以下のコマンドを実行してスキーマを準備します:

    sudo gitlab-rake db:create db:migrate
    
  7. Unicornを停止して、他のデータベースアクセスがデータのロードを妨害しないようにします:

    sudo gitlab-ctl stop unicorn
    

これらの手順が終わると、最新のスキーマを持つ新しいPostgreSQLデータベースができあがります。

次に、pgloader 、古いMySQLデータベースから新しいPostgreSQLデータベースへデータを移行します:

  1. 以下のスニペットをcommands.load ファイルに保存し、MySQL データベースusernamepasswordhostで編集します:

    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'
    
    ;
    
  2. 移行を開始します:

    sudo -u gitlab-psql pgloader commands.load
    
  3. 移行が完了すると、次のようなサマリーテーブルが表示されます:

                                     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 エラーが発生した可能性があります。詳しくはトラブルシューティングガイドをご覧ください。

  4. GitLabを起動します:

    sudo gitlab-ctl start
    

GitLab にアクセスして、すべてが期待通りに動くことを確認しましょう。

ソース・インストール

MySQLを使用するソースからのインストールでは、まずPostgreSQLをインストールしてデータベースを作成する必要があります。

データベースが作成されたら、次のステップに進みます:

  1. GitLabを停止します:

    sudo service gitlab stop
    
  2. 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
    
  3. PostgreSQLに関連するGemsのインストール

    sudo -u git -H rm .bundle/config
    sudo -u git -H bundle install --deployment --without development test mysql aws kerberos
    
  4. 以下のコマンドを実行してスキーマを準備します:

    sudo -u git -H bundle exec rake db:create db:migrate RAILS_ENV=production
    

これらの手順が終わると、最新のスキーマを持つ新しいPostgreSQLデータベースができあがります。

次に、pgloader 、古いMySQLデータベースから新しいPostgreSQLデータベースへデータを移行します:

  1. 以下のスニペットをcommands.load ファイルに保存し、MySQLusernamepasswordhostで編集してください:

    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'
    
    ;
    
  2. 移行を開始します:

    sudo -u postgres pgloader commands.load
    
  3. 移行が完了すると、次のようなサマリーテーブルが表示されます:

                                     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 エラーが発生した可能性があります。詳しくはトラブルシューティングガイドをご覧ください。

  4. 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