Script para fazer backup de cada DB no servidor, mas omitir bancos de dados do sistema

0

Eu li um monte de posts sobre esse assunto, mas não encontrei o que atendesse às minhas necessidades. Então, basicamente eu quero fazer dois backups: um no meio dia (12 PM) e outro na meia noite (12 AM) para cada banco de dados em um servidor MySQL, mas eu quero deixar de fora bancos de dados do sistema: mysql e information_schema (tanto quanto eu sei é que há outro por favor me avise). Depois de ler muitos tópicos eu venho com este script bash:

#!/bin/sh
now="$(date +'%d_%m_%Y_%H_%M_%S')"
filename="db_backup_$now".gz
backupfolder="/home/backups"
fullpathbackupfile="$backupfolder/$filename"
logfile="$backupfolder/"backup_log_"$(date +'%Y_%m')".txt
echo "mysqldump started at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
mysqldump --user=userbackup --password=***** --default-character-set=utf8 database | gzip > "$fullpathbackupfile"
echo "mysqldump finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
find "$backupfolder" -name db_backup_* -mtime +7 -exec rm {} \;
echo "old files deleted" >> "$logfile"
echo "operation finished at $(date +'%d-%m-%Y %H:%M:%S')" >> "$logfile"
echo "*****************" >> "$logfile"
exit 0

Este script fez um backup para o banco de dados database e mantém 7 últimos .tar.gz arquivos. Algum pode me ajudar a melhorar este script para que eu possa fazer backup de cada banco de dados que não seja do sistema e manter 7 últimas cópias para cada um?

    
por ReynierPM 25.11.2015 / 15:23

1 resposta

1

Atualmente, estou usando PostgreSQL e faço algo que parece realmente próximo do que você deseja alcançar, portanto, este é meu script de backup:

#!/bin/bash
#
#------------------------------------------------------------------------------
# Editable parameters:
#
## Filesystem Location to place backups.
BACKUP_DIR="/path/to/backup/folder"
## The user used to connect to postgres instance
USER="postgres"
PWD="pwd_in_plaintext_is_not_a_"
## Just the date string that will be appended to the backup files name
BACKUP_DATE="$(date +'%d_%m_%Y_%H_%M_%S')"
## Numbers of days you want to keep copie of your databases
NUMBER_OF_DAYS=7
## Uncomment following line if you want to overwrite the whole folder each time
#rm -rf ${BACKUP_DIR}/backupFulldb-*
#
#------------------------------------------------------------------------------
# don't change anything below this line

# Vacumm al databases before begin to backup
vacuumdb --all -U ${USER}

DATABASES='psql -U ${USER} -l -t | cut -d'|' -f1 | sed -e 's/ //g' -e '/^$/d''
for i in ${DATABASES}; do
  if [ "$i" != "template0" ] && [ "$i" != "template1" ]; then
    echo Dumping $i to ${BACKUP_DIR}
    pg_dump -U ${USER} --column-inserts $i | gzip -c >  ${BACKUP_DIR}/backupFulldb-$i-${BACKUP_DATE}.out.gz
  fi
done
find ${BACKUP_DIR} -type f -prune -mtime +${NUMBER_OF_DAYS} -exec rm -f {} \;

Você só precisa de uma consulta listando todos os dbs em sua instância do mysql e substituí-la pela matriz DATABASES . Lendo este post e este , eu suponho que você poderia, por exemplo. faça o seguinte:

while read line
do 
    DATABASES+=("$line")
done < <(mysql -u${USER} -p${PWD} INFORMATION_SCHEMA -e "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA")

E, com certeza, corrija os nomes do dbs que você deseja excluir:

if [ "$i" != "mysql" ] && [ "$i" != "information_schema" ]; then

Espero que isso ajude

    
por 25.11.2015 / 16:27