Bonjour tout le forum,
J'ai besoin de votre aide.
J'ai un vieux serveur sous ubuntu 16.04.7 LTS. C'est une configuration 32 bits.
Depuis quelques semaines, j'ai des pertes de données à son allumage.
J'ai relevé des lignes en moins dans :
- le fichier /etc/sudoers
un de mes fichiers /root/bash/save_rsync.sh
dans une table de ma base de données (les dernières)
Le serveur s'allume tous les matins de la semaine à 6h30, configuration dans le bios.
A 17h08 sauvegarde de la base de données et du repertoire /var/www sur une clé USB.
A 18h20 arrêt du serveur.
crontab
J'ai vérifié la sauvegarde se passe correctement, toutes les tables de la base de données sont sauvegardées sur la clé USB, aucune perte dans le serveur après la sauvegarde. Pourtant le lendemain à l'allumage, il arrive qu'il manque des données (les dernières) dans des tables. A ce moment-là, si je fais une mise à jour avec la sauvegarde de la veille, tout est retrouvé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 08 17 * * * /root/bash/save_rsync.sh 20 18 * * * /sbin/shutdown -h now
Je n'arrive pas à définir quand cela arrive. J'ai fait des essais de modifications de fichiers, des modification de tables, des sauvegardes, des mises à jour de tables. J'ai redémarré plusieurs fois le serveur, parfois aucun problème (du moins, je ne remarque rien.) et parfois des pertes.
Voilà des fichiers que j'utilise qui sont peut-être la cause de mon problème.
/etc/sudoers
/root/bash/maj2.sh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 root ALL=(ALL:ALL) ALL www-data ALL=NOPASSWD: /root/bash/demonter_cle.sh start www-data ALL=NOPASSWD: /root/bash/maj2.sh start www-data ALL=NOPASSWD: /root/bash/monter_cle.sh start www-data ALL=NOPASSWD: /root/bash/save_rsync.sh start www-data ALL=NOPASSWD: /root/bash/services.sh start www-data ALL=NOPASSWD: /sbin/shutdown -h now
Pour mettre à jour ma base de données et le répertoire /var/www depuis une sauvegarde sur une clé USB
/var/www/admin/maj.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #!/bin/bash # Attention ce script fonctionne avec /root/.my.cnf # Demander le montage de la clé USB. source /root/bash/monter_cle.sh # Tester si la clé est montée. Si la clé n'est pas montée retourne 0. if [ `grep -c "/mnt/cle" /etc/mtab` -eq 0 ] then echo " /!\ Echec la clé n'est pas montée." else # Aller dans le dossier sauvegarde de la clé USB. cd /mnt/cle/sauvegarde # Création de la variable dossierSauvegarde. # dossierSauvegarde = dernier dossier modifié. dossierSauvegarde=$(ls -1t | head -1) # Mise à jour de /var/www/ rsync -a --exclude '_basesDeDonnees/' --delete-after /mnt/cle/sauvegarde/$dossierSauvegarde/ /var/www # Mise à jour de la base données maintenance. USER="root" HOST="localhost" BASE_SQL="maintenance" # Mettre la base de données à jour mysql -h$HOST -u$USER $BASE_SQL < $dossierSauvegarde/_basesDeDonnees/maintenance.sql chmod -R 777 /var/www # Demander le démontage de la clé USB. source /root/bash/demonter_cle.sh echo $dossierSauvegarde fi
page php pour lancer la mise à jour de ma base de données et le répertoire /var/www depuis une sauvegarde sur une clé USB
/root/bash/save_rsync.sh
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102 <?php session_start(); $titre = "Mise à jour"; ?> <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <link href="/images/logo_lycee.png" rel="shortcut icon"> <link rel="stylesheet" href="/css/bouton.css"/> <link rel="stylesheet" href="/css/page.css"/> <link rel="stylesheet" href="/css/paragraphe.css"/> <link rel="stylesheet" href="/css/tableau.css"/> <link rel="stylesheet" href="/css/titre.css"/> <title><?php echo $titre;?></title> </head> <body class="s1"> <?php ob_start(); if(!empty($_SESSION['prof'])){ try{ include("/var/www/connexion_bdd.php"); include("/var/www/admin/_enTeteAdmin.php"); if(!empty($_POST['subMaj'])){ // Rechercher toutes les contraintes de clés étrangères $chContrainte = $bdd->query (' SELECT k.CONSTRAINT_SCHEMA, k.CONSTRAINT_NAME, k.TABLE_NAME, k.COLUMN_NAME , k.REFERENCED_TABLE_SCHEMA, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME, r.UPDATE_RULE, r.DELETE_RULE FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS k INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS c ON k.CONSTRAINT_SCHEMA = c.CONSTRAINT_SCHEMA INNER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS r ON k.CONSTRAINT_SCHEMA = r.CONSTRAINT_SCHEMA AND k.CONSTRAINT_NAME = c.CONSTRAINT_NAME AND k.CONSTRAINT_NAME = r.CONSTRAINT_NAME AND k.CONSTRAINT_SCHEMA = "maintenance" AND k.REFERENCED_TABLE_NAME != "aatest1" WHERE c.CONSTRAINT_TYPE = "FOREIGN KEY" ORDER BY k.REFERENCED_COLUMN_NAME, k.REFERENCED_TABLE_NAME, k.TABLE_NAME '); $contrainte = $chContrainte->fetchAll(); foreach ($contrainte as $con) { // Supprimer toutes les contraintes de clés étrangères $bdd->query('ALTER TABLE '.$con['TABLE_NAME'].' DROP FOREIGN KEY '.$con['CONSTRAINT_NAME'].''); // echo $con['TABLE_NAME'].' '.$con['CONSTRAINT_NAME']."<br>"; // echo $con['CONSTRAINT_SCHEMA']."<br>"; } $chContrainte->closeCursor(); // Rechercher toutes les tables de la base de données maintenance $chTable = $bdd->query('show tables'); While($table = $chTable->fetch()){ // Supprimer chaque table $bdd->query('DROP TABLE '.$table['Tables_in_maintenance'].''); // echo $table['Tables_in_maintenance']."<br>"; } $chTable->closeCursor(); // Mettre à jour le répertoire /var/www et la base de données maintenance $dossierSauvegarde = exec('sudo /root/bash/maj2.sh start'); $chNote = $bdd->query('SELECT COUNT(id) AS nbr FROM travail_realise'); $note = $chNote->fetch(); $chCompteRendu = $bdd->query('SELECT COUNT(id) AS nbr FROM compteRendu'); $compteRendu = $chCompteRendu->fetch(); $chBonDeCommande = $bdd->query('SELECT COUNT(idBDC) AS nbr FROM bonDeCommande'); $bonDeCommande = $chBonDeCommande->fetch(); $bdd->query('INSERT INTO infosMaintenance (dossierMAJIM, dateMAJIM, nbrNoteIM, nbrBDCIM, nbrCRIM) VALUES ("'.$dossierSauvegarde.'", NOW(), '.$note['nbr'].', '.$bonDeCommande['nbr'].', '.$compteRendu['nbr'].')'); $chNote->closeCursor(); $chCompteRendu->closeCursor(); $chBonDeCommande->closeCursor(); echo "Serveur mis à jour au : ".$dossierSauvegarde."<br>"; echo "notes : ".$note['nbr']."<br>"; echo "Bon de commande : ".$bonDeCommande['nbr']."<br>"; echo "Compte-rendu : ".$compteRendu['nbr']."<br>"; } ?> <form method="post" class="p1"> Voulez-vous écraser et mettre à jour les fichiers et la base de données du serveur ?<br><br> <input type="submit" name="subMaj" value="Mettre à jour" class="bp0"/> </form> <?php }catch(Exception $e){ exit('<div class="erreurSQL">Problème à la ligne '. $e->getLine() .' : '. $e->getMessage().'</div>'); } } else{ // Redirection si session professeur détruite header('Location: admin.php'); } ob_end_flush(); ?> </body> </html>
Pour sauvegarder ma base de données et le répertoire /var/www sur une clé USB
Merci pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 #!/bin/bash # Attention ce script fonctionne avec /root/.my.cnf # Demander le montage de la clé USB. source /root/bash/monter_cle.sh if [ `grep -c "/mnt/cle" /etc/mtab` -eq 0 ] then echo "La clé n'est pas montée" else # Créer le nom de dossier de sauvegarde moisSansAccent=$(echo $(date +%B) | sed 'y/áàâäçéèêëîïìôöóûùúüñÂÀÄÇÉÈÊËÎÏÔÖÙÜÑ/aaaaceeeeiiiooouuuunAAACEEEEIIOOUUN/') nomDossierSauvegarde="${moisSansAccent}_$(date +%Y_%d_%A-%Hh%M)_lycee" echo $nomDossierSauvegarde # Créer le nom de dossier de sauvegarde pour les bases de données nomDossierSauvegardeBaseDonnees=_basesDeDonnees # Sauvegarder le dossier www dans le dossier de sauvegarde rsync -a /var/www/ /mnt/cle/sauvegarde/$nomDossierSauvegarde # Créer le dossier pour enregistrer les bases de données mkdir /mnt/cle/sauvegarde/$nomDossierSauvegarde/$nomDossierSauvegardeBaseDonnees # Sauvegarder la base de données maintenance USER="root" HOST="localhost" BASE_SQL="maintenance" mysqldump --opt -h$HOST -u$USER $BASE_SQL > /mnt/cle/sauvegarde/$nomDossierSauvegarde/$nomDossierSauvegardeBaseDonnees/maintenance.sql # Demander le démontage de la clé USB. source /root/bash/demonter_cle.sh fi
Partager