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 |
Стоит помнить, что команда загрузки дампа может быть и немного иной, все зависит от того какую команду экспорта дампа выбирали вы в на первом шаге этого поста. Ну вот и все.
Проблемы с кодировкой.
Сделать БД с кодировкой 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”;
Все может случиться: и богатый к бедному стучится.
Спасибо за инструкцию.
Не понял насчет табуляции в database.yml, это вроде как специфика yaml – параметры здесь это вложенные элементы секции development
Наверняка, вы правы. Я с YML очень слабо знаком.
Или гораздо быстрее экспортировать и импортировать дамп можно так соответственно:
$ mysqldump -u dbuser -p dbname > dumpfile
$ mysql -udbuser -p -hlocalhost dbname < dumpfile
Было бы еще хорошо затронуть нюанс что не нужно делать цифровой пароль и про настройку кодировки UTF-8 в базе.
Про пароль я и сам не знал, спасибо за инфу. А про кодировку написано в первом моем комменте к этой статье
Еще бывает bundle install не может установить gem mysql2 приходится ему библиотеки с хидерами установить
sudo apt-get install libmysql-ruby libmysqlclient-dev mysql-client mysql-server
Это походу чисто дебиановская трабла, в RH-based сколько раз я ни устанавливал никаких, слава Богу, проблем не было. Вероятно dev-пакеты подтягиваются как зависимости от mysql,mysql-server, mysql-devel и ruby-mysql.
В любом случае большое спасибо за инфу.
В MariDB команда создания БД:
CREATE DATABASE railsdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Если при создании базы возникает ошибка
Mysql2::Error: Specified key was too long; max key length is 767 bytes
(чаще всего в инете встречается эта ошибка при использовании Devise), то надо добавить config/initializers/mysqlpls.rb:Ошибка возникает при использовании кодировки
utf8mb4
, если база вutf8
этой проблемы не будет. Подробнее об ошибке и ее решении: https://github.com/rails/rails/issues/9855#issuecomment-28874587