Exportar e importar uma base MySQL/MariaDB num VPS Linux

3 min
Alojamento VPS/VDS

Migrar um site, restaurar uma cópia de segurança ou clonar um ambiente de testes resume-se sempre a duas operações: exportar a base de dados para um ficheiro e voltar a carregá-la. Num VPS Linux Infrawire ambas se fazem com poucos comandos, sem interface web. Este guia cobre exportações consistentes, compressão, ficheiros grandes, codificação de caracteres e transferência direta entre servidores.

📋 Pré-requisitos

  • Um VPS Linux com Ubuntu 24.04 ou Debian 12 e acesso SSH como root (o IP e a palavra-passe root estão na sua área de cliente)
  • MySQL ou MariaDB instalado, ou pelo menos o cliente (apt install mariadb-client)
  • Um utilizador da base de dados com os privilégios SELECT, SHOW VIEW, TRIGGER, LOCK TABLES e EVENT sobre a base a exportar
  • Espaço livre suficiente em disco: verifique com df -h

1. Exportar uma base com mysqldump

Para tabelas InnoDB (o motor por omissão), --single-transaction produz um instantâneo consistente sem bloquear as tabelas, pelo que o seu site continua a funcionar durante a exportação.

Bash
mysqldump -u USER -p --single-transaction --quick DBNAME > DBNAME.sql

Nas versões recentes do MariaDB a ferramenta também existe como mariadb-dump, com as mesmas opções.

2. Incluir rotinas, triggers e eventos

Os triggers são exportados por omissão, mas os procedimentos armazenados, as funções e os eventos agendados têm de ser pedidos explicitamente. Fixar o conjunto de caracteres evita surpresas com acentos e emojis.

Bash
mysqldump -u USER -p --single-transaction --routines --triggers --events \ --default-character-set=utf8mb4 DBNAME > DBNAME.sql

Variantes úteis:

Bash
# Apenas a estrutura, sem linhas mysqldump -u USER -p --no-data DBNAME > schema.sql # Várias bases, com instruções CREATE DATABASE mysqldump -u USER -p --single-transaction --databases DB1 DB2 > two-dbs.sql # Todas as bases do servidor mysqldump -u root -p --single-transaction --routines --events --all-databases > all.sql

3. Comprimir a exportação com gzip

O texto SQL comprime muito bem. Envie a saída diretamente para o gzip para que o ficheiro sem compressão nunca chegue ao disco.

Bash
mysqldump -u USER -p --single-transaction --routines --events DBNAME | gzip > DBNAME_$(date +%F).sql.gz

Para não escrever a palavra-passe de cada vez (e evitar que apareça na saída de ps), guarde-a em ~/.my.cnf:

INI
[client] user=USER password=YOUR_PASSWORD
Bash
chmod 600 ~/.my.cnf

4. Importar uma exportação

Crie primeiro a base de destino com um conjunto de caracteres moderno e depois carregue o ficheiro.

Bash
mysql -u USER -p -e 'CREATE DATABASE IF NOT EXISTS DBNAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;' mysql -u USER -p --default-character-set=utf8mb4 DBNAME < DBNAME.sql # A partir de um ficheiro comprimido gunzip -c DBNAME.sql.gz | mysql -u USER -p --default-character-set=utf8mb4 DBNAME

Atenção: por omissão a exportação contém DROP TABLE IF EXISTS, por isso importar para uma base existente substitui as tabelas com o mesmo nome. Faça antes uma cópia do destino.

5. Lidar com ficheiros grandes

Para exportações de vários gigabytes, execute a importação dentro do tmux para que uma desligação SSH não a interrompa, e use o pv para acompanhar o progresso.

Bash
apt install -y tmux pv tmux new -s import pv DBNAME.sql.gz | gunzip | mysql -u USER -p --max-allowed-packet=512M DBNAME

Separe-se com Ctrl+B e depois D, e volte mais tarde com tmux attach -t import.

6. Transferir diretamente para outro servidor por SSH

Não é preciso nenhum ficheiro intermédio: a exportação viaja por um pipe SSH cifrado e é carregada à chegada. As credenciais são lidas de ~/.my.cnf (ou do socket local como root) em cada extremo.

Bash
mysqldump --single-transaction --routines --events DBNAME | gzip \ | ssh root@NEW_VPS_IP 'gunzip | mysql DBNAME'

A base DBNAME tem de existir já no servidor de destino.

✅ Verificar o resultado

Bash
gzip -t DBNAME.sql.gz && echo 'archive OK' mysql -e 'SHOW TABLES;' DBNAME mysql -e 'SELECT COUNT(*) FROM TABLENAME;' DBNAME mysql -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name='DBNAME';"

Compare o número de linhas de algumas tabelas importantes entre a origem e o destino.

🔧 Resolução de problemas

ERROR 1045 Access denied : utilizador ou palavra-passe incorretos, ou o utilizador não tem permissão a partir deste anfitrião. Teste primeiro com mysql -u USER -p.

ERROR 2006 MySQL server has gone away : uma linha ou consulta excede max_allowed_packet. Aumente-o no servidor, na secção [mysqld] da configuração, e reinicie o serviço, ou passe --max-allowed-packet=512M ao cliente.

Acentos ilegíveis após a importação : o ficheiro foi lido com o conjunto de caracteres errado. Exporte com --default-character-set=utf8mb4 e importe com a mesma opção.

ERROR 1227 ou erros de DEFINER : a exportação refere um utilizador que não existe no destino. Remova a cláusula durante a importação:

Bash
sed -E 's/DEFINER=`[^`]+`@`[^`]+`//g' DBNAME.sql | mysql -u USER -p DBNAME

🎉 As suas bases de dados são agora fáceis de guardar, restaurar e migrar entre servidores!

Fique a par das últimas ofertas, descontos e promoções especiais.

Ver promoções

Utilizamos cookies

Utilizamos cookies analíticos para melhorar a sua experiência no nosso site. Nenhum dado é vendido a terceiros. Saiba mais na nossa política de privacidade.