Copier une table d'un serveur mysql a un autre en php

willpower

WRInaute discret
Hello a tous,

J'essais de copier le contenu d'une table a une table identique sur un autre serveur.

Voici mon code:
Code:
<?
// BASE 2
$host2 = "nomdedomaine.ca"; // voir hébergeur
$user2 = "user2"; // vide ou "root" en local
$pass2 = "pass2"; // vide en local
$bdd2 = "cybersp1_kvdsoft"; // nom de la bdd
// connexion
@mysql_connect($host2,$user2,$pass2)
   or die("Impossible de se connecter base 2");
@mysql_select_db("$bdd2")
   or die("Impossible de se connecter database2");

//Efface le contenu actuel
mysql_query("TRUNCATE TABLE updatedate2");


//BASE ORIGINAL
$host = "localhost"; // voir hébergeur
$user = "user"; // vide ou "root" en local
$pass = "pass"; // vide en local
$bdd = "kvd"; // nom de la BD
// connexion
@mysql_connect($host,$user,$pass)
   or die("Impossible de se connecter");
@mysql_select_db("$bdd")
   or die("Impossible de se connecter");


mysql_query("INSERT INTO cybersp1_kvdsoft.updatedate2
Select * kvd.updatedate");

echo"hello";

?>

Mais voila le contenu de la table updatedate2 se fait bien effacer, mais rien n'est copier.
Mes connection au base se font et mon "hello" s'affiche.

Avez vous une idee?
 

JulienV

WRInaute discret
Salut ;)

Le mieux est de faire un backup de tes tables dans un fichier .txt ou .sql (fopen, fputs, fclose) puis de l'exporter sur ta seconde base.

Sinon, il y a aussi la réplication MySQL qui est très performante (ta base esclave se connecte à la base maître pour reproduire tes données à l'identique).
 

willpower

WRInaute discret
On oubli l'option 1, car ca doit etre mis dans un script php qui sera lancer plusieurs fois par jour.

Pour ce qui est de l'option 2 j'ai seulement besoin de copier quelques tables et donc j'ai l'impression que ca va etre tres lourd pour rien non?
Merci
 

jcaron

WRInaute accro
C'est normal que ça ne marche pas, tu fais une requête SQL sur un seul serveur, forcément, elle ne peut pas aller prendre des données dans une table sur un serveur X et la mettre sur un serveur Y.

Ce qu'il faut que tu fasses, c'est une première requête qui fait un select sur la première base, puis pour chaque ligne du résultat, faire un insert de la ligne en question dans la deuxième base.

Evidemment pour ça il faut que tu utilises des identificateurs de connexion de BDD explicites (un pour chaque connexion).

En gros:
Code:
$bdd1 = mysql_connect(paramètres bdd 1);
$bdd2 = mysql_connect(paramètres bdd 2);
mysql_query("TRUNCATE table",$bdd2);
$res = mysql_query("SELECT * FROM table",$bdd1);
while ($row = mysql_fetch_assoc($res))
{
    mysql_query("INSERT INTO table (col1,col2...) VALUES '".mysql_real_escape_string($row['col1'])."','".mysql_real_escape_string($row['col2'])."'...",$bdd2);
}

En espérant que ta table ne soit pas trop grosse, sinon il va au minimum falloir faire ça par petits bouts (avec des offset/limit), sans parler de l'impact sur les performances des deux bases. Et evidemment il faudrait que l'ensemble de l'opération se fasse dans une transaction, sinon le gars qui arrive "au mauvais moment" il va avoir droit à une table incomplète...

Une solution de réplication aura l'avantage de faire de l'incrémental, i.e. ne copier que ce qui change (et en plus les modifications seront répercutées beaucoup plus rapidement).

Jacques.
 

JulienV

WRInaute discret
Rien ne vaut la réplication MySQL pour faire cela, c'est extrêmement performant et ça prend à tout casser 5 minutes à mettre en place...

Même pour un débutant, comptons 1 heure pour être large :)
 

willpower

WRInaute discret
Hello,

Pour ce qui est de la replication, mon hebergeur est tellement securisé, que je trouve pas les fichiers a modifier et donc je crois que vu que mes tables ne sont pas trop grosse, que vais y aller avec un script php.

Je reprends donc le script de Jacques:
Code:
<?
// BASE 2
$host2 = "nomdedomaine.ca"; // voir hébergeur
$user2 = "user2"; // vide ou "root" en local
$pass2 = "pass2"; // vide en local
//$bdd2 = "cybersp1_kvdsoft"; // nom de la bdd

//BASE ORIGINAL
$host1 = "localhost"; // voir hébergeur
$user1 = "user"; // vide ou "root" en local
$pass1 = "pass"; // vide en local
//$bdd = "kvd"; // nom de la BD


$bdd1 = mysql_connect($host1,$user1,$pass1);
$bdd2 = mysql_connect($host2,$user2,$pass2);
mysql_query("TRUNCATE table cybersp1_kvdsoft.updatedate2",$bdd2);
$res = mysql_query("SELECT * FROM kvd.updatedate",$bdd1);
while ($row = mysql_fetch_assoc($res))
{
    mysql_query("INSERT INTO cybersp1_kvdsoft.updatedate2(customer, products, images) VALUES '".mysql_real_escape_string($row['customer'])."','".mysql_real_escape_string($row['products'])."','".mysql_real_escape_string($row['images'])."'",$bdd2);
}

echo"hello";

?>


Le truncate fonctionne, mais le insert toujours pas. C'est surement quelques chose de bete, mais je trouve pas. Auriez-vous une idee?

Merci
 

willpower

WRInaute discret
Youuuuuuuuuuuuuuppppi!
J'ai reussi!

Voici le code si ca peus aider...holalala j'en ai mis du temps pour ce ptit code.. :D Merci Jacques et Julien!

Code:
<?
// BASE 2
$host2 = "nomdedomaine.ca"; // voir hébergeur
$user2 = "user2"; // vide ou "root" en local
$pass2 = "pass2"; // vide en local
//$bdd2 = "cybersp1_kvdsoft"; // nom de la bdd

//BASE ORIGINAL
$host1 = "localhost"; // voir hébergeur
$user1 = "user"; // vide ou "root" en local
$pass1 = "pass"; // vide en local
//$bdd = "kvd"; // nom de la BD


$bdd1 = mysql_connect($host1,$user1,$pass1);
$bdd2 = mysql_connect($host2,$user2,$pass2);
mysql_query("TRUNCATE table cybersp1_kvdsoft.updatedate2",$bdd2);

$res = mysql_query("SELECT * FROM kvd.updatedate",$bdd1)or die("<pre><b>MySQL Error:<b/>". mysql_error() ."</pre>");
while ($row = mysql_fetch_array($res))
{
   mysql_query("INSERT INTO cybersp1_kvdsoft.updatedate2 (customer, products, images) VALUES ('".mysql_real_escape_string($row['customer'])."','".mysql_real_escape_string($row['products'])."','".mysql_real_escape_string($row['images'])."')",$bdd2)or die("<pre><b>MySQL Error:<b/>". mysql_error() ."</pre>");
}

echo"hello";

?>
 

Discussions similaires

Haut