Перевод базы Drupal сайта с MyISAM на InnoDB

Опубликовано malov - пн, 09/14/2015 - 11:54

1. Перед началом работ, рекомендую сделать резервную копию базы данных

mysqldump -uuser -ppassword --default-character-set=utf8 database > dump.sql

или через drush

drush sql-dump > dump.sql

2. Далее, надо выяснить версию MySQL

mysql --version

3. Если версия mysql ниже чем 5.6.4, то надо проверить все таблицы на наличие индексов с типом FULLTEXT. Зайти через консоль в mysql

mysql -uuser -ppaswword

4. Перейти в базу данных information_schema, в которой хранится структура данных всех БД на сервере

use information_schema;

5. Выполнить запрос:

SELECT TABLE_SCHEMA,
TABLE_NAME FROM statistics
WHERE index_type LIKE 'FULLTEXT%';

6. Если такие таблицы есть, то необходимо изучить для чего создан индекс и изменить его тип, или удалить. При удалении индекса выборка по этим таблицам будет осуществляться медленнее. Если таблицы не найдены - переходим к следующему шагу
7. Перевести сайт в режим обслуживания, в файл index.php вставить:

header('HTTP/1.1 503 Service Unavailable');
header('Content-Type: text/html; charset=UTF-8');
print('Website under maintenance. Please visit website later.');
exit();

8. В файл /etc/mysql/my.cnf добавить строку

default-storage-engine=innodb

9. Остановить mysql:

/etc/init.d/mysql stop

10. В директории /var/lib/mysql файлы ibdata1, ib_logfile0, ib_logfile1 переместить в /tmp
11. Запустить mysql:

/etc/init.d/mysql start

12. Зайти в mysql и проверить типы поддерживаемых систем хранения, среди них должен быть innodb:

show engines;

13. Далее изменим систему хранения в таблицах. Это можно сделать вручную с каждой таблицей. Для этого в консоли mysql выполнить команду

ALTER TABLE `yourtable` ENGINE = InnoDB;

Но если таблиц много, то проще через скрипт.
14. Создайте файл convert.sh с содержимым:

DBUSER=user
DBPWD=password
DBNAME=db
ENGINE=innodb
for t in `echo "show tables" | mysql -u$DBUSER -p$DBPWD --batch --skip-column-names $DBNAME`; do
    mysql -u$DBUSER -p$DBPWD $DBNAME -e "ALTER TABLE \`$t\` ENGINE = $ENGINE;";
done

DBUSER=user - укажите имя пользователя для подключения к базе данных
DBPWD=password - укажите пароль от пользователя
DBNAME=db - укажите имя базы данных
ENGINE=innodb - укажите тип системы хранения данных. В данном случае указан тип innodb
15. Выполнить файл

sh convert.sh

16. По завершению конвертации, удалите из файла index.php строки, которые указали в начале.

Update
Все изменения по переходу с MyISAM на InnoDB рекомендуем делать на отдельной базе данных, чтобы не затронуть работу основного проекта.

Теги

Добавить комментарий

Filtered HTML

  • Допустимые HTML-теги: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd>
  • Строки и абзацы переносятся автоматически.
  • Web page addresses and email addresses turn into links automatically.