Cursos Magento

Fazendo e Restaurando Backups de Banco de Dados MySQL

, , , , ,

Publicado em 13 de outubro de 2020

Vai instalar um novo módulo que altera seu banco de dados, ou apenas vai migrar seu banco de um lugar para o outro? Veja como fazer isso de forma rápida e eficiente.

Embora muitos provedores de hospedagem Magento (ou não) ofereçam formas de exportar e importar banco de dados eu sempre preferi fazer isso com o comando mysqldump, diretamente no terminal das lojas que gerencio.

Vantagens do mysqldump e de fazer isso no terminal

Ele me permite exportar apenas algumas tabelas, e eventualmente não exportar dados de tabelas muito grandes e desnecessárias em alguns casos. Tabelas de log por exemplo, tendem a representar 80% do tamanho do arquivo final.

Além disso, em casos onde a transferência destas tabelas se dará entre servidores, nada melhor do que usar a própria conexão do servidor para transferir o arquivo. Desta forma não precisamos baixar pra nossa máquina e depois fazer upload pro outro servidor. Muito mais rápido, né?

Por fim sempre compacto o arquivo sql a fim de torná-lo cerca de 90% menor que o original.

O básico

Uma vez que você se conectou no terminal, e tem o mysqldump disponível na linha de comando, você pode usá-lo da seguinte forma:

mysqldump -h<nome da base> -u<usuario> -p<senha> --opt <nome da base> --routines > <nome do arquivo de saída.sql>

Exemplo: mysqldump -h127.0.0.1 -umagentoUser -pmagentoSenha --opt baseMagento --routines > db-prod.sql

Note que não é recomendável informar a senha ao usar este comando, pois ele ficará salvo no histórico. Você pode usar apenas o -p sem informar a senha, e ela será solicitada logo em seguida,

Pode também informar a porta do banco com -P (maiúsculo), caso não esteja usando a porta padrão (3306).

O comando acima criará um arquivo .SQL que pode ser usado para migrar esta base de dados mysql para outro servidor ou servir como backup para uma restauração futura.

Onde o Magento salva as credenciais do Banco?

Caso não saiba os dados acima, você pode encontrá-los no arquivo de configuração do Magento.

No Magento 2

Em app/etc/env.php dentro da chave 'db' do array de configuração.

No Magento 1

Em app/etc/local.xml dentro do nó xml config > global > resources > default_setup > connection.

Pulando tabelas grandes e reduzindo tamanho do dump

Eventualmente seu arquivo final fique muito grande. Em geral isso se dá por conta de tabelas grandes de logs. Se a finalidade do seu backup é ter a base da loja real no ambiente de desenvolvimento, você não precisará dos dados dessas tabelas.

Nestes casos, podemos ignorar as tabelas que não queremos com o parâmetro –ignore-table e depois exportamos somente a tabela vazia com o parâmetro –no-data, adicionando a criação das tabelas no final do arquivo.

Ficaria assim:

#Exportando a base sem as tabelas de log_customer e log_visitor
mysqldump -h SEU_HOST -u SEU_USER -pSUA_SENHA --ignore-table=SUA_BASE.log_customer --ignore-table=SUA_BASE.log_visitor --opt SUA_BASE --routines > ARQUIVO.SQL

#Exportando as tabelas log_customer e log_visitor sem os dados
mysqldump -h SEU_HOST -u SEU_USER -pSUA_SENHA SUA_BASE log_customer log_visitor --no-data --routines >> ARQUIVO.SQL

Note que:

  • Usamos dois comandos acima
  • O primeiro comando usa apenas um sinal >, enquanto o segundo usa >>

O uso de >> faz com que ele adicione o conteúdo do mysqldump ao final do ARQUIVO.SQL, e não apague o que foi criado pelo primeiro comando.

Quais tabelas devo pular?

Você pode usar a query abaixo para ver quais tabelas possuem mais dados na sua base. Veja quais tabelas são de logs e que seus dados não são necessários, e siga os passos acima.

SELECT
  TABLE_NAME AS `Table`,
  ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)`
FROM
  information_schema.TABLES
WHERE
  TABLE_SCHEMA = "BASEMAGENTO" /* TROQUE PELO NOME DA SUA BASE */
ORDER BY
  (DATA_LENGTH)
DESC;

Compactando o SQL

Pra compactar o arquivo SQL você pode usar tar czvf ARQUIVOFINAL.tar.gz ARQUIVOORIGEM.sql.

Isso criará um arquivo compactado (.tar.gz) com seu backup.

Para descompactar

Faça tar xzvf ARQUIVOFINAL.tar.gz

Importando/Restaurando backup da base

Para importar um backup .SQL para uma base de dados MySQL utilizamos o comando mysql.

mysql -h<host> -u<usuario> -p<senha> -D<nome da base> < <arquivo.sql>

Exemplo
mysql -h127.0.0.1 -umagentoUser -pmagentoSenha -DbaseMagento < meubackup.sql

Note que quando geramos nosso backup com o primeiro comando, as instruções SQL dentro deste arquivo fazem com que cada tabela a ser importada seja apagada antes da importação. Ou seja, dados de tabelas com mesmo nome serão apagados.

Erro DEFINER em Procedures e outras instruções

Ao importar banco de dados de um servidor para outro, é comum termos problemas com uma cláusula DEFINER mencionada nas instruções do SQL.

Isso ocorre porque o usuário que exportou a base não possuí permissões ou não existe na base de destino. Porém o mysqldump adiciona o DEFINER fazendo com que o usuário que execute uma das Procedures ou Functions criadas seja o mesmo usado no comando acima.

Para contornar o problema, removemos a instrução do arquivo SQL antes de fazer a importação. Sempre faço isso da seguinte forma (conforme já respondido no StackOverflow):

Em máquinas linux

sed -i 's/DEFINER=[^*]*\*/\*/g' SEUARQUIVO.sql

No MacOS

sed -i '' 's/DEFINER=[^*]*\*/\*/g' SEUARQUIVO.sql

Trocando URL da loja na base

Quando importamos uma base Magento de uma loja real para trabalhar com desenvolvimento, geralmente a loja terá um URL diferente. Ou seja, minhaloja.com.br provavelmente sera minhaloja.local ou minhaloja.dev no ambiente de desenvolvimento.

Nestes casos, após importar a base, é importante também atualizar o URL da loja nas configurações do Magento.

As configurações que realizamos na área administrativa da nossa loja são salvas na tabela core_config_data.

Sendo assim, sugiro que sempre verifique quais valores de configuração existem por lá com o url da loja de origem ( SELECT * from core_config_data WHERE value like '%minhaloja.com.br%' ) e faça os ajustes necessários.

Eu geralmente crio um arquivo de texto com os scripts prontos para cada loja, de forma que todos os comandos acima possam apenas ser copiados e colados de um canto para o outro com mais facilidade e que eu sempre possa importar as lojas de produção para meu ambiente da forma mais rápida possível.

No caso das atualizações destes valores, o faço executando os comandos abaixo e algumas variações:

mysql -h HOST_LOCAL -u USER_LOCAL -pPASS_LOCAL -D DB_LOCAL -e "update core_config_data set value='URL_LOCAL' where path='web/unsecure/base_url';"
mysql -h HOST_LOCAL -u USER_LOCAL -pPASS_LOCAL -D DB_LOCAL -e "update core_config_data set value='URL_LOCAL' where path='web/secure/base_url';"

O parâmetro -e nos permite executar uma query à partir da linha de comando. Então apenas deixo sempre à mão os UPDATEs que preciso fazer em cada situação.

Lembre-se de limpar os caches de configuração após realizar updates na tabela core_config_data.


O artigo de hoje foi uma sugestão do David Martinez. Quer sugerir ou escrever o próximo? Deixe um comentário.

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-1/backup-banco-magento/"]