rails 3. переход с sqlite3 на mysql

Существует гипотеза, что MySQL гораздо быстрее SQLite в многопользовательском приложении. Собственно, гипотеза подтверждается на всех тестах, что я видел, а также на моем собственном опыте. Подобный холивар, о том у кого длинее что быстрее можно слегкостью найти на Хабре. Весь описанный дальше процесс был проделан на Fedora 14.1 x64, однако, даю клык, что все тоже самое будет работать на федоре старше 11.

Далее я буду описывать все в том порядке, в каком делаю это я. Также я считаю, что именно такой порядок наиболее удобен для миграции с SQLite3 на MySQL.

экспорт БД с sqlite3

Прежде всего надо как-то сдампить старую БД на SQLite и хотелось бы это сделать без писания дополнительных скриптов. Для этого делаем нижеизложенное.
Закидываем в Gemfile следующую строку:

gem 'yaml_db'

И далее установим этот гем через bundle:

# cd rails_app && bundle install

Этот гем даст некоторые новые rake’и для работы с БД:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ rake -T
...
rake db:create          # Create the database from ...
rake db:data:dump       # Dump contents of database ...
rake db:data:dump_dir   # Dump contents of database ...
rake db:data:load       # Load contents of db/data...
rake db:data:load_dir   # Load contents of db/data_dir ...
rake db:drop            # Drops the database for the ...
rake db:dump            # Dump schema and data to db/...
rake db:fixtures:load   # Load fixtures into the current...
rake db:load            # Load schema and data from ...
rake db:migrate         # Migrate the database (options:...
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to ...
rake db:schema:dump     # Create a db/schema.rb file ...
rake db:schema:load     # Load a schema.rb file into...
rake db:seed            # Load the seed data from...
rake db:setup           # Create the database, load...
rake db:structure:dump  # Dump the database structure...
rake db:version
...

Далее нижеприведенной командой экспортируем схему и содержание БД в db/data.yml.

$ rake db:dump

Если БД слишком разрослась, можно попробывать вариант с rake db:data:dump_dir.

поднимаем и настраиваем MySQL

MySQL

Сразу же устанавливаем пакеты:

# yum install mysql mysql-server mysql-devel ruby-mysql -y

Далее прописываем во все тот же Gemfile:

gem 'mysql2'

И опять бандлим:

# bundle install

Стартуем сервер MySQL.

# service mysqld start

Заходим под рутом в MySQL:

mysql -uroot -p

Если до этого руту был задан пароль, то его надо будет ввести, если это первый заход рута, то пароль пустой.
А теперь создаем базу

mysql> CREATE DATABASE railsdb CHARACTER SET utf8 COLLATE utf8_general_ci;

и пользователя, попутно назначая ему права на эту БД.

mysql> GRANT ALL PRIVILEGES ON railsdb.* TO 'railsuser'@'localhost' IDENTIFIED BY 'railspass' WITH GRANT OPTION;

Команда выше дает права пользователю railsuser с паролем railspass на полный доступ к БД railsdb c локального хоста. Подробнее о правах и как их назначить читаем на оффсайте.

настройка rails-приложения

Открываем config/database.yml и заменяем настройки БД нужной секции на подобные (в моем случае это development):

1
2
3
4
5
6
7
8
9
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: railsdb
  pool: 5
  username: railsuser
  password: railspass
  host: localhost

Хочу предупредить, что табуляция перед параметрами, видимо, очень важна т.к. без этих табов сервер не стартанул, а с ними запустился на ура.
Теперь импортируем схему и данные в БД.

$ rake db:load

Стоит помнить, что команда загрузки дампа может быть и немного иной, все зависит от того какую команду экспорта дампа выбирали вы в на первом шаге этого поста. Ну вот и все.

11 Comments to “rails 3. переход с sqlite3 на mysql”

  1. lukmus пишет:

    Проблемы с кодировкой.
    Сделать БД с кодировкой utf8:
    CREATE DATABASE ‘my_db’ CHARACTER SET utf8 COLLATE utf8_general_ci;

    Посмотреть кодировку БД:
    SELECT default_character_set_name FROM information_schema.SCHEMATA S
    WHERE schema_name = “schemaname”;

  2. Weitottanda пишет:

    Все может случиться: и богатый к бедному стучится.

  3. dozen пишет:

    Спасибо за инструкцию.
    Не понял насчет табуляции в database.yml, это вроде как специфика yaml – параметры здесь это вложенные элементы секции development

  4. lukmus пишет:

    Или гораздо быстрее экспортировать и импортировать дамп можно так соответственно:

    $ mysqldump -u dbuser -p dbname > dumpfile
    $ mysql -udbuser -p -hlocalhost dbname < dumpfile

  5. kopyrin пишет:

    Было бы еще хорошо затронуть нюанс что не нужно делать цифровой пароль и про настройку кодировки UTF-8 в базе.

    • lukmus пишет:

      Про пароль я и сам не знал, спасибо за инфу. А про кодировку написано в первом моем комменте к этой статье

  6. koprin пишет:

    Еще бывает bundle install не может установить gem mysql2 приходится ему библиотеки с хидерами установить
    sudo apt-get install libmysql-ruby libmysqlclient-dev mysql-client mysql-server

    • lukmus пишет:

      Это походу чисто дебиановская трабла, в RH-based сколько раз я ни устанавливал никаких, слава Богу, проблем не было. Вероятно dev-пакеты подтягиваются как зависимости от mysql,mysql-server, mysql-devel и ruby-mysql.
      В любом случае большое спасибо за инфу.

  7. lukmus пишет:

    В MariDB команда создания БД:
    CREATE DATABASE railsdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    • lukmus пишет:

      Если при создании базы возникает ошибка Mysql2::Error: Specified key was too long; max key length is 767 bytes (чаще всего в инете встречается эта ошибка при использовании Devise), то надо добавить config/initializers/mysqlpls.rb:

      # config/initializers/mysqlpls.rb
      require 'active_record/connection_adapters/abstract_mysql_adapter'
       
      module ActiveRecord
        module ConnectionAdapters
          class AbstractMysqlAdapter
            NATIVE_DATABASE_TYPES[:string] = { :name => "varchar", :limit => 191 }
          end
        end
      end

      Ошибка возникает при использовании кодировки utf8mb4, если база в utf8 этой проблемы не будет. Подробнее об ошибке и ее решении: https://github.com/rails/rails/issues/9855#issuecomment-28874587

Leave a Reply to dozen

(обязательно)

(обязательно)