it-swarm.it

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

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 il innodb_buffer_pool_size variabile 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 cambiare il innodb_log_file_size valore (esempio my.cnf su pagina di configurazione 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 del pool di buffer
InnoDB: errore: il file di registro ./ib_logfile0 ha dimensioni diverse da 0 5242880 byte
InnoDB: rispetto a quanto specificato nel file .cnf 0 33554432 byte!
110216 9:48:41 [ERRORE] La funzione di inizializzazione del plug-in 'InnoDB' ha restituito un errore.
110216 9:48:41 [ERRORE] Registrazione del plug-in 'InnoDB' come MOTORE DI STOCCAGGIO fallita.

Quindi la mia domanda: è sicuro eliminare i vecchi log_files o c'è un altro metodo per cambiare il innodb_log_file_size variabile?

108
Derek Downey

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

L'avvio di mysqld ricrea ib_logfile0 e ib_logfile1

Provaci !!!

AGGIORNAMENTO 2011-10-20 16:40 EDT

Pagina pulita fuori 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. Esecuzione di service mysql stop lo fa 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 un po 'di più la mia risposta con innodb_fast_shutdown perché ero solito riavviare mysql e fermare mysql per farlo. Ora, questo passaggio è fondamentale perché 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 a 2 pulirà anche i log, ma esistono ancora più parti mobili e vengono raccolte su Crash Ripristino durante l'avvio di mysqld. L'impostazione di 0 è la migliore.

86
RolandoMySQLDBA

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

Per modificare il numero o la dimensione dei file di registro di InnoDB in MySQL 5.6.7 o precedente , 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 esistono 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, sebbene si possa comunque voler 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 la dimensione 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.

31
RandomSeed

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 fornito i passaggi , ma un aspetto mi preoccupa ... Non so se i primi due passi sono 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 riavvio. Quindi la rimozione dei file potrebbe perdere informazioni?

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

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

Devo cambiare log_file_size?

Uso GLOBAL STATUS per calcolare il numero di minuti prima dei cicli di registro.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

Se è molto meno di 60 (minuti), potrebbe aiutare ad 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.

Partire innodb_log_files_in_group al valore predefinito di 2.

22
Rick James

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. Dividilo quindi per due e otterrai un numero vicino a 7.000 MB. Per sicurezza, imposta la dimensione del file di registro 8 GB

2
Linux Newbie