Конвертация таблиц mysql из MyIsam в InnoDB

Допустим у нас есть mysql база данных site_db, а в ней таблица tablename. Нам нужно конвертировать таблицу tablename из myisam в innodb. По идее всё просто. 1 2 3 mysql -u root -p USE site_db; ALTER TABLE tablename ENGINE=InnoDB; Но в жизни мы можем получить следующий ответ ответ 1 ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes И вот здесь можно побороться. SHOW CREATE TABLE tablename; Нам покажут много строк, среди которых будет строчка с текстом FULLTEXT KEY key_name (column_list) или что-то около того. Важно чтоб в начале было FULLTEXT KEY. Запомнили этот ‘key_name’. Удаляем этот индекс ALTER TABLE tablename DROP INDEX key_name; в ответ получим что-то такое 1 2 Query OK, 6175950 rows affected (20 min 56.88 sec) Records: 6175950 Duplicates: 0 Warnings: 0 а затем снова пробуем конвертировать ALTER TABLE tablename ENGINE=InnoDB; В этот раз должно всё получиться. Не забывайте использовать screen, если работаете с большими базами данных.

13 квітня 2016 · 1 хвилина · 153 слів · dimetrius

Некоторые параметры mysql innodb

В качестве заметки… При изменении innodb_log_file_size придется остановить сервер и удалить (или переименовать) старый лог файл, для чего могут потребоваться рутовые права. Если же старый файл не удалять, mysql просто откажется стартовать. Моя выжимка из конфига (не самая сильная dev-машина, 3G RAM, Dual CPU E2140 @ 1.60GHz) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 [innodb] innodb_buffer_pool_size = 1024M innodb_flush_method = O_DIRECT innodb_log_file_size = 256M innodb_log_buffer_size = 4M innodb_flush_log_at_trx_commit = 2 innodb_thread_concurrency = 8 [mysqld] log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 1 log-queries-not-using-indexes default-storage-engine = InnoDB collation_server=utf8_general_ci character_set_server=utf8 и вот ещё из другого источника innodb_buffer_pool_size – 70 – 80% оперативной памяти. Я ставлю это значение в 12G на системе с 16G RAM innodb_log_file_size – зависит от необходимого вам объема данных для восстановления, но 256МБ будут разумным компромиссом между производительностью и рамером лог-файла innodb_log_buffer_size=4M – 4 мегабайта – нормальное значение, если вы не используете подачу больших блоков данных в InnoDB через каналы (pipes). Если используете, это значение лучше увеличить. innodb_flush_logs_at_trx_commit=2 – если вас не особо заботит ACID, и вы можете себе позволить потерять транзакции за последние секунду или две, в случае полного краха ОС, то установите это значение. Но это может повлечь печальные эффекты при коротких записях транзакций. innodb_thread_concurrency=8 – даже при имеющихся InnoDB Scalability Fixes будет совсем не лишним иметь ограниченное количество потоков. Значение может быть больше или меньше в зависомости от ваших потребностей, но 8 будет оптимальным значением для начала. innodb_flush_method=O_DIRECT – избегайте двойной буферизации и уменьшите активность swap, в большинстве случаев это увеличивает производительность. Но будьте осторожны, если у вас нет RAID с возможностью сохранения данных, операции ввода-вывода могут проходить некорректно и данные могут быть повреждены. innodb_file_per_table– если у вас немного таблиц, используйте эту опцию и рост занимаемого таблицами места не будет бесконтрольным. Эта опция добавлена в MySQL 4.1 и сейчас достаточно стабильна для использования. ...

13 квітня 2016 · 2 хвилин · 329 слів · dimetrius