ibdata1 og MyISAM udelukker hinanden.
Den første ting du skal gøre er at tælle, hvor mange tabeller der bruger begge lagermotorer:
SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;
Hvis NOGLE tabeller er InnoDB:
Udfør min Oprydning af InnoDB
- Howto:Rengør en mysql InnoDB storage engine?
- https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/ 8983#8983
Hvis du kun har MyISAM-tabeller og ingen InnoDB-tabeller:
Fjern først eventuelle spor af InnoDBDo følgende:
TRIN01) Føj dette til my.cnf
[mysqld]
skip-innodb
TRIN02) service mysql restart
STEP03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*
Efter disse trin kan du udføre en komprimering af hver MyISAM-tabell som denne:
For tabellen mydb.mytable, der er MyISAM, skal du blot køre en af følgende:
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Hvis du vil defragmentere alle dine MyISAM-tabeller, er her et shell-script til at gøre 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 har tillid til scriptet visuelt, skal du bare køre det
mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql
Prøv det!!!
OPDATERING 2012-07-25 09:52 EDT
Jeg vil gerne præcisere et af mine forslag til komprimering af MyISAM
Jeg sagde tidligere
OPTIMIZE TABLE mydb.mytable;
ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;
Disse kommandoer er mekanisk identiske. OPTIMIZE TABLE
udfører en defragmentering af MyISAM-tabellen og kører derefter ANALYZE TABLE
at beregne frisk indeksstatistik.
Mekanisk set er dette hvad 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;