Ho la risposta completa per questo.
Una volta che innodb_file_per_table è stato messo in atto, e le nuove tabelle InnoDB possono essere ridotte usando ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
Ciò ridurrà i nuovi .ibd
file GARANTITI.
Se corri ALTER TABLE <innodb-table-name> ENGINE=InnoDB';
su una tabella InnoDB creata prima di usare innodb_file_per_table, strapperà i dati e gli indici per quella tabella dal file ibdata1 e li memorizzerà in un .ibd
file, questo lascerà un intero piccione permanente nell'ibdata1 che non potrà mai essere riutilizzato .
Il ibdata1
file contiene normalmente quattro tipi di informazioni
- Dati tabella
- Indici delle tabelle
- Dati
MVCC (Multiversioning Concurrency Control)
- Segmenti di rollback
- Annulla spazio
- Tabella dei metadati (dizionario dei dati)
- Double Write Buffer (scrittura in background per impedire la dipendenza dalla cache del sistema operativo)
- Inserisci buffer (gestione delle modifiche agli indici secondari non univoci)
- Vedi il
Pictorial Representation of ibdata1
Ecco il modo garantito per ridurre il file ibdata1 praticamente per sempre ...
PASSAGGIO 01) MySQLDump di tutti i database in un file di testo SQL (chiamalo SQLData.sql)
PASSAGGIO 02) Eliminare tutti i database (tranne gli schemi mysql, information_schema e performance_schema)
PASSAGGIO 03) Spegnimento mysql
PASSAGGIO 04) Aggiungi le seguenti righe a /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend
Sidenote: qualunque sia il tuo set per innodb_buffer_pool_size, assicurati che innodb_log_file_size sia il 25% di innodb_buffer_pool_size.
- PASSAGGIO 05) Elimina ibdata1, ib_logfile0 e ib_logfile1 ( vedi l'aggiornamento sotto prima di cancellare! )
A questo punto, dovrebbe esserci solo lo schema mysql in / var / lib / mysql
- PASSAGGIO 06) Riavvia mysql
Ciò ricrea ibdata1 a 10 MB (non configurare l'opzione), ib_logfile0 e ib_logfile1 a 1G ciascuno
- PASSAGGIO 07) Ricaricare SQLData.sql in mysql
ibdata1
crescerà ma conterrà solo metadati di tabella e dati MVCC intermittenti.
Ogni tabella InnoDB esiste al di fuori di ibdata1
Supponiamo di avere una tabella InnoDB denominata mydb.mytable. Se vai in /var/lib/mysql/mydb
, vedrai due file che rappresentano la tabella
mytable.frm
(Intestazione del motore di archiviazione)
mytable.ibd
(Home dei dati delle tabelle e degli indici delle tabelle per mydb.mytable
)
ibdata1
non conterrà più dati e indici InnoDB.
Con l' opzione innodb_file_per_table in /etc/my.cnf
, puoi eseguire OPTIMIZE TABLE mydb.mytable
OR ALTER TABLE mydb.mytable ENGINE=InnoDB;
e il file /var/lib/mysql/mydb/mytable.ibd
si ridurrà effettivamente.
L'ho fatto numerose volte nella mia carriera come DBA MySQL senza un singolo problema da allora in poi. In effetti, la prima volta che l'ho fatto, ho compresso un file ibdata1 da 50 GB in 50 MB.
Provaci. Se hai ulteriori domande al riguardo, inviami un'e-mail. Fidati di me. Questo funzionerà a breve termine e nel lungo periodo.
AGGIORNAMENTO 2013-07-02 15:08 EDT
C'è un avvertimento che ho a questo proposito che ho aggiornato in altri miei post, ma ho perso questo: sto aggiornando un po 'di più la mia risposta con innodb_fast_shutdown perché ho usato per riavviare mysql e fermare mysql per farlo. Ora, questo passaggio è fondamentale poiché ogni transazione non impegnata può avere altre parti mobili all'interno e all'esterno dei registri delle transazioni di InnoDB ( vedi InnoDB Infrastruttura ).
Si noti che l'impostazione innodb_fast_shutdown su 2 pulirà anche i logout ma esistono ancora più parti mobili e vengono raccolte su Crash Recovery durante l'avvio di mysqld. L'impostazione di 0 è la migliore.