Come posso ridurre il file innodb ibdata1 senza scaricare tutti i database?


24

InnoDB memorizza tutte le tabelle in un unico file di grandi dimensioni ibdata1.

Dopo aver eliminato una tabella grande, il file mantiene le sue dimensioni, indipendentemente dalla dimensione della tabella. Come posso ridurre quel file senza dover scaricare e reimportare l'intero database (che ha diverse centinaia di GB in totale)?

Penso che il motivo sia perché sei ancora in grado di ripristinare il rilascio. Nel mio caso non ne ho bisogno.

Risposte:


30

Questo è uno degli argomenti più controversi che abbia mai affrontato negli anni come DBA MySQL e nello StackExchange DBA.

Per dirla in parole povere, semplicemente non c'è altro modo per ridurre ibdata1 . Con innodb_file_per_table disabilitato, ogni volta che si esegue OPTIMIZE TABLEsu una tabella InnoDB, ibdata1 cresce rapidamente. Dati che vengono eliminati utilizzando DROP TABLEe DROP DATABASEnon è possibile eseguire il rollback perché sono DDL, non DML. Credo che Oracle e MSSQL possano eseguire il rollback del DDL. MySQL non può farlo.

Esistono diverse classi di informazioni che risiedono in ibdata1

  • Dati tabella
  • Indici delle tabelle
  • Tabella MetaData
  • Dati di controllo MVCC
  • Doppio buffer di scrittura (scrittura in background per impedire la dipendenza dalla cache del sistema operativo)
  • Inserisci buffer (Gestione delle modifiche agli indici secondari non univoci)

L'utilizzo innodb_file_per_table=1consentirà di creare nuove tabelle con i dati delle tabelle e gli indici delle tabelle creati all'esterno di ibdata1. È possibile estrarre qualsiasi tabella ancora all'interno di ibdata1 utilizzandoALTER TABLE ... ENGINE=InnoDB; o OPTIMIZE TABLEma ciò lascerà quel grande spazio inutilizzato spalancato in ibdata1.

Tuttavia, è necessario ripulire l'infrastruttura InnoDB. Ho già scritto post su StackExchange su come e perché farlo:

Buone notizie

Devi solo scaricare i dati, ricaricare ancora una volta e non rivedere mai più questo problema . L'esecuzione OPTIMIZE TABLEsuccessiva ridurrà effettivamente il .ibdfile tablespace per qualsiasi tabella InnoDB.


1
Correzione minore: MSSQL e PostgreSQL possono ripristinare DDL. Oracle non può. In effetti Oracle emette un commit implicito quando vede DDL!
Chris Travers,

1
@RolandoMySQLDBA da quale versione di MySQL funziona questa "buona notizia" del restringimento automatico?
Gavriel,

@Gavriel - Penso che tu abbia letto male. Devi ancora scaricare; rimuovi ibdata1; ricomincia; e ricaricare. No-autoshrink di ibdata1. (Cambiare iblog * è ora più semplice.)
Rick James

2

InnoDB memorizza tutte le tabelle InnoDB in ibdata1 solo se non si utilizza la seguente impostazione nel file delle impostazioni predefinite my.cnf:

innodb_file_per_table = 1

DROP TABLE (e DROP DATABASE) non possono essere ripristinati.

Questo non è il motivo per cui non è possibile ridurre ibdata1.

Questa è una spiegazione abbreviata, ma ibdata1 contiene interni InnoDB oltre ai dati della tabella. Da quanto ho capito, per ridurlo sarebbe necessario deframmentarlo, che non è un'operazione supportata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.