IT & + si affinités

Encore un blog de sysadmin … mais pas uniquement ;-)

Backup mysql databases

Un script de backup des bases mysql simple :

il est prévu pour fonctionner sur debian.

#!/bin/bash
# Name : backup_mysql.sh
# Author : @Markhor75 
# Last Mod : 2014 08 27
# Backup all MySQL databases

DESTINATION="/home/backup/mysql"
RETENTIONDAYS="2"

MYSQLUSER=`cat /etc/mysql/debian.cnf |grep -m 1 user |awk '{print $3}'`
MYSQLPASS=`cat /etc/mysql/debian.cnf |grep -m 1 password |awk '{print $3}'`
DATE="$(date +"%Y%m%d_%H%M")"

mysqldump --user=$MYSQLUSER --password=$MYSQLPASS --events --all-databases |bzip2 >$DESTINATION"/"$DATE""_mysql_""$HOSTNAME""_db.bz2
find $DESTINATION -maxdepth 1 -ctime +$RETENTIONDAYS -type f -exec rm {} \;

Script de backup

Voici un petit script qui permet de  « sauvegarder » un répertoire et de gérer la rotation :

#!/bin/bash
# 
# Name : backup_dir.sh
# Author : @Markhor75 
# Last Mod : 2012 10 28
export name=`basename "$0"`

RETENTIONDAYS="7"
MAKEARCHIVE="1"
SOURCE="&&&"
DESTINATION="/var/backups"
DATE="$(date +"%Y%m%d_%H%M")"

if [ $MAKEARCHIVE -eq "1" ]; then
        ARCHIVESTATUS="enabled"
else
        ARCHIVESTATUS="disabled"
fi

usage()
{
   echo "> Make a tar.gz of \"Source dir\" directory in "$DESTINATION" or other specified dir." 
   echo "> Delete archives older than "$RETENTIONDAYS" days."
   echo "> You can change this value with option -r ( 0 won't delete files)."
   echo "> Optionaly make mensual permanent copy, this option is currently "$ARCHIVESTATUS
   echo ">"
   echo "> Usage:"
   echo ">    $name -h                      Show this help."
   echo ">    $name -s Source dir [-d Destination dir] [-r 7]"
   echo "> Default Destination dir is "$DESTINATION
}

if [ "$1" != "-s" ]; then
   usage
   exit
fi
while getopts s:d:hr: opt
do
   case "$opt" in
      s) SOURCE=$OPTARG;;
      d) DESTINATION=$OPTARG;;
      r) ((RETENTIONDAYS=OPTARG+0));;
      h)
        usage
        exit
        ;;
      \?)
        usage
        exit
         ;;
   esac
done

if [ ! -d $SOURCE ]; then
        usage
        exit
fi

# Creating destination dir if needed
if [ ! -d $DESTINATION ]; then
        mkdir $DESTINATION
fi

CURRENT_DIR=`pwd`
cd $SOURCE
ARCHIVENAME=${PWD##*/}"_"$DATE".tar.gz"

tar -cvzf $DESTINATION"/"$ARCHIVENAME $SOURCE 2>&1 1>/dev/null

if [ "$MAKEARCHIVE" == "1" ]; then
        ARCHIVEMENSUEL=$DESTINATION"/mensuel"
        if [ ! -d $ARCHIVEMENSUEL ]; then
                mkdir $ARCHIVEMENSUEL
        fi
fi

# If RETENTIONDAYS value is greater than 1, we delete older files
if [ "$RETENTIONDAYS" -gt "1" ] ; then
        find $DESTINATION -maxdepth 1 -ctime +$RETENTIONDAYS -type f -exec rm {} \;
fi

cd $CURRENT_DIR
exit 0;

 

Supression de doublons en fonction du contenu

Pour mon premier article voici un petit script en perl que j’ai fait tout seul comme un grand 🙂

Voici le contexte : nous utilisons un vieux serveur mail pas libre (boooouuhhh !) qui tourne sur un OS pas libre non plus (re boooouuhhh !!) et en plus il gère mal l’IMAP.

Suite à une mauvaise manipulation d’utilisateur sur un compte partagé, les mails se sont multipliés comme dans l’histoire des cinq pains et des deux poissons. A la fin nous nous sommes retrouvés avec des dizaines de milliers de mails dont certains étaient uniques et d’autres dupliqués en plusieurs exemplaires. Evidemment le temps que nous soyons alertés, de nombreux mails étaient arrivés dans cette boite donc filtrer par date n’était pas évident.

Sur ce logiciel, un mail se compose de deux fichiers ayant un même nom, généré par le logiciel et des extensions différentes. Le but était donc de filtrer par contenu en ne gardant qu’un seul couple de fichiers par email.

 
#!/usr/bin/perl

my $dir_in='/home/in';    #répertoire contenant les fichiers avec doublons
my $dir_out='/home/out';   #répertoire ou placer les fichiers uniques
my %tab=();

chdir($dir_in) || die ("Erreur chdir 1 \n");

foreach (<*.txt>) {
    $retour = `md5sum $_`;             # calcul du md5 des fichiers pour repérer les copies
    @valeur=split (/\s+/,$retour);     # récupération du md5 et du nom du fichier
    $tab{$valeur[0]}=$valeur[1];       # on créé un tableau associatif dont la clé est le md5 du fichier.
                                       # de cette façon on aura qu&amp;#039;une entrée par occurrence de mail 
}

while ( my ($key,$val) = each %tab ) {    # sélection et déplacement des fichiers.
    @result=split (/\./,$val);
    `mv $dir_in/$result[0].* $dir_out`;
}