ibdata1 i MyISAM wzajemnie się wykluczają.
Pierwszą rzeczą, którą powinieneś zrobić, to policzyć, ile tabel korzysta z obu silników pamięci masowej:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Jeśli NIEKTÓRE tabele to InnoDB:
Wykonaj czyszczenie InnoDB
- Jak:wyczyścić Silnik pamięci mysql InnoDB?
- https://dba.stackexchange.com/questions/8982/jest-najlepszy sposób-na-zmniejszenie-rozmiaru-ibdata-w-mysql/ 8983#8983
Jeśli masz tylko tabele MyISAM i nie masz tabel InnoDB:
Najpierw usuń wszelkie ślady InnoDBWykonaj następujące czynności:
KROK01) Dodaj to do my.cnf
[mysqld]
skip-innodb
STEP02) service mysql restart
STEP03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Po wykonaniu tych kroków możesz wykonać kompresję każdej tabeli MyISAM w następujący sposób:
Dla tabeli mydb.mytable, czyli MyISAM, uruchom jedną z następujących czynności:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Jeśli chcesz zdefragmentować wszystkie tabele MyISAM, oto skrypt powłoki, który to zrobi...
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
Gdy zaufasz wizualnie skryptowi, po prostu go uruchom
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Wypróbuj !!!
AKTUALIZACJA 25.07.2012 09:52 EDT
Chciałbym wyjaśnić jedną z moich sugestii dotyczących kompresji MyISAM
Powiedziałem wcześniej
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Te polecenia są mechanicznie identyczne. OPTIMIZE TABLE
wykonuje defragmentację tabeli MyISAM, a następnie uruchamia ANALYZE TABLE
do obliczania świeżych statystyk indeksu.
Mówiąc mechanicznie, to właśnie ALTER TABLE mydb.mytable ENGINE=MyISAM;
robi:
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;