Como alterar com segurança a variável innodb do MySQL 'innodb_log_file_size'?

105

Então, eu sou bastante novo para ajustar o InnoDB. Estou mudando lentamente as tabelas (quando necessário) do MyIsam para o InnoDB. Eu tenho cerca de 100 MB no innodb, então aumentei a innodb_buffer_pool_sizevariável para 128 MB:

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

Quando fui mudar o innodb_log_file_sizevalor (exemplo: my.cnf nos comentários da página de configuração do innodb do mysql para alterar o tamanho do arquivo de log para 25% do tamanho do buffer. Agora, meu my.cnf fica assim:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Quando reinicio o servidor, recebo este erro:

110216 9:48:41 InnoDB: Inicializando o buffer pool, tamanho = 128.0M
110216 9:48:41 InnoDB: Inicialização concluída do buffer pool
InnoDB: Erro: o arquivo de log ./ib_logfile0 é de tamanho diferente 0 5242880 bytes
InnoDB: que o especificado em o arquivo .cnf 0 33554432 bytes!
110216 9:48:41 [ERRO] A função de inicialização do plug-in 'InnoDB' retornou um erro.
110216 9:48:41 [ERRO] O registro do plug-in 'InnoDB' como um STORAGE ENGINE falhou.

Então, minha pergunta: é seguro excluir os arquivos de log antigos ou existe outro método para alterar a innodb_log_file_sizevariável?

Derek Downey
fonte
1
Basta comentar o innodb_log_file_size em my.ini .....
5
hmm, por que eu gostaria de comentá-lo para usar o valor padrão quando estou tentando alterá-lo do valor padrão?
Derek Downey
Sim, comentando a linha innodb_log_file_size, funciona. Obrigado.
muhammad umar farooq frank
2
@muhammadumarfarooqfrank É claro que funciona - porque você não está mais alterando o valor da variável, fazendo com que todo o argumento seja discutido. Eu gostaria que houvesse uma maneira de reduzir o voto dos comentários.
dr01 26/16

Respostas:

83

Sim, é seguro excluir o arquivo de log após o encerramento do mysqld

À luz disso, execute as seguintes etapas:

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

Iniciar o mysqld irá recriar ib_logfile0eib_logfile1

De uma chance !!!

UPDATE 2011-10-20 16:40 EDT

Como pagina limpa todos os dados no InnoDB Buffer Pool antes de refazer os arquivos de log, você deve definir esta opção cerca de 1 hora antes do desligamento:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

Por padrão, innodb_max_dirty_pages_pct é 75 (MySQL 5.5+) ou 90 (antes do MySQL 5.5). Definir isso como zero mantém o número de páginas sujas abaixo de 1% do pool de buffers do InnoDB. A execução service mysql stopfaz isso de qualquer maneira. Além disso, um desligamento finalizará todos os itens restantes no log de refazer. Para manter essa opção, adicione-a ao /etc/my.cnf:

[mysqld]
innodb_max_dirty_pages_pct = 0

ATUALIZAÇÃO 2013-04-19 16:16 EDT

Atualizei minha resposta um pouco mais com innodb_fast_shutdown porque eu costumava reiniciar o mysql e parar o mysql para fazer isso. Agora, essa etapa é vital porque todas as transações não confirmadas podem ter outras partes móveis dentro e fora dos logs de transações do InnoDB ( consulte Infra-estrutura do InnoDB ).

Observe que definir innodb_fast_shutdown como 2 também limparia os logs, mas ainda existem mais partes móveis e são selecionadas no Crash Recovery durante a inicialização do mysqld. Configuração de 0 é melhor.

RolandoMySQLDBA
fonte
1
Boa resposta e a atualização também é ótima. Minha única sugestão seria COPIAR os arquivos ib_log para outro local, caso algo desse errado. Isso ajudará você a ter uma idéia de como dimensionar os arquivos: mysqlperformanceblog.com/2011/07/09/…
Justin Noel
5
Funcionou para mim também, MAS: a interface do usuário do console linux pode ser enganosa - a inicialização do mysqld leva muito tempo se você definir um tamanho grande de arquivo de log (várias centenas de MB ou mais). A interface do usuário do console mostra pontos e depois mostra "falhou!", Mas na verdade o MySQL ainda está iniciando. Aguarde e continue lendo o arquivo de log (ou monitore o arquivo de log com "tail -f [log-file]" ") até ver" mysqld: pronto para conexões ". e os dois arquivos de log alocados no disco.
F055
2
AVISO!! O passo 3 não funcionou para mim e meu coração quase parou quando vi o mysql carregando sem o InnoDB, tive que parar o mysql e removê-los manualmente e iniciar o MySQL novamente. dois conselhos: arquivos de log 1. backup de seu já existentes, 2. excluir os arquivos manualmente
Peeyush Kushwaha
2
Peeyush está correto. Mesmo a documentação mysql recomenda fazer backup de seus arquivos de log no caso de algo der errado
Greg
1
@ Greg é por isso que eu uso SET GLOBAL innodb_fast_shutdown = 0;. Quando o MySQL é encerrado, tudo transacional é liberado de todas as partes móveis, incluindo os logs de refazer (ib_logfile0 e ib_logfile1). Pode-se ficar com eles. Ainda não encontrei problemas com logs completamente liberados.
RolandoMySQLDBA
31

Em vez disso, eu recomendaria o método oficial , que reproduzo aqui por conveniência:

Para alterar o número ou o tamanho dos arquivos de log do InnoDB no MySQL 5.6.7 ou anterior , use as seguintes instruções. O procedimento a ser utilizado depende do valor de innodb_fast_shutdown, que determina se o espaço de tabela do sistema deve ou não ser atualizado completamente antes de uma operação de encerramento:

  • Se innodb_fast_shutdown não estiver definido como 2: Pare o servidor MySQL e verifique se ele é encerrado sem erros, para garantir que não haja informações para transações pendentes no log de refazer. Copie os arquivos de redo log antigos para um local seguro, caso algo dê errado durante o desligamento e você precise deles para recuperar o espaço de tabela. Exclua os arquivos de log antigos do diretório do arquivo de log, edite my.cnf para alterar a configuração do arquivo de log e inicie o servidor MySQL novamente. O mysqld vê que nenhum arquivo de log do InnoDB existe na inicialização e cria novos.

  • Se innodb_fast_shutdown estiver definido como 2: configure innodb_fast_shutdown como 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

Em seguida, siga as instruções no item anterior.

No MySQL 5.6.8 , a configuração innodb_fast_shutdown não é mais relevante ao alterar o número ou o tamanho dos arquivos de log do InnoDB. Além disso, não é mais necessário remover arquivos de log antigos, embora você ainda queira copiar os arquivos de log antigos para um local seguro, como um backup. Para alterar o número ou tamanho dos arquivos de log do InnoDB, execute as seguintes etapas:

  1. Pare o servidor MySQL e verifique se ele é desligado sem erros.

  2. Edite my.cnf para alterar a configuração do arquivo de log. Para alterar o tamanho do arquivo de log, configure innodb_log_file_size. Para aumentar o número de arquivos de log, configure innodb_log_files_in_group.

  3. Inicie o servidor MySQL novamente.

Se o InnoDB detectar que o innodb_log_file_size difere do tamanho do arquivo de redo log, ele escreverá um ponto de verificação de log, fechará e removerá os arquivos de log antigos, criará novos arquivos de tamanho solicitado e abrirá os novos arquivos de log.

RandomSeed
fonte
Esta é uma boa resposta como uma atualização para esta pergunta. +1 !!!
RolandoMySQLDBA
2
Esta não é uma "atualização". Essas páginas de manual existem há muito tempo. Eu sempre recomendo informações em primeira mão do manual (um dos melhores manuais disponíveis), em vez de reinventar a roda e duplicar informações (que é algo que os DBAs mais odeiam).
randomSeed
Este é o método preferido no MySQL 5.6. Se você ainda estiver executando uma versão anterior à 5.6, isso não funcionará.
Derek Downey
20

innodb_buffer_pool_size- simplesmente mude my.cnf( my.ini) e reinicie o mysqld.

innodb_log_file_sizeé menos crítico. Não mude a menos que haja uma razão para isso. Roland forneceu os passos , mas um aspecto me preocupa ... Não sei se os dois primeiros passos são importantes; parece que eles poderiam ser:

  1. set innodb_fast_shutdown = OFF
  2. reinicie o mysql
  3. pare o mysql
  4. remova os arquivos de log
  5. inicie o mysql

Os arquivos de log acompanham os negócios inacabados; " innodb_fast_shutdown" diz para lidar com essas coisas depois de reiniciar. Então, remover os arquivos pode perder informações?

Novas versões melhoraram as coisas: (mais discussão nos Comentários)

  • 5.6 Permite innodb_log_file_size> 4 GB
  • 5.6 innodb_log_file_sizepode ser alterado sem primeiro remover o iblog *
  • 5.7 permite redimensionar dinamicamente innodb_buffer_pool_size

Devo alterar log_file_size?

Use GLOBAL STATUSpara calcular o número de minutos antes do ciclo do log.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

Se for muito menor que 60 (minutos), poderá ajudar a aumentar o log_file_size. Se for muito mais, os arquivos de log estão desperdiçando espaço em disco. Essa "1 hora" é bastante arbitrária; portanto, se você estiver próximo, não se preocupe em alterar o tamanho do arquivo_log.

Deixe innodb_log_files_in_groupno padrão 2.

Rick James
fonte
+1 A sua preocupação parece ser apoiada pelos documentos.
Jack Douglas
Dei uma olhada nesta resposta e gosto da primeira linha. Normalmente, eu tinha clientes trazendo o mysql para cima e para baixo --skip-networkingcomo precaução para obter essas mudanças de última hora. Sua primeira linha (set innodb_fast_shutdown = OFF) elimina isso. +1 !!!
RolandoMySQLDBA
1
Obrigado pelas votações. Novos leitores podem não precisar disso. Na 5.6.8 , innodb_log_file_sizefoi aprimorado para permitir a alteração sem remover os arquivos iblog.
Rick James
Você quer dizer "mais crítico", não "menos crítico"?
Igor
@Igor - Não. Se você tiver um tamanho de log_file_size muito pequeno, haverá E / S extra passando por ele. Eu raramente vejo isso. Se você o possui muito grande, está apenas desperdiçando espaço em disco. O objetivo em defini-lo é percorrer em uma hora. Mas 10 minutos versus 10 horas - nem importa muito. mais ...
Rick James
1

Quando você faz logon no mysql, digite esses comandos:

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

Você receberá dois números. Primeiro você recebe um e depois espera um minuto. Você receberá outro.

Digamos que o primeiro seja 3.456.718.123 e o segundo seja 4.098.873.134

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

O resultado é = 13.856 MB

Você tem dois arquivos de log. Então divida por dois e você obterá um número próximo a 7.000 MB. Apenas para ter certeza, defina o tamanho do arquivo de log de 8 GB

Linux Iniciante
fonte
1
Não é óbvio (pelo menos para mim) que isso realmente responda à pergunta. Parece ser uma sugestão para um tamanho alternativo para o arquivo de log, não como alterar com segurança o tamanho do arquivo de log.
RDFozz
1
@RDFozz você está certo. Isso não responde como alterar o tamanho do arquivo de log. Esta pergunta responde como descobrir o número para definir o innodb_log_file_size. Eu já respondi a essa pergunta há cinco anos (Veja o subtítulo Log File Sizeno dba.stackexchange.com/questions/23189/... )
RolandoMySQLDBA
Eu só queria ajudar: / Eu sei que não é a resposta exata.
Linux Novato
-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || serviço mysql restart

Experimente, com garantia de estar funcionando [testado no Debian 6]

Gregory
fonte
2
Isso não garante um desligamento limpo. Pode funcionar normalmente em um servidor com carga leve, mas não é recomendado se você se preocupa com a integridade do banco de dados.
Emil Vikström