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

MySQL:reduktion af ibdata-filstørrelse for MyISAM-tabeller

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

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;


  1. Primær nøgle SQL-vejledning – Sådan defineres en primær nøgle i en database

  2. Opret forbindelse til MySQL eksternt

  3. Kan jeg have en begrænsning på antallet af forskellige værdier i en kolonne i SQL?

  4. Gem mysql array php