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: конечно, рекомендую сделать бекап базы прежде чем конвертировать - на всякий случай.

2012/01/12

Восстановление MySQL MyISAM

Если у вас в логах внезапно начали появляться ошибки типа "Table './mybd/cw_table' is marked as crashed and last (automatic?) repair failed", то значит наш дорогой MyISAM дал сбой. А так как автовосстановления в нем не предусмотрели, то придется вручную нам это сделать. Во-первых, остановим сервер mysql:
# /etc/rc.d/mysql-server stop
Воспользуемся утилитой myisamchk для восстановления таблицы с ключом -r, что означает recovery:
# myisamchk -r cw_table
Это помогает в большинстве случаев. При запущенных случаях, если посыпались много таблиц, то можно проверить всю базу целиком:
# myisamchk --silent --force --fast --update-state /var/lib/mysql/mybd/*.MYI
Если сбои произошли в результате смерти жесткого диска и файлы восстановлялись с помощью черной магии, то вместо опции --fast лучше задать --medium-check или же --extended-check, если времени вагон / небольшие таблицы / мало индексов.