Sauvegarde d'une base de donnee

salley Messages postés 34 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 septembre 2007 - 23 avril 2004 à 15:57
cs_kalamya Messages postés 4 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 1 août 2005 - 1 août 2005 à 15:34
Bonjour tout le monde,

Voila, je viens juste de reprendre un projet de base de donnee auquel je dois ajouter quelques fonctionnalites. Pour cela je veux faire une sauvegarde de la base de donnee Online pour ensuite travailler en local.

Mais le probleme est que cette base de donnee est vraiment enorme (plus de 800 000 entrees et 70MB) et lorsque je veux faire cette sauvegarde:

- avec l'outil PHPmyadmin: j'ai des messages d'erreurs du style:
MySQL client run out of memory


- avec le script phpmydump.php, cela marche pour les premieres entrees mais ensuite, j'a le message d'erreur suivant
Fatal error:  Maximum execution time of 30 seconds exceeded in /home2/www/pastures/Kirt/admin_tools/phpmydump.php on line 181


- enfin j'ai essaye d'executer la commande (que j'execute avec l'outil phpMyAdmin du serveur Online:
BACKUP TABLE nom_de_table TO '/home2/www/pastures/Kirt/'


mais ensuite j'ai le message d'erreur suivant
Access denied for user: 'pastures@localhost' (Using password: YES)


Je pense que pour les deux premiers essais, je ne peux pas faire ma sauvegarde car ma base de donnees est trop grande mais pour le dernier essai avec la commande BaCKUP, je ne comprends pas l'erreur.

Si vous pouviez me donner une idee cela me depanerrai bein.

Merci
Salley

7 réponses

scoder Messages postés 140 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 20 mars 2006
23 avril 2004 à 16:56
voilà un script que j'ai trouvé il y a quelques temps pour sauvegarder ma base mysql. il faut uploader le script sur la racine de ton ftp et lancer le fichier.

voilà le script :

<?php

// indiquer ici le serveur base ("localhost" sur levillage et lycos,

"sql.free.fr" sur free, etc.)
$host="localhost";

//indiquer ici le nom de votre base (votrelogin_xxxx sur village, votrelogin_db sur lycos, votrelogin sur free)
$base="mabase";

// indiquer ici l'user/utilisateur base (votrelogin_xxxx sur village.org,

votrelogin sur lycos et free )
$user="root";

// indiquer ici le pass de votre base (pass particulier possible sur levillage, pass du compte sur lycos et free)
$pass="";

//////////////// remplir au moins ci-dessus: server nom login pass de la base

////////////////////

//Par défaut toutes les tables sont sauvegardées à la racine (là où est ce

fichier)
// ajoutez entre les guillemets un critere de sélection, d'exclusion, un

dossier de stockage.
$exclus = ""; // Ne pas sauver les tables dont le nom contient.. ici:

"_index_" (utile pour Spip)
$prefixe = ""; // Ne sauver que les tables avec ce préfixe ex:

"spip_"
$dossier = ""; // Dossier de stockage de la sauvegarde ex:

"ecrire/data/" (utile pour Spip)

// Sauvegarde compressée par défaut. Remplacer true par false pour ne pas

compresser,
// ou si le serveur fait une erreur car il n'accepte pas la compression gz
$gz = true;

$format = "INSERT"; // utiliser l'instruction SQL INSERT
$insertComplet = true; // INSERT avec les noms des champs (sans: false)

echo "
SAUVEGARDE DE VOTRE BASE DE DONNEES
";
echo "Sauvegarde FTP automatique,
puis vers votre ordinateur en cliquant

sur le lien
";

//CONNEXION
$link = mysql_connect($host, $user, $pass);
mysql_select_db($base) or die("Connexion impossible à la base de donnée

(vérifiez server nom login pass).");

function ecrire ($texte) {
global $fp, $_fputs;
$_fputs($fp, "$texte\n");
}

//calcul de la date
$temps = time();
$jour = date("j", $temps); //format numerique : 1->31
$annee = date("Y", $temps); //format numerique : 4 chiffres
$mois = date("m", $temps);
$heure = date("H", $temps);
$minutes = date("i", $temps);

//nom du fichier de sauvegarde: sauv_jj_mm_aaaa_nombase .gz si compressé ou

.sql si non compressé
if ($gz) $ext = ".gz";
else $ext = ".sql";

// pour éviter un éventuel téléchargement par un tiers, remplacez ci-dessous

"sauv_" par "wcoqp_" ou autre
$nom = $dossier . "sauv_" . $base . "_" . $prefixe . $jour. "_" . $mois. "_" .

$annee . $ext;
// PS: pas grand chose à voir, les pass sont écrits en crypté...

$date = "$jour/$mois/$annee a $heure" . "h" . $minutes;

//creation et ouverture du fichier
if ($gz) $fp = @gzopen($nom, "wb");
else $fp = fopen($nom, "wb");
if (! $fp) die("impossible de créer $nom.");
$_fputs = ($gz) ? gzputs : fputs;

//ecriture entete du fichier
ecrire("# sauvegarde de la base $base");
ecrire("# le $date");

// pour chaque table...
$res = mysql_list_tables($base, $link);
$num_rows = mysql_num_rows($res);
$i = 0;
while ($i < $num_rows)
{
$tablename = mysql_tablename($res, $i);
// éviter les tables avec le préfixe signalé par $prefixe
if (substr($tablename,0,strlen($prefixe)) != $prefixe) { echo

"
> $tablename NON INCLUS ($prefixe non

souhaité)";}
else {
// éviter les tables avec mot exclus signalé par $exclus
if (strstr($tablename, $exclus)) {echo "
>

$tablename NON INCLUS ($exclus non souhaité)";}
else{
// ecrire la structure de la table
echo "
$tablename : Structure

OK ";
ecrire("# structure de la table $tablename");
ecrire("DROP TABLE IF EXISTS `$tablename`;\n");
// requete de creation de la table
$query = "SHOW CREATE TABLE $tablename";
$resCreate = mysql_query($query);
$row = mysql_fetch_array($resCreate);
$schema = $row[1].";";
ecrire("$schema\n");

// ecrire le contenu de la table
echo " Données OK ";
ecrire("# donnees de $tablename");
$query = "SELECT * FROM $tablename";
$resData = mysql_query($query);
if (mysql_num_rows($resData) > 0)
{
$sFieldnames = "";
if ($insertComplet)
{
$num_fields =

mysql_num_fields($resData);
for($j=0; $j < $num_fields; $j++)
{
$sFieldnames .=

"`".mysql_field_name($resData, $j) ."`";
if ($j<$num_fields-1) $sFieldnames .=

", ";
}
$sFieldnames = "(" . $sFieldnames .

")";
}
$sInsert = "INSERT INTO `$tablename`

$sFieldnames values ";

while($rowdata = mysql_fetch_assoc($resData))
{
$lesDonnees =

"<guillemet>".implode("<guillemet>,
<guillemet>", $rowdata)."<guillemet>";
$lesDonnees =

str_replace("<guillemet>", "'",
addslashes($lesDonnees));
if ($format "INSERT") $lesDonnees

"$sInsert($lesDonnees);";
ecrire("$lesDonnees\n");
}
}
}
$i++;
}
}

ecrire("# ------- fin ------------");

// fermer le fichier
if ($gz) gzclose($fp);
else fclose($fp);

echo "

Sauvegarde FTP finie !

";
echo "Fichier de sauvegarde : $nom (" .

ceil(filesize("$nom")/1024) . " Ko).";

echo "

Pour le télécharger sur votre ordinateur: CLIQUER ICI

";
echo "(N'oubliez pas de supprimer vos anciennes sauvegardes régulièrement)";

?>

pour récupérer ta base après ça devient galère, en tout cas je ne l'ai pas encore fait puisque je n'ai pas eu de prob heureusement, mais mon fichier de backup fait 25Mo, soit + de 10000 pages sous word et il est impossible de le récupérer avec mysql car le délai est trop long....
je ne m'y connais pas trop en la matière mais peut être qu'en affectant tout le contenu de ton fichier à une variable, et en exécutant cette variable en tant que requête ça peut marcher mais je ne garantis rien.

bon courage!
0
salley Messages postés 34 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 septembre 2007
23 avril 2004 à 17:37
Merci pour le code mais en fait j'en ai deja un ; phpmydump et le probleme qui se pose est qu'au bout de 30 seconde le code se stoppe, c la limite d'execution par defaut de pas mal d'hebergeur.

N'ayant pas acces au fichier de configuration php.ini de mon hebergeur, j'ai essayer de mettre la fonction set_time_limit(200) dans le script de phpmydump mais maintenant ce qui se passe c'est que le script se stoppe un peu apres (il a le temps de sauvegarder 22000 entrrees au lie de 19000)

Finalement, le script se stoppe quand meme largement avant les 200 secondes que j'ai fixe mais cela ne cree pas de "fatal error".

Salley
0
scoder Messages postés 140 Date d'inscription dimanche 18 avril 2004 Statut Membre Dernière intervention 20 mars 2006
23 avril 2004 à 17:42
Désolé mais dans ton cas je ne vois pas du tout quoi faire.....
Je vais y penser et regarder si j'ai pas un script qui traine mais j'en doute

SCoder
0
porciner Messages postés 56 Date d'inscription mardi 22 juin 2004 Statut Membre Dernière intervention 18 avril 2008
18 août 2004 à 12:13
J'ai exactement le meme problème que toi, je suis chez lycor (version pme) et impossible de sauvegarder ma base.
Si quelqu'un à une idée ou si une solution à été trouvé postez la svp.
Merci.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
salley Messages postés 34 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 19 septembre 2007
19 août 2004 à 09:11
Salut porciner,

En fait ce que j'ai fais, c'est que jai utilisé le protocole SSH (une sorte de Telnet sécurisé) pour avoir directement accés au shell du serveur de mon herbergeur et donc ne pas être gêner par les limitations de Apache, PHP ou MySQL.

Salut porciner,

En fait ce que j'ai fais, c'est que jai utilisé le protocole SSH (une sorte de Telnet sécurisé) pour avoir directement accés au shell du serveur de mon herbergeur et donc ne pas être gêner par les limitations de Apache, PHP ou MySQL.

Pour cela, j'ai utilisé le logiciel PuTTY (logiciel gatuit).

Ensuite j'ai utilisé l'outil mysqldump qui est fournis avec mySQL, donc j'ai tapé la commande:

mysqldump -q name_of_the database > name_of_the_backup.sql -p password


avec
-q: option pour socket UNIX
name_of_the database: nom de ta base de donnée
name_of_the_backup.sql: nom de la sauvegarde de ta base donnée
-p:option d'éctiure (utile pour les grosses bases de données)
password: mot de passe pour accéder à ta base de donnée.

Après cela, tu n'as plus besoin que d'aller chercher ta base do donnée sur le serveur de ton herbergeur grâce à un logiciel FTP.

Si tu as encore des problèmes n'hésite pas.

Salley
0
cs_kclito Messages postés 12 Date d'inscription dimanche 25 juillet 2004 Statut Membre Dernière intervention 17 mai 2005
17 mai 2005 à 16:56
Super ton script [auteurdetail.aspx?ID=262570 scoder] il m'a bcp aidé



- © Kclito -
0
cs_kalamya Messages postés 4 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 1 août 2005
1 août 2005 à 15:34
Merci Scoder !!!!!!!!!!!!!
Tu n'imagines pas combien de temps j'ai bataillé pour trouver un exemple simple et qui fonctionne surtout !! Je suis sûre que tu ferais beaucoup d'heureux si tu le mettais dans les sources à consulter sur le site. Encore merci !!!!
0
Rejoignez-nous