sql >> Databasteknik >  >> RDS >> Mysql

MySQL:minska ibdata-filstorleken för MyISAM-tabeller

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

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;


  1. WAMP Virtual Host fungerar inte

  2. Hur räknar man användarfrågor?

  3. Importera en CSV till MySQL med annat datumformat

  4. Det går inte att ladda upp och lagra bilden i databasen genom att använda php