Qual è il file ibdata1 nella mia directory / var / lib / mysql?


32

Accedendo al mio pannello di controllo Webmin, ho notato che praticamente tutto il mio spazio su disco è pieno. Ho cercato i dieci file / directory più grandi sul mio sistema e ho scoperto che un file chiamato ibdata1 occupa circa 94 GB di spazio. Risiede nella mia directory / var / lib / mysql.

Cosa fa ibdata1? Sono sicuro di rimuoverlo? La mia ipotesi è che si tratti di una discarica di qualche tipo, ma è solo un'ipotesi selvaggia.

Risposte:


38

Il file ibdata1è il tablespace di sistema per l'infrastruttura InnoDB.

Contiene diverse classi per informazioni vitali per InnoDB

  • Pagine dei dati della tabella
  • Pagine indice delle tabelle
  • Dizionario dei dati
  • Dati di controllo MVCC
    • Annulla spazio
    • Segmenti di rollback
  • Doppio buffer di scrittura (pagine scritte in background per evitare la memorizzazione nella cache del sistema operativo)
  • Inserisci buffer (modifiche agli indici secondari)

Nota: il posto di ibdata1 nell'universo InnoDB (sul lato destro)

Architettura di InnoDB

È possibile separare le pagine dei dati e dell'indice ibdata1abilitando innodb_file_per_table . Ciò farà sì che qualsiasi tabella InnoDB appena creata memorizzi i dati e indicizzi le pagine in un .ibdfile esterno .

Esempio

  • il datadir è / var / lib / mysql
  • CREATE TABLE mydb.mytable (...) ENGINE=InnoDB;, crea /var/lib/mysql/mydb/mytable.frm
    • innodb_file_per_table abilitato, pagine dati / indice archiviate in /var/lib/mysql/mydb/mytable.ibd
    • innodb_file_per_table disabilitato, Pagine dati / indice archiviate in ibdata1

Indipendentemente da dove è memorizzata la tabella InnoDB, la funzionalità di InnoDB richiede la ricerca di metadati della tabella e la memorizzazione e il recupero delle informazioni MVCC per supportare la conformità ACID e l' isolamento delle transazioni .

Ecco i miei precedenti articoli sulla separazione dei dati e degli indici delle tabelle da ibdata1

COSA FARE DOPO

Puoi continuare ad avere ibdata1 memorizzato tutto, ma questo rende il fare istantanee LVM un vero e proprio lavoro (la mia opinione personale).

Devi usare il mio post StackOverflow e ridurre quel file in modo permanente.

Si prega di eseguire questa query:

SELECT 
    ((POWER(1024,3)*94 - InnoDBDiskDataAndIndexes))/POWER(1024,3) SpaceToReclaim
FROM
(SELECT SUM(data_length+index_length) InnoDBDiskDataAndIndexes
FROM information_schema.tables WHERE engine='InnoDB') A;

Questo dirà quanto spazio sprecato può essere recuperato dopo aver applicato InnoDB Cleanup.


Grazie per il tuo contributo. Da allora la mia quota del disco si è riempita completamente - prima di dare seguito ai consigli nei tuoi post, avrò bisogno di spazio libero? Prendo atto che il tuo post originale su SO menziona come fare un dump SQL, ma questo presumibilmente creerebbe un file di ~ 90 GB senza nessun posto dove andare.
James,

mysqldump rappresenterà solo la rappresentazione logica delle pagine di dati, non degli indici. Sarà necessario un altro mount del disco, forse un server remoto, per scaricare i dati.
RolandoMySQLDBA

9
Restituisce 91.25350952148438 per me come SpaceToReclaim. È in megabyte? per cento? byte?
Isacco,

So che è troppo vecchio. Ma per chiunque venga qui con il problema, devi sostituire il numero 94con qualunque sia la dimensione del tuo ibdata1file in GB e SpaceToReclaimti darà la dimensione in GB.
anupsabraham


2

Se si utilizza innodb come motore MySQL per impostazione predefinita, tutti i database verranno archiviati in ibdata1. Inoltre ci sono file di registro ib_logfile0 e ib_logfile1. Non eliminare quei file.


Cos'è eliminare quel file sul mio server?
Frank,
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.