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:

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"