Sauvegarde simple de base de données Mysql

Il nécessite le script contenant les « fonctions maisons« .

ATTENTION 1 : si votre base n’est pas en utf-8 (voir Database Character Set and Collation), il est peut-être utile de spécifier le jeu de caractère à utiliser, avec –default-character-set=charset.

ATTENTION 2 : ne pas utiliser ce script sur des bases volumineuses car l’accès en écriture sur chaque table est bloqué pendant le dump de celle-ci. De plus si les bases sont modifiées très fréquemment, la cohérence des données n’est pas forcément respectée. Pour une utilisation en environnement de production, s’orienter plutôt vers Zmanda Recovery Manager, ou utiliser les snapshot LVM.

#!/bin/bash
# backup des BD mysql, une par fichier .sql
# Copyright (C) 2006 Luc Santeramo (luc.santeramo at yahoo dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
# Chemin vers les executables de MySQL
MYSQLBINPATH="/usr/bin"
# Repertoire de sauvegarde
BACKUPPATH="/var/backup/mysql"
# destinataire du message d'erreur
ERRDEST="sysadmin@localhost"
# fichier de fonction
COMMON_FUNCTIONS="/root/scripts/common_functions"
#####
source $COMMON_FUNCTIONS
# recuperation de la liste des BD mysql
DB_LIST="`mysql -B -N -e "show databases;"`"
# sauvegarde des BD, une par fichier
for db in $DB_LIST
do
$MYSQLBINPATH/mysqldump $db > $BACKUPPATH/$db.sql
error_check $0 $? $LINENO "$*" "$ERRDEST"
chmod 640 $BACKUPPATH/$db.sql
error_check $0 $? $LINENO "$*" "$ERRDEST"
done

Une alternative très intéressante à ce script pourrait-être automysqlbackup, mais il souffre des mêmes maux.

Sauvegarde sur bande

#!/bin/bash
# Script de sauvegarde de plusieurs hôtes sur le lecteur de bande du serveur de sauvegarde
# Ne remplace pas des outils comme Bacula, Amanda ou autre, mais reste plus simple à mettre en place.
# Copyright (C) 2006 Luc Santeramo (luc.santeramo at yahoo dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
####### Definition des variables
# modele du lecteur de bande,
# tel qu'il apparait en faisant "cat /proc/scsi/scsi"
TAPEDRIVEMODEL="C5683A"
# listes des hotes a sauvegarder
backup_hosts=("hote1" "hote2")
# utilisateur effectuant les backups
backupuser=root
# lecteur de sauvegarde
backupdevice="/dev/nst0"
# cle privee par defaut
backupkey="/root/.ssh/id_dsa_backup"
# adresse email des sysadmins
maildest="sysadmin@localhost"
# sujet du mail a envoyer aux sysadmins
mailsubj="Sauvegardes serveurs"
# options de tar
taroptions="--create --gzip --one-file-system --preserve --file"
# fichier d'exclusion à créer sur chaque hôte
exclude_file="/etc/backup/backup_excludes"
# fichier d'inclusion à créer sur chaque hôte
include_file="/etc/backup/backup_includes"
###### Fin definition des variables
SSH="/usr/bin/ssh"
MT="/bin/mt"
MAIL="/bin/mail"
export TAPE="${backupdevice}"
####### Definition des fonctions
check_tape () {
${MT} status > /dev/null 2>&1
if [ $? -ne "0" ]
then
echo "La bande n'est pas prete"
exit 1
fi
}
check_tape_drive () {
grep ${TAPEDRIVEMODEL} /proc/scsi/scsi > /dev/null 2>&1
if [ $? -ne "0" ]
then
echo "Le lecteur de bande (${TAPEDRIVEMODEL}) n'a pas ete initialisee."
echo "Veuiller redemarrer la machine"
echo "Peripheriques SCSI detectes :"
cat /proc/scsi/scsi
exit 2
fi
}
####### Fin definition des fonctions
# verification de la presence du lecteur de bande
check_tape_drive
# Affichage du menu
# On pourrait simplifier certaines parties du menu par un "select"
echo "***** Sauvegarde *****"
echo
echo "Lecteur de bande utilise : ${TAPEDRIVEMODEL}"
echo
echo "0- Quitter"
echo "1- Sauvegarde complete"
nbhosts=$((${#backup_hosts[@]} - 1))
for choix in $(seq 0 ${nbhosts})
do
let c=${choix}+2
echo "${c}- ${backup_hosts[$choix]}"
done
echo
echo "Taper votre choix, puis entree :"
read choix
let nbchoix=${nbhosts}+2
if [ "${choix}" -le "${nbchoix}" ]
then
case ${choix} in
0) exit 0;;
1) hosttobackup=("${backup_hosts[@]}");;
*) let c=${choix}-2 ; hosttobackup=${backup_hosts[$c]};;
esac
else
echo "Choix impossible"; exit 1;
fi
# debut de la sauvegarde
for host in $(seq 0 $((${#hosttobackup[@]} - 1)))
do
hostname=${hosttobackup[$host]}
echo "*** Inserer la bande pour la sauvegarde de ${hostname}, attendre que la LED verte arrete de clignoter, et presser la touche entree"
read a
check_tape
# Rembobine la bande
${MT} rewind
echo "--> $0 : debut de la sauvegarde complete de ${hostname}"
key=${backupkey}
# recuperation de la date
set $(date +"%Y %m %d")
year=$1
month=$2
day=$3
# sauvegarde de la machine
${SSH} -i ${key} ${backupuser}@${hostname} "tar ${taroptions} - -V ${hostname}_${year}_${month}_${day} --exclude-from=${exclude_file} --files-from=${include_file}" | cat - > ${backupdevice}
RES=$?
# verification du bon deroulement des backups
if [ ${RES} -eq "0" ] ; then
${MT} rewind
${MT} unlock
${MT} offline
echo "--> $0 : sauvegarde complete de ${hostname} terminee."
echo "$0 : sauvegarde complete sur ${hostname} terminee." | ${MAIL} -s "${mailsubj} : ${hostname} OK" "${maildest}" > /dev/null 2>&1
else
echo "--> $0 : erreur de sauvegarde complete de ${hostname}. RES=${RES}" 1>&2
echo "$0 : erreur de sauvegarde complete de ${hostname}. RES=${RES}" | ${MAIL} -s "${mailsubj} : ${hostname} ERREUR" "${maildest}" > /dev/null 2>&1
exit 1;
fi
done
echo "--> Sauvegarde terminee"

Améliorer l’affichage de ses scripts avec « tput »

« La commande tput initialise et manipule votre session terminal en utilisant la base de données terminfo. Avec tput, vous pouvez par exemple déplacer ou changer le curseur ou changer l’apparence du texte, et effacer certaines zones de l’écran »

Un exemple concret : « Discover tput« 

(Attention, il y a quelques erreurs à rectifier pour pouvoir exécuter le script d’exemple, notamment des côtes ‘ à changer en côtes inverses `, et coller à gauche la partie entre EOF.)

Copie optimisée d’un disque dur vers un autre

Ce script peut être utilisé pour des copies régulières d’un disque local vers un autre disque local, dans le but de pouvoir remplacer le 1er disque par le 2e en cas de problème
Il nécessite le script contenant les « fonctions maisons« .

#!/bin/bash
# fait une copie du 1er disque dur vers le 2e
# Copyright (C) 2005 Luc Santeramo (luc.santeramo at yahoo dot com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
# ATTENTION /etc/fstab doit etre configure correctement
# nom du peripherique pour le 1er HD
DEVHD1="/dev/hda"
# nom du peripherique pour le 2e HD
DEVHD2="/dev/hdb"
# options de rsync
OPTS="--verbose --recursive --links --hard-links --perms --owner --group --devices --times --no-whole-file --delete --one-file-system"
# file systems a sauver
FSLIST="/ /home /usr /usr/local /var"
# repertoire contenant le fs de backup
DEST="/backupfs"
# repertoire contenant le binaire rsync
BIN="/usr/bin"
# destinataire du message d'erreur
ERRDEST="sysadmin@localhost"
# fichier de log
LOG="/var/log/disk_mirroring.log"
# fichier de fonction
COMMON_FUNCTIONS="/root/scripts/common_functions"
###
source $COMMON_FUNCTIONS
# ATTENTION : n'activer la copie du MBR que si les 2 disques sont identiques
# copie du MBR
# dd if=$DEVHD1 of=$DEVHD2 bs=512 count=1
# copie des partitions
for fs in $FSLIST
do
echo "** Copie de la partition $fs **"
SRC=$fs
DESTDIR=$DEST`dirname $fs`
mount $DEST$fs
# on ne verifie pas la valeur de retour pour eviter
# d'arreter le processus si le dev etait deja monté
$BIN/rsync $OPTS $SRC $DESTDIR >> $LOG 2>&1
error_check $0 $? $LINENO "$*" "$ERRDEST"
umount $DEST$fs
error_check $0 $? $LINENO "$*" "$ERRDEST"
echo "** Copie de la partition $fs terminee**"
done