Script de Exportação Top
Muitas vezes uma exportação MySQL ou MariaDB utilizando a exportação via mysqldump, mariadb-dump ou phpMyAdmin não funciona quando importamos o arquivo SQL em outro servidor.
Problemas comuns de exportação são: gatilhos (triggers), procedures ou views com instruções vinculadas ao nome de usuário, views exportadas em sequência incorreta, causando a não criação delas em uma eventual exportação, etc.
Depois de sofrer com exportações SQL problemáticas e que sempre requeriam intervenções, criei este script bash que faz as seguintes operações:
- Obtém as credenciais para acesso ao banco de dados (nome do banco, usuário e senha). O script considera que o banco de dados está instalado localmente.
- Em uma segunda etapa, é feito a exportação via dump, apenas da estrutura das tabelas.
- Depois, em uma nova etapa, é feito a exportação apenas dos dados.
- Na terceira etapa, são exportadas as views.
- Em uma quarta etapa, exporta-se os gatilhos.
- Para sanear o arquivo SQL dump, são removidas instruções 'USE $DB;' e DEFINER.
- Por fim, são removidas todas as ocorrências DEFINER=… para evitar vinculação de usuário
Considerando esta forma de exportação, temos um arquivo dump SQL totalmente organizado para exportação fácil e rápida em outro servidor MySQL ou MariaDB.
Abaixo o código-fonte do script:
#!/bin/bash
# Pergunta o nome do banco de dados
read -p "Digite o nome do banco de dados: " DB
# Pergunta o nome do usuário MySQL
read -p "Digite o nome do usuário MySQL: " USER
# Pergunta a senha (sem mostrar no terminal)
read -s -p "Digite a senha do MySQL para o usuário $USER: " PASS
echo ""
OUTFILE="${DB}_full_export.sql"
echo "Exportando estrutura das tabelas..."
mysqldump -u "$USER" -p"$PASS" --no-data --routines=false --events=false --triggers=false "$DB" > "$OUTFILE"
echo "Exportando dados das tabelas..."
mysqldump -u "$USER" -p"$PASS" --no-create-info --routines=false --events=false --triggers=false "$DB" >> "$OUTFILE"
echo "Exportando views..."
VIEWS=$(mysql -u "$USER" -p"$PASS" -D "$DB" -Bse "SHOW FULL TABLES WHERE Table_type = 'VIEW';" | awk '{print $1}' | tr '\n' ' ')
if [ -n "$VIEWS" ]; then
mysqldump -u "$USER" -p"$PASS" --no-create-info --no-data --skip-triggers --routines=false --events=false --tables "$DB" $VIEWS >> "$OUTFILE"
else
echo "Nenhuma view para exportar."
fi
echo "Exportando triggers..."
mysqldump -u "$USER" -p"$PASS" --no-create-info --no-data --triggers --routines=false --events=false "$DB" >> "$OUTFILE"
echo "Removendo instruções 'USE $DB;' e DEFINER do arquivo de dump..."
# Remove linhas USE nome_do_banco;
sed -i "/^USE \`$DB\`;/d" "$OUTFILE"
sed -i "/^USE $DB;/d" "$OUTFILE"
# Remove todas as ocorrências DEFINER=... para evitar vinculação de usuário
sed -i 's/DEFINER=[^*]*\*/\*/g' "$OUTFILE"
echo "Exportação completa salva em $OUTFILE"