Aller au contenu

Sauvegarde Des Bases Mysql


DjMomo

Messages recommandés

Bonsoir,

Petit tutoriel du jour, la sauvegarde automatisée périodique de toutes les bases d'un serveur MySQL (et ce n'est pas seulement limité aux NAS Synology, dès lors que vous possédez un accès TELNET/SSH et la possibilité de jouer avec la crontab sur le serveur en question).

Le script ci-dessous va vous permettre de sauvegarder toutes les bases de données de n'importe quel serveur MySQL périodiquement, dès lors que vous avez un minimum de droits dessus. Et pas besoin de le faire évoluer au rythme d'ajout/suppression de vos bases de données, c'est tout automatisé.

Il y a une sauvegarde gzippée par date et base de données.

Allons-y.

Prérequis :

- Un accès Telnet/SSH....

- Le droit de modifier la crontab pour programmer l'exécution périodique du script

- et c'est tout smile.png

1 - Création de l'utilisateur sauvegarde

Il va falloir créer, pour un poil plus de sécurité, un utilisateur ayant seulement quelques droits sur toutes les bases de notre serveur MySQL. Cela évitera ainsi d'avoir le mot de passe du compte root en clair dans le script. Vous pouvez toutefois utiliser le compte root (et donc sauter la présente étape), si vous le souhaitez.

- Rendez-vous sur phpMyAdmin de votre serveur MySQL. Sur la page d'accueil, cliquez sur le bouton "Privilèges", puis "Ajouter un utilisateur".

- Configurez le nouvel utilisateur :

- Nom d'utilisateur :
sauvegarde

- Serveur :
localhost
(sauf lors d'une éxecution distante de la sauvegarde, dans quel cas il faut indiquer le nom réseau de la machine qui exécute le script ci-dessous)

- Mot de passe : celui que vous voulez

- Privilèges globaux :

- Données :
SELECT
,
INSERT

- Administration :
SHOW DATABASES
,
LOCK TABLES

- Cliquez sur Exécuter pour valider la création de l'utilisateur.

Avec ces droits, même si quelqu'un ce connecte avec ce compte "sauvegarde", il ne pourra aucunement supprimer des données, tables, ou bases.

2 - Installation du script

Là, on va pas y aller par 4 chemins. Il suffit de compléter les 4 champs nécessaires en début de script :


mysql_server=localhost

mysql_user=sauvegarde   	

mysql_pass=mot_de_passe

dossier_sauvegarde=/chemin/vers/le/dossier/de/sauvegarde

Attention
, pour le dossier de sauvegarde, il ne faut pas le / en fin de chemin. Ainsi une sauvegarde dans
/opt/etc/dossier/
devra être indiqué
/opt/etc/dossier
dans le script.
#!/bin/sh

# *******************************************

# Script de sauvegarde automatique des bases

# de données d'un serveur MySQL

# *******************************************

# Par F. Maurel

# Suivi des mises à jours sur nas-forum :

#

# *******************************************

# v1.0 - 10/02/12 - Version initiale

# v1.1 - 11/02/12 - Ajout path binaire mysql

# *******************************************


# *******************************************

# Renseigner les variables de connexion au serveur

# *******************************************

# Adresse IP / nom du serveur de bases de données

mysql_server=localhost

# Nom d'utilisateur ayant les droits adéquats, cf forum

mysql_user=sauvegarde

# Mot de passe de l'utilisateur

mysql_pass=mot_de_passe

# Chemin du dossier où vont être sauvegardées les bases de données, chemin sans le / en fin

dossier_sauvegarde=/chemin/vers/le/dossier/de/sauvegarde

# Chemin des binaires mysql

dossier_bin=/usr/syno/mysql/bin

# *******************************************

# Ne pas modifier la suite du fichier

# *******************************************

bases=`$dossier_bin/mysql --host=$mysql_server --user=$mysql_user --password=$mysql_pass -e "show databases;" -B -s 2> /dev/null`

if [ -z "$bases" ];then

		echo "Erreur d'accès ou pas de bases."

		exit 1

fi

echo "***************************************************"

echo "* Début d'optimisation et de sauvegarde des bases	*"

echo "***************************************************"

for base in $bases

do

		echo "------- Traitement de la base $base -------"

		echo "-- Début d'optimisation --"

		$dossier_bin/mysqlcheck --optimize --host=$mysql_server --user=$mysql_user --password=$mysql_pass --databases "$base"

		wait

		echo ">> Optimisation terminée"

		echo "-- Début de sauvegarde --"

		$dossier_bin/mysqldump --opt --verbose --host=$mysql_server --user=$mysql_user --password=$mysql_pass --databases "$base" | gzip -9 > ${dossier_sauvegarde}/backup-${base}-$(date -I).gz

		echo "------- Sauvegarde de la base $base terminée -------"

done

echo "*********************************"

echo "* Sauvegarde des bases terminée *"

echo "*********************************"
Pensez à rendre ce script exécutable.
3 - Création de la tâche planifiée
Là, rien de bien compliqué, il suffit de créer une tâche planifiée - quotidienne et de nuit est l'idéal - qui va exécuter le précédent script.

vi /etc/crontab

Ajouter la ligne

5	  0 	 *	   *	   *	   root	/chemin/vers/backupbdd.sh

pour une exécution quotidienne à 00h05. Notre script se nommant
backupbdd.sh
Enfin, relancer le démon cron pour prendre en compte la modification de la crontab :

cd /usr/syno/etc/rc.d/

./S04crond.sh stop

./S04crond.sh start

Et voilà, rien de plus difficile smile.png

Modifié par DjMomo
Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Ce script te sauvegarde aussi la base mysql, tu sais, celle où tu as toute ta config MySQL ainsi que tous les privilèges utilisateurs.... Celle là, elle n'est pas sauvegardée avec l'appli intégrée...

Et comme je le dis en intro, ce n'est pas limité aux NAS Synology... Il peut être utilisé presque partout....

D'ailleurs, l'USB Station 2 n'étant pas pourvue de fonction de sauvegarde, il m'y est très utile dessus...

smile.png

Modifié par DjMomo
Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Bonjour et merci pour ce tuto fort intéressant.

Je ne suis pas un pro de la ligne de commande et j'ai un message d'erreur lorsque j'exécute ton script.

/etc/bckmysql.sh: line 29: gt: not found

/etc/bckmysql.sh: line 29: /dev/null: Permission denied

ERROR 1049 (42000): Unknown database '2'

J'ai bien vérifié. L'accès au serveur, l'utilisateur et le mot de passe sont corrects.

Ai je raté quelque chose ?

Merci pour vos lumières !

Modifié par gg3105
Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Fonctionne impec après après quelques modifs, comme gg3105 j'avais :

[color=#282828][font=helvetica, arial, sans-serif]/etc/bckmysql.sh: line 29: gt: not found[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]/etc/bckmysql.sh: line 29: /dev/null: Permission denied[/font][/color]

[color=#282828][font=helvetica, arial, sans-serif]ERROR 1049 (42000): Unknown database '2'[/font][/color]
Le problème vient du caractère ">" qui dans le code donné DjMomo a été remplacé par son code HTML ">". Il suffit donc de remplacer tous > par > Voilà le code complet corrigé :


#!/bin/sh

# *******************************************

# Script de sauvegarde automatique des bases

# de données d'un serveur MySQL

# *******************************************

# Par F. Maurel

# Suivi des mises à jours sur nas-forum :

#

# *******************************************

# v1.0 - 10/02/12 - Version initiale

# v1.1 - 11/02/12 - Ajout path binaire mysql

# *******************************************[/size][/font][/color]

[color=#303030][font=Arial, Helvetica, sans-serif][size=3]# *******************************************

# Renseigner les variables de connexion au serveur

# *******************************************

# Adresse IP / nom du serveur de bases de données

mysql_server=localhost

# Nom d'utilisateur ayant les droits adéquats, cf forum

mysql_user=sauvegarde

# Mot de passe de l'utilisateur

mysql_pass=mot_de_passe

# Chemin du dossier où vont être sauvegardées les bases de données, chemin sans le / en fin

dossier_sauvegarde=/volume1/backup/mysql

# Chemin des binaires mysql

dossier_bin=/usr/syno/mysql/bin

# *******************************************

# Ne pas modifier la suite du fichier

# *******************************************

bases=`$dossier_bin/mysql --host=$mysql_server --user=$mysql_user --password=$mysql_pass -e "show databases;" -B -s 2> /dev/null`

if [ -z "$bases" ];then

			 echo "Erreur d'accès ou pas de bases."

			 exit 1

fi

echo "***************************************************"

echo "* Début d'optimisation et de sauvegarde des bases *"

echo "***************************************************"

for base in $bases

do

			 echo "------- Traitement de la base $base -------"

			 echo "-- Début d'optimisation --"

			 $dossier_bin/mysqlcheck --optimize --host=$mysql_server --user=$mysql_user --password=$mysql_pass --databases "$base"

			 wait

			 echo ">> Optimisation terminée"

			 echo "-- Début de sauvegarde --"

			 $dossier_bin/mysqldump --opt --verbose --host=$mysql_server --user=$mysql_user --password=$mysql_pass --databases "$base" | gzip -9 > ${dossier_sauvegarde}/backup-${base}-$(date -I).gz

			 echo "------- Sauvegarde de la base $base terminée -------"

done

echo "*********************************"

echo "* Sauvegarde des bases terminée *"

echo "*********************************"

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Bonjour à tous,

Je remonte ce sujet un peu vieux mais c'est exactement ce dont j'ai besoin.

Je suis totalement newbie sous linux mais pas mal débrouillard, j'ai donc modifié mon crontab, rendu le script exécutable, tout ça...

Sauf que lorsque je veux tester l’exécution du script à la main et que je l’exécute, j'ai droit à un message d'erreur:

Ds107> sh backupbdd.sh

backupbdd.sh: line 38: syntax error: unexpected word (expecting "do")

J'ai bien vérifié ligne 38, c'est bien écrit "do". Le monsieur dans le synology me dit qu'il attend la valeur "do", après vérification du script elle y est, je cale...

voici mon code :

#!/bin/sh

# *******************************************

# Script de sauvegarde automatique des bases

# de données d'un serveur MySQL

# *******************************************

# Par F. Maurel

# Suivi des mises à jours sur nas-forum :

#

# *******************************************

# v1.0 - 10/02/12 - Version initiale

# v1.1 - 11/02/12 - Ajout path binaire mysql

# *******************************************

# *******************************************

# Renseigner les variables de connexion au serveur

# *******************************************

# Adresse IP / nom du serveur de bases de données

mysql_server=localhost

# Nom d'utilisateur ayant les droits adéquats, cf forum

mysql_user=sauvegarde

# Mot de passe de l'utilisateur

mysql_pass=sauvegardebdd

# Chemin du dossier où vont être sauvegardées les bases de données, chemin sans le / en fin

dossier_sauvegarde=/volume1/sauvegarde/mysql

# Chemin des binaires mysql

dossier_bin=/usr/syno/mysql/bin

# *******************************************

# Ne pas modifier la suite du fichier

# *******************************************

bases=`$dossier_bin/mysql --host=$mysql_server --user=$mysql_user --password=$mysql_pass -e "show databases;" -B -s 2> /dev/null`

if [ -z "$bases" ];then

echo "Erreur d'accès ou pas de bases."

exit 1

fi

echo "***************************************************"

echo "* Début d'optimisation et de sauvegarde des bases *"

echo "***************************************************"

for base in $bases

do

echo "------- Traitement de la base $base -------"

echo "-- Début d'optimisation --"

$dossier_bin/mysqlcheck --optimize --host=$mysql_server --user=$mysql_user --password=$mysql_pass --databases "$base"

wait

echo ">> Optimisation terminée"

echo "-- Début de sauvegarde --"

$dossier_bin/mysqldump --opt --verbose --host=$mysql_server --user=$mysql_user --password=$mysql_pass --databases "$base" | gzip -9 > ${dossier_sauvegarde}/backup-${base}-$(date -I).gz

echo "------- Sauvegarde de la base $base terminée -------"

done

echo "*********************************"

echo "* Sauvegarde des bases terminée *"

echo "*********************************"

Merci pour le coup de main.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonjour,

merci pour ce script, mais je voudrai comprendre ce que sont les binaires mysql ? Sont-ils toujours au même endroit ? a quoi correspond usr/syno ?

je n'ai pas ce repertoire sur mon sytème (ubuntu)

"Ce que sont les binaires mysql" tu veux dire quoi par là !?

Bien sur que sur un systeme Ubuntu tu n'as pas /usr/syno !

Patrick

Lien vers le commentaire
Partager sur d’autres sites

  • 9 mois après...

Bonjour à tous,

J'ai lu avec grand intêret votre topic et je précise que je suis un newbie total dans le domaine des scripts programables...

Ce script c'est exactement ce dont j'ai besoin pour sauvegarder mes bases au travail car j'ai un serveur DS212+ qui n'exécute pas les sauvegardes comme je les lui demande.

J'ai branché un lecteur USB3 Lacie compatible SYNOLOGY, formaté en ext4 (j'ai déjà fait des tentatives en ext3 infructueuses) et utilise la fonction de sauvegarde Mysql fournie par défaut dans le serveur.

Une de mes bases fait 20Go...et ça coince, la tache de sauvegarde n'arrive jamais au bout ! Les journaux de sauvegarde me disent qu'il n'arrive pas à exporter les "settings de mysql...blablabla". Je ne vois vraiment pas a quoi ça fait référence.

Je voudrais integrer ce script dans mon syno mais je ne comprends pas avec quels outils vous l'integrez.

J'ai ouvert une tunnel ssh avec une ouverture de session qui se fait correctement avec interface "commander" donc j'ai deux fenêtres une de mon poste local et une autre avec l'arborescence de mes fichiers syno.

J'ai compris qu'il fallait créer avec un editeur de texte un fichier rassemblant les instructions de ce script mais je n'arrive jamais à le copier dans le bon repertoire (j'utilise WinSCP pour cela, il me renvoi a chaque fois un message d'erreur....).

Utilisez vous un programme particulier pour copier le script dans le bon repertoire du syno ?

Merci infiniment de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

  • 4 semaines après...

Bonjour,

Ce script te sauvegarde aussi la base mysql, tu sais, celle où tu as toute ta config MySQL ainsi que tous les privilèges utilisateurs.... Celle là, elle n'est pas sauvegardée avec l'appli intégrée...

Et comme je le dis en intro, ce n'est pas limité aux NAS Synology... Il peut être utilisé presque partout....

D'ailleurs, l'USB Station 2 n'étant pas pourvue de fonction de sauvegarde, il m'y est très utile dessus...

smile.png

Moi je trouve que ce script remplit sa tache bien plus rapidement que l'outil intégré au DSM. A titre d'exemple, je sauvegarde 9Go de bases en 30 mn avec le script, 1h30 avec l'outil intégré au DSM. Pour moi il y a pas photo.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Bonjour

Je poste la réponse qui peut paraître évidente pour beaucoup d'entre vous, mais pas pour les nouveaux (ca m'a pris deux jours pour trouver).

Un fichier linux, ouvert sous windows est "corrompu" lorsque windows l'enregistre.

Windows rajoute des ^M a la fin de chaque ligne, ce qui explique l'erreur que j'avais.

Pour contourner le probleme il faut soit:

l'éditer avec vi par telnet ou ssh (et c'est l'enfer à manipuler :wacko: )

soit passer par notepad++ pour editer le fichier directement sur le syno, ci dessous le lien d'un tuto pour parametrer notepad

http://www.f4fxl.org/2012/07/13/editer-des-fichiers-sous-linux-depuis-un-systeme-windows/

@+

Gilles

Lien vers le commentaire
Partager sur d’autres sites

dos2unix ne ressemble pas du tout à vi, tu n'as pas du tout la nécessité d'éditer le fichier.

En fait dos2unix change le codage (dos/windows) qui génère des ¨M lorsqu'ils sont transféré sous unix/linux en fichier unix/linux.

Sinon pour le reste, il n'y a aucune question bête, c'est un forum d'entraide, qui là pour aider.

Mais pour te donner un autre d'idée de la puissance de la commande dos2unix, si dans un répertoire tu as 20 fichiers .sh qui ont été créé sous windows et donc auront des ¨M s'ils ont été codé en mode "windows" et non pas "unix", la commande dos2unix *.sh vas traiter l'ensemble des fichiers .sh présent dans le répertoire, s'il y a d'autre fichiers .sh au bon format de présent, ces derniers ne seront pas traiter.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Suite à un problème de disques durs mon volume Raid est crashé.

J'accède encore à mes données qui ne sont accessibles qu'en lecture seule.

Je souhaiterais récupérer la dernière version de mes bases de données présentes sur le syno.

Etant donné que mon volume est en lecture seule, je ne peux installer de script sur le volume.

Est-ce possible de sauvegarder les bases de la même façon en local sur le pc en utilisant un script windows lancé directement par le pc.

Si, je copie lle fichier mysql qui se trouve sur /usr/syno/mysql/bin, puis-je extraire les bases de données en local sur le pc?

Je n'ai pas de connaissances poussées en script mais beaucoup de bonne volonté. Merci de votre compréhension et de votre aide

Modifié par Machine Head
Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour à tous,

Je trouve très bon ce script pour sauvegarder ses bases mysql. Curieusement le DSM 5 (DS212+) ne propose plus de sauvegarde des bases mysql avec l'outils sauvegade et réplication (ou alors j'ai mal compris....)

Toutefois j'aurai 2 questions qui me viennent à l'esprit :

Question n°1 : comment le modifier pour que la sortie génère des fichiers .sql

Question n°2 : comment ajouter (dans ce même script) une commande qui supprime automatiquement les anciennes sauvegardes pour qu'il n'en reste que les 3 dernières par exemple. ?

Merci beaucoup pour le coup de main.

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gaetan, merci de ta réponse et bonjour à tous les Belges !

J'apporte quelques précisions a sujet de mon problème

Je suis Medecin et utilise une base mysql pour enregistrer toutes les infos de mes patients.

Dans cette base j'ai inclus des images, des pdf, bref toutes sortes de documents et j'avoue que la flexibilité de cette base m'apporte beaucoup plus que de nombreuses bases propriétaires que j'ai pu utiliser auparavant.

Bref je dois sauvegarder entre 12h et 14h pour éviter de laisser mon support de sauvegarde USB trop longtemps au cabinet, si je la faisait la nuit j'ai peur de perdre ma sauvegarde si un accident survient, un incendie ou autre chose du même acabit.

Mes exigeances : une sauvegarde qui ne prenne pas plus de 2h.....avec le script, il fallait 30 a 40 mn pour sauvegarder 15 Go en produisant des fichiers .sql

En comprimant en gz j'obtenais le même resultat en plus de 2h ce qui m'ennuie fortement.

Pour le reste, j'ai des difficultés "techniques" avec ce script :

1/ il ne se declenche à l heure que j'ai indiqué au crontab, même si je change l'heure.

2/ je n'ai pas modifié le caractère &gt par >.....une importance ?

3/ Avec le passage de mysql a MariaDB c'est la panique à bord !!! où faut-il placer le script ? : dans /usr/syno/mysql/bin ? ou bien ailleurs ?

4/ Pourquoi est-ce que synology a abandonné la sauvegarde mysql et mis un outil de sauvegarde INCOMPREHENSIBLE par le commun des mortels ??

Cela fait plus d'un mois que j'ai pas fait de sauvegarde....je commence a être en mode panic !!!

Merci par avance

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.