Fazendo e Restaurando Backups de Banco de Dados MySQL
Backend, Desenvolvimento, Desenvolvimento, Magento 1, Magento 2, Para Magenteiros
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>
Exemplomysql -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.
- PagSeguro (PagBank) para Magento 1 recebe a Nova Geração - 9 de abril de 2024
- Recorrência no WooCommerce Sem Plugins Pagos - 28 de janeiro de 2024
- Chargeback. O que é, e como se livrar deles. - 19 de dezembro de 2023
Deixe seu comentário
[fbcomments url="https://www.magenteiro.com/blog/magento-1/backup-banco-magento/"]