ibdata1 och MyISAM utesluter varandra.
Det första du bör göra är att räkna hur många tabeller som använder båda lagringsmotorerna:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Om NÅGRA tabeller är InnoDB:
Utför min CleanUp av InnoDB
- Howto:Clean a mysql InnoDB-lagringsmotor?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
Om du bara har MyISAM-tabeller och inga InnoDB-tabeller:
Ta först bort alla spår av InnoDBDo följande:
STEP01) Lägg till detta till my.cnf
[mysqld]
skip-innodb
STEP02) service mysql restart
STEP03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Efter dessa steg kan du utföra en komprimering av varje MyISAM-tabell så här:
För tabellen mydb.mytable som är MyISAM, kör bara något av följande:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Om du vill defragmentera alla dina MyISAM-tabeller, här är ett skalskript för att göra det...
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
När du litar på skriptet visuellt är det bara att köra det
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Ge det ett försök !!!
UPPDATERING 2012-07-25 09:52 EDT
Jag skulle vilja förtydliga ett av mina förslag för komprimering av MyISAM
Jag sa tidigare
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Dessa kommandon är mekaniskt identiska. OPTIMIZE TABLE
utför en defragmentering av MyISAM-tabellen och kör sedan ANALYZE TABLE
för att beräkna färsk indexstatistik.
Mekaniskt sett är detta vad ALTER TABLE mydb.mytable ENGINE=MyISAM;
gör:
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;