-
-
Save JulienRAVIA/54f0c76a5a1eb4aa7bc6226de729666c to your computer and use it in GitHub Desktop.
Tutoriel PHP : Programmer des backups automatiques d’une base de données MySQL et les envoyer via FTP - http://tellibus.com/blog/3
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Données de connexion à la base de données | |
$MYSQLhost = 'localhost'; | |
$MYSQLdb = 'tlb_db'; | |
$MYSQLuid = 'tlb_db_uid'; | |
$MYSQLpwd = 'motdepasse'; | |
// Données de connexion au serveur FTP | |
$ftpServer = 'ftp.votre-serveur.com'; | |
$ftpUser = '[email protected]'; | |
$ftpPwd = 'motdepasse'; | |
$ftpTarget = '/backup-db/'; | |
// Ensemble des tables éventuelles à exclure complètement | |
$excludedTables = array( | |
'tlb_topsecret', | |
); | |
// Ensemble des tables éventuelles dont on ne veut sauvegarder que la structure | |
$onlyStructureTables = array( | |
'tlb_historique', | |
); | |
// On spécifie le chemin absolu où le script stockera les sorties .gz et .html | |
$path = '/backup/'; | |
// On ouvre en création ou en modification le fichier log de la journée | |
$file = $path . 'logs/log-' . date('d-m-Y') . '.html'; | |
if (file_exists($file)) { | |
$newDay = false; | |
$f = fopen($file, 'a+'); | |
$log = ''; | |
} else { | |
$newDay = true; | |
$f = fopen($file, 'w'); | |
$log = '<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body>'; | |
} | |
// On démarre la connexion | |
try { | |
$log .= '<hr><h3>Tentative de connexion MySQL...</h3>'; | |
$conn = new PDO("mysql:host=$MYSQLhost;dbname=$MYSQLdb", $MYSQLuid, $MYSQLpwd, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")); | |
$log .= "Connexion à la BDD MySQL $MYSQLhost \ $MYSQLdb effectuée !<br>"; | |
// On liste d’abord l’ensemble des tables | |
$result = $conn->query("SHOW TABLES"); | |
$tables = array(); | |
// On exclut éventuellement les tables indiquées | |
while ($row = $result->fetch()) { | |
if (!in_array($row[0], $excludedTables)) { | |
$tables[] = $row[0]; | |
} | |
} | |
// La variable $return contiendra le script de sauvegarde. | |
// On englobe le script de backup dans une transaction | |
// et on désactive les contraintes de clés étrangères | |
$return = '-- | |
-- Hôte : ' . $MYSQLhost . ' | |
-- Date et heure : ' . date('d/m/Y à H:i:s') . ' | |
-- Base de données : `' . $MYSQLdb . '` | |
-- | |
SET FOREIGN_KEY_CHECKS=0; | |
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; | |
SET AUTOCOMMIT=0; | |
START TRANSACTION; | |
'; | |
// On boucle sur l’ensemble des tables à sauvegarder | |
foreach ($tables as $table) { | |
// On ajoute une instruction pour supprimer la table si elle existe déjà | |
$return .= "DROP TABLE IF EXISTS `$table`;\n"; | |
// On génère ensuite la structure de la table | |
$result = $conn->query("SHOW CREATE TABLE `$table`")->fetch(PDO::FETCH_ASSOC); | |
$return .= $result['Create Table'] . ";\n\n"; | |
// Si la table n’est pas marquée à sauver en tant que "structure seule" | |
if (!in_array($table, $onlyStructureTables)) { | |
$result = $conn->query("SELECT * FROM `$table`"); | |
// On boucle sur l’ensemble des enregistrements de la table | |
while ($row = $result->fetch(PDO::FETCH_ASSOC)) { | |
$return .= "INSERT INTO `$table` VALUES("; | |
// On boucle sur l’ensemble des champs de l’enregistrement | |
foreach ($row as $fieldValue) { | |
// On purifie la valeur du champ | |
$fieldValue = addslashes($fieldValue); | |
$fieldValue = preg_replace("/\r\n/", "\\r\\n", $fieldValue); | |
$return .= '"' . $fieldValue . '", ' ; | |
} | |
// On supprime la virgule à la fin de la requête INSERT | |
$return = mb_substr($return, 0, -2) . ");\n"; | |
} | |
$return .= "\n"; | |
} | |
} | |
// On valide la transaction | |
// et on résactive les contraintes de clés étrangères | |
$return .= 'SET FOREIGN_KEY_CHECKS=1; | |
COMMIT;'; | |
$conn = null; | |
// On enregistre maintenant le script SQL dans un fichier au format gzip | |
$savedFile = 'BKP-' . date('d-m-Y_H-i-s') . '-' . md5(implode(',', $tables)) . '.sql.gz'; | |
$gz = gzopen($path . $savedFile, 'w9'); | |
gzwrite($gz, $return); | |
gzclose($gz); | |
$log .= "Le fichier $savedFile a été correctement généré<br>"; | |
// On envoie maintenant le fichier gzip au serveur FTP indiqué | |
$log .= '<h3>Tentative de connexion FTP...</h3>'; | |
$connection = ftp_connect($ftpServer); | |
$login = ftp_login($connection, $ftpUser, $ftpPwd); | |
if ($connection && $login) { | |
$log .= 'La tentative de connexion FTP a réussi !<br>'; | |
$upload = ftp_put($connection, $ftpTarget . $savedFile, $path . $savedFile, FTP_BINARY); | |
if ($upload) { | |
$log .= '<span style="color:#090">Le téléversement par FTP a réussi !</span><br>'; | |
} else { | |
$log .= '<span style="color:#900">Le téléversement par FTP a échoué !</span><br>'; | |
} | |
} else { | |
$log .= 'La tentative de connexion FTP a échoué !<br>'; | |
} | |
ftp_close($connection); | |
} catch(PDOException $e) { | |
$log .= '<h1>Erreur de connexion MySQL : </h1><pre>'; | |
$log .= $e->getMEssage(); | |
$log .= '</pre>'; | |
exit(); | |
} | |
// On écrit le log dans le fichier de logs de la journée | |
fwrite($f, $log); | |
fclose($f); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
00 04 * * * /home/domain/backup/backup.php |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment