Un code source PHP pour sauvegarder votre base de donnée MySQL

Voici un code source fonctionnel pour sauvegarder l’intégralité de votre base de donnée Mysql.

PHP
216 lines
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
<?php
################################################################################
# L'auteur a autorisé la redistribution gratuite et l'inclusion de ce code dans
# les programmes à condition que cette notice de copyright soit dûment incluse.
# BackySQL (c) 2010 Brice Sanchez
# 10/03/2010 Brice SANCHEZ - www.brice-sanchez.com
#
# LE CODE COUVERT PAR CETTE LICENCE EST FOURNI « EN L'ÉTAT »,
# SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE, INCLUANT,
# SANS S'Y LIMITER, LES GARANTIES D'ABSENCE DE DÉFAUT, DE QUALITÉ MARCHANDE,
# D'ADÉQUATION À UN USAGE PARTICULIER OU DE NON-VIOLATION DE DROITS DE TIERCES
# PARTIES. VOUS ASSUMEZ TOUS LES RISQUES LIÉS À LA QUALITÉ ET AUX PERFORMANCES
# DU CODE COUVERT PAR CETTE LICENCE. SI UN DÉFAUT, QUEL QU'IL SOIT, EST DÉTECTÉ
# DANS LE CODE COUVERT PAR CETTE LICENCE, VOUS (ET NON LE DÉVELOPPEUR INITIAL
# OU UN CONTRIBUTEUR) ASSUMEZ LE COÛT DES SERVICES D'ASSISTANCE, DES RÉPARATIONS
# OU DES CORRECTIONS NÉCESSAIRES. CETTE LIMITATION DE GARANTIE CONSTITUE UNE
# PARTIE ESSENTIELLE DE CETTE LICENCE. LE CODE COUVERT PAR CETTE LICENCE NE PEUT
# ÊTRE UTILISÉ QUE DANS LE CADRE DE CETTE LIMITATION DE GARANTIE.
# Vous utilisez ce code à vos propres risques.
################################################################################
////////////////////////////////////////////////////////////////////////////////
// @Description
// Sauvegarde de base de donnée
// @Version 0.6
// @Licence GNU/GPL3
// http://www.gnu.org/licenses/gpl-3.0.html
// @Publication Vendredi 12 Mars 2010
// @Revision Samedi 13 Mars 2010
// @Catgorie Administration
// @Compatibilite PHP 4 >= 4.0.1, PHP 5
// @Auteur Brice Sanchez
// http://www.brice-sanchez.com/
// @Contributeur Flashx
// @Contact
// @Télechargement
// http://www.siteduzero.com/forum-83-498153-p1-sauvegarde-automatique-de-la-base-de-donnee-mysql.html#r4753068
// @Note
// Utiliser un cron job toute les 24 h vers 3heure du matin
//
// @changement
// Support la sauvegarde de DB differente
// Windows compatibility
// check config
//
// Remerciement
// * à M@teo pour héberger gracieusement nos sources,
// * à Brice pour l'élan communautaire qu'il a su ranimer,
// * aux développeurs de siteduzero.com pour leurs conseils( notamment Sebi57)
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Configuration
////////////////////////////////////////////////////////////////////////////////
//TODO : céer un object de configuration( ajouter un nom a cette config, donner plus d'option)
// inclure la configuration : pas de C/C
// Nom de la base de donnée à enregistrer
$nom_bdd = 'test' ;
// Hôte de la base de donnée ciblé
$hote = 'localhost' ;
// Port de la base de donnée
$port = '3306' ;
// Nom d'utilisateur de la base de donnée à enregistrer
$utilisateur = 'root' ;
// Mot de passe de la base de donnée à enregistrer
$mot2passe = '' ;
// Exemple : latin1 ou utf8
$encodage_caracteres_mysql = 'latin1' ;
// Remplir le tableau si on veut sauvegarder uniquement certaines tables
// Exemple : array('table1','table2','table5')
$selection_tables_mysql = array();
// Chemin absolu de l'emplacement du site
$chemin_absolu_site = dirname( __FILE__) . DIRECTORY_SEPARATOR;
// Emplacement sur le FTP du répertoire des sauvegardes
$repertoire = 'sauvegarde_mysql';
// Nom du fichier ( ex : nomdelabasededonnee_2010-03-01_01-01-01.sql)
$ext_fichier = 'sql' ;
// Nombre de sauvegardes à garder sur le FTP
$nbre_sauvegardes_a_garder = 7 ;
define( "CHECK", true);
define( "FIRST_RUN", true);
////////////////////////////////////////////////////////////////////////////////
// Initialisation
////////////////////////////////////////////////////////////////////////////////
$repertoire_sauvegardes = $chemin_absolu_site . $repertoire.DIRECTORY_SEPARATOR;
$nom_fichier = $nom_bdd.'_'.date('Y-m-d_H-i-s').'.'.$ext_fichier ;
////////////////////////////////////////////////////////////////////////////////
// Vérification de l'environnement
////////////////////////////////////////////////////////////////////////////////
if( true == CHECK)
{
$sapi_type = php_sapi_name();// Context d'execution
if (substr($sapi_type, 0, 3) != 'cli') {
if( true == FIRST_RUN)
{
?><html><body>
<p>Il semblerai que vous souhaitez utiliser ce fichier a travers le reseaux.<br/>
<p>Si tel est votre souhais, Pensez à :
<ul>
<li>Autentifier l'attaquant;</li>
<li>Identifier l'attaquant;</li>
<li>Modifier périodiquement vos codes d'acces.</li>
</ul></p>
</body></html><?php
}
exit( );
}
if( is_dir ($repertoire_sauvegardes) === FALSE ) {
if(mkdir ($repertoire_sauvegardes, 0700) === FALSE ) {
exit('Impossible de créer le répertoire de sauvegarde'.PHP_EOL);
// TODO : Indiquer une solution
}
} else if( is_writable( $repertoire_sauvegardes)===FALSE) {
exit('Impossible d\'écrire dans le répertoire de sauvegarde'.PHP_EOL);
// TODO : Indiquer une solution
}
// tester la connexion Mysql;
// Que ce passe t-il si MySQL n'est pas en TCP mais en socket file ?
// Optimiser le mode de compatibilité mysql( interoger mysql)
// Que ce pass t'il si on se plante dans le nom des table $selection_tables_mysql( interoger mysql)
}
////////////////////////////////////////////////////////////////////////////////
// Sauvegarde de la base de donnée
////////////////////////////////////////////////////////////////////////////////
$commande = 'mysqldump';
$commande .= ' --host='.$hote;
$commande .= ' --port='.$port;
$commande .= ' --user='.$utilisateur;
$commande .= ' --password='.$mot2passe ;
$commande .= ' --skip-opt';
$commande .= ' --compress';
$commande .= ' --add-locks';
$commande .= ' --create-options';
$commande .= ' --disable-keys';
$commande .= ' --quote-names';
$commande .= ' --quick';
$commande .= ' --extended-insert';
$commande .= ' --complete-insert';
$commande .= ' --default-character-set='.$encodage_caracteres_mysql;
$commande .= ' --compatible=mysql40';
$commande .= ' --result-file='.$repertoire_sauvegardes.$nom_fichier ;
$commande .= ' '.$nom_bdd ;
if( !empty($selection_tables_mysql) ) {
$commande .= ' '.implode(' ',$selection_tables_mysql) ;
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// WARNING
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// a REVOIR, exec() serrai plus mieux ????????????????
// Execution de la commande de sauvegarde
system($commande) ;
// Compression au format GZIP du fichier sauvegardé
system('cd '.$repertoire_sauvegardes.'; gzip '.$nom_fichier) ;
// $] gzip: test_2010-03-13_02-31-16.sql.gz already exists; do you wish to overwrite (y or n)?
// et il me crée *.sql sans le gziper
// donc verifier les erreur retourner par systeme
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// WARNING
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//TODO choix de la destination de la sauvegarde sur FTP
// Initialisation des variables
$tableau_sauvegardes = array();
// Ouverture du dossier, Attention au cache du filesysteme???
if ($repertoire_ouvert = opendir($repertoire_sauvegardes)) {
// Lecture des entrées
while( ($fichier_en_cours = readdir($repertoire_ouvert)) !== false) {
if(is_file($repertoire_sauvegardes.$fichier_en_cours)) {
if( substr( $fichier_en_cours, 0, strlen( $nom_bdd))!=$nom_bdd ) {
continue;//
}
// Mise en tableau des résultats
$tableau_sauvegardes[] = $fichier_en_cours;
}
}
// fermeture du dossier
closedir($repertoire_ouvert) ;
}
sort($tableau_sauvegardes, SORT_STRING);
// Supprime les fichiers en trop
$ln = sizeof( $tableau_sauvegardes)-( $nbre_sauvegardes_a_garder-1);
for($i=0; $i<$ln; $i++) {
unlink($repertoire_sauvegardes.$tableau_sauvegardes[$i]);
}
////////////////////////////////////////////////////////////////////////////////
// Loger nos actions
////////////////////////////////////////////////////////////////////////////////
//TODO, envoyer un mail : c'est rassurant
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Grand maître L

Commentaires

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.