Verifique a integridade de imagens JPG com o jpeginfo

O jpeginfo pode ajudar a verificar automaticamente a integridade de uma quantidade enorme de imagens, em seu sistema Linux.
Trata-se de um pequeno utilitário de linha de comando (CLI), flexível, rápido e eficiente.
linux jpeginfo
Posso usar o jpeginfo para checar um único arquivo de imagem ou centenas deles.
Como, para um trabalho desta natureza, você quer resultados rápidos, as ferramentas CLI são a melhor opção — por que conseguem mostrar os resultados que você deseja, com o menor consumo possível de recursos do sistema.

Como instalar o jpeginfo

No Debian e no Ubuntu, ele pode ser instalado, com o apt:

sudo apt install jpeginfo
 _

Trata-se de um programa muito pequeno, que não vai pesar no sistema — caso você se preocupe com estes detalhes. Além disto, sempre é possível removê-lo, depois de realizar o seu trabalho.
Se estiver curioso, você pode conferir o tamanho dele com a opção ‘show’ do apt:

apt show jpeginfo | grep -i size

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Installed-Size: 25,6 kB
Download-Size: 13,2 kB
 _

Ele pode ser instalado em questão de segundos, como você pode ver.

O tamanho do jpeginfo, após a instalação, é aproximadamente 25 Kb.

Como verificar a integridade das minhas fotos?

Como eu disse, dá pra verificar apenas uma imagem, assim:

jpeginfo --check System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 
 _

O texto “[OK]”, ao final das informações básicas do arquivo, indica que está tudo bem com ele:

System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  985882  [OK]
 _
jpeginfo --check foto-danificada.jpg
 _

… ou você pode obter uma indicação de que há “[ERROR]”:

foto-danificada.jpg  Not a JPEG file: starts with 0x5c 0x6e  [ERROR]
 _

Você pode pedir para verificar todas as imagens do diretório corrente, com o uso de curingas:

jpeginfo --check *.jpg
 _
foto-danificada.jpg  Not a JPEG file: starts with 0x5c 0x6e  [ERROR]
System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg 2560 x 1440 24bit JFIF  P 3768044  [OK]
System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  985882  [OK]
System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  824133  [OK]
System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  952200  [OK]
System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  974983  [OK]
System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  731859  [OK]
System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  943715  [OK]
 _

Observe que as informações, na listagem normal, vêm em colunas:

  1. nome do arquivo
  2. resolução da imagem
  3. profundidade das cores
  4. padrão do arquivo de imagem
  5. padrão da decodificação (progressiva, interpolada etc.)
  6. Tamanho, em bytes

Na última coluna, o resultado do teste.

A sigla JFIF, que aparece na lista acima, significa JPEG File Interchange Format. Trata-se do formato padrão do arquivo da imagem.
Este formato é compatível com o padrão JPEG Interchange Format (JIF) e resolve algumas de suas limitações de codificação.
Tal como todos os arquivos JIF, os dados contidos em imagens JFIF comprimidos com o uso de técnicas no padrão JPEG, uma vez que as imagens JFIF são comumente chamadas “JPEG/JFIF”.

Use a opção ‘–lsstyle’, para ver o resultado organizado de outra forma:

jpeginfo --check --lsstyle *.jpg
 Not a JPEG file: starts with 0x5c 0x6e  foto-danificada.jpg [ERROR]
2560 x 1440 24bit JFIF  P 3768044 System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg  [OK]
2560 x 1440 24bit JFIF  P  985882 System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  824133 System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  952200 System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  974983 System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  731859 System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg  [OK]
2560 x 1440 24bit JFIF  P  943715 System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg  [OK]
_

Use o comando grep, para ver apenas os resultados que retornaram erro:

jpeginfo --check --lsstyle *.jpg | grep -i error
_
 Not a JPEG file: starts with 0x5c 0x6e  foto-danificada.jpg [ERROR]
_

Use a opção ‘–delete’, para remover automaticamente todos os arquivos que forem encontrados com erros:

jpeginfo --delete *.jpg
_

Use a opção ‘–info’, para obter mais detalhes nas informações sobre cada arquivo:

jpeginfo --info *.jpg
_
System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,300dpi 3768044 
System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  985882 
System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  824133 
System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  952200 
System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  974983 
System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  731859 
System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  Progressive Huffman,150dpi  943715 
_

Calcule a soma MD5, ou MD5 checksum, com a opção ‘–md5’:

jpeginfo --md5 *.jpg
_
System76-Old_Man_Smoked_His_Pipe-by_Ian_Hex_of_LightSweep.jpg 2560 x 1440 24bit JFIF  P 3768044 f45c6abe65faff92c753ca24ec5f8152 
System76-System76_Brandmark_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  985882 3fc69c0484860c02b21cb6582067c28b 
System76-System76_Brandmark_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  824133 3406d52789e7a79cf9efc76135416cf4 
System76-System76_Brandmark_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  952200 bb1cd2cd03730e8e56d5876c6638de47 
System76-System76_Logo_Blue-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  974983 dc2e914b26c91dceb745baab1dd677aa 
System76-System76_Logo_Gray-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  731859 9efd7ded3aceb671a708bac28a7aeb6a 
System76-System76_Logo_Yellow-by_Kate_Hazen_of_System76.jpg 2560 x 1440 24bit JFIF  P  943715 30ee050e0c5d14b7c9c6f44b7df2fff4
_

Fazer o cálculo da soma MD5, é útil para quem vai fazer a transmissão de uma grande quantidade de arquivos de imagem e deseja obter uma checagem, no final, de que a transferência ocorrem sem incidentes.
Como você já deve ter percebido, pode combinar várias opções na mesma linha.
Para saber mais sobre o jpeginfo, use a opção ‘–help’ ou consulte o manual do sistema: man jpeginfo.

Como obter informações dos arquivos de imagem com o identify, no Linux

Esta dica é útil para webmasters, que precisam obter informações sobre imagens armazenadas em servidores sFTP, FTP, etc.
Todos sabemos que uma página web vai carregar mais rápido no navegador do cliente, se as imagens estiverem devidamente otimizadas ou, pelo menos usarem resoluções mais adequadas ao tráfego eficiente de dados.
A maioria dos servidores web, atualmente, usam distribuições Linux ou FreeBSD. Portanto, a dica que segue vale para todos.
O identify é um aplicativo utilitário CLI, que faz parte do pacote de ferramentas de manipulação de imagens ImageMagick, que costuma estar instalado na maioria das distribuições. Se não estiver, instale você mesmo ou peça para o administrador.
O utilitário tem (entre outras) a função de obter e exibir informações sobre o formato e as características de um ou mais arquivos de imagem.
Ele também pode ajudar a determinar se uma imagem se encontra incompleta ou corrompida.
O comportamento básico consiste em retornar informações sobre resolução e mapa de cores.
Se você fizer uso de algumas de suas opções, contudo, vai poder obter mais dados sobre as imagens no diretório.
Veja um exemplo do uso básico do identify:

identify images/wallpapers/system76/System76-System76_Logo_DarkBlue-remix.jpg 

Como você pode observar, no resultado abaixo, o comando exibe o nome do arquivo seguido de informações relacionadas ao seu formato, resolução, mapa de cores, tamanho (em MB) e, por fim, o tempo que a imagem demora para carregar.

images/wallpapers/system76/System76-System76_Logo_DarkBlue-remix.jpg 
JPEG 2560x1440 2560x1440+0+0 8-bit sRGB 1.455MB 0.090u 0:00.100

Você pode usar coringas para obter informações sobre várias imagens, dentro de um diretório:

identify *.png
System76-Fractal_Mountains-by_Kate_Hazen_of_System76.png PNG 2560x1440 2560x1440+0+0 8-bit sRGB 216KB 0.000u 0:00.000
System76-Fractal_Salad-by_Kate_Hazen_of_System76.png[1] PNG 2560x1440 2560x1440+0+0 8-bit sRGB 1.233MB 0.000u 0:00.000
System76-Geometric-adapted_by_Kate_Hazen_of_System76.png[2] PNG 2560x1440 2560x1440+0+0 8-bit sRGB 543KB 0.000u 0:00.000
System76-Honeycomb-by_Kate_Hazen_of_System76.png[3] PNG 2560x1440 2560x1440+0+0 8-bit sRGB 1.274MB 0.000u 0:00.000
System76-Robot-by_Kate_Hazen_of_System76.png[4] PNG 2560x1440 2560x1440+0+0 8-bit sRGB 117KB 0.000u 0:00.000
System76-Unleash_Your_Robot_Blue-by_Kate_Hazen_of_System76.png[5] PNG 2560x1440 2560x1440+0+0 8-bit sRGB 366KB 0.000u 0:00.000
System76-Unleash_Your_Robot-by_Kate_Hazen_of_System76.png[6] PNG 2560x1440 2560x1440+0+0 8-bit sRGB 317KB 0.000u 0:00.000

Se acrescentar a opção ‘-verbose’, você irá obter uma quantidade (muito) maior de informações sobre a imagem:

identify -verbose System76-Unleash_Your_Robot-by_Kate_Hazen_of_System76.png
Image: System76-Unleash_Your_Robot-by_Kate_Hazen_of_System76.png
  Format: PNG (Portable Network Graphics)
  Mime type: image/png
  Class: DirectClass
  Geometry: 2560x1440+0+0
  Units: Undefined
  Type: Palette
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
    red: 8-bit
    green: 8-bit
    blue: 8-bit
  Channel statistics:
    Pixels: 3686400
    Red:
      min: 49 (0.192157)
      max: 251 (0.984314)
      mean: 67.3018 (0.263929)
      standard deviation: 52.2158 (0.204768)
      kurtosis: 8.12896
      skewness: 3.16752
    Green:
      min: 49 (0.192157)
      max: 211 (0.827451)
      mean: 64.1777 (0.251677)
      standard deviation: 45.8988 (0.179995)
      kurtosis: 5.73893
      skewness: 2.76302
    Blue:
      min: 8 (0.0313725)
      max: 240 (0.941176)
      mean: 53.8382 (0.21113)
      standard deviation: 27.4086 (0.107485)
      kurtosis: 32.4493
      skewness: 4.88138
  Image statistics:
    Overall:
      min: 8 (0.0313725)
      max: 251 (0.984314)
      mean: 61.7726 (0.242245)
      standard deviation: 43.1448 (0.169195)
      kurtosis: 11.5967
      skewness: 3.57292
  Colors: 158
  Histogram:
      1077: ( 49,178,217) #31B2D9 srgb(49,178,217)
      1470: ( 49,187,228) #31BBE4 srgb(49,187,228)

...

      4954: (239,201, 11) #EFC90B srgb(239,201,11)
    257974: (251,211,  8) #FBD308 srgb(251,211,8)
  Rendering intent: Perceptual
  Gamma: 0.454545
  Chromaticity:
    red primary: (0.64,0.33)
    green primary: (0.3,0.6)
    blue primary: (0.15,0.06)
    white point: (0.3127,0.329)
  Background color: white
  Border color: srgb(223,223,223)
  Matte color: grey74
  Transparent color: black
  Interlace: None
  Intensity: Undefined
  Compose: Over
  Page geometry: 2560x1440+0+0
  Dispose: Undefined
  Iterations: 0
  Compression: Zip
  Orientation: Undefined
  Properties:
    date:create: 2016-09-21T11:51:50-03:00
    date:modify: 2016-09-02T10:53:12-03:00
    png:IHDR.bit-depth-orig: 8
    png:IHDR.bit_depth: 8
    png:IHDR.color-type-orig: 2
    png:IHDR.color_type: 2 (Truecolor)
    png:IHDR.interlace_method: 0 (Not interlaced)
    png:IHDR.width,height: 2560, 1440
    png:sRGB: intent=0 (Perceptual Intent)
    png:text: 1 tEXt/zTXt/iTXt chunks were found
    signature: b7734eceb937dcaa86ca13ecb086850622c67fc8a863fd7c10f095c98498054e
    Software: Adobe ImageReady
  Artifacts:
    filename: System76-Unleash_Your_Robot-by_Kate_Hazen_of_System76.png
    verbose: true
  Tainted: False
  Filesize: 317KB
  Number pixels: 3.686M
  Pixels per second: 61.44MB
  User time: 0.060u
  Elapsed time: 0:01.060
  Version: ImageMagick 6.8.9-9 Q16 x86_64 2016-09-25 http://www.imagemagick.org

Neste caso, recomendo combinar o comando less ou o comando grep, para pausar ou filtrar a listagem.
Os usos do comando permitem, até mesmo, realizar tarefas mais complexas de manipulação de imagens, direto da linha de comando — mas isto, vamos explicar em outro artigo.

MySQL: use o mysqlcheck para fazer manutenção das suas tabelas

O programa cliente mysqlcheck oferece uma maneira eficiente para executar a manutenção das tabelas em seu banco de dados — ele verifica, conserta, otimiza ou apenas analisa as tabelas dentro do banco de dados.
O mysqlcheck deve ser usado quando o servidor mysqld está rodando — uma de suas primeiras vantagens é essa: a de não precisar indisponibilizar o servidor para fazer uma manutenção no seu sistema de banco de dados.
O mysqlcheck é um “frontend”. Ele se autentica no MySQL e execute as declarações CHECK TABLE, REPAIR TABLE, ANALYZE TABLE e OPTIMIZE TABLE do modo mais conveniente pro usuário. Ele determina a forma mais adequada para cada declaração de acordo com a operação pedida, na linha de comando, e a envia ao servidor para ser executada.
É o indicado para realizar as tarefas de manutenção em tabelas MyISAM. Outros mecanismos de armazenamento (storage engines) podem não suportar todas as operações, nestes casos, mensagens de erro irão surgir para te informar do fato:

note    : The storage engine for the table doesn't support check
PRECAUÇÕES

Você deve fazer backup dos dados nas tabelas antes de inciar uma operação de restauração (repair) nestas tabelas. Sob certas circunstâncias, a operação pode causar perda de dados.
Algumas causas de perda de dados podem estar ligadas a sistemas de arquivos com erros.

De acordo com o manual oficial do MySQL, há 3 sintaxes possíveis pro comando mysqlcheck:

mysqlcheck [opcoes] nome_do_banco [nome_da_tabela1 nome_da_tabela2 ...]
mysqlcheck [opcoes] --databases nome_do_banco1 nome_do_banco2 ...
mysqlcheck [opcoes] --all-databases

Daqui pra frente, vamos desenvolver melhor o assunto e algumas das opções mais comuns de uso do comando.

Como verificar uma tabela dentro do banco de dados

Se seu aplicativo retornou uma mensagem de erro, informando que uma determinada tabela está corrupta, execute o mysqlcheck assim:

mysqlcheck -c nome_do_banco nome_da_tabela -u root -p

forneça a senha, assim que lhe for pedido e aguarde o resultado:

nome_do_banco.nome_da_tabela      OK

Se a senha e/ou nome de usuário estiver errada, o sistema emitirá uma mensagem de erro semelhante a esta:

mysqlcheck: Got error: 1045: Access denied for user 'root'@'localhost' (using password: NO) when trying to connect

A opção -c é a que indica que a operação a ser realizada é de checagem (verificatória).

Como verificar todas as tabelas em um banco de dados

Se quiser verificar todas as tabelas dentro de um banco de dados, com o mysqlcheck, omita seus nomes. Forneça apenas o nome do banco de dados que as contém (no meu caso, é clientes):

mysqlcheck -c clientes -u root -p

O meu resultado foi este:
clientes.CLPJ OK
clientes.CLCD OK
clientes.CLPD OK
clientes.CLCT OK[/plain]

Como checar todas as tabelas e bancos de dados

Para realizar uma checagem desta amplitude, o comando executado é bem curto:

mysqlcheck c -u root -p --all-databases

Você pode executar o mysqlcheck em mais de um banco de dados (sem ser todos), assim, com a opção --databases. No exemplo, que segue, o comando será executado em todas as tabelas dentro dos bancos de dados fornecedores e clientes:

mysqlcheck -c -u root -p --databases fornecedores clientes

Como analisar tabelas usando o mysqlcheck

O exemplo que segue, usa o comando mysqlcheck, com a opção -a para analisar a tabela cadastros, dentro do banco de dados clientes:

mysqlcheck -a clientes cadastros -u root -p

Internamente, o mysqlcheck roda a declaração ANALYZE TABLE em relação à clientes. Enquanto trabalha, trava a tabela, permitindo apenas a sua leitura – motivo, pelo qual, você não deve fazer estas tarefas em horários de pico.

Use o mysqlcheck para otimizar tabelas

No exemplo que segue, o mysqlcheck é usado para otimizar a tabela projetos, dentro do banco de dados clientes.

mysqlcheck -o clientes projetos -u root -p
Enter password: 
clientes.projetos                                  Table is already up to date

Como já disse, o comando mysqlcheck executa um comando MySQL internamente. Neste caso, o OPTIMIZE TABLE.
À medida em que você vai removendo registros das suas tabelas, espaços sem uso vão ficando no meio. Este comando funciona semelhante ao desfragmentador de alguns sistemas operacionais, reorganizando os espaços, o que melhora a performance em tabelas que já tenham passado por grandes quantidades de alterações.

Restaure, conserte tabelas com o comando mysqlcheck

Aqui, o mysqlcheck vai usar internamente o comando REPAIR TABLE, que repara (conserta) uma tabela MyISAM corrompida.
Veja como:

mysqlcheck -r clientes projetos -u root -p

Combine diversas tarefas em uma só declaração mysqlcheck

É claro que, para a sua comodidade, é possível combinar diversas tarefas para serem executadas pelo mysqlcheck, em apenas uma linha de comando. veja como combinar CHECK, OPTIMIZE e REPAIR e mais a opção --auto-repair, dentro do banco de dados clientes (adeque o comando à sua realidade):

mysqlcheck -u root -p --auto-repair -o clientes

Ou em todas as tabelas, em todos os bancos de dados:

mysqlcheck -u root -p --auto-repair -o --all-databases
LEIA MAIS:
  • Comandos (internos) de manutenção — rápida noção dos comandos REPAIR, ANALYZE, CHECK e OPTIMIZE.
  • Otimize suas consultas — use o QUERY CACHE!
  • Outras opções úteis pro mysqlcheck

    Para ter um feedback maior do que está sendo feito pelo programa, use a opção –debug-info. Ela é mais voltada para encontrar erros dentro do próprio programa, para desenvolvedores – mas é uma mão na roda para administradores de MySQL que desejam ter um maior controle do que o comando está executando. Veja, no exemplo, como a saída oferece mais informações.

    mysqlcheck -u root -p --debug-info --auto-repair clientes projetos
    Enter password: 
    clientes.projetos                                  OK
    User time 0.01, System time 0.00
    Maximum resident set size 1584, Integral resident set size 0
    Non-physical pagefaults 538, Physical pagefaults 0, Swaps 0
    Blocks in 0 out 0, Messages in 0 out 0, Signals 0
    Voluntary context switches 3, Involuntary context switches 17

    MySQL: comandos para manutenção do banco de dados

    De maneira bem breve, vou listar 4 comandos MySQL relacionados à manutenção dos seus bancos de dados. Neste texto, serão descritos de forma bem sucinta e rápida. É mais ou menos um lembrete para quem é administrador iniciante e ainda não criou os bons hábitos de verificação dos seus bancos de dados.

    Check table

    Com suporte ao MyISAM e ao InnoDB, o comando CHECK TABLE pode ser usado para verificar erros e inconsistências nas tabelas.
    Sua sintaxe é simples mas você precisa ter privilégios adequados para poder rodar este comando:

    
    CHECK TABLE projetos QUICK;
    
    +-------------------+-------+----------+----------+
    | Table             | Op    | Msg_type | Msg_text |
    +-------------------+-------+----------+----------+
    | clientes.projetos | check | status   | OK       |
    +-------------------+-------+----------+----------+
    1 row in set (0.09 sec)
    

    Repair table

    Se houver erros detectados por CHECK TABLE, será necessário usar o REPAIR na sua tabela.

    
    REPAIR TABLE projetos;
    
    +-------------------+--------+----------+----------+
    | Table             | Op     | Msg_type | Msg_text |
    +-------------------+--------+----------+----------+
    | clientes.projetos | repair | status   | OK       |
    +-------------------+--------+----------+----------+
    1 row in set (0.00 sec)
    

    Analyze table

    Este comando (exemplo abaixo) analisa e armazena a distribution key da tabela. Enquanto isto, ele a trava, impedindo que seja alterada temporariamente – ela só pode ser lida.

    O que é distribution key

    Uma distribution key ou chave de distribuição é uma coluna (ou grupo de colunas) usada para determinar a partição do banco de dados em que um registro, em particular, será armazenado.
    Você define uma distribution key em uma tabela através do comando CREATE TABLE.

    
    ANALYZE TABLE projetos;
    
    +-------------------+---------+----------+-----------------------------+
    | Table             | Op      | Msg_type | Msg_text                    |
    +-------------------+---------+----------+-----------------------------+
    | clientes.projetos | analyze | status   | Table is already up to date |
    +-------------------+---------+----------+-----------------------------+
    1 row in set (0.01 sec)
    
    

    Optimize table

    Se você executa muitas operações de remoção de registros (DELETE), provavelmente precisará da declaração OPTIMIZE TABLE para fazer uso de espaços liberados e desfragmentar o arquivo de dados.

    
    OPTIMIZE TABLE projetos;
    
    +-------------------+----------+----------+----------+
    | Table             | Op       | Msg_type | Msg_text |
    +-------------------+----------+----------+----------+
    | clientes.projetos | optimize | status   | OK       |
    +-------------------+----------+----------+----------+
    1 row in set (0.04 sec)