1
0

【Rails + Heroku】PostgreSQLからJawsDB MySQLへ移行する

Last updated at Posted at 2023-12-14

概要

HerokuのPostgreSQLアドオンは費用が高めです。そこで、よりコスト効率の良いMySQLのJawsDBに移行する方法を紹介します。

ローカル環境の設定変更

主に修正するファイルはGemfileconfig/database.ymlです。

ファイルの修正手順

  • Gemfile: pg gemをコメントアウトし(念のため保持)、gem "mysql2", "~> 0.5"を追加します。ここで"~> 0.5"を指定する理由は、新規にrails new -d mysqlで作成したプロジェクトに同じバージョンが指定されていたためです。

  • database.yml: MySQLを使うために、新規に作成したRailsプロジェクトの設定を参考に変更します。違いはdefaultの設定だけだったのでそこだけ変更します。

    変更前:

    default: &default
      adapter: postgresql
      encoding: unicode
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    

    変更後:

    default: &default
      adapter: mysql2
      encoding: utf8mb4
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: root
      password:
      socket: /tmp/mysql.sock
    

その後、rails db:createを実行し、データベースを作成します。その後、rails db:migrateでマイグレーションを実行し、rails sでサーバーを起動します。正常に立ち上がれば設定は成功です。

エラー処理

もし以下のようなエラーが発生した場合は、前のインスタンスがまだ稼働している可能性があります。この場合は、lsof -i :3000でプロセスIDを調べ、kill -9 [PID]で該当プロセスを終了させます。

Address already in use - bind(2) for "127.0.0.1" port 3000 (Errno::EADDRINUSE)

データの削除

MySQLでの動作が確認できたら、PostgreSQLのデータを削除します。私の場合は個人開発で利用者がほとんどいないため、安心してデータを削除しました。削除するには、設定ファイルを元に戻した後、rails db:dropでデータベースを削除しました。

Herokuでの設定

次に、Herokuでの設定を行います。

  1. HerokuのアドオンセクションでJawsDBを探し、インストールします。
    jawsDB-addon.png

  2. 既存のPostgreSQLアドオンを削除します。
    delete-heroku-addon.png

    JawsDBが正常にインストールされたことを確認します。
    installed-jawsDB.png

  3. 変更をデプロイ

最後に変更をデプロイします。以下のようなログが表示されれば、データベースの変更が適用されたことになります。
deploy-pg-mysql.png

  1. 実際にアプリケーションを起動して動作を確認し、問題がなければ完了です。

追記

デプロイした後、heroku run rake db:migrateを実行するとエラーになります。この問題を解決するためには、以下の2点を修正する必要があります。

1. database.ymlのproduction設定の変更

database.ymlファイルのproductionセクションにおいて、JAWSDB_URL環境変数からデータベースのURLを取得するように設定します。これにより、データベース名やパスワードなどの情報が一括で設定されます。

production:
  <<: *default
  url: <%= ENV['JAWSDB_URL'] %>

2. Herokuの環境変数設定の変更

Herokuの設定をheroku configで確認すると、JAWSDB_URL環境変数がmysql:~~~となっていることが分かります。Railsではmysql2アダプターを使用しているため、このURLをmysql2プロトコルに変更する必要があります。これは、既存のURLをコピーし、プロトコル部分に2を付け加えることで行います。以下のコマンドを実行します。

heroku config:set JAWSDB_URL="mysql2://~~~"

これらの変更を行うことで、Heroku本番環境でのマイグレーションが正常に機能するはずです。

参考資料

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0