{"id":507,"date":"2012-05-11T14:31:42","date_gmt":"2012-05-11T12:31:42","guid":{"rendered":"http:\/\/blog.jeremm.fr\/?p=507"},"modified":"2014-09-24T21:21:02","modified_gmt":"2014-09-24T19:21:02","slug":"script-backup-snapshot-lvm-mysql-replication","status":"publish","type":"post","link":"https:\/\/blog.jeremm.fr\/?p=507","title":{"rendered":"Script backup snapshot lvm mysql-replication"},"content":{"rendered":"<pre lang=\"bash\">#!\/bin\/bash\r\n# Nom du lv a backup\r\nlv='var_lib_mysql'\r\n\r\n# Connect mysql\r\nmysql='\/usr\/bin\/mysql -uroot -p'\r\n\r\n# Chemin\r\nchem='\/mnt\/snapshot'\r\nbackup='\/var\/backup'\r\nrapport='\/tmp\/rapport_backup.txt'\r\nlog='\/var\/log\/backup.log'\r\n\r\n# Size\r\nsnapshot_size='30G'\r\n\r\n# Bin\r\nrsync='\/usr\/bin\/rsync'\r\ncut='\/usr\/bin\/cut'\r\ngrep='\/bin\/grep'\r\nawk='\/usr\/bin\/awk'\r\nlvs='\/sbin\/lvs'\r\nvgs='\/sbin\/vgs'\r\nlvdisplay='\/sbin\/lvdisplay'\r\nlvcreate='\/sbin\/lvcreate'\r\nlvremove='\/sbin\/lvremove'\r\nmount='\/bin\/mount'\r\numount='\/bin\/umount'\r\nrm='\/bin\/rm'\r\ndf='\/bin\/df'\r\n\r\n# DATE\r\nTODAY=$(date '+%Y.%m.%d')\r\nDELETE=$(date -d now-1days '+%Y.%m.%d')\r\n\r\nfunction quit {\r\n\t# Send rapport if error\r\n\tif [ -s \/tmp\/rapport_backup.txt ]; then\r\n\t        \/usr\/bin\/mail -s \"Erreur de backup $DATE\" user@test.fr < \/tmp\/rapport_backup.txt\r\n\t        $rm \/tmp\/rapport_backup.txt\r\n\t\texit 1\r\n\tfi\r\n\t$rm \/tmp\/rapport_backup.txt\r\n\texit 0\r\n}\r\n\r\necho \"Debut des verifs et suppression des anciens backups : `date +%Y.%m.%d-%Hh%M`\" >> $log\r\n\r\n## Suppression rapport \r\nif [ -f $rapport ]; then\r\n        $rm $rapport\r\nfi\r\n\r\n## Verifications paquet \r\nif ! dpkg -l rsync |grep ^ii >\/dev\/null ; then \r\n        apt-get install rsync --force-yes &> \/dev\/null\r\n        if ! dpkg -l rsync |grep ^ii >\/dev\/null ; then\r\n                echo \"Erreur : Installation paquet rsync !!!!\" >> $rapport\r\n\t\tquit\r\n        fi\r\nfi\r\n\r\n# Verif lv existe\r\nif ! $lvdisplay | $grep 'LV Name' | $cut -d\/ -f4 | $grep $lv &> \/dev\/null ; then\r\n\techo \"Erreur : LV $lv n'existe pas\" >> $rapport\r\n\tquit\r\nfi\r\n\r\n# Verif si chem existe\r\nif [ ! -d $chem ] ; then\r\n\t\/bin\/mkdir $chem\r\nfi\r\nif [ ! -d $chem ] ; then\r\n\techo \"Erreur : Impossible de cr\u00e9er $chem\" >> $rapport\r\n\tquit\r\nfi\r\n\r\n# Verif si backup existe\r\nif [ ! -d $backup ] ; then\r\n\t\/bin\/mkdir $backup\r\nfi\r\nif [ ! -d $backup ] ; then\r\n\techo \"Erreur : Impossible de cr\u00e9er $backup\" >> $rapport\r\n\tquit\r\nfi\r\n\r\n# Verif freespace for snap\r\nVG=$($lvs | $grep $lv | $awk '{print $2}' | uniq )\r\nVG_free=$($vgs | $grep $VG | $awk '{print $7}' | $cut -d'G' -f1 | $cut -d'g' -f1 | $cut -d',' -f1)\r\nif [ $(echo $snapshot_size | $cut -d'G' -f1 | $cut -d'g' -f1 | $cut -d',' -f1) -ge $VG_free ] ; then\r\n\techo \"Erreur : Pas assez de place pour cr\u00e9er le snaphot\" >> $rapport\r\n\tquit\r\nfi\r\n\r\n# Verif si snap existe\r\nif $lvs | $grep $VG | $grep lvmsnap &> \/dev\/null ; then\r\n\techo \"Erreur : LV lvmsnap existe\" >> $rapport\r\n\tquit\r\nfi\r\n\r\n# Verif si chem d\u00e9j\u00e0 mont\u00e9\r\nif $mount | $grep $chem &> \/dev\/null ; then\r\n\techo \"Erreur : $chem d\u00e9j\u00e0 mont\u00e9\">> $rapport\r\n        quit\r\nfi\r\n\r\n# Delete old backup\r\nif [ -d $backup\/$DELETE ] ; then\r\n\t$rm -r $backup\/$DELETE\r\nfi\r\nif [ -d $backup\/$DELETE ] ; then\r\n\techo \"Erreur : Impossible de supprimer $backup\/$DELETE\" >> $rapport\r\n\tquit\r\nfi\r\n\r\n# Chemin lv mapper\r\nLVmapper=$(echo $lv | sed 's\/-\/--\/' )\r\n\r\n# Compare freespace backup > usedspace source (if source mount)\r\nif $mount | $grep $LVmapper &> \/dev\/null ; then\r\n\tLVmount=$($mount | $grep $LVmapper | $awk '{print $3}')\r\n\tif [ $($df -P $backup | $grep '\/' | $awk '{print $4}') -lt $($df -P $LVmount | $grep '\/' | $awk '{print $3}') ] ; then\r\n\t\techo \"Erreur : Espace restant sur la destination du backup non suffisant\" >> $rapport\r\n\t\tquit\r\n\tfi\r\nfi\r\n\r\n\r\n# Backup\r\n\t## Log time \r\n        echo \"Debut du backup : `date +%Y.%m.%d-%Hh%M`\" >> $log\r\n\r\n\t# Chemin dev lv\r\n\tLVS=$($lvdisplay | $grep 'LV Name' | $grep $lv | $awk '{print $3}')\r\n\r\n\t# Stop replication\r\n\t$mysql -e\"stop slave;\"\r\n\tif ! $mysql -e\"show slave status\\G\" | $grep \"Slave_SQL_Running\" | $grep \"No\" &> \/dev\/null ; then\r\n\t\techo \"Erreur : La r\u00e9plication ne s'arr\u00eate pas avant le snaphost\" >> $rapport\r\n                quit\r\n        fi\r\n\t# Create snap\r\n\t$lvcreate -L$snapshot_size -s -n lvmsnap $LVS\r\n\t\r\n\t# Start replication\r\n\t$mysql -e\"start slave;\"\r\n\tif ! $mysql -e\"show slave status\\G\" | $grep \"Slave_SQL_Running\" | $grep \"Yes\" &> \/dev\/null ; then\r\n                echo \"Waring : La r\u00e9plication ne d\u00e9marre pas apr\u00e8s le snapshot\" >> $rapport\r\n        fi\r\n\tSNAP=$($lvdisplay | $grep 'LV Name' | $grep lvmsnap | $awk '{print $3}')\r\n\tif [ ! $SNAP ] ; then\r\n\t\techo \"Erreur : Impossible de cr\u00e9er le snaphost\"  >> $rapport\r\n\t\tquit\r\n\tfi\r\n\t\r\n\t$mount $SNAP $chem\r\n\r\n\t# Copy\r\n\t$rsync -a $chem\/ $backup\/$TODAY\/ >> $rapport\r\n\t\t\r\n\t$umount $chem\r\n\r\n\t# Check snapshot used\r\n\tif [ $($lvs | $grep lvmsnap | $awk '{print $6}') = 100.00 ] ; then\r\n\t\techo \"Erreur : Snapshot plein \u00e0 la fin du backup\" >> $rapport\r\n\t\t$rm -rf $backup\/$TODAY\r\n\t\t$lvremove -f $SNAP\r\n\t\tquit\r\n\tfi\r\n\tif [ $($df $backup\/$TODAY | $grep '\/' | $awk '{print $3}') -le 0 ] ; then\r\n\t\techo \"Erreur : Destination du backup plein apr\u00e8s la copie\" >> $rapport\r\n                $rm -rf $backup\/$TODAY\r\n\t\t$lvremove -f $SNAP\r\n\t\tquit\r\n        fi\r\n\t$lvremove -f $SNAP\r\n\r\n\t## Log time \r\n        echo \"Fin du backup : `date +%Y.%m.%d-%Hh%M`\" >> $log\r\n\r\nquit\r\n\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>#!\/bin\/bash # Nom du lv a backup lv=&rsquo;var_lib_mysql&rsquo; # Connect mysql mysql=&rsquo;\/usr\/bin\/mysql -uroot -p&rsquo; # Chemin chem=&rsquo;\/mnt\/snapshot&rsquo; backup=&rsquo;\/var\/backup&rsquo; rapport=&rsquo;\/tmp\/rapport_backup.txt&rsquo; log=&rsquo;\/var\/log\/backup.log&rsquo; # Size snapshot_size=&rsquo;30G&rsquo; # Bin rsync=&rsquo;\/usr\/bin\/rsync&rsquo; cut=&rsquo;\/usr\/bin\/cut&rsquo; grep=&rsquo;\/bin\/grep&rsquo; awk=&rsquo;\/usr\/bin\/awk&rsquo; lvs=&rsquo;\/sbin\/lvs&rsquo; vgs=&rsquo;\/sbin\/vgs&rsquo; lvdisplay=&rsquo;\/sbin\/lvdisplay&rsquo; lvcreate=&rsquo;\/sbin\/lvcreate&rsquo; lvremove=&rsquo;\/sbin\/lvremove&rsquo; mount=&rsquo;\/bin\/mount&rsquo; umount=&rsquo;\/bin\/umount&rsquo; rm=&rsquo;\/bin\/rm&rsquo; df=&rsquo;\/bin\/df&rsquo; # DATE TODAY=$(date &lsquo;+%Y.%m.%d&rsquo;) DELETE=$(date -d now-1days &lsquo;+%Y.%m.%d&rsquo;) function quit { # Send rapport if error if <a href='https:\/\/blog.jeremm.fr\/?p=507' class='excerpt-more'>[&#8230;]<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[5,4],"tags":[62,59,15,63],"_links":{"self":[{"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=\/wp\/v2\/posts\/507"}],"collection":[{"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=507"}],"version-history":[{"count":9,"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=\/wp\/v2\/posts\/507\/revisions"}],"predecessor-version":[{"id":898,"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=\/wp\/v2\/posts\/507\/revisions\/898"}],"wp:attachment":[{"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jeremm.fr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}