Назад | Перейти на главную страницу

'ALTER table' для всех таблиц в базе данных

Как я могу выполнить следующее для каждой таблицы в базе данных:

ALTER table [table_name] type=innodb;

Я не хочу, чтобы вручную запускал его для каждой таблицы, а лучше запускать его для всех таблиц в базе данных. В стороне: если вам интересно, почему я использую это: http://bugs.mysql.com/bug.php?id=1341 & http://bugs.mysql.com/bug.php?id=1287

Предполагая, что у вас настроены учетные данные на my.cnf, такая команда может делать то, что вы хотите.

mysql --batch --skip-column-names --execute \
'select concat("alter table ",TABLE_SCHEMA,".",TABLE_NAME," type=innodb;") 
 from information_schema.TABLES where TABLE_SCHEMA="database_name"' | mysql

Конечно, замените database_name на имя вашей базы данных.

Что касается вас главного вопроса. Похоже, вы хотите освободить место после того, как позволили вашим таблицам innodb стать большими. Как сказано в сообщении об ошибке, единственный безопасный способ справиться с этим - использовать mysqldump для экспорта всего. Удалите файлы, а затем восстановите.

Как отмечается в этой статье. Вы можете включить innodb_file_per_table опция my.cnf вашего сервера сделает каждый файл отдельным файлом. Таким образом, освободить место можно путем удаления / восстановления таблицы проблем, а не всего.

Об ответе Zoredache (который был очень полезен для меня, спасибо): - пропустить имена столбцов следует использовать для удаления заголовка.

mysql --batch --skip-column-names -e \ 
'select concat("alter table ",TABLE_SCHEMA,".",TABLE_NAME," type=innodb;")  
 from information_schema.TABLES where TABLE_SCHEMA="database_name"' | mysql

Я не знаю, какой язык вы используете, но вы, вероятно, можете просто запустить:

show table status from `DATABASE`;

Затем прокрутите набор результатов, создавая запрос для каждого.