Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problèmes de pertes de données : fichiers, mysql

    16 décembre 2023 à 18:21:11

    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
    08 17 * * * /root/bash/save_rsync.sh
    20 18 * * * /sbin/shutdown -h now
    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 au rallumage, 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é.
    Je n'arrive pas à definir 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 redemarré 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 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
    /root/bash/maj2.sh
    Pour mettre à jour ma base de données et le répertoire /var/www depuis une sauvegarde sur une clé USB
    #!/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
    /var/www/admin/maj.php
    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
    <?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>
    /root/bash/save_rsync.sh
    Pour sauvegarder ma base de données et le répertoire /var/www sur une clé USB
    #!/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
    Merci pour votre aide.
    • Partager sur Facebook
    • Partager sur Twitter

    Problèmes de pertes de données : fichiers, mysql

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    • Editeur
    • Markdown