MySQL InnoDB – innodb_file_per_table cons?

Per impostazione predefinita MySQL InnoDB memorizza tutte le tabelle di tutti i DB in un file globale. È ansible modificare questo valore impostando innodb_file_per_table nella configuration, che quindi crea un file di dati per each tabella.

Mi chiedo perché innodb_file_per_table non sia abilitato per impostazione predefinita. Ci sono disagi per usarlo?

  • mysql error 1062 'duplicate entry' durante il ripristino del backup
  • mysql non si fermerà, mysqld_safe è apparso in cima
  • Percona-server time out su /etc/init.d/mysql inizio
  • MySQL è abbastanza buono per grandi scale?
  • Sostituire i file MyISAM senza interrompere Mysql
  • Come definisce il nome host dei suoi clienti mysql?
  • 7 Solutions collect form web for “MySQL InnoDB – innodb_file_per_table cons?”

    Ho la risposta completa per questo.

    Una volta inserito il file innodb_file_per_table e le nuove tabelle InnoDB possono essere ridotte usando ALTER TABLE <innodb-table-name> ENGINE=InnoDB'; Ciò ridurrà i nuovi file .ibd GARANTITI.

    Se si esegue ALTER TABLE <innodb-table-name> ENGINE=InnoDB'; in una tabella di InnoDB creata prima di utilizzare innodb_file_per_table, raccoglierà i dati e gli indici per quella tabella dal file ibdata1 e lo .ibd in un file .ibd . Questo lascerà un integer pigeon permanente nel ibdata1 che non può mai essere riutilizzato.

    Il file ibdata1 ospita normalmente quattro tipi di informazioni

    • Tabella dati
    • Indici tabella
    • Dati MVCC (Multiversioning Concurrency Control)
      • Segmenti di rollback
      • Annulla lo spazio
    • Tabella metadati (Dati di dati)
    • Doppio buffer di scrittura (scrittura di background per impedire la dipendenza dalla cache OS)
    • Buffer di inserimento (gestione delle modifiche agli indici secondari non unici)
    • Vedere la Pictorial Representation of ibdata1

    Ecco il modo garantito per ridurre il file ibdata1 praticamente per sempre …

    PASSO 01) MySQLDump tutti i database in un file di text SQL (chiamarlo SQLData.sql)

    PASSO 02) Cancellare tutti i database (ad exception di schemi mysql, information_schema e performance_schema)

    PASSO 03) Arresto mysql

    PASSO 04) Aggiungere le seguenti righe a /etc/my.cnf

     [mysqld] innodb_file_per_table innodb_flush_method=O_DIRECT innodb_log_file_size=1G innodb_buffer_pool_size=4G innodb_data_file_path=ibdata1:10M:autoextend 

    Sidenote: qualunque sia il tuo set per innodb_buffer_pool_size, assicurati che innodb_log_file_size sia il 25% di innodb_buffer_pool_size.

    • PASSO 05) Elimina ibdata1, ib_logfile0 e ib_logfile1 ( vedi aggiornamento qui sotto prima dell'eliminazione! )

    A questo punto, dovrebbe esistere solo lo schema mysql in / var / lib / mysql

    • PASSO 06) Riavviare mysql

    Questo ricreerà ibdata1 a 10MB (non configurare l'opzione), ib_logfile0 e ib_logfile1 a 1G each

    • PASSO 07) Ricaricare SQLData.sql in mysql

    ibdata1 crescerà ma contiene solo metadati di tabella e dati MVCC intermittenti.

    Ogni tabella InnoDB esisterà al di fuori di ibdata1

    Supponi di avere una tabella InnoDB denominata mydb.mytable. Se entri in /var/lib/mysql/mydb , vedrai due file che rappresentano la tabella

    • mytable.frm (intestazione del motore di stoccaggio)
    • mytable.ibd (Home di dati tabella e indici tabella per mydb.mytable )

    ibdata1 non contiene mai più dati e indici InnoDB.

    Con l'opzione innodb_file_per_table in /etc/my.cnf , è ansible eseguire OPTIMIZE TABLE mydb.mytable OR ALTER TABLE mydb.mytable ENGINE=InnoDB; e il file /var/lib/mysql/mydb/mytable.ibd si riduce.

    Ho fatto questo numerose volte nella mia carriera come MySQL DBA senza tanto come un solo problema in seguito. Infatti, la prima volta che ho fatto questo, ho compilato un file ibdata1 da 50 GB in 50 MB.

    Provaci. Se hai ulteriori domande su questo, inviami un'e-mail. Fidati di me. Questo functionrà a breve e lungo il lungo raggio.

    AGGIORNAMENTO 2013-07-02 15:08 EDT

    C'è un avvertimento in questo senso che ho aggiornato in altri miei post ma ho perso questo: sto aggiornando la mia risposta un po 'di più con innodb_fast_shutdown perché ho usato per riavviare mysql e fermare mysql per farlo. Adesso, questo passo è vitale perché each transazione non impegnata può avere altre parti in movimento all'interno e all'esterno dei registri di transazione InnoDB (si veda Infrastruttura InnoDB ).

    Si prega di notare che l'impostazione di innodb_fast_shutdown a 2 pulirebbe i log, ma altre parti in movimento ancora esistono e vengono selezionate in Crash Recovery durante l'avvio di mysqld. L'impostazione di 0 è migliore.

    Vedi bug .

    Ci sono disagi per usarlo?

    • file più aperti
    • aprire / riaprire il sovraccarico
    • il file .ibd non si restringe (vedere 1 , 2 )

    Io uso sempre innodb_file_per_table su grandi database.

    innodb_file_per_table è abilitato per impostazione predefinita in MariaDB.

    Il motivo per cui ho scelto di non utilizzare innodb_file_per_table è perché each tabella viene inserita nel proprio file, il che significa che each tabella ha il suo proprio overhead separato (firme di file, ecc.) Che causa la dimensione totale e totale della directory MySQL per essere più grande di quello se si utilizza un tablespace condiviso. Inoltre, c'è più spazio sprecato a causa del cluster-slack quando si dispone di file multipli, piccoli invece di singoli, grandi.

    Certo, l'overhead supplementare non è una quantità enorme nel grande schema delle cose, specialmente se si utilizza una grande unità o dispone di un database gigante, ma per me stesso (e probabilmente molti "utenti domestici"), tutto è stato aggiunto e era ancora troppo per la piccola unità con grossi cluster where stavo mantenendo il mio negozio MySQL.

    Ad esempio, il mio archivio di database con i miei database di WordPress e alcune altre piccole basi di dati (phpBB, dev, alcuni test AMP, ecc.), Convertendolo a per-table, ha cambiato da 32 a 50 MB e non include neppure l' ibdata1 richiede ancora un minimo di 10 MB , per un totale di alless 60 MB.

    Come ho detto, questo potrebbe non essere troppo di un problema per alcune persone, in particolare le imprese, ma se sei un utente domestico che ospita solo il tuo sito, il tuo blog, ecc. Allora può essere un fattore di cose come la scelta un provider host perché molti host limitano la dimensione del database in aggiunta al totale utilizzo del disco.

    con innodb_file_per_table = 1, la tabella di drop può essere più lenta vedere qui

    Solo per aggiungere un po 'più informazioni

    Poiché mysql 5.6.6 è abilitato per impostazione predefinita

    Secondo il documento MariaDB , innodb_file_per_table è disabilitato per impostazione predefinita. E sì, può influenzare le performance (come quando si eseguono query di massa per cercare e sostituire i valori in un'istanza di Clone WordPress di recente). Ma in termini di equilibrio che consente di aumentare le probabilità di sopravvivere in una situazione in cui i singoli file di database sono stati danneggiati (o sono stati cancellati accidentalmente – una direttiva che tutti i nuovi sysadmin dovrebbero get quando si avvia dovrebbe essere "Toccare il dannato file ibdata e baciare job goodbye! ").

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