Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL:riduzione della dimensione del file ibdata per le tabelle MyISAM

ibdata1 e MyISAM si escludono a vicenda.

La prima cosa da fare è contare quante tabelle utilizzano entrambi i motori di archiviazione:

SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;

Se ALCUNE tabelle sono InnoDB:

Esegui la mia pulizia di InnoDB

Se hai solo tabelle MyISAM e nessuna tabella InnoDB:

Innanzitutto, elimina qualsiasi traccia di InnoDB. Fai quanto segue:

STEP01) Aggiungi questo a my.cnf

[mysqld]
skip-innodb

STEP02) service mysql restart

PASSO03) rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*

Dopo questi passaggi, puoi eseguire una compressione di ciascuna tabella MyISAM in questo modo:

Per la tabella mydb.mytable che è MyISAM, esegui semplicemente una delle seguenti operazioni:

  • OPTIMIZE TABLE mydb.mytable;
  • ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;

Se vuoi deframmentare tutte le tue tabelle MyISAM, ecco uno script di shell per farlo...

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

Una volta che ti fidi visivamente dello script, eseguilo

mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql

Provalo!!!

AGGIORNAMENTO 25-07-2012 09:52 EDT

Vorrei chiarire uno dei miei suggerimenti per la compressione di MyISAM

Ho detto prima

  • OPTIMIZE TABLE mydb.mytable;
  • ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;

Questi comandi sono meccanicamente identici. OPTIMIZE TABLE esegue una deframmentazione della tabella MyISAM e quindi esegue ANALYZE TABLE per calcolare nuove statistiche sull'indice.

Meccanicamente parlando, questo è ciò che ALTER TABLE mydb.mytable ENGINE=MyISAM; fa:

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;