MySQL error: Table storage engine for ‘catalog_product_relation’ doesn’t have this option

Está com esse problema para executar um script SQL no MySQL? O que está ocorrendo é que de definição da tabela não é compatível com sua instalação do MySQL.

Esse problema ocorre principalmente ao realizar mysqldump na versão 5.5.x de um banco de dados do Magento, e ao importar em 5.7.x, não ter a opção para criação da tabela.

O seguinte erro ocorre ao executar o script SQL:

ERROR 1031 (HY000) at line 3002: Table storage engine for ‘catalog_product_relation’ doesn’t have this option

O problema

Isso provavelmente se deve à opção de tabela que você tem em seu CREATE TABLE DDL:

ROW_FORMAT = FIXED

Para verificar onde está o problema no scritp, pode executar no terminal o seguinte comando:

cat magento.sql | grep '=FIXED'

Somente as linhas que contém a palavra FIXED irão retornar. Para corrigir o problema, podemos realizar uma substituição através de REGEX, como nos exemplos abaixo.

Solução 1

Essa solução pode funcionar em SO linux, mas no Mac OSX apresentam erros.

sed -i 's/ROW_FORMAT=FIXED//g' magento.sql

Solução 2

Para funcionar no terminal do Mac OSX, utilize o comando abaixo:

LC_ALL=C sed -i '' 's/ROW_FORMAT=FIXED//g' magento.sql

Depois, é só realizar a importação do dump sem problemas!

SQL Join: Como e quando usar INNER JOIN, LEFT JOIN ou RIGHT JOIN

Uma artigo rápido para ajudar a entender como funciona cada tipo dessas pesquisas. Sempre que estamos começando com banco de dados, a dúvida de qual momento e como usar os JOIN no SQL surgem. OK, pra quem já está a tempos no desenvolvimento, a dúvida sempre fica.

O uso dos JOIN é essencial para conectar os dados entre as tabelas no banco de dados. Para nosso exemplo, por ser um portal focado em PHP, vamos considerar o exemplo em cima do melhor amigo que é o MySQL.

A modelagem

Para nosso exemplo, vamos considerar uma modelagem simples, imaginando um sistema de blogs onde existem artigos e categorias. O que vamos querer retornar nas consultas é os artigos que tem categorias, os arquivos com ou sem categoria, quais categorias tem artigos e ainda artigos sem categoria.

Sempre considerando que cada artigo pode ter apenas uma categoria associada.Exemplo de ER

 

Quando usar o INNER JOIN

Vamos listar todos os artigos e suas respectivas categorias. Caso um artigo não tenha categoria relacionada, não será exibido no resultado dessa pesquisa. Para isso, a query abaixo será executada.

SELECT artigos.id, artigos.titulo, categorias.titulo FROM artigos INNER JOIN categorias ON artigos.categoria_id = categorias.id

Quando usar o LEFT JOIN

Agora, vamos listar todos os artigos, mesmo que não tenham uma categoria associada na coluna.

SELECT artigos.id, artigos.titulo, categorias.titulo FROM artigos LEFT JOIN categorias ON artigos.categoria_id = categorias.id

Nesse caso, a coluna “categorias.titulo” irá retornar o valor NULL, mostrando os artigos que não tem uma categoria definida.

Quando usar o RIGHT JOIN

No caso do RIGHT JOIN, irá retornar primeiro verificar todas as categorias que tem artigos. Com isso, você irá perceber uma mudança no resultado, pois eles virão ordenados pelas categorias, caso não tenha definido nenhuma ordenação especial.

SELECT artigos.id, artigos.titulo, categorias.titulo FROM artigos RIGHT JOIN categorias ON artigos.categoria_id = categorias.id

Obrigado e até a próxima, qualquer dúvida deixe um comentário!

Backup de banco MySQL via SSH

Realizar um backup de banco MySQL as vezes pode ser complicado, quando a base tem diversas tabelas. No caso do sistema Magento, por exemplo, aonde você encontra mais de 300 tabelas, usar um programa de gerenciamento pode ser demorado.

Uma maneira rápida e fácil de realizar o backup é via SSH. Claro, para isso o servidor de hospedagem precisa permitir o acesso SSH de sua conta.

Veja abaixo um exemplo de como realizar esse backup:

mysqldump -h HOSTDOBANCO -u LOGIN -p -R --opt NOMEDOBANCO > bkp.sql

Após rodar o comando acima, será socitado o password da base de dados. O arquivo .sql será gerado em poucos segundos, dentro da pasta aonde você esta navegando no servidor.

É possível realizar esse comando para gerar um backup apenas de uma tabela, conforme abaixo:

mysqldump -h HOSTDOBANCO -u LOGIN -p -R --opt NOMEDOBANCO TABELA > backup.sql

Para bases de dados até a versão 5.0, o comando muda um pouco, conforme abaixo:

mysqldump -h HOSTDOBANCO -u LOGIN -p --opt NOMEDOBANCO > backup.sql