"ALTER table" для всех таблиц в базе данных
Как я могу запустить следующее для каждой таблицы в базе данных:
ALTER table [table_name] type=innodb;
Я не хочу запускать его вручную для каждой таблицы, а запускать его для всех таблиц в базе данных. В качестве отступления: если вам интересно, почему я запускаю это: http://bugs.mysql.com/bug.php?id=1341 & http://bugs.mysql.com/bug.php?id=1287
3 ответа
Предполагая, что вы настроили свои учетные данные на 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
Конечно, замените имя_базы_данных именем вашей базы данных.
Что касается вас, основной вопрос. Похоже, вы хотите освободить место после того, как ваши таблицы innodb станут большими. Как сказано в сообщении об ошибке, единственный безопасный способ справиться с этим - использовать mysqldump для экспорта всего. Удалите файлы и затем восстановите.
Как отмечает эта статья. Вы можете включить innodb_file_per_table Опция my.cnf вашего сервера заставит каждый файл существовать как отдельный файл. Таким образом, освобождение места может быть сделано путем удаления / восстановления проблемной таблицы вместо всего.
Об ответе Zoredache (который был очень полезен для меня, спасибо): --skip-column-names следует использовать для удаления заголовка.
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`;
Затем переберите набор результатов, генерируя запрос для каждого.