Bonjour à tous,
Mon but est de faire une sauvegarde de ma base de données régulièrement. Ma base fait a peu près 200 mo, ce qui fait que le téléchargement de la sauvegarde dure plusieurs heures.
(mes problèmes sont écrits en gras, histoire de pas se perdre dans tout mon texte :s )
Mon but serait de ne récupérer QUE les nouveaux enregistrements (nouveau depuis la dernière sauvegarde), ainsi que ceux qui ont été modifiés... mais mysql ne prévois pas cette option avec mysqldump ou hotcopy
Pour les nouveaux enregistrements, j'ai pensé à cette solution (ça m'a pris du temps pour y penser et pour la "concrétiser" plus ou moins).
- Créer la table de "sauvegarde des derniers auto-increments"
- Peupler la base des tables que je veux sauvegarder
- Sauvegarder les derniers auto-increments lors d'une sauvegarde.
Qui nécessite que toutes les tables à sauvegarder aient comme clef primaire un champ en incrémentation automatique. Si des tables contiennent un champ de dernière modification, je pourrai aussi utiliser celui là, ça peut être pratique. En fait, je peux ajouter un champ à ma table de "tables à sauvegarder" pour lui indiquer quel champ prendre en compte, et le laisser vide pour utiliser l'auto-increment.
Bref, ma solution commence comme ça :
De cette manière, ma table sav contient les tables que je sauvegarde habituellement, ainsi que la valeur qu'avait l'auto-incrément lors de la dernière sauvegarde.
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 -- Créer la table de "sauvegarde des derniers auto-increments" CREATE TABLE IF NOT EXISTS `sav` ( `sav_id` int(11) NOT NULL auto_increment, `sav_date` int(11) NOT NULL, `sav_table` varchar(200) NOT NULL, `sav_auto_increment` int(11) NOT NULL, PRIMARY KEY (`sav_id`) ); -- Créer les lignes intéressantes (exemple si je veux sauver toute les tables de ma base) INSERT INTO sav(sav_table) select t.TABLE_NAME from information_schema.TABLES t where t.TABLE_SCHEMA="ma_bdd_a_sauver" and t.TABLE_TYPE="BASE TABLE" and TABLE_NAME<>"sav"; -- Sauvegarder les derniers auto-increments lors d'une sauvegarde. -- REMARQUE : Il y a une manière plus simple pour la valeur de l'auto-increment : regarder directement le nombre le plus grand dans la table concernée :max() ... Je viens d'y penser, mais je laisse ça au cas où. update sav set sav_date=UNIX_TIMESTAMP(), sav_auto_increment= (SELECT t.`AUTO_INCREMENT` from information_schema.TABLES t1 where t.`TABLE_NAME`=sav.sav_table); -- Reafficher les résultats (test phpmyadmin). -- select * from sav;
Il me reste à coder la manière de récupérer ce que je souhaite. Si je ne souhaite sauvegarder que les données, la requête SELECT à utiliser est quelquechose comme ça :
Là je bloque : Comment faire une boucle afin de ne pas avoir à écrire mes quelques 140 requetes (une pour chaque table) ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Select * from nom_de_ma_table where id>( select sav_auto_increment from sav where sav_table="nom_de_ma_table" )
Autre problème : un "select", c'est bien joli, mais pour exporter il faut ensuite que je l'affiche de telle manière que ce soit exploitable pour peupler une autre base. Là non plus, je n'ai pas trouvé de méthode simple dans la doc MySQL :/ . En regardant les sources de phpmyadmin (que j'ai trouvé très lisibles, Je m'en était pas autant rendu compte la dernière fois ! Félicitations aux auteurs. ), j'ai l'impression que tout est fait "à la main" (récupérer les valeurs, les noms des champs, et reconstruire la requête). C'est une solution que je peut envisager, mais ça me semble un peu compliqué...
Si vous avez des conseils, des suggestions, des pistes, une meilleure méthode, n'hésitez pas !
Merci de m'avoir lu![]()
Partager