É seguro usar innodb_flush_log_at_trx_commit = 2

54

Virei innodb_flush_log_at_trx_commit = 2e obtive uma velocidade de gravação muito rápida. Mas é seguro ser usado no site de produção?

Bruce Dou
fonte

Respostas:

57

Você pode perder transações de até um segundo. O valor padrão é 1, o que ajuda a manter o InnoDB ACID compatível .

De acordo com a documentação do MySQL em innodb_flush_log_at_trx_commit

Se o valor de innodb_flush_log_at_trx_commit for 0, o buffer de log será gravado no arquivo de log uma vez por segundo e a operação de liberação em disco será executada no arquivo de log, mas nada será feito em uma confirmação de transação. Quando o valor é 1 (o padrão), o buffer de log é gravado no arquivo de log em cada transação confirmada e a operação de liberação para disco é executada no arquivo de log. Quando o valor é 2, o buffer de log é gravado no arquivo a cada confirmação, mas a operação de liberação para disco não é executada nele. No entanto, a liberação no arquivo de log ocorre uma vez por segundo também quando o valor é 2. Observe que a liberação de uma vez por segundo não é 100% garantida para acontecer a cada segundo, devido a problemas de agendamento do processo.

O valor padrão de 1 é necessário para conformidade total com ACID. Você pode obter um melhor desempenho definindo o valor diferente de 1, mas pode perder até um segundo de transações em uma falha. Com o valor 0, qualquer falha no processo do mysqld pode apagar o último segundo de transações. Com o valor 2, apenas uma falha no sistema operacional ou uma falta de energia pode apagar o último segundo de transações. A recuperação de falhas do InnoDB funciona independentemente do valor.

Para obter a maior durabilidade e consistência possível em uma configuração de replicação usando o InnoDB com transações, use innodb_flush_log_at_trx_commit = 1 e sync_binlog = 1 no arquivo my.cnf do servidor principal.

Cuidado

Muitos sistemas operacionais e alguns hardwares de disco enganam a operação de liberação em disco. Eles podem dizer ao mysqld que o flush ocorreu, mesmo que não tenha ocorrido. Portanto, a durabilidade das transações não é garantida, mesmo com a configuração 1, e, na pior das hipóteses, uma queda de energia pode até danificar o banco de dados do InnoDB. O uso de um cache de disco com bateria no controlador de disco SCSI ou no próprio disco acelera a liberação de arquivos e torna a operação mais segura. Você também pode tentar usar o comando Unix hdparm para desativar o armazenamento em cache de gravações de disco em caches de hardware ou usar algum outro comando específico para o fornecedor do hardware.

Com base nisso, valores diferentes de 1 colocam o InnoDB em risco de perder o valor de 1 segundo em transações ou o valor de dados de um commit de transação.

A documentação também diz uso sync_binlog=1.

De acordo com a documentação do MySQL em sync_binlog

O valor 1 é a opção mais segura, pois, no caso de uma falha, você perde no máximo uma instrução ou transação do log binário. No entanto, também é a opção mais lenta (a menos que o disco tenha um cache com bateria, o que torna a sincronização muito rápida).

Sua escolha mais segura é

[mysqld]
innodb_flush_log_at_trx_commit=1
sync_binlog=1

Se você não se importa com a possível perda de dados (no valor de até 1 segundo), pode usar 0 ou 2 por sua conta e risco, se as recompensas (velocidade de gravação mais rápida) valerem a pena.

RolandoMySQLDBA
fonte
3
Rolando: +1 nas últimas linhas sync_binlog = 1 ...
Abdul Manaf
@AbdulManaf, opte sempre pela integridade dos dados e pela velocidade. Se você deseja sacrificar a velocidade pela integridade dos dados, estará perdendo muito mais tempo lidando com problemas nos dados.
Pacerier 9/04
11
@RolandoMySQLDBA, "Ao perder um segundo de transação", você quer dizer que um sucesso commit pode realmente ser perdido?
Pacerier 9/04
11
Pacerier, sim. Os dados são garantidos apenas para serem gravados no disco após serem "liberados no disco". Até lá, pode estar apenas na memória RAM.
Emil Vikström
2
@RolandoMySQLDBA você é o homem, sério. Se você fizer algo além de shows de consultoria mysql em tempo integral, você poderá mudar sua carreira.
sjas
25

O innodb_flush_log_at_trx_commité usado com o objetivo de ..

Se o valor innodb_flush_log_at_trx_commit for 0, o buffer de log será gravado no arquivo de log uma vez por segundo e a operação de liberação para disco será executada no arquivo de log, mas nada será feito em uma confirmação de transação.

Quando o valor é 1 (o padrão), o buffer de log é gravado no arquivo de log em cada transação confirmada e a operação de liberação para disco é executada no arquivo de log.

Quando o valor é 2, o buffer de log é gravado no arquivo a cada confirmação, mas a operação de liberação para disco não é executada nele. No entanto, a liberação no arquivo de log ocorre uma vez por segundo também quando o valor é 2. Observe que a liberação de uma vez por segundo não é 100% garantida para acontecer a cada segundo, devido a problemas de agendamento do processo.

O valor padrão de 1 é necessário para conformidade total com ACID. Você pode obter um melhor desempenho definindo o valor diferente de 1, mas pode perder até um segundo de transações em uma falha. Com o valor 0, qualquer falha no processo do mysqld pode apagar o último segundo de transações. Com o valor 2, apenas uma falha no sistema operacional ou uma falta de energia pode apagar o último segundo de transações. A recuperação de falhas do InnoDB funciona independentemente do valor.

Na minha opinião, usar o innodb_flush_log_at_trx_commit2 não deve ser um problema, mas usar o 1 é o mais seguro.

Abdul Manaf
fonte
3
Acabei de perceber que você respondeu apenas 18 segundos depois de mim com a mesma resposta. +1 !!!
RolandoMySQLDBA
24

Minha opinião difere de outra. innodb_flush_log_at_trx_commit = 0 se: é o meu computador de desenvolvimento ou o mini banco de dados doméstico, onde não há dados confidenciais.

innodb_flush_log_at_trx_commit = 2 se: for blog / stats / e-commerce (com ~ 100x lojas por dia), etc.

innodb_flush_log_at_trx_commit = 1 se: você tem muitos clientes ou precisa trabalhar com transações em dinheiro, como banco. dessa vez, você deve dividir seu fluxo de dados entre vários servidores para ter velocidade e segurança.

Eu prefiro 2, porque tem uma velocidade de gravação ~ 75x mais rápida e falha apenas se o hardware falhar.

De qualquer forma, você deve saber o que precisa com muito mais velocidade de gravação ou informações de até 1 segundo?

Sertekmedia
fonte
11
+1 para75x faster write speed and it fails ONLY if hardware fails.
Naman Gala
3
75x mais rápido? Citação necessária.
Pacerier 9/04
5
Meu próprio benchmark: 5000 UPDATEcom innodb_flush_log_at_trx_commit = 1: 179 segundos. Com innodb_flush_log_at_trx_commit = 2: 1.12segundos. É uma velocidade de gravação 160x mais rápida no meu caso.
21715 Kevin
Boa resposta. Uma coisa para pensar é que - se sua máquina travar após uma transação bem-sucedida, é possível que a transação não tenha sido gravada em disco com innodb_flush_log_at_trx_commit = 2, e mesmo assim tenha sido indicado o sucesso do seu aplicativo (ou seja, o mysqld consegue enviar um pacote de rede indicando que a transação foi concluída com êxito) para o motorista em seu aplicativo), essa chance é muito, muito baixo
Vladislav Vaintroub
você pode imrove sua resposta especificando o docs dizer comcrash
shareef
2

Estou tentando responder, qual é o propósito de innodb_flush_log_at_trx_commit?

O InnoDB executa a maioria de suas operações na memória ( InnoDB Buffer Pool). Todos os dados modificados são gravados InnoDB transaction log filee liberados (gravados) para armazenamento durável (disco rígido).

Para segurança dos dados ( Durability from ACID), o InnoDB precisa armazenar dados modificados de cada transação em um armazenamento permanente. Ao mesmo tempo, comprometer-se com o disco para cada transação é um processo dispendioso.

A E / S de disco é um processo de bloqueio e é muito lento, é um disco lento e reduz o número de InnoDB transaction per seconds(taxa de transferência de disco).

O InnoDB fornece innodb_flush_log_at_trx_commitvariável para controlar a frequência dessa operação de descarga. Com base no valor, a operação de descarga do InnoDB se comporta de maneira diferente.

(Já explicado em outras respostas)

0 - Grave no arquivo de log e libere no disco a cada segundo (os dados estão no buffer pool não gravados no arquivo de log - para obter ganho de desempenho). 1 - Liberar no disco quando uma transação é confirmada - padrão (Para segurança dos dados - conformidade com ACID) 2 - gravar no arquivo de log para todas as transações e liberar no disco a cada segundo. (Para ganho de desempenho)

Depende do requisito do aplicativo ( Performance Vs data safety), você pode definir esta variável. A diferença entre 0 e 2 - ambos aumentam o desempenho, o valor 2 armazena os dados no arquivo de transação e pode ser recuperável, em caso de falha ou falha, mas não em 0.

Em muitos casos, liberar no disco significa que os dados são gravados e InnoDB buffer pool (memory) to Operating systems cachenão gravados no disco de armazenamento (armazenamento permanente). Em caso de falha, na pior das hipóteses, você pode perder dados em até um segundo)

O ganho de desempenho depende do ambiente e você pode comparar e identificar. Em um ambiente de replicação, para segurança e consistência dos dados, defina innodb_flush_log_trx_commit = 1e sync_binlog=1.

Se o desempenho é o principal objetivo da aplicação, o InnoDB fornece uma variável para controlar a frequência da descarga de logs - innodb_flush_log_at_timeout- o que permite definir a faixa de frequência de descarga de logs 1 to 2700 seconds, por padrão é 1.

Esteja ciente de que, quando você aumenta o intervalo de liberação para até N segundos, o ganho de desempenho vem comprometendo a segurança dos dados em até N segundos. Por exemplo - se você definir a descarga a cada 5 segundos - o ganho da taxa de transferência será muito alto, mas em caso de falha de energia ou falha no sistema, você perderá dados no valor de 5 segundos.

Este artigo discute sobre as operações de liberação e confirmação de transação do InnoDB .

Você pode alterar depois do modo 2 no aws rds:

pode mudar depois de fazer o modo 2 no aws

previewchanges

Não modificável em alguns casos, como se você tiver replicação múltipla:

FYI inalterável em alguns casos

rathishDBA
fonte
1

Se o seu hardware falhar, você poderá perder todos os seus dados, então eu uso o parâmetro = 2 sem preocupações. De qualquer forma, você pode dividir seus dados confidenciais (pedidos, dinheiro virtual, ...) e regulares (estatísticas, carrinho, ...) entre servidores de 2 db e mantê-los seguros e rápidos. Para transações entre bancos de dados, você pode usar http://dev.mysql.com/doc/refman/5.7/en/xa.html

Karolis Mačiulskis
fonte
"Perca todos os seus dados", ou você quer dizer as transações que foram consultadas nos últimos segundos?
NiCk Newman 10/03/16
11
Uma falha de hardware pode significar perder um disco rígido inteiro e, portanto, "perder todos os seus dados". Então, se você tem uma configuração de replicação seus dados está à mercê de quantas vezes você faz backups de qualquer maneira, de modo que o ponto de esta resposta estava fazendo é que um ou dois segundos de dados perdidos é nada para se preocupar em comparação
thomasrutter