2010-01-17 16 views
15

Ho una tabella MyISAM MySQL da 1,5 GB (dati da 1,0 GB, indici da 0,5 GB) in produzione che sto per convertire in InnoDB.Accelerazione della conversione da MyISAM a InnoDB

Poiché il tavolo viene utilizzato in produzione, vorrei ridurre al minimo i tempi di fermo.

Le mie domande:

  • Quali sono le opzioni di configurazione di MySQL devono essere regolati in modo da velocizzare ALTER TABLE table_name ENGINE=InnoDB;?

  • Quali altri trucchi possono essere utilizzati per accelerare la conversione di una tabella di database di produzione da MyISAM a InnoDB?

risposta

12
  • L'impostazione di un grande innodb_buffer_pool_size (2 GB o più)
  • preread i file MyISAM dati/index vecchi utilizzando comandi della shell
  • aumento innodb_log_file_size (256 MB)
  • fare la tabella alter in thread paralleli X, dove X è il qty di core della CPU sul server
  • altre modifiche minori per la conversione solo (innodb_doublewrite = 0, innodb_flush_log_at_trx_commit = 0)

impostando innodb_buffer_pool_size il più alto possibile è il modo tipico per accelerare la creazione di tabelle innodb - il set di dati sembra che possa stare all'interno di un pool di buffer innodb da 2 GB, quindi qualsiasi server decente a 64 bit dovrebbe consentirlo. alter table type = innodb è anche più veloce della soluzione dump + reimport ed è facile da eseguire in parallelo.

Assicurarsi inoltre di aver aumentato il parametro innodb_log_file_size dal valore predefinito di 5 Mb a 128 o 256 MB. Attenzione a questo, e ha bisogno di un arresto pulito + cancellando il vecchio ib_logfile *.

Se il server ha qualcosa come 8GB di ram e si esegue una versione a 64 bit di mysql, suggerirei un innodb_buffer_pool da 2 GB, e si possono anche rileggere i vecchi file MYD e MYI prima di chiudere per i tempi di inattività, in modo che sarà nella cache della pagina del sistema operativo all'avvio del vero lavoro.

Se si apportano anche piccole modifiche, si prega di tenere presente che è necessario annullarle dopo la conversione (un altro piccolo tempo di inattività) per proteggere i dati, dubito che valga la pena per un set di dati così piccolo.

Buona fortuna.

3

Se siete alla ricerca di una soluzione veloce (anche se un po lo-fi), si può semplicemente esportare i dati in un file di testo (tramite mysqldump), cambiare il tipo di tabella di InnoDB nel file di testo risultante e quindi reimportare i dati.

Detto questo, è necessario testare questo importando in un database diverso per garantire che non ci siano problemi.

+1

Vorrei che sia più veloce di ALTER TABLE nome_tabella ENGINE = InnoDB ;? Perché? – knorv

+1

Potrebbe * essere più veloce in quanto non è necessario ricostruire gli indici nello stesso modo. (Se osservate il file di dump vedrete che gira l'indicizzazione, fa tutti gli inserimenti e quindi riabilita l'indicizzazione su una base per tabella.) Detto questo, immagino che ALTER TABLE lo farebbe anche ad essere onesti. –

+0

La riattivazione degli indici dopo il caricamento del dump dura per sempre su InnoDB, quindi non sarebbe molto più veloce - ci ho già provato. –

2

La tabella sarà inaccessibile per le scritture; le letture continueranno ad accedere alla vecchia tabella MyISAM per la durata di ALTER.

Seriamente, la ricostruzione di una tabella da 1.5G non dovrebbe richiedere molto tempo, se la tua app non può tollerare quella quantità di tempo di inattività, dovresti disporre già di un sistema HA che puoi usare per farlo.Presumibilmente il tuo team di supporto tecnico può emettere un avviso per informare gli utenti sul tempo di inattività e ricevere un avviso sufficiente, lo farai in un momento calmo del giorno/settimana (Normalmente troviamo domenica per essere un buon momento, ma può variare se hai molti clienti nei paesi musulmani)

Puoi scoprire quanto ci vorrà correndo sul tavolo con le stesse dimensioni dei dati presenti sul tuo sistema di non-produzione con la stessa configurazione e le stesse specifiche, che senza dubbio avete per il test delle prestazioni.

1

L'utilizzo di pt-online-schema-change renderebbe irrilevante il problema. pt-online-schema-change è uno strumento da riga di comando progettato da Percona (probabilmente la migliore consulenza MySQL al mondo) per risolvere questo problema. Ti consente di condurre istruzioni ALTER su qualsiasi tabella senza bloccare né le letture né le scritture, il che è probabilmente il tuo obiettivo ACTUAL se dici di voler accelerare questa conversione in produzione.

Dopo aver installato il Percona Toolkit, si sarebbe semplicemente eseguire il seguente comando nella shell O/S:

$ pt-online-schema-change h=your_host.com,t=your_db.your_target_table --alter "ENGINE=InnoDB" 
Problemi correlati