Conversione di grandi tabelle da MyISAM a Innodb

Ho un tavolo con le righe di circa 300M in formato MyISAM che voglio convertire in Innodb

Il mio objective originale era quello di ridurre l'utilizzo cambiando lo schema della tabella per avere indici più semplici. Ho buttato tutto il tavolo, abbandonato, ricreato con less indici e ora sono riemportre. Tuttavia, ho dimenticato di specificare che dovrebbe essere innodb invece di myisam.

Posso solo fare la tabella standard ALTER … ENGINE = INNODB? C'è qualcosa di speciale che dovrei essere a conoscenza con un tavolo così enorme?

L'operazione di importzione dei dati richiede circa 12 ore – mi dispiace di farlo ancora. Per questo motivo voglio solo convertirlo.

  • Come tunnel con SSH correttamente?
  • Come risolvere un problema di memory grande con Apache e mySQL
  • Quale metodo di mirroring MySQL dovrei usare per questo?
  • Mysql - Accesso negato per utente 'root' @ 'xxxx'
  • MySQL: carica database in memory
  • Configurazione di MySQL per drupal
  • php-mysqlnd o php-mysql
  • Utilizzo del disco I / O fino al 100% dopo l'impostazione della configuration MySQL relativa a InnoDB
  • 2 Solutions collect form web for “Conversione di grandi tabelle da MyISAM a Innodb”

    Il seguente esercito è uscito dal libro " High Performance MySQL, seconda edizione ".

    Questo è un ottimo libro e lo consiglierei a chiunque.

    La breve risposta è:

    Con le size e le condizioni del tavolo, non import quale metodo scegli, penso di essere potenzialmente in attesa di una lunga attesa.


    Conversioni di tabelle

    Ci sono diversi modi per convertire una tabella da un motore di archiviazione ad un altro, ognuno con vantaggi e svantaggi.

    TAVOLA ALTER

    mysql> ALTER TABLE mytable ENGINE = Falcon; 

    Questa syntax funziona per tutti i motori di stoccaggio, ma c'è una cattura: può richiedere molto tempo. MySQL esegue una copia row per row della vecchia tabella in una nuova tabella. Durante questo periodo probabilmente utilizzerai tutta la capacità di I / O del server e la tabella originale verrà bloccata durante la conversione.

    Dump e importzione

    Per get maggiore controllo sul process di conversione, è ansible scegliere di prima scaricare la tabella in un file di text utilizzando l'utilità mysqldump. Una volta che hai scaricato la tabella, puoi semplicemente modificare il file di dump per regolare l'istruzione CREATE TABLE che contiene. Assicurarsi di modificare il nome della tabella e il suo tipo perché non è ansible avere due tabelle con lo stesso nome nello stesso database anche se sono di tipo diverso e che mysqldump predefinisce la scrittura di un command DROP TABLE prima che CREATE TABLE , in modo da perdere i tuoi dati se non sei attento!

    CREATE e SELEZIONA

    La terza tecnica di conversione è un compromesso tra la velocità del primo meccanismo e la sicurezza del secondo. Piuttosto che eliminare l'integer tavolo o convertirlo contemporaneamente, creare la nuova tabella e utilizzare la syntax INSERT … SELECT di MySQL per popolarla, come segue:

     mysql> CREATE TABLE innodb_table LIKE myisam_table; mysql> ALTER TABLE innodb_table ENGINE=InnoDB; mysql> INSERT INTO innodb_table SELECT * FROM myisam_table; 

    Questo funziona bene se non hai molti dati, ma se lo fai, spesso è più efficiente popolare la tabella in modo incrementale, commettendo la transazione tra ciascun pezzo in modo che i registri di annullamento non crescano enormi. Supponendo che id è la chiave primaria, eseguire questa query ripetutamente (utilizzando più grandi valori di x e y each volta) finché non si sono copiati tutti i dati nella nuova tabella:

     mysql> START TRANSACTION; mysql> INSERT INTO innodb_table SELECT * FROM myisam_table -> WHERE id BETWEEN x AND y; mysql> COMMIT; 

    Dopo averlo fatto, sarai lasciato con la tabella originale, che puoi lasciare quando sei finita, e la nuova tabella, ora pienamente popolata. Fare attenzione a bloccare la tabella originale se necessario per evitare di get una copia inconsistente dei dati!

    L'istruzione ALTER TABLE esegue essenzialmente la stessa cosa: il server crea una tabella temporanea in cui copia tutte le righe e quindi fa un RENAME. I formati sul disco sono estremamente diversi tra InnoDB e MyISAM, quindi non mi aspetto che tu abbia scelto questo collegamento.

    Un'altra osservazione (che potrebbe essere a conoscenza, ma aiuterà ad altri a leggere questo): il formato sul disco per InnoDB è fortemente dipendente dalla chiave primaria, perché raggruppa i record in base a esso. Quindi, quando si lavora con grandi tabelle di InnoDB, rifletti due volte prima di scegliere la chiave primaria, perché cambiandola ricostruisce l'integer tavolo, come il problema in questione.

    In each caso, raccommand fare qualche prova prima su un tavolo di size moderate e tempo quelle.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.