Backup de bancos de dados MySQL em 1 arquivo, mas com .tar.gz separado para cada db

4

Agora estou usando isso no cron para fazer backup de todos os meus bancos de dados em um arquivo sql.gz:

0 0     * * *   root    mysqldump -u root -pPASSWORD --all-databases | gzip > /home/backup/db/'date +\%G-\%m-\%d'_db.sql.gz

Eu gostaria de ter um arquivo .tar.gz dentro do qual X outros arquivos para quantos bancos de dados eu tenho .. Isso é possível?

    
por MultiformeIngegno 17.07.2012 / 19:18

3 respostas

6

Algo como isso pode funcionar. É não testado, mas apenas um pouco diferente do que estou usando para backups em meus sistemas.

# define common vars
OPTIONS="--verbose --lock-tables --flush-logs --force --quick --single-transaction"
AUTHFILE="/etc/mysql/rootauth.cnf"
BACKUPDIR="/srv/backup/mysql/"
BACKUPDATE='date +"%y%m%d%H"'

# create temp folder (this isn't entirely safe, but be sure only root or backup user has 
#                     write access here, you might want to use mktemp)
mkdir ${BACKUPDIR}/tmp/

# get a list of all the databases on the system
DBSQL="SELECT SCHEMA_NAME FROM information_schema.SCHEMATA where SCHEMA_NAME!='information_schema' \
       AND SCHEMA_NAME!='performance_schema' order by SCHEMA_NAME"
DBS='/usr/bin/mysql --defaults-extra-file=${AUTHFILE} --batch \
                                  --skip-column-names --execute "$DBSQL"'
DBS='echo $DBS | tr -d '\n' | sed -e "s/ \+/ /g"'

for DB in $DBS; do
  # perform a per-database dump
  BACKUPDIRDB="${BACKUPDIR}/tmp/${DB}"
  mkdir -p ${BACKUPDIRDB}
  /usr/bin/mysqldump --defaults-extra-file=${AUTHFILE} \
       ${OPTIONS} $DB > ${BACKUPDIRDB}/backup_${BACKUPDATE}
done

# create archive of everything
tar -czvf ${BACKUPDIR}/backup_${BACKUPDATE}.tar.gz ${BACKUPDIR}/tmp/ 
#remove temp files
rm -rf ${BACKUPDIR}/tmp/
    
por 17.07.2012 / 19:47
5

Crie um script como este para mysqldump todas as bases de dados em paralelo

DBLIST='mysql -uroot -pPASSWORD -ANe"SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" | sed 's/,/ /g''
MYSQLDUMP_OPTIONS="-uroot -pPASSWORD --single-transaction --routines --triggers"
BACKUP_DEST=/home/backup/db/'date +\%G-\%m-\%d'
mkdir ${BACKUP_DEST}
for DB in 'echo "${DBLIST}"'
do
    mysqldump ${MYSQLDUMP_OPTIONS} ${DB} | gzip > ${BACKUP_DEST}/${DB}.sql.gz &
done
wait

Em seguida, coloque este script no crontab

Se houver muitos bancos de dados, você poderá despejar 5 de uma vez como esta

DBLIST='mysql -uroot -pPASSWORD -ANe"SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','performance_schema')" | sed 's/,/ /g''
MYSQLDUMP_OPTIONS="-uroot -pPASSWORD --single-transaction --routines --triggers"
BACKUP_DEST=/home/backup/db/'date +\%G-\%m-\%d'
mkdir ${BACKUP_DEST}
COMMIT_COUNT=0
COMMIT_LIMIT=5
for DB in 'echo "${DBLIST}"'
do
    mysqldump ${MYSQLDUMP_OPTIONS} ${DB} | gzip > ${BACKUP_DEST}/${DB}.sql.gz &
    (( COMMIT_COUNT++ ))
    if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
    then
        COMMIT_COUNT=0
        wait
    fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
    wait
fi

Você pode adicionar os comandos tar ao script

    
por 17.07.2012 / 19:47
0

Eu diria que você poderia realizá-lo fazendo um script que é executado a partir do cron que realiza um despejo de cada banco de dados e, em seguida, a operação final do script arquiva todos os arquivos juntos em um .tar.gz

Portanto, em sua instância, você removeria a opção --all-databases e colocaria o nome de um banco de dados lá. Em seguida, repita essa linha para todos os bancos de dados que você tem. Então, depois que todos os dumps tiverem sido feitos, crie um tar com todos esses arquivos e feche-o. Por último mas não menos importante, execute qualquer limpeza necessária. Coloque tudo isso em um script e execute o script no cron.

    
por 17.07.2012 / 19:24