Perché tutte le tabelle MySQL InnoDB sono frammentate?


10

Per qualche motivo, tutte le tabelle InnoDB nel mio server MySQL vengono elencate come frammentate quando eseguo mysqltuner. Ho installato il server solo poche ore fa (su OSX Lion) e contiene un sacco di nuovi dati importati da file batch.

Ho provato a convertire tutte le tabelle in un database in MYISAM e sicuramente il numero di tabelle frammentate è diminuito. Stranamente, non appena ho convertito quelle tabelle in InnoDB, il conteggio frammentato delle tabelle è tornato indietro. Questo è contrario alla mia ricerca finora che suggerisce che la corsa ALTER TABLE table_name ENGINE=INNODB;dovrebbe riparare la frammentazione.

Dopo un po 'di googling ho corso:

SELECT table_schema, table_name, data_free/1024/1024 AS data_free_MB 
FROM information_schema.tables
WHERE engine LIKE 'InnoDB' AND data_free > 0

Che presumibilmente elenca tutte le tabelle frammentate (in effetti restituisce lo stesso numero di risultati degli output mysqltuner per il conteggio delle tabelle frammentate). Ogni singola voce ha esattamente lo stesso numero nella data_free_MBcolonna (attualmente 7.00000000).

È davvero un vero problema o qualcosa che mysqltuner sta facendo male? Se si tratta di un problema, come posso risolverlo?

MODIFICARE

Sto diventando sempre più sospettoso di essere un idiota e che la frammentazione di 7 MB sia per l'intero file, non per ogni tabella. Qualcuno può confermare se ciò sarebbe il caso?


Pensi davvero che 7 MB gratuiti siano un problema?
David Schwartz,

@DavidSchwartz Non ne ho idea, ecco perché l'ho chiesto;) Ci sono 2314 tavoli, ognuno con 7 MB gratuiti, e non so cosa significhi. Non sono sicuro del motivo per cui mysqltuner mi mostrerebbe quella cifra se non fosse una potenziale causa di preoccupazione. Speravo che qualcuno qui fosse in grado di dirmi quanto fosse preoccupato ricevere i numeri e cosa posso fare per mitigare il problema poiché i metodi "standard" non funzionano
Clive,

Migrazione di questa domanda secondo la richiesta dell'utente in un flag.
Daniel Beck,

La maggior parte dei dettagli mostrati da mysqltuner è solo a scopo informativo. Non tutto è un problema. Se è un problema, lo dirà chiaramente. Questo è stato indicato come un problema?
John Gardeniers,

@JohnGardeniers Credo di sì, il messaggio è:, [!!] Total fragmented tables: 2314che sono abbastanza sicuro che indica un problema (con i doppi punti esclamativi rossi)
Clive,

Risposte:


5

Secondo i miei commenti sopra, non tutti gli output di sqltuner indicano errori. A meno che lo script non indichi chiaramente che si tratta di un problema, di solito nella riga successiva, seguito da suggerimenti per la correzione, allora è solo un elemento informativo.


3

Quando hai abilitato innodb_file_per_table , tutto ciò che hai fatto è stato impostare un protocollo per fare in modo che qualsiasi nuova tabella InnoDB venisse creata in un .ibdfile esterno . Tutte le tabelle InnoDB create in precedenza sono ancora integrate in ibdata1.

Con innodb_file_per_table disabilitato, ogni volta che esegui

ALTER TABLE table_name ENGINE=INNODB;

non fa altro che aggiungere i dati della tabella e le pagine dell'indice a ibdata1. Questo renderà la tabella esistente in pagine contigue e rimuoverà la frammentazione. Il rovescio della medaglia è che ibdata1 cresce rapidamente.

RACCOMANDAZIONE

Dovrai esportare tutti i dati, rimuovere ibdata1, ib_logfile0, ib_logfile1 e ricaricare.

Ho scritto come e perché farlo

AGGIORNAMENTO 2012-08-15 12:05 EDT

Potresti voler esaminare lo script mysqltuner.pl stesso. IMHO Penso che stia usando una vecchia formula per misurare la frammentazione. Assicurati di avere l'ultima versione di mysqltuner.

Per quanto riguarda la misurazione della frammentazione delle tabelle di InnoDB archiviate esternamente, ho scritto un post sull'argomento l'11 aprile 2012 (vedi l'aggiornamento in basso per il 19 aprile 2012)


1
Ahhh ok, adesso le cose hanno molto più senso, grazie. Ho finito per esportare i dati, cancellare completamente MySQL, quindi reinstallare (ma aggiungendo innodb_file_per_tableal file conf prima di avviare il server e reimportare). Prima di allora stavo ricevendo tutti i tipi di errori InnoDB (i tipi davvero cattivi ... quelli che significavano che dovevo correre con il innodb_force_recoverylivello 6 solo per ottenere i dati!), E tutti i tipi di "data del file di registro sono in il futuro!' errori. Quelli sembrano essersi fermati ora, ma ho ancora alcuni tavoli frammentati. Lo terrò d'occhio, grazie ancora per l'input
Clive,

eccezionale! questo è molto informativo. Grazie @RolandoMySQLDBA!
Sudhi,
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.