概要

Ruby on Rails 製のプロジェクト管理ツール「Redmine」を最初に設置した際、ファイルを作成するだけという設定の容易さからデータベースとして SQLite3 を採用しました。

しかし、管理するデータの容量が増えてくると目に見えて速度の遅さが気になりはじめました。
そこで、データベースを SQLite3 から MySQL への移行する事になりました。

このドキュメントでは Reamine(Rails) のデータベースを SQLite3 から MySQL に移行した際の手順を説明します。

変換方法

今回の方法: SQLite3 => YAML => MySQL

今回のデータ移転では、各種データベースと YAML 形式のファイルの間でデータの受け渡しができる Rails プラグイン「yaml_db」を使用しました。
このプラグインで、現在使用している SQLite3 のデータを YAML 形式に変換し、そのデータを MySQL に挿入します。

元ネタは Kartar.Netの「Migrating a Rails database from Sqlite3 to MySQL)」です。

※この手順を逆順で行うと MySQL => SQLite3 の移行も行えます。

SQLite3 => MySQL のツールではダメなの?

いくつかの、SQLite3 から MySQL にマイグレーションするスクリプトやツールを試してみましたが、どれも変換した SQL 文を MySQL に読み込ませる段階で構文エラーが発生してしまいました。

以下、試みて失敗してスクリプト・ツールです。

更新履歴

  • 2009-10-18
    • 初稿

前提環境

移転は以下の環境で行いました。

OS

  • CentOS5.3

データベース

  • sqlite-3
  • mysql-5.0

HTTPD サーバ

  • Apache-2.2.3
  • passenger-2.2.5

Redmine

  • ruby-1.8.7 (yum パッケージでなくソースからインストール)
  • rails-2.3
  • redmine-0.8.5

Ruby ライブラリ

各データベースにアクセスする API。gem でインストールしました。

  • sqlite3-ruby-1.2.5
  • mysql-2.8.1

移行手順

準備

Redmine サービスの停止

作業中にデータベースが更新されないように ((@redmine@)) のサービスを停止します。
がりんの環境では Apahce 経由で ((@redmine@)) にアクセスしているので Apache を停止します。

# /etc/init.d/httpd stop

※SQLite3 はデーモンを持たないデータベースなので停止する必要はありません。

yaml_db のインストール

各種データベースと YAML 形式のファイルの間でデータの受け渡しができる Rails プラグイン 『yaml_db』 をインストールします。

// $REDMINE_ROOT は Redmine をインストールしたディレクトリ
$ cd $REDMINE_ROOT
$ script/plugin install git://github.com/adamwiggins/yaml_db.git

データの出力

現在のプロダクション環境のデータベース (SQLite3)の内容を yaml_db を使用してファイルにダンプします。
ダンプした内容は、db/data.yml に書き出されます。

$ sudo rake db:dump RAILS_ENV=production
$ ls db/data.yaml
data.yml

データの入力

MySQL のデータベースを作成する

redmine のデータを管理する新規のデータベース「redmine」を MySQL に作成します。
必要に応じてユーザ権限等を設定してください。

// ここでは redmine という名前のデータベースを作成
$ mysql -u root -p
mysql> create redmine;
mysql> quite

プロダクション環境で使用するデータベースの変更

redmine が接続するデータベースを SQLite3 から 上記で作成した MySQL のデータベース「redmine」に config/database.yaml で変更します。

config/database.yaml

// MySQL のエントリを追加
production:
  adapter: mysql
  database: redmine
  host: localhost
  username: root
  password: XXXXX
  encoding: utf8

// 既存の SQLite3 のエントリをコメントアウトする
#production:
#  adapter: sqlite3
#  dbfile: db/redmine.db
#  timeout: 5000

出力したデータの挿入

config/database.yaml を編集した段階ではまだ、MySQL の redmine データベースは空っぽのままです。
yaml_db を再度使用して、「データの出力」で作成した db/data.yaml の内容を redmine データベース挿入します (([入力用のファイルを指定しないと自動で db/data.yaml を読み込みます]))。

$ rake db:load RAILS_ENV=production

データが正しく移行できたか確認します。
Redmine 用のテーブルが redmine データベースに登録されたかを確認します。

$ mysql -u root -p redmine
mysql> show tables;
+------------------------+
| Tables_in_redmine      |
+------------------------+
| attachments            |
| auth_sources           |
| boards                 |
| changes                |
〜中略〜
44 rows in set (0.00 sec)
mysql> quite

Redmine サービスの再開

停止していた Apahce を再開して Redmine を起動します。
Redmine のサイトにアクセスしてサイトが正しく表示され、データが移行されていれば完了です。

# /etc/init.d/httpd start

参考 URL