PDA

Voir la version complète : [HOW-TO] Backup automatique MySQL


Julia41
26/09/2007, 15h11
Bon, ceci est un petit script permettant une sauvegarde automatique de ses Bases de données MySQL. Ainsi que d'envoyer un mail contenant un backup de ses bases de données. Le format Zip a été choisi pour pouvoir être lu facilement sous Windows...

Il n'est pas complet, quelques modifications (cf. TODO) pourrait être sympa.


#!/bin/bash

#************************************************* **********************#
# BACKUP MySQL repris de celui de DanSteph #
# ------------------ #
# Vous pouvez lancer ce script en cron tous les jours, il est #
# prévu pour un backup par jour #
# Attention à la taille de vos bases de données pour l'envois #
# des emails . #
# #
#************************************************* **********************#

#************************************************* **********************#
# TODO #
# Gestion des erreurs si échec #
# Fichier permettant de mettre directement ses BDD #
#************************************************* **********************#

#************************************************* **********************#
# PARAMETRES A EDITER
#************************************************* **********************#
USER="root" #Nom de superutilisateur MySQL
DBPASS="XXXXXXXX" #Votre password superutilisateur
EMAIL="XXXXXXXX@XXX.XXX" #Votre email
#Envois d'un mail (attention ne pas mettre à 1 si JOINDB=1
MAILSEND="0"
DBNAME1="aseco" #Nom de vos bases de données
DBNAME2="cacti" #Une nouvelle ligne par base
DBNAME3="flyspray" #
DATEFORMAT=`date +%d-%m` #Format de la fate pour le backup
#Sujet de mail que vous recevrez si MAILSEND ou JOINDB = 1
SUJETMAIL="Backup $DATEFORMAT MySQL effectué"
COMPRESS="1" #Mettre "1" pour zipper le backup
JOINDB="1" #Joindre par mail le Backup
#Mettez à 0 si vous souhaitez supprimer la copie local (Déconseillé)
KEEPLOCAL="0"
#************************************************* **********************#
# EDITION AVANCEE #
#************************************************* **********************#

#Répertoire de backup (temporaire si KEEPLOCAL = 0
BACKUPDIR="/home/backup/sql/"

#Sauvegarde des bases de données
#Rajoutez une ligne si vous avez plus de bases de données à sauvegarder
echo "Backup SQL commencé le `date`"
mysqldump --opt -u root -p$DBPASS $DBNAME1 > $BACKUPDIR/$DATEFORMAT-$DBNAME1.sql
echo "Base de données $DBNAME1 sauvegardée"
mysqldump --opt -u root -p$DBPASS $DBNAME2 > $BACKUPDIR/$DATEFORMAT-$DBNAME2.sql
echo "Base de données $DBNAME2 sauvegardée"
mysqldump --opt -u root -p$DBPASS $DBNAME3 > $BACKUPDIR/$DATEFORMAT-$DBNAME3.sql
echo "Base de données $DBNAME3 sauvegardée"

#************************************************* **********************#
# FIN DES PARAMETRES A EDITER #
#************************************************* **********************#

#Compression en Zip si COMPRESS est à 1 (Option obligatoire pour l'envois de la copie par mail.
if [ "$COMPRESS" = "1" ]
then
zip -rT9 $DATEFORMAT-MySQL.zip $BACKUPDIR
rm $BACKUPDIR*
mv $DATEFORMAT-MySQL.zip $BACKUPDIR
echo "Backup SQL compressé effectué `date`"
fi
#Envois d'un email récapitulatif (Désactivé la variable MAILSEND si vous avez mis JOINDB à 1.
if [ "$MAILSEND" = "1" ]
then
echo -e "Backup MySQL effectué le `date`.\nLes Bases de données $DBNAME1, $DBNAME2, $DBNAME3 ont bien été sauvegardées.\nFichier $DATEFORMAT-MySQL.zip placé dans $BACKUPDIR" | mail -s "$SUJETMAIL" $EMAIL
fi
#Envois de votre sauvegarde par email (seulement si vous avez activé la compression par ZIP.
if [ "$JOINDB" = "1" ]
then
cd $BACKUPDIR
(echo -e "Backup MySQL effectué le `date`.\nLes Bases de données $DBNAME1, $DBNAME2, $DBNAME3 ont bien été sauvegardées.\nFichier $DATEFORMAT-MySQL.zip placé dans $BACKUPDIR"; uuencode $DATEFORMAT-MySQL.zip $DATEFORMAT-MySQL.zip) | mail -s "$SUJETMAIL" $EMAIL
fi
#Suppression de votre sauvegarde local si la variable KEEPLOCAL est = 0
if [ "$KEEPLOCAL" = "0" ]
then
rm $BACKUPDIR*
fi
echo "Backup terminé"

redji
26/09/2007, 16h04
plutot pas mal ce script julia merci beaucoup si je vais testé sa maintnenant en esperant que d autre pourrons l optimiser ^^

nero62
14/12/2007, 11h33
Bonjour,

Mes bases de données font environ 5Go : ceci ne risque-t-il pas de surcharger le serveur au moment de la sauvegarde ?

Alpha_67
09/07/2008, 13h54
Salut,

est ce que ces messages mis en gras sont normaux :
adding: var/www/backups/09-07-psychosstats.sql (deflated 76%)
adding: var/www/backups/09-07-gpx.sql (deflated 81%)
adding: var/www/backups/09-07-hlstatsmulti.sql (deflated 87%)

sadinfo
11/07/2008, 13h17
Salut,

Pour la sauvegarde automatique de toutes les base:

DBS="$($MYSQL -u root -p$DBPASS -Bse 'show databases')"
for DBNAME in $DBS
do

mysqldump --opt -u root -p$DBPASS $DBNAME > $BACKUPDIR/$DATEFORMAT-$DBNAME.sql
echo "Base de données $DBNAME sauvegardée"


done

A tester

Florentriv
11/07/2008, 13h43
Salut,
est ce que ces messages mis en gras sont normaux :
Il s'agit du taux de compression en zip, c'est donc normal :)

sum_fvm
11/07/2008, 14h03
Sinon, backup-manager fait ça très bien aussi ;)

Alpha_67
11/07/2008, 18h07
Merci ;)

naeh
27/03/2009, 19h06
Salut,

Pour la sauvegarde automatique de toutes les base:

DBS="$($MYSQL -u root -p$DBPASS -Bse 'show databases')"
for DBNAME in $DBS
do

mysqldump --opt -u root -p$DBPASS $DBNAME > $BACKUPDIR/$DATEFORMAT-$DBNAME.sql
echo "Base de données $DBNAME sauvegardée"


done

A tester

il y a aussi l'option --all-databases
ce qui automatiquement dump toutes les bases du serveur.

sinon on peut aussi les lister les unes après les autres (si on ne veut pas toutes les dumper)

Nickoeuh
25/09/2011, 11h07
Bonjour,

Je me permets de relancer ce sujet, car le script de Julia m'intéresse sauf que je ne sais pas quelle extension mettre pour le fichier.
J'ai mis .php (ayant vu un echo), mais ça m'affiche le code au lieu de l'exécuter.

Merci d'avance.

ekozan
25/09/2011, 11h40
c'est un script BASH ... donc .sh

Nickoeuh
25/09/2011, 13h34
Merci pour ta réponse.
Mais c'est super pas secure comme fichier. Si quelqu'un trouve l'url de mon fichier, il peut avoir accès à mes données.

N'y a-t-il pas une protection contre ça ?

Gaston_Phone
25/09/2011, 13h40
Soyons prétentieux dans nos conseils! :D

Avec l'aimable autorisation de sfk, et de code_grabber une piste :

Comment faire un Backup/Restor de mes bases de données MUTUALISEES ?
-------------------------------------------------------------------------------

Bonjour, j'utilise le format GZIP.

Dans un script PHP je mets :

Sauvegarde GZIP - Toutes les tables :


<?PHP
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP

$db_charset = "latin1"; /* mettre utf8 ou latin1 */

$db_server = "xxxxxx"; // Nom du serveur MySQL. ex. mysql5-26.perso
$db_name = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_username = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_password = "xxxxxx"; // Mot de passe de la base de données.

$cmd_mysql = "mysqldump";

$archive_GZIP = "sauve_base_format_gzip.gz";

echo " Sauvegarde de la base <font color=red><b>$db_name</b></font> par <b>mysqldump</b> dans le fichier <b>$archive_GZIP</b> <br> \n";
$commande = $cmd_mysql." --host=$db_server --user=$db_username --password=$db_password -C -Q -e --default-character-set=$db_charset $db_name | gzip -c > $archive_GZIP ";
$CR_exec = system($commande);
?>


Sauvegarde GZIP - quelques tables :


<?PHP
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP

$db_charset = "latin1"; /* mettre utf8 ou latin1 */

$db_server = "xxxxxx"; // Nom du serveur MySQL. ex. mysql5-26.perso
$db_name = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_username = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_password = "xxxxxx"; // Mot de passe de la base de données.

$cmd_mysql = "mysqldump";

$archive_GZIP = "sauve_base_format_gzip.gz";

$Liste_tables_a_sauvegarder = " Table1 Table2 Table3 Table4 Table5 ... ";

echo " Sauvegarde de la base <font color=red><b>$db_name</b></font> par <b>mysqldump</b> dans le fichier <b>$archive_GZIP</b> <br> \n";
$commande = $cmd_mysql." --host=$db_server --user=$db_username --password=$db_password -C -Q -e --default-character-set=$db_charset $db_name $Liste_tables_a_sauvegarder | gzip -c > $archive_GZIP ";
$CR_exec = system($commande);
?>



Sauvegarde GZIP - sauve tables avec liste tables à exclure :


<?PHP
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP

$db_charset = "latin1"; /* mettre utf8 ou latin1 */

$db_server = "xxxxxx"; // Nom du serveur MySQL. ex. mysql5-26.perso
$db_name = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_username = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_password = "xxxxxx"; // Mot de passe de la base de données.

$cmd_mysql = "mysqldump";

$archive_GZIP = "sauve_base_format_gzip.gz";

$Prefixe_tables_a_exclure = " --ignore-table=".$db_name.".jomla1_";

echo " Sauvegarde de la base <font color=red><b>$db_name</b></font> par <b>mysqldump</b> dans le fichier <b>$archive_GZIP</b> <br> \n";
$commande = $cmd_mysql." --host=$db_server --user=$db_username --password=$db_password -C -Q -e --default-character-set=$db_charset $db_name $Prefixe_tables_a_exclure | gzip -c > $archive_GZIP ";
$CR_exec = system($commande);
?>



Restauration GZIP

<?PHP
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP

$db_charset = "latin1"; /* mettre utf8 ou latin1 */

$db_server = "xxxxxx"; // Nom du serveur MySQL. ex. mysql5-26.perso
$db_name = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_username = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_password = "xxxxxx"; // Mot de passe de la base de données.

$cmd_mysql = "mysql";

$archive_GZIP = "sauve_base_format_gzip.gz";

if (!is_file($archive_GZIP)) echo "<font color=red>Le fichier <b>".$archive_GZIP."</b> n'existe pas </font> <br> \n";

echo " Restauration de la base <font color=red><b>$db_name</b></font> par <b>mysql</b> depuis le fichier <b>$archive_GZIP</b> <br> \n";
$commande = "gzip -d < $archive_GZIP | $cmd_mysql --host=$db_server --user=$db_username --password=$db_password $db_name";
$CR_exec = system($commande);
?>


Restauration SQL

<?PHP
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP

$db_charset = "latin1"; /* mettre utf8 ou latin1 */

$db_server = "xxxxxx"; // Nom du serveur MySQL. ex. mysql5-26.perso
$db_name = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_username = "xxxxxx"; // Nom de la base de données. ex. mabase
$db_password = "xxxxxx"; // Mot de passe de la base de données.

$cmd_mysql = "mysql";

$archive_SQL = "Sauve_Base.SQL";

if (!is_file($archive_SQL)) echo "<font color=red>Le fichier <b>".$archive_SQL."</b> n'existe pas </font> <br> \n";

echo " Restauration de la base <font color=red><b>$db_name</b></font> par <b>mysql</b> depuis le fichier <b>$archive_SQL</b> <br> \n";
$commande = "$cmd_mysql --host=$db_server --user=$db_username --password=$db_password $db_name < $archive_SQL";
$CR_exec = system($commande);
?>



Analyse :
Pour la partie sauvegarde pas de risque.
Pour la partie restauration, s'assurer au préalable que la sauvegarde est correcte :

Transfert de la sauvegarde sur ton micro,
Dé-zippe le fichier sauvegarde,
Ouvre avec NOTEPAD.EXE le fichier extrait.


Le fichier extrait doit avoir une taille conséquente et commencer par quelque chose qui ressemble à :


-- MySQL dump 10.13 Distrib 5.1.35, for Win32 (ia32)
--
-- Host: localhost Database: YYY
-- ------------------------------------------------------
-- Server version 5.1.35-community

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `tbl_adresses`
--

DROP TABLE IF EXISTS `Table_xxx`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `Table_xxx` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
...
`DER` varchar(3) NOT NULL DEFAULT '',
PRIMARY KEY (`Id`),
KEY `Id` (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=2561 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `Table_xxx`
--

LOCK TABLES `Table_xxx` WRITE;

Nickoeuh
25/09/2011, 20h06
Merci.

J'aimais l'idée de recevoir le dump par mail mais je ferai sans.

Bonne soirée

Nowwhat
26/09/2011, 00h34
....
Erf. Même pas vu la suite ...
Je --> [...] aussi.

Nickoeuh
01/10/2011, 18h50
Bon finalement, j'ai fait un script qui liste les .gz et j'envoie le dernier par mail 1h après la création de l'archive.
Ça fonctionne plutôt bien, donc résolu pour moi.

Freemaster
01/10/2011, 21h01
lorsque la base fera plus de 100Mo, tu vas la recevoir par mail ?
un lien ftp serait plus judicieux ahma

Kleduts
04/10/2011, 14h37
Bonjour,

Je me permets de relancer ce sujet, car le script de Julia m'intéresse sauf que je ne sais pas quelle extension mettre pour le fichier.
J'ai mis .php (ayant vu un echo), mais ça m'affiche le code au lieu de l'exécuter.

Merci d'avance.

Non, il s'agit d'un script qui s'exécutera sur le serveur via ton terminal.
Tu le transfères donc sur le serveur, tu lui mets les droits d'exécution et tu l'exécutes. Tout simplement

A+ / F.