ibdata1和MyISAM是互斥的。
首先,您应该统计使用这两种存储引擎的表的数量:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
如果有一些表是InnoDB类型:
执行清理InnoDB的操作
如果您只有MyISAM表而没有InnoDB表:
首先,消除任何InnoDB痕迹
按照以下步骤进行:
STEP01) 将以下内容添加到my.cnf中
[mysqld]
skip-innodb
步骤02) service mysql restart
步骤03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
完成这些步骤后,您可以执行以下操作压缩每个MyISAM表:
对于MyISAM类型的表mydb.mytable,只需运行以下命令之一:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
如果您想要碎片整理所有MyISAM表,这是一个shell脚本...
MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('OPTIMIZE TABLE ',table_schema,'.',table_name,';') "
SQL="${SQL} FROM information_schema.tables "
SQL="${SQL} WHERE engine='MyISAM' AND table_schema NOT IN "
SQL="${SQL} ('information_schema','performance_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQL}" > GlobalMyISAMOptmizeTable.sql
less GlobalMyISAMOptmizeTable.sql
如果你在视觉上信任这个脚本,那么就直接运行它。
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
来试试吧!
更新 2012-07-25 09:52 EDT
我想澄清一下关于压缩 MyISAM 的建议之一。
我之前说过:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
这些命令在机械上是相同的。 OPTIMIZE TABLE
对 MyISAM 表进行碎片整理,然后运行 ANALYZE TABLE
来计算最新的索引统计信息。
从机械的角度来看,这就是 ALTER TABLE mydb.mytable ENGINE=MyISAM;
所做的事情:
CREATE TABLE mydb.mytabletmp LIKE mydb.mytable;
INSERT INTO mydb.mytabletmp SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytabletmp RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;