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 TABLESeEVENTsobre 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.
Bashmysqldump -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.
Bashmysqldump -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.
Bashmysqldump -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
Bashchmod 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.
Bashmysql -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.
Bashapt 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.
Bashmysqldump --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
Bashgzip -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:
Bashsed -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!