{"id":314,"date":"2012-03-18T11:49:43","date_gmt":"2012-03-18T14:49:43","guid":{"rendered":"http:\/\/wagnerbianchi.com\/blog\/?p=314"},"modified":"2012-05-13T16:20:10","modified_gmt":"2012-05-13T19:20:10","slug":"innodb-e-os-logs-de-transacao","status":"publish","type":"post","link":"http:\/\/wagnerbianchi.com\/blog\/?p=314","title":{"rendered":"InnoDB e os Logs de Transa\u00e7\u00e3o"},"content":{"rendered":"<p>Um dos desafios mais interessantes no MySQL atualmente \u00e9 conseguir aplicar ao servidor de bancos de dados, o mysqld, uma boa configura\u00e7\u00e3o relacionada com o InnoDB Plugin. Digo uma configura\u00e7\u00e3o, pois, atingir um n\u00edvel de melhoria de performance n\u00e3o \u00e9 l\u00e1 t\u00e3o f\u00e1cil, mesmo sabendo o significado e os poss\u00edveis valores de cada uma daquelas vari\u00e1veis e tendo ci\u00eancia que, se voc\u00ea altera a quantidade de arquivos de log, voc\u00ea precisa tamb\u00e9m alterar outros par\u00e2metros para que realmente fa\u00e7a sentido todo o trabalho realizado. Pode parecer que \u00e9 uma a\u00e7\u00e3o de configura\u00e7\u00e3o mais tranquila, mas, na verdade, n\u00e3o \u00e9.<\/p>\n<p>Desde a sua concep\u00e7\u00e3o, o servidor de bancos de dados MySQL utiliza os conceitos &#8220;<em>vari\u00e1veis de ambiente<\/em>&#8221; e &#8220;<em>vari\u00e1veis de status<\/em>&#8220;, onde, respectivamente, as vari\u00e1veis de ambiente s\u00e3o aquelas que receber\u00e3o os poss\u00edveis valores para que um determinado comportamento seja desenhado (<em>innodb_flush_method=O_DIRECT<\/em>, por exemplo), enquanto que, as vari\u00e1veis de status s\u00e3o registradores internos que s\u00e3o incrementados (em bytes ou n\u00famero de ocorr\u00eancia) para que determinadas a\u00e7\u00f5es possam ser realizadas com base em fatos reais.<\/p>\n<p>Por que eu falei isso tudo at\u00e9 agora? Na verdade, nesse final de semana trabalhei com um novo cliente que rodava o MySQL 5.1.49 e migramos para o MySQL 5.5. Mesmo ap\u00f3s todos os ajustes necess\u00e1rios para fazer com que o novo ambiente utilize as novas features do produto (<a title=\"MySQL 5.5 Presentation\" href=\"http:\/\/www.google.com.br\/url?sa=t&amp;rct=j&amp;q=&amp;esrc=s&amp;source=web&amp;cd=3&amp;ved=0CDMQFjAC&amp;url=http%3A%2F%2Ftechnocation.org%2Ffiles%2Fdoc%2F2011_02_14_MySQL_55_Overview.pdf&amp;ei=ve5lT5vXE9G_gQeMwcjKAg&amp;usg=AFQjCNG_myVVtMY4WuT8GYAvRlBeydA9EQ&amp;sig2=rWQTi_dkoPP-fteyyduXEw\" target=\"_blank\">clique aqui e veja o que mudou<\/a>), notei problemas de lentid\u00e3o e fui investigar. Primeiro, contei com o SMART para testar os discos, que s\u00e3o discos de 15K rodando muito bem. Analisei por uma hora e meia o comportamento de mem\u00f3ria com o htop, vmstat e atop. Nada foi encontrado, mas, consegui perceber que havia uma movimenta\u00e7\u00e3o de I\/O muito grande quando o MySQL fazia o flush das p\u00e1ginas sujas do buffer para o disco.<\/p>\n<blockquote><p>O processo de flush no MySQL \u00e9 bem parecido com este mesmo processo que ocorre no Oracle; que pode acontecer por 4 motivos: 1-) quantidade de p\u00e1ginas sujas no limite; 2-) um checkpoint aconteceu; 3-) um COMMIT foi enviado ou ainda, 4-) de acordo com um limite de tempo que determinado pela vari\u00e1vel\u00a0innodb_flush_log_at_trx_commit, isso no MySQL, obviamente;<\/p><\/blockquote>\n<p>Se formos analisar \u00e0 grosso modo, &#8220;in broad terms&#8221;, o log de transa\u00e7\u00e3o do InnoDB \u00e9 o redo log do Oracle, j\u00e1 que a id\u00e9ia \u00e9 muito parecida. Por padr\u00e3o, ap\u00f3s qualquer instala\u00e7\u00e3o, seja ela no MS Windows ou em qualquer sabor de Linux\/Unix, voc\u00ea notar\u00e1 que 2 arquivos de log foram criados no DATADIR do MySQL; dois arquivos que seguem o padr\u00e3o de denomina\u00e7\u00e3o ib_logfilex, onde x \u00e9 um n\u00famero sequencial. Tais arquivos, se tiver os seus tamanhos somados, n\u00e3o podem ultrapassar ou mesmo ter o valor da soma igual \u00e0 4GB ou 4096MB. Geralmente eu configura\u00e7\u00f5es que criam v\u00e1rios arquivos de 398MB, por exemplo.<\/p>\n<p><code>[root@shaftserver01 mysql]# ls -lh | grep ib<br \/>\n-rw-rw----. 1 mysql mysql 1,0G Mar 18 11:34 ibdata1<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:34 ib_logfile0<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile1<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile2<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile3<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile4<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile5<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile6<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile7<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile8<br \/>\n-rw-rw----. 1 mysql mysql 380M Mar 18 11:33 ib_logfile9<\/code><\/p>\n<p>O que te faz pensar que \u00e9 necess\u00e1rio aumentar a quantidade de arquivos ou mesmo, o espa\u00e7o dispon\u00edvel para os logs? Uma vari\u00e1vel de status que pouca gente d\u00e1 valor e sabe que ela existe para medir se h\u00e1 efici\u00eancia no processo de grava\u00e7\u00e3o de logs em disco. A efici\u00eancia \u00e9 justamente nesse processo \u00e9 justamente n\u00e3o ter que &#8220;esperar&#8221; para poder gravar logs nos arquivos e portanto, se um flush tiver que aguardar a libera\u00e7\u00e3o de espa\u00e7o, \u00e9 hora de acrescentar mais arquivos de log e tamb\u00e9m, disponibilizar mais espa\u00e7o &#8211; um lembrete, os logs s\u00e3o primeiro armazenados no log buffer e depois, nas condi\u00e7\u00f5es j\u00e1 citadas, s\u00e3o &#8220;flusheados&#8221; para disco, sendo gravados nos arquivos de maneira circular. <\/p>\n<p>N\u00e3o h\u00e1 no MySQL a possibilidade de arquivar logs antes que tais arquivos sejam reutilizados. No caso de voc\u00ea querer reconstruir os bancos a partir dos vetores de altera\u00e7\u00f5es que passaram pelos logs de transa\u00e7\u00e3o do InnoDB, utilize o log bin\u00e1rio, que, ele sim \u00e9 o cara que poder\u00e1 lhe ajudar com a tarefa de recriar o banco.<\/p>\n<p>Voltando ao problema, se a vari\u00e1vel de status Innodb_log_waits for maior que zero, considere reconfigurar o servidor MySQL:<\/p>\n<p><code>mysql&gt; show status like 'innodb_log_waits';<br \/>\n+------------------+-------+<br \/>\n| Variable_name    | Value |<br \/>\n+------------------+-------+<br \/>\n| Innodb_log_waits | 3287  |<br \/>\n+------------------+-------+<br \/>\n1 row in set (0.00 sec)<\/code><\/p>\n<p>Reconfigurando os logs, voc\u00ea poder\u00e1 ter problemas ao reinicializar o MySQL. Sendo assim, voc\u00ea precisa excluir os logs de transa\u00e7\u00e3o atuais e ent\u00e3o, reiniciar o MySQL.<\/p>\n<p>At\u00e9!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Um dos desafios mais interessantes no MySQL atualmente \u00e9 conseguir aplicar ao servidor de bancos de dados, o mysqld, uma boa configura\u00e7\u00e3o relacionada com o InnoDB Plugin. Digo uma configura\u00e7\u00e3o, pois, atingir um n\u00edvel de melhoria de performance n\u00e3o \u00e9 l\u00e1 t\u00e3o f\u00e1cil, mesmo sabendo o significado e os poss\u00edveis valores de cada uma daquelas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/314"}],"collection":[{"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=314"}],"version-history":[{"count":7,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/314\/revisions"}],"predecessor-version":[{"id":331,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/314\/revisions\/331"}],"wp:attachment":[{"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=314"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}