MySQL:减少MyISAM表的ibdata文件大小

时间:2012-07-24 16:34:38

标签: mysql

我的问题实际上非常类似于此问题,并且对InnoDB Engine表的案例也提供了一个很好的答案:

https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/8983#8983

我注意到drop schema不会缩小ibdata文件,所以我找了一种方法来配置数据库,以便在删除模式后减小大小。

我发现很多链接都在谈论InnoDB以及保存每个文件表的方法,这样它自己的.frm文件就会包含表格数据并且会减少。

但是MyISAM表会发生什么(表大小超过5G)。

2 个答案:

答案 0 :(得分:4)

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的CleanUp

如果您只有MyISAM表而没有InnoDB表:

首先,消除InnoDB的任何痕迹 执行以下操作:

STEP01)将此添加到my.cnf

[mysqld]
skip-innodb

STEP02)service mysql restart

STEP03)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美国东部时间

我想澄清一下我对压缩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;

答案 1 :(得分:2)

如上所述,MyISAM不应该使用ibdata。 您的my.cnf或MySQL shell类型中的innodb设置是什么:

    SHOW VARIABLES LIKE "%innodb%";

这些变量是否已设定?

    innodb_data_home_dir
    innodb_data_file_path

如果你根本不使用INNODB,你应该能够安全地删除ibdata和ib_logfile并重新启动MySQL。通常虽然在不丢弃表的情况下删除它们会导致问题。 见How to shrink/purge ibdata1 file in MySQL

如果您有超过5Gigs的MyISAM表,建议您仍然使用INNODB。 (任何超过4演出)。 要进行问题排查,您可以尝试添加

    skip-innodb 
如果您根本没有使用INNODB,请访问my.cnf。