Come modificare in modo sicuro la variabile innodb di MySQL 'innodb_log_file_size'?


105

Quindi sono abbastanza nuovo nell'ottimizzare InnoDB. Sto lentamente cambiando le tabelle (dove necessario) da MyIsam a InnoDB. Ho circa 100 MB in innodb, quindi ho aumentato la innodb_buffer_pool_sizevariabile a 128 MB:

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

Quando sono andato a modificare il innodb_log_file_sizevalore (esempio my.cnf nella pagina di configurazione di innodb di mysql commenti per modificare la dimensione del file di registro al 25% della dimensione del buffer. Quindi ora my.cnf è simile al seguente:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Quando riavvio il server, ottengo questo errore:

110216 9:48:41 InnoDB: inizializzazione pool buffer, dimensione = 128.0M
110216 9:48:41 InnoDB: inizializzazione completata pool buffer
InnoDB: errore: file di registro ./ib_logfile0 è di dimensioni diverse 0 5242880 byte
InnoDB: rispetto a specificato in il file .cnf 0 33554432 byte!
110216 9:48:41 [ERRORE] La funzione di inizializzazione del plugin 'InnoDB' ha restituito un errore.
110216 9:48:41 [ERRORE] Registrazione del plug-in 'InnoDB' come MOTORE DI STOCCAGGIO non riuscita.

Quindi la mia domanda: è sicuro eliminare i vecchi file log o c'è un altro metodo per cambiare la innodb_log_file_sizevariabile?


1
Basta commentare innodb_log_file_size in my.ini .....

5
hmm, perché dovrei voler commentare per utilizzare il valore predefinito quando sto provando a cambiarlo dal valore predefinito?
Derek Downey,

Sì, commentando la linea innodb_log_file_size funziona ... Grazie.
muhammad umar farooq, franco

2
@muhammadumarfarooqfrank Ovviamente funziona, perché non stai più cambiando il valore della variabile, facendo quindi discutere l'intero punto. Vorrei che ci fosse un modo per ridimensionare i commenti.
dr01,

Risposte:


83

Sì, è sicuro eliminare il file di registro una volta arrestato mysqld

Alla luce di ciò, basta eseguire i seguenti passaggi:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

Avvio di mysqld si ricrea ib_logfile0eib_logfile1

Provaci !!!

AGGIORNAMENTO 2011-10-20 16:40 EDT

Pagina pulita di tutti i dati nel pool di buffer InnoDB prima di ripetere i file di registro, è necessario impostare questa opzione circa 1 ora prima dell'arresto:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Per impostazione predefinita, innodb_max_dirty_pages_pct è 75 (MySQL 5.5+) o 90 (prima di MySQL 5.5). L'impostazione su zero mantiene il numero di pagine sporche al di sotto dell'1% del pool di buffer InnoDB. L'esecuzione lo service mysql stopfa comunque. Inoltre, un arresto completerà tutti gli elementi rimanenti nel registro di ripetizione. Per mantenere questa opzione basta aggiungerla a /etc/my.cnf:

[mysqld]
innodb_max_dirty_pages_pct = 0

AGGIORNAMENTO 2013-04-19 16:16 EDT

Ho aggiornato la mia risposta un po 'di più con innodb_fast_shutdown perché ero solito riavviare mysql e fermare mysql per farlo. Ora, questo passaggio è fondamentale poiché ogni transazione non impegnata può avere altre parti mobili all'interno e all'esterno dei registri delle transazioni di InnoDB ( vedi InnoDB Infrastruttura ).

Si noti che l'impostazione innodb_fast_shutdown su 2 pulirà anche i logout ma esistono ancora più parti mobili e vengono raccolte in Crash Recovery durante l'avvio di mysqld. L'impostazione di 0 è la migliore.


1
Bella risposta e anche l'aggiornamento è ottimo. Il mio unico suggerimento sarebbe quello di COPIARE i file ib_log in un'altra posizione nel caso qualcosa dovesse andare storto. Questo ti aiuterà a farti un'idea di come dimensionare i file: mysqlperformanceblog.com/2011/07/09/…
Justin Noel

5
Ha funzionato anche per me, MA: l'interfaccia utente della console Linux può essere fuorviante - l'avvio di mysqld richiede molto tempo se si imposta una dimensione di file di registro di grandi dimensioni (diverse centinaia di MB o più). L'interfaccia utente della console mostra punti e quindi mostra "non riuscito!", Ma in realtà MySQL si sta ancora avviando. Attendi e continua a leggere il file di registro (o monitora il file di registro con "tail -f [file di registro]") fino a visualizzare "mysqld: pronto per le connessioni". ed entrambi i file di registro allocati sul disco.
f055,

2
AVVERTIMENTO!! il passaggio 3 non ha funzionato per me e il mio cuore si è quasi fermato quando ho visto mysql caricarsi senza InnoDB, ho dovuto interrompere mysql e rimuoverli manualmente e riavviare MySQL. due consigli: 1. eseguire il backup dei file di registro già esistenti, 2. eliminare manualmente i file
Peeyush Kushwaha,

2
Peeyush è corretto. Anche la documentazione di mysql consiglia di eseguire il backup dei file di registro nel caso in cui qualcosa vada storto
Greg

1
@Greg questo è il motivo per cui lo uso SET GLOBAL innodb_fast_shutdown = 0;. Quando MySQL si spegne, tutto ciò che è transazionale viene scaricato da tutte le parti mobili, inclusi i registri di ripetizione (ib_logfile0 e ib_logfile1). Uno può tenerli. Devo ancora riscontrare problemi con i log completamente scaricati.
RolandoMySQLDBA

31

Vorrei invece raccomandare il metodo ufficiale , che riproduco qui per comodità:

Per modificare il numero o la dimensione dei file di registro InnoDB in MySQL 5.6.7 o precedenti , utilizzare le seguenti istruzioni. La procedura da utilizzare dipende dal valore di innodb_fast_shutdown, che determina se aggiornare completamente il tablespace di sistema prima di un'operazione di arresto:

  • Se innodb_fast_shutdown non è impostato su 2: arrestare il server MySQL e assicurarsi che si spenga senza errori, per assicurarsi che non ci siano informazioni per le transazioni in sospeso nel registro di ripetizione. Copia i vecchi file di registro di ripetizione in un luogo sicuro, nel caso in cui qualcosa sia andato storto durante l'arresto e ti servano per recuperare il tablespace. Eliminare i vecchi file di registro dalla directory del file di registro, modificare my.cnf per modificare la configurazione del file di registro e riavviare il server MySQL. mysqld vede che non ci sono file di registro InnoDB all'avvio e ne crea di nuovi.

  • Se innodb_fast_shutdown è impostato su 2: imposta innodb_fast_shutdown su 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

Quindi seguire le istruzioni nella voce precedente.

A partire da MySQL 5.6.8 , l'impostazione innodb_fast_shutdown non è più rilevante quando si modifica il numero o la dimensione dei file di registro di InnoDB. Inoltre, non è più necessario rimuovere i vecchi file di registro, anche se è possibile che si desideri comunque copiare i vecchi file di registro in un luogo sicuro, come backup. Per modificare il numero o la dimensione dei file di registro di InnoDB, procedere come segue:

  1. Arrestare il server MySQL e assicurarsi che si spenga senza errori.

  2. Modifica my.cnf per modificare la configurazione del file di registro. Per modificare le dimensioni del file di registro, configurare innodb_log_file_size. Per aumentare il numero di file di registro, configurare innodb_log_files_in_group.

  3. Riavvia il server MySQL.

Se InnoDB rileva che innodb_log_file_size differisce dalla dimensione del file di registro ripetuto, scriverà un punto di controllo del registro, chiuderà e rimuoverà i vecchi file di registro, creerà nuovi file di registro nella dimensione richiesta e aprirà i nuovi file di registro.


Questa è una buona risposta come aggiornamento a questa domanda. +1 !!!
RolandoMySQLDBA,

2
Questo non è un "aggiornamento". Queste pagine di manuale esistono da tempo. Consiglio sempre informazioni di prima mano dal manuale (uno dei migliori manuali disponibili) piuttosto che reinventare la ruota e duplicare le informazioni (che è qualcosa che odiamo di più i DBA).
RandomSeed,

Questo è il metodo preferito da MySQL 5.6. Se continui a essere in esecuzione su una versione precedente alla 5.6, questo non funzionerà.
Derek Downey,

20

innodb_buffer_pool_size- cambia semplicemente my.cnf( my.ini) e riavvia mysqld.

innodb_log_file_sizeè meno critico. Non cambiarlo a meno che non ci sia un motivo per. Roland ha fornito i passaggi , ma un aspetto mi preoccupa ... Non so se i primi due passi siano importanti; sembra che potrebbero essere:

  1. set innodb_fast_shutdown = OFF
  2. riavvia mysql
  3. basta mysql
  4. rimuovere i file di registro
  5. avvia mysql

I file di registro tengono traccia degli affari incompiuti; " innodb_fast_shutdown" dice di occuparsi di quella roba dopo il riavvio. Quindi la rimozione dei file potrebbe perdere informazioni?

Le nuove versioni hanno migliorato le cose: (più discussioni nei commenti)

  • 5.6 Consente innodb_log_file_size> 4 GB
  • 5.6 innodb_log_file_sizepuò essere modificato senza prima rimuovere iblog *
  • 5.7 consente il ridimensionamento dinamico innodb_buffer_pool_size

Devo cambiare log_file_size?

Utilizzare GLOBAL STATUSper calcolare il numero di minuti prima dei cicli di registro.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

Se è molto inferiore a 60 (minuti), potrebbe essere utile aumentare log_file_size. Se è molto di più, i file di registro sprecano spazio su disco. Quella "1 ora" è piuttosto arbitraria, quindi se ci sei vicino, non preoccuparti di cambiare log_file_size.

Lasciare innodb_log_files_in_groupil valore predefinito di 2.


+1 la tua preoccupazione sembra essere supportata dai documenti
Jack Douglas

Ho dato un'occhiata a questa risposta e mi piace la prima riga. Di solito, --skip-networkingper precauzione, i miei clienti smettevano di usare mysql per rimediare a quei cambiamenti dell'ultimo minuto. La tua prima riga (set innodb_fast_shutdown = OFF) lo elimina. +1 !!!
RolandoMySQLDBA

1
Grazie per il voto. I nuovi lettori potrebbero non averne bisogno. In 5.6.8 , è innodb_log_file_sizestato migliorato per consentire la modifica senza rimuovere i file iblog.
Rick James,

Vuoi dire "più critico", non "meno critico"?
Igor,

@Igor - No. Se hai log_file_size troppo piccolo, ci sarà un ulteriore I / O che lo attraverserà. Lo vedo raramente. Se lo hai troppo grande, stai semplicemente sprecando spazio su disco. L'obiettivo nel impostarlo è di scorrere in un'ora. Ma 10 minuti contro 10 ore - nessuno dei due conta molto. altro ...
Rick James,

1

Quando accedi a mysql digita questi comandi:

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

Otterrai due numeri. Prima ne prendi uno e poi aspetti un minuto. Ne otterrai un altro.

Dire che il primo è 3.456.718.123 e il secondo è 4.098.873.134

Ora (4.098.873.134-3.856.718.123) * 60/1024/1024

Il risultato è = 13.856 MB

Hai due file di registro. Quindi dividilo per due e otterrai un numero vicino a 7.000 MB. Per sicurezza, imposta la dimensione del file di registro 8 GB


1
Non è ovvio (almeno per me) che questo risponda effettivamente alla domanda. Questo sembra essere un suggerimento per una dimensione alternativa per il file di registro, non come modificare in modo sicuro la dimensione del file di registro.
RDFozz,

1
@RDFozz hai ragione. Questo non risponde come modificare la dimensione del file di registro. Questa domanda risponde come fare per capire il numero per impostare innodb_log_file_size. Ho già risposto a una domanda del genere cinque anni fa (vedi il sottotitolo Log File Sizein dba.stackexchange.com/questions/23189/… )
RolandoMySQLDBA

Volevo solo aiutare: / So che non è la risposta esatta però.
Principiante di Linux il

-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || servizio riavvio mysql

Provalo, sicuramente funzionerà [testato su Debian 6]


2
Ciò non garantisce un arresto pulito. Potrebbe funzionare nel caso medio su un server con solo carico leggero, ma non è consigliabile se ti preoccupi dell'integrità del tuo database.
Emil Vikström,
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.