Parece que você tem tabelas enormes
Se você gostaria de desfragmentar uma tabela Indb de mydb.mytable, apenas execute o seguinte:
ALTER TABLE mydb.mytable ENGINE=InnoDB;
Sob o hodd, ele fará o seguinte:
CREATE TABLE mydb.mytablenew LIKE mydb.mytable;
INSERT INTO mydb.mytablenew SELECT * mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytableold;
ALTER TABLE mydb.mytablenew RENAME mydb.mytable;
DROP TABLE mydb.mytableold;
Se você deseja desfragmentar em massa todas as Tabelas InnoDB, basta executar isto:
echo "SET SQL_LOG_BIN = 0;" > /root/DefragInnoDB.sql
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
mysql ${MYSQL_CONN} -ANe"${SQL}" >> /root/DefragInnoDB.sql
mysql ${MYSQL_CONN} -A < /root/DefragInnoDB.sql
Você pode não precisar desfragmentar o InnoDB com freqüência. Confira meu post no DBA StackExchange para determinar se qualquer tabela InnoDB precisa ser desfragmentada .
Em um sidenote, algumas das tabelas parecem ter mais espaço consumido pelo índice do que pelos dados. Depois de executar a desfragmentação nessas tabelas, volte e examine os índices em cada tabela. Tente determinar se houver algum índice não utilizado e remova-o.
Você tem 300 como innodb_open_files . Você pode aumentá-lo, mas não enlouqueça muito alto
Veja os posts a seguir em innodb_open_files
Eu também gostaria de recomendar que você atualize o MySQL 5.5 onde você pode criar innodb_read_io_threads e innodb_write_io_threads para melhor CPU utilização pelo InnoDB Storage Engine .