В нашем Ruby On Rails 3 приложении возникла необходимость перейти с Sqlite на MySQL. Нужен было простой и действенный способ, без громоздких Perl скриптов и платных утилит, которыми пестрит интернет и в частности StackOverflow.
Лучшим вариантом оказался gem yaml_db, возникший в недрах команды разработчиков Heroku.
Суть работы гема заключается в том, что он сохраняет дамп данных одной базы в YAML-файл на диск, а затем загружает его в другую базу (технически, конечно, такой подход можно использовать и для бэкапов).
Преимущество данного подхода в том, что совершенно неважно, с какой базой вы работаете. Теоретически поддерживаются все базы данных, для которых существует ActiveRecord adapter.
Добавляем yaml_db в Gemfile:
Запускаем Bundler:
Начальная конфигурация базы данных:
config/database.yml
Делаем, собственно, сам дамп:
После этого в db/data.yml должны быть данные вашей базы.
Если все хорошо, то меняем конфигурацию базы данных на нужную:
config/database.yml
Не забудьте добавить необходимый гем в Gemfile.
Создаем базу и запускаем миграции:
Ну и, наконец, загружаем дамп в новую базу:
Теперь можно запустить сервер и проверить, что все работает.
Если вы используете ветку Ruby 1.9, то Bundler версии 1.0.10 загружает Psych как YAML engine по умолчанию, который не самым корректным образом работает с некоторыми версиями Rails, поэтому если у вас возникли какие-то проблемы при вставке дампа, то одним из вариантов решения может быть замена Psych на Syck:
в config/application.rb после строки
вставить
yaml_db может делать не только дамп данных, но еще и структуры базы:
Первый таск делает дамп данных и структуры, второй создает таблицы и загружает данные.
Статья о yaml_db на блоге Heroku
Ветка yaml_db для Rails 2.x
Описание
Лучшим вариантом оказался gem yaml_db, возникший в недрах команды разработчиков Heroku.
Суть работы гема заключается в том, что он сохраняет дамп данных одной базы в YAML-файл на диск, а затем загружает его в другую базу (технически, конечно, такой подход можно использовать и для бэкапов).
Преимущество данного подхода в том, что совершенно неважно, с какой базой вы работаете. Теоретически поддерживаются все базы данных, для которых существует ActiveRecord adapter.
Простейший сценарий использования
Добавляем yaml_db в Gemfile:
gem 'yaml_db', :git => 'git://github.com/ludicast/yaml_db.git'
Запускаем Bundler:
bundle install
Начальная конфигурация базы данных:
config/database.yml
production:
adapter: sqlite3
database: db/production.sqlite3
pool: 5
timeout: 5000
Делаем, собственно, сам дамп:
export RAILS_ENV=production
rake db:data:dump
После этого в db/data.yml должны быть данные вашей базы.
Если все хорошо, то меняем конфигурацию базы данных на нужную:
config/database.yml
production:
adapter: mysql2
database: app_production
username: root
password: root
host: localhost
pool: 5
timeout: 5000
Не забудьте добавить необходимый гем в Gemfile.
Создаем базу и запускаем миграции:
rake db:create
rake db:migrate
Ну и, наконец, загружаем дамп в новую базу:
rake db:data:load
Теперь можно запустить сервер и проверить, что все работает.
Замечания
Если вы используете ветку Ruby 1.9, то Bundler версии 1.0.10 загружает Psych как YAML engine по умолчанию, который не самым корректным образом работает с некоторыми версиями Rails, поэтому если у вас возникли какие-то проблемы при вставке дампа, то одним из вариантов решения может быть замена Psych на Syck:
в config/application.rb после строки
Bundler.require(:default, Rails.env) if defined?(Bundler)
вставить
YAML::ENGINE.yamler = 'syck'
yaml_db может делать не только дамп данных, но еще и структуры базы:
rake db:dump
rake db:load
Первый таск делает дамп данных и структуры, второй создает таблицы и загружает данные.
Ссылки
Статья о yaml_db на блоге Heroku
Ветка yaml_db для Rails 2.x