Mysqldump

Per esportare tutti i database del server:

# mysqldump -u root -p -all-databases > dump.sql

Per esportare solo la struttura di un database:

# mysqldump -u root -p -no-data  nome_database > dump.sql

Per esportare solo i dati di un database:

# mysqldump -u root -p –no-create-info  nome_database > dump.sql

Compressione del file di DB creato

Usando gzip:

# gzip -v dump.sql

Creazione del dump MySQL come redirezione in output a gzip:

# mysqldump < mysqldump options> | gzip > dump.sql.gz

Ripristino di un file di dump compresso con gzip:

# gunzip -v dump.sql.gz

Creazione del dump MySQL come redirezione in output a bzip2:

# mysqldump < mysqldump options> | bzip2 > dump.sql.bz2

Ripristino del database

Il ripristino potrà essere effettuato con il comando:

# mysql -u [username] -p [database_name] < [backup_file].dump

Oppure con la sequenza:

# mysql -u root -p
Enter Password
mysql> use database_name
Database changed
mysql> source [backup_file].dump

Import di un file di dump compresso gzip (in una sola riga):

# gunzip < dump.sql.gz | mysql < mysql options>

Import di un file di dump compresso bzip2 (in una sola riga):

# bunzip2 < dump.sql.bz2 | mysql < mysql options>

Esempi

Script per il Backup di tutti i databases.

#!/bin/bash

MyUSER="root"           # USERNAME
MyPASS="password!"   # PASSWORD
MyHOST="localhost"      # Hostname

# Log
MYCMD=$(basename $0)
MYDATALOG=$(date +%Y%m%d-%H%M%S)
MYLOGDIR=/etc/SCRIPT/log
MYLOGFILE=${MYLOGDIR}/${MYDATALOG}-${MYCMD}.log

# Linux bin paths, change this if it can't be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"

# Backup Dest directory, change this if you have someother location
DEST="/home/BACKUP"

# Main directory where backup will be stored
MBD="$DEST/mysql"

# Get hostname
HOST="$(hostname)"

# Get data in dd-mm-yyyy format
NOW="$(date +"%d-%m-%Y")"

# File to store current backup file
FILE=""
# Store list of databases
DBS=""

# DO NOT BACKUP these databases
IGGY="test performance_schema information_schema"

[ ! -d $MBD ] && mkdir -p $MBD || :

# Only root can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST

ws_date=$(date)
echo "- - - - - - - Started: $ws_date - - - - - - -" > ${MYLOGFILE}
echo "" >> ${MYLOGFILE}

# Get all database list first
printf " ------> Retrive DB lists...\n\n" >> ${MYLOGFILE}
DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases' 2>> ${MYLOGFILE})"
printf "\n     ... done\n\n" >> ${MYLOGFILE}

for db in $DBS
do
    skipdb=-1
    if [ "$IGGY" != "" ]; then
        for i in $IGGY
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi

    if [ "$skipdb" == "-1" ]; then

    ws_date=$(date +%H:%M:%S)
    printf " ------> Start Dump $db at $ws_date\n\n" >> ${MYLOGFILE}

    FILE="$MBD/$db.$HOST.$NOW.gz"
    # do all inone job in pipe,
    # connect to mysql using mysqldump for select mysql database
    # and pipe it out to gz file in backup dir :)
    $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS --databases $db --max_allowed_packet=4G --compress --add-drop-table --add-drop-database 2>> ${MYLOGFILE} | $GZIP -9 > $FILE 2>> ${MYLOGFILE}

    ws_date=$(date +%H:%M:%S)
    printf "\n        End Dump $db at $ws_date\n\n\n" >> ${MYLOGFILE}

    elif [ "$skipdb" == "1" ]; then
        printf " ------> $db Skipped due configuration script.\n\n" >> ${MYLOGFILE}
    fi

done

printf "\n ------> Find old files to delete\n" >> ${MYLOGFILE}

find $MBD -type f -mtime +1 > /tmp/list_2_del.txt 2>> ${MYLOGFILE}
    if [ -s /tmp/list_2_del.txt ]
    then
        while read FILE_2_DEL
        do
            rm -f ${FILE_2_DEL} &>> ${MYLOGFILE}
            if [ $? -ne 0 ]
            then
               echo "   ERRORE - Cancellazione del file ${FILE_2_DEL} " >> ${MYLOGFILE}
               exit 1
            fi
        done < /tmp/list_2_del.txt
    else
        echo "   Nothing to Do" >> ${MYLOGFILE}
    fi

ws_date=$(date)
printf "\n- - - - - - - Ended: $ws_date - - - - - - -" >> ${MYLOGFILE}

 

Script per il backup di un singolo Database

#!/bin/bash

FILE=/dove/voglio/backuppare/name_backup
NAME=utente_sql
PASS=password_sql
DB=nome_DB

echo "Content-type: text/plain"
echo
echo "Tried to export file: "$FILE

#eliminare il commmento a seconda del risultato che si vuole ottenere
#dump non compresso
#mysqldump --quote-names -u $NAME --password=$PASS $DB > $FILE.sql

#dump compresso con gzip
#mysqldump --quote-names -u $NAME --password=$PASS $DB| gzip -9 > $FILE.sql.gz

 

Script per il backup di singoli Database con verifica del sizing

#!/bin/bash

usage()
{
echo "erCopiaDb - Made by CC. Version 1.1

Usage
  -r | --dumpsroot imposta la cartella di riferimento; default /home/backups
  -d | --dbname sceglie il nome del db
  -u | --user utente mysql
  -p | --pwd pwd mysql
  Crea un dump dei 3 database ufficiali e mantiene una copia del dump del giorno precedente. Se uno dei file
  risulta troppo piccolo per essere un dump credibile, viene marchiato come suspect e non sostituito."
}

dumpsRoot="/home/backups";
dbName="bloomy"
user="actuser"
pwd="actuser"

{
while [ "$1" != "" ]; do
    case $1 in
                -r | --dumpsroot )          shift
                                dumpsRoot=$1
                                ;;
                -d | --dbname )             shift
                                dbName=$1
                                ;;
                -u | --user )             shift
                                user=$1
                                ;;
                -p | --pwd )             shift
                                pwd=$1
                                ;;
                --version )                 shift
                                echo "Version 1.1"
                                ;;
                --help | * )                usage
                                exit 1
    esac
    shift
done
}

cd $dumpsRoot

log=dbBackup.log;
if [ ! -f $log ]; then
  touch $log
fi

echo $dumpsRoot
echo $dbName

echo -e "\n\n\n\n\n Moving to "$dumpsRoot >> $log
date >> $log
echo "Backing up "$dbName >> $log

mysqldump --max_allowed_packet=4G --verbose --compress --add-drop-table --add-drop-database $dbName > $dbName'.sql' -u $user -p$pwd
echo "Dumping $dbName">> $log

minimumsize=1000
actualsize1=$(wc -c $dbName".sql" | cut -f 1 -d ' ')
d=$(date +%a%d%m%y)

if [ $actualsize1 -ge $minimumsize ]; then
 mv $dbName".tar.gz" $dbName"_yesterday.tar.gz"
 tar -zcvf $dbName".tar.gz" $dbName".sql"
 echo "Rolling $dbName" >> $log
else
 tar -zcvf $dbName"_suspect"$dbName$d".tar.gz" $dbName".sql"
 echo "Rolling $dbName but something is suspect">> $log
fi
rm $dbName".sql"
for i in $(find $dumpsRoot/* -maxdepth 0 -mtime +15); do
        echo "Deleting "$i >> $log
        rm $i
done