« MySQL : Backup d'un serveur » : différence entre les versions

De Adadov.net wiki
Aucun résumé des modifications
 
(14 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
{{EnCours|auteur=Adadov}}
{{Auteur|Adadov}}
{{Auteur|Adadov}}
[[Category:SysAdmin]]


== Introduction ==
== Introduction ==
Ligne 11 : Ligne 9 :
== Script de backup ==
== Script de backup ==


<source lang="bash">
<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash


MUSER='backup' # Nom d'utilisateur pour MySQL
MUSER='backup'     # Nom d'utilisateur pour MySQL
BUSER='backup' # Nom d'utilisateur pour la connexion SSH au serveur de backup
BUSER='backup'     # Nom d'utilisateur pour la connexion SSH au serveur de backup
BSRV='srv2'   # Adresse ou non du serveur de backup
BSRV='srvdistant' # Adresse ou non du serveur de backup
DEST='/backup' # Répertoire où envoyer le fichier sur le serveur de backup
DEST='/backup'     # Répertoire où envoyer le fichier sur le serveur de backup
RETDAY='7'        # Nombre de jour avant suppression du fichier en local


DATE=`date +%y%m%d`
DATE=`date +%y%m%d`
Ligne 31 : Ligne 30 :
############################################
############################################


cd $DATADIR
SCRIPTPATH=$(dirname $0)
for i in `${CFIND} * -type d`; do mysqldump -u ${MUSER} ${i} | ${CGZIP} -9 > ${BACKDIR}/${HOST}_${i}_${DATE}.sql.gz; done
for i in `${CFIND} ${DATADIR}/* -type d`
do
  DB=$(basename $i)
  grep ${DB} ${SCRIPTPATH}/backupMysql.exclude > /dev/null 2>&1
  if [ $? -eq 1 ]
  then
    echo "Backing up ${DB}"
    mysqldump -u ${MUSER} -p${MPASS} --routines ${DB} | ${CGZIP} -9 > ${BACKDIR}/${HOST}_${DB}_${DATE}.sql.gz
  fi
done
DB=mysql
echo "Backing up mysql"
mysqldump -u ${MUSER} -p${MPASS} --routines --events ${DB} | ${CGZIP} -9 > ${BACKDIR}/${HOST}_${DB}_${DATE}.sql.gz


${CSCP} ${BACKDIR}/*_${DATE}.sql.gz ${BUSER}@${BSRV}:${DEST}/
${CSCP} ${BACKDIR}/*_${DATE}.sql.gz ${BUSER}@${BSRV}:${DEST}/
Ligne 38 : Ligne 50 :
${CFIND} ${BACKDIR}/*.sql.gz -ctime +${RETDAY} -type f -delete
${CFIND} ${BACKDIR}/*.sql.gz -ctime +${RETDAY} -type f -delete


cd -
</syntaxhighlight>
 
</source>


== Configuration du serveur MySQL ==
== Configuration du serveur MySQL ==
Ligne 47 : Ligne 57 :
On autorisera cet utilisateur à se connecter uniquement depuis localhost vu qu'il n'aura pas de mot de passe.
On autorisera cet utilisateur à se connecter uniquement depuis localhost vu qu'il n'aura pas de mot de passe.


{{LinuxTerminal2|text=mysql -p}}
{{LxTerm|user=root|text=mysql -p}}
{{MySQLTerminal|text=GRANT USAGE,SELECT,LOCK TABLES ON *.* TO 'backup'@'localhost';}}
{{MySQLTerminal|text=GRANT USAGE,SELECT,LOCK TABLES,SHOW VIEW,EVENT ON *.* TO 'backup'@'localhost' Identified By 'S0m3Pa33';}}


Nous avons maintenant un utilisateur 'backup' capable de se connecter au serveur MySQL pour sauvegarder chacune des bases sans avoir besoin de saisir un mot de passe.
Nous avons maintenant un utilisateur 'backup' capable de se connecter au serveur MySQL pour sauvegarder chacune des bases sans avoir besoin de saisir un mot de passe.
Ligne 54 : Ligne 64 :
== Configuration de la connexion SSH au serveur de backup ==
== Configuration de la connexion SSH au serveur de backup ==


Pour se connecter au serveur SSH il faudra générer une clé SSH qui ne demandera pas de mot de passe.
Pour se connecter au serveur de backup, il faudra générer une clé SSH qui ne demandera pas de mot de passe.


{{Warn|On prendra grand soin de ne pas laisser qui que ce soit accéder à la clé privée sinon il aurait facilement accès au serveur.}}
{{Warn|On prendra grand soin de ne pas laisser qui que ce soit accéder à la clé privée sinon il aurait facilement accès au serveur.}}
Ligne 60 : Ligne 70 :
La création de la clé se fait depuis l'utilitaire 'ssh-keygen'.
La création de la clé se fait depuis l'utilitaire 'ssh-keygen'.


{{LinuxTerminal2|text=ssh-keygen -t rsa -b 2048}}
{{LxTerm|user=root|text=ssh-keygen -t rsa -b 2048}}
<output>
<output>
Generating public/private rsa key pair.
Generating public/private rsa key pair.
Ligne 87 : Ligne 97 :
Je déconseille très fortement d'utiliser 'root' sur le serveur distant pour recevoir le fichier, il vaut mieux avoir créer un utilisateur qui aura un droit d'écriture sur le dossier de destination pour éviter de mettre tout le système en péril si la clé venait à tomber entre de mauvaise mains.
Je déconseille très fortement d'utiliser 'root' sur le serveur distant pour recevoir le fichier, il vaut mieux avoir créer un utilisateur qui aura un droit d'écriture sur le dossier de destination pour éviter de mettre tout le système en péril si la clé venait à tomber entre de mauvaise mains.


{{LinuxTerminal2|user=root|text=ssh-copy-id backup@srvdistant}}
{{LxTerm|user=root|text=ssh-copy-id backup@srvdistant}}


Une fois le mot de passe saisi, l'utilitaire se chargera de mettre en place la clé publique sur le serveur distant.<br />
Une fois le mot de passe saisi, l'utilitaire se chargera de mettre en place la clé publique sur le serveur distant.<br />
Il ne reste plus qu'à tester la connexion.
Il ne reste plus qu'à tester la connexion.


{{LinuxTerminal2|user=root|text=ssh backup@srvdistant}}
{{LxTerm|user=root|text=ssh backup@srvdistant}}


Elle devrait se faire sans aucune demande de mot de passe.
Elle devrait se faire sans aucune demande de mot de passe.
[[Category:SysAdmin|MySQL]]
[[Catégorie:Backup]]

Dernière version du 6 février 2023 à 05:08

Ecrit Par : Adadov


Introduction[modifier | modifier le wikicode]

On ne pense jamais assez aux sauvegardes et perdre les données d'un serveur peut vite devenir un énorme problème.
Donc j'ai mis en place un script de backup qui est capable à chaud de venir sauvegarder toutes les bases de données d'un serveur MySQL.
Il se base sur la liste des dossiers présents dans le répertoire de données de MySQL, ainsi il suffira de créer une nouvelle base de données pour qu'elle soit sauvegardée.

Script de backup[modifier | modifier le wikicode]

#!/bin/bash

MUSER='backup'     # Nom d'utilisateur pour MySQL
BUSER='backup'     # Nom d'utilisateur pour la connexion SSH au serveur de backup
BSRV='srvdistant'  # Adresse ou non du serveur de backup
DEST='/backup'     # Répertoire où envoyer le fichier sur le serveur de backup
RETDAY='7'         # Nombre de jour avant suppression du fichier en local

DATE=`date +%y%m%d`
HOST=`hostname -s`
DATADIR='/var/lib/mysql'
BACKDIR='/backup'
CGZIP='/bin/gzip'
CFIND='/bin/find'
CSCP='/usr/bin/scp'

############################################
## RIEN A MODIFIER AU DELÀ DE CETTE LIGNE ##
############################################

SCRIPTPATH=$(dirname $0)
 
for i in `${CFIND} ${DATADIR}/* -type d`
do
  DB=$(basename $i)
  grep ${DB} ${SCRIPTPATH}/backupMysql.exclude > /dev/null 2>&1
  if [ $? -eq 1 ]
  then
    echo "Backing up ${DB}"
    mysqldump -u ${MUSER} -p${MPASS} --routines ${DB} | ${CGZIP} -9 > ${BACKDIR}/${HOST}_${DB}_${DATE}.sql.gz
  fi
done
DB=mysql
echo "Backing up mysql"
mysqldump -u ${MUSER} -p${MPASS} --routines --events ${DB} | ${CGZIP} -9 > ${BACKDIR}/${HOST}_${DB}_${DATE}.sql.gz

${CSCP} ${BACKDIR}/*_${DATE}.sql.gz ${BUSER}@${BSRV}:${DEST}/

${CFIND} ${BACKDIR}/*.sql.gz -ctime +${RETDAY} -type f -delete

Configuration du serveur MySQL[modifier | modifier le wikicode]

Afin de pouvoir facilement faire le backup du serveur MySQL il faut créer un utilisateur qui aura le droit de lire les données et de verrouiller les tables de toutes les bases.
On autorisera cet utilisateur à se connecter uniquement depuis localhost vu qu'il n'aura pas de mot de passe.

[root@linux] # mysql -pdblclick to copy
{{#sqlcmd:GRANT USAGE,SELECT,LOCK TABLES,SHOW VIEW,EVENT ON *.* TO 'backup'@'localhost' Identified By 'S0m3Pa33';|mysql>}}

Nous avons maintenant un utilisateur 'backup' capable de se connecter au serveur MySQL pour sauvegarder chacune des bases sans avoir besoin de saisir un mot de passe.

Configuration de la connexion SSH au serveur de backup[modifier | modifier le wikicode]

Pour se connecter au serveur de backup, il faudra générer une clé SSH qui ne demandera pas de mot de passe.

Warning : On prendra grand soin de ne pas laisser qui que ce soit accéder à la clé privée sinon il aurait facilement accès au serveur.

La création de la clé se fait depuis l'utilitaire 'ssh-keygen'.

[root@linux] # ssh-keygen -t rsa -b 2048dblclick to copy

<output> Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in id_rsa. Your public key has been saved in id_rsa.pub. The key fingerprint is: 29:51:fb:55:ff:f0:fb:03:1d:b4:c1:dd:62:3f:d5:51 root@srv.example.com The key's randomart image is: +--[ RSA 2048]----+ | . o.E| | . . .o==| | . . ..oo=| | . o . *o| | . S . . =| | . . ..| | .. | | ..| | o| +-----------------+ </output>

Une fois la clé générée il ne reste plus qu'à l'autoriser sur le serveur distant.
Je déconseille très fortement d'utiliser 'root' sur le serveur distant pour recevoir le fichier, il vaut mieux avoir créer un utilisateur qui aura un droit d'écriture sur le dossier de destination pour éviter de mettre tout le système en péril si la clé venait à tomber entre de mauvaise mains.

[root@linux] # ssh-copy-id backup@srvdistantdblclick to copy

Une fois le mot de passe saisi, l'utilitaire se chargera de mettre en place la clé publique sur le serveur distant.
Il ne reste plus qu'à tester la connexion.

[root@linux] # ssh backup@srvdistantdblclick to copy

Elle devrait se faire sans aucune demande de mot de passe.