Pull to refresh

Перенос данных из одной базы в любую другую

Reading time2 min
Views13K
В нашем Ruby On Rails 3 приложении возникла необходимость перейти с Sqlite на MySQL. Нужен было простой и действенный способ, без громоздких Perl скриптов и платных утилит, которыми пестрит интернет и в частности StackOverflow.

Описание


Лучшим вариантом оказался 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
Tags:
Hubs:
+28
Comments16

Articles