{"id":151,"date":"2011-11-13T14:34:15","date_gmt":"2011-11-13T17:34:15","guid":{"rendered":"http:\/\/wagnerbianchi.com\/blog\/?p=151"},"modified":"2011-11-13T14:34:15","modified_gmt":"2011-11-13T17:34:15","slug":"manutencao-do-mysql-mysqlcheck","status":"publish","type":"post","link":"http:\/\/wagnerbianchi.com\/blog\/?p=151","title":{"rendered":"Manuten\u00e7\u00e3o do MySQL &#8211; mysqlcheck"},"content":{"rendered":"<p>Uma das tarefas mais interessantes e que envolve mais pontos a serem analisados s\u00e3o as rotinas de manuten\u00e7\u00e3o dos bancos de dados e com o MySQL n\u00e3o \u00e9 diferente. Tais pontos v\u00e3o da an\u00e1lise do melhor momento para se realizar tal manuten\u00e7\u00e3o, intervalo de tempo denominado &#8220;janela de manuten\u00e7\u00e3o&#8221; ou do ingl\u00eas, &#8220;maintenance\u00a0time frame&#8221; , o tempo que tal rotina levar\u00e1 para completar o trabalho e quais s\u00e3o os objetivos de tal a\u00e7\u00e3o, esta que pode resultar em v\u00e1rios ganhos para o ambiente, seja de performance, seja de backup ou mesmo de preven\u00e7\u00e3o contra desastres.<\/p>\n<p>Comummente, n\u00e3o \u00e9 muito racional simplesmente colocar um script qualquer no <a href=\"http:\/\/www.vivaolinux.com.br\/artigo\/Usando-cron-e-crontab-para-agendar-tarefas\" target=\"_blank\">cron<\/a> do Linux ou agendador de tarefas do MS Windows e deixar este ser executado de acordo com o agendamento. Interessante que voc\u00ea, administrador de bancos de dados, saiba exatamente o que realizar em detrimento de cada objetivo que voc\u00ea tem em rela\u00e7\u00e3o \u00e0 manuten\u00e7\u00e3o dos seus bancos de dados &#8211; \u00e9 uma ilus\u00e3o achar que os dados n\u00e3o fragmentar\u00e3o com o tempo, que dados n\u00e3o ser\u00e3o corrompidos nunca e que, principalmente, voc\u00ea n\u00e3o precisar\u00e1 de um backup, aquele que falhou esta manh\u00e3. Muito cuidado com este \u00faltimo t\u00f3pico e lembre-se, Murphy e sua lei est\u00e3o sempre aonde existem &#8220;pontos simples de falha (<em>SPOF<\/em>)&#8221;.<\/p>\n<p>O MySQL nos d\u00e1 v\u00e1rias possibilidades de se trabalhar a manuten\u00e7\u00e3o de tabelas de qualquer Storage Engine atrav\u00e9s do *programa-cliente mysqlcheck, que \u00e9 adicionado ao PATH do sistema operacional ap\u00f3s a instala\u00e7\u00e3o do MySQL Server. Tanto em sistemas Unix Like quanto em sistemas MS Windows, ao utilizar o terminal ou o prompt de comando, respectivamente, basta teclar as primeiras letras e utilizar TAB para completar o nome do aplicativo, que, logo voc\u00ea perceber\u00e1 que v\u00e1rios outros aplicativos, al\u00e9m do mysqlcheck, tamb\u00e9m est\u00e3o dispon\u00edveis. Ap\u00f3s ser chamado na linha de comando, como se trata de um programa-cliente, voc\u00ea precisar\u00e1 apontar qual usu\u00e1rio\/senha para se conectar ao servidor de bancos de dados MySQL (mysqld), quais bancos de dados e quais as op\u00e7\u00f5es, estas que s\u00e3o v\u00e1rias as dispon\u00edveis.<\/p>\n<p>Sintaxe de utiliza\u00e7\u00e3o do mysqlcheck:<\/p>\n<p><code>shell&gt; mysqlcheck [options] db_name [tables]<br \/>\nshell&gt; mysqlcheck [options] --databases DB1 [DB2 DB3...]<br \/>\nshell&gt; mysqlcheck [options] --all-databases<\/code><\/p>\n<p><strong>Checagem de Erros &#8211; op\u00e7\u00e3o &#8220;-c&#8221;<\/strong><\/p>\n<p>O mysqlcheck poder\u00e1 ser utilizado com a op\u00e7\u00e3o &#8220;-c&#8221; para checar os poss\u00edveis erros em tabelas de qualquer Storage Engine. Voc\u00ea pode programar algo em <em>shell script<\/em> para pegar os erros e lhe enviar por e-mail ou acompanhar a execu\u00e7\u00e3o do programa via linha de comando. Ap\u00f3s a checagem, caso algum erro seja reportado, \u00e9 interessante verificar qual \u00e9 a tabela e em qual banco de dados est\u00e1 para que as a\u00e7\u00f5es de corre\u00e7\u00e3o possam ser realizadas, o que varia de acordo com o Storage Engine.<\/p>\n<p>Checando erros em todos os bancos de dados:<\/p>\n<p><code>shell&gt; mysqlcheck [options] --all-databases -c<\/code><\/p>\n<p><strong>Atualizando Estat\u00edsticas &#8211; op\u00e7\u00e3o &#8220;-a&#8221;<\/strong><\/p>\n<p>Atualizar estat\u00edsticas \u00e9 uma opera\u00e7\u00e3o essencial em bancos de dados! Normalmente, \u00e9 interessante que os objetos, \u00edndices e linhas de tabelas sejam\u00a0estatisticamente\u00a0computadas para que a primeira camada do MySQL, aonde residem os m\u00f3dulos de otimiza\u00e7\u00e3o de consultas (transforma\u00e7\u00e3o e cria\u00e7\u00e3o de plano de execu\u00e7\u00e3o), para que a melhor rota seja tra\u00e7ada com base em tais estat\u00edsticas &#8211; resumidamente, eu sei quantas linhas, em \u00edndices ou n\u00e3o, eu tenho que percorrer de acordo com uma estrat\u00e9gia definida para atender a uma consulta. No caso de consultas que envolvem JOIN, a ordem das tabelas \u00e9 definida atrav\u00e9s das estat\u00edsticas.<\/p>\n<p>Se eu n\u00e3o sei a quantidade de objetos, \u00edndices e linhas que tenho em disco nos arquivos em disco, como farei essa decis\u00e3o? A atualiza\u00e7\u00e3o das estat\u00edsticas garante que haja consist\u00eancia entre a vis\u00e3o l\u00f3gica (engine) e f\u00edsica (arquivos em disco) dos bancos de dados.<\/p>\n<p>O mysqlcheck -a ou &#8211;analyze \u00e9 equivalente ou ANALYZE TABLEs\u00e3o comando equivalentes e ao serem executados, adquirem bloqueio de leitura (bloqueio compartilhado) e funcionando para tabelas MyISAM e InnoDB.<\/p>\n<p>Analisando as tabelas em todos os bancos de dados:<\/p>\n<p><code>shell&gt; mysqlcheck [options] --all-databases -a<\/code><\/p>\n<p><strong>Otimizando tabelas &#8211; op\u00e7\u00e3o &#8220;-o&#8221;<\/strong><\/p>\n<p>A op\u00e7\u00e3o &#8220;-o&#8221; otimiza os dados em disco promovendo melhor aloca\u00e7\u00e3o dos dados dentro de suas respectivas p\u00e1ginas de dados em disco, assim como promove, consequentemente, a desfragment\u00e7\u00e3o de toda a informa\u00e7\u00e3o armazenada. Al\u00e9m disso, atualiza as estat\u00edsticas de \u00edndices fazendo a ordena\u00e7\u00e3o dos mesmos (InnoDB Clustered Indexes) e o rearranjo da \u00e1rvore B-TREE (MyISAM e InnoDB). Durante a opera\u00e7\u00e3o, um bloqueio exclusivo ser\u00e1 adquirido na tabela na qual o processo est\u00e1 rodando (bloqueio exclusivo = WRITE LOCK) e o poder de resposta do servidor de bancos de dados poder\u00e1 diminuir muito nesse momento. Ap\u00f3s o processo, caso seja uma base que tem altera\u00e7\u00f5es intensas em seus registros, poderemos perceber diminui\u00e7\u00e3o dos espa\u00e7o consumido em disco pelos bancos de dados.<\/p>\n<p>Otimizando as tabelas em todos os bancos de dados:<\/p>\n<p><code>shell&gt; mysqlcheck [options] --all-databases -o<\/code><\/p>\n<p>A partir da vers\u00e3o 5.1 do MySQL, o InnoDB Plugin passou a n\u00e3o se entender muito bem com o OPTIMIZE TABLE ou a op\u00e7\u00e3o &#8220;-o&#8221; do mysqlcheck. Ao rodar um daqueles comandos contra uma tabela que \u00e9 controlada pelo Storage Engine InnoDB Plugin, o seguinte erro ser\u00e1 enviado ao usu\u00e1rio:<\/p>\n<p><code>Table does not support optimize, doing recreate + analyze ...<\/code><\/p>\n<p>Este tipo de problema poder\u00e1 ser contornado atrav\u00e9s do recria\u00e7\u00e3o da tabela com o que chamamos de REBUILD, seguido por um ANALYZE, isso para todas as tabelas do banco de dados:<\/p>\n<p><code>mysql> ALTER TABLE nome_tabela ENGINE=InnoDB;<br \/>\nmysql> ANALYZE TABLE nome_tabela;<\/code><\/p>\n<p>Lembro que voc\u00ea poder\u00e1 montar os comandos para todas as tabelas do banco atrav\u00e9s de scripts ou mesmo, utilizando SQL em conjunto com a tabela TABLES do dicion\u00e1rio de dados do MySQL, o INFORMATION_SCHEMA.<\/p>\n<p>Tais opera\u00e7\u00f5es de manuten\u00e7\u00e3o podem agora fazer parte do seu plano de otimiza\u00e7\u00e3o para o MySQL e voc\u00ea poder\u00e1 desenvolver um script para isso utilizando shell ou DOS. Problemas com <em>crash<\/em> de tabelas e performance poder\u00e3o ser detectados e resolvidos com o aplicativo mysqlcheck. Basta agora, conceber um plano com padr\u00f5es para todas as a\u00e7\u00f5es que ser\u00e3o realizadas, estudar o padr\u00e3o de\u00a0nomenclatura, contar com um profissional especializado para assinar o projeto e colocar em execu\u00e7\u00e3o. Assim, sua tecnologia tem bem menos chances de ter problemas quando mais se precisar dela.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das tarefas mais interessantes e que envolve mais pontos a serem analisados s\u00e3o as rotinas de manuten\u00e7\u00e3o dos bancos de dados e com o MySQL n\u00e3o \u00e9 diferente. Tais pontos v\u00e3o da an\u00e1lise do melhor momento para se realizar tal manuten\u00e7\u00e3o, intervalo de tempo denominado &#8220;janela de manuten\u00e7\u00e3o&#8221; ou do ingl\u00eas, &#8220;maintenance\u00a0time frame&#8221; , [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17],"tags":[],"_links":{"self":[{"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/151"}],"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=151"}],"version-history":[{"count":11,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/151\/revisions"}],"predecessor-version":[{"id":162,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/151\/revisions\/162"}],"wp:attachment":[{"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=151"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=151"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/wagnerbianchi.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=151"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}