2012/01/24

Конвертация MyISAM -> InnoDB

По мотивам предыдущего поста. :))
В интернете много всяких заметок по поводу преобразования MyISAM в InnoDB: и с помощью всяких скриптов, и утилит типа mysql_convert_table_format, и даже с помощью sed. Но нам сложности не нужны, поэтому предлагаю самый простой вариант. Во-первых, остановим сервер:
# /etc/rc.d/mysql-server stop
Затем нужно убедиться, что в конфиге /etc/mysql/my.cnf нет строчки skip-innodb, а также присутствует строчка типа:
innodb_data_file_path = ibdata1:100M:autoextend
Затем логинимся в консоль MySQL:
mysql -u <username> -p
И вводим команду:
ALTER TABLE <tablename> ENGINE='InnoDB';
Вот и всё! Моя гиговая табличка преобразовалась за шесть минут.

PS: конечно, рекомендую сделать бекап базы прежде чем конвертировать - на всякий случай.

6 comments:

  1. Если уже конвертировать наживую - то лучше innodb_file_per_table сразу включать http://michael-xiii.blogspot.com/2011/10/mysql-innodbfilepertable.html

    ReplyDelete
    Replies
    1. Спасибо за замечание, в будущем учту это. Но в текущем случае комп задействован под достаточно специфичный проект, где только 1 табличка и она постоянно разрастается. :)

      Delete
  2. Паш, я чего-то, наверное, не понимаю, но если ты остановишь сервер, то как ты к базе данных подключишься? )

    ReplyDelete
    Replies
    1. да, это залет :)

      Delete
    2. А поправить в статье залёт?

      Delete
    3. mysql -u username -p // подключаемся через ssh к серверу
      SHOW DATABASES; // смотрим список баз данных
      USE databasename; // выбираем нужную
      ALTER TABLE ENGINE='InnoDB'; // конвертим нужную таблицу в базе

      ну и в конце перезагружаем mysql сервер. У меня базу в полтора гигабайта переконвертило минут за пять. Кстати, можно названия таблиц указывать в одну строку через точку с запятой, например ALTER TABLE users ENGINE='InnoDB';ALTER TABLE news ENGINE='InnoDB';

      Delete