2010-10-17 5 views
2

En utilisant PHP et MySQL dans un script exécuté sur mysite1.com, j'essaie de copier toutes les lignes et colonnes d'une table sur mysite2.com dans une table identique (qui a déjà été créé) sur mysite1.com. Je me connecte d'abord aux deux bases de données (j'ai déjà mis en place des connexions MySQL distantes sur mysite2.com).insertion dans une base de données MySQL sur un serveur différent

$con1 = mysql_connect("mysite1.com", "username1", "password1"); 
if (!$con1) {die('Could not connect: ' . mysql_error());} 
mysql_select_db("database1", $con1); 

$con2 = mysql_connect("mysite2.com", "username2", "password2"); 
if (!$con2) {die('Could not connect: ' . mysql_error());} 
mysql_select_db("database2", $con2); 

Je ne peux pas comprendre comment formater le « INSERT INTO » string sql il obtiendra les données de mysite2.com et le mettre dans mysite1.com. Est-ce que quelqu'un sait comment faire ça?

INSERT INTO my_table1 SELECT * FROM my_table2 

Répondre

3

Ne peut pas être fait comme vous le pensez. Vous pouvez configurer un federated table et copier à partir de cela. Probablement plus simple juste pour utiliser mysqldump, puis charger le fichier qu'il crée.

La troisième option consiste à lire les données via php et à générer des instructions INSERT, mais ce sera la plus lente des trois options.

1

Un handle de connexion mysql ne peut pas être partagé entre différents serveurs. C'est spécifiquement lié au serveur sur lequel vous l'avez ouvert, et c'est là que ça va rester.

Il existe plusieurs options. bemace a mentionné les tables fédérées. Il y a aussi replication. Parmi les deux, la réplication est probablement la plus facile à maintenir, même si c'est un peu difficile à démarrer. Une fois que c'est fait, il va gérer toutes les mises à jour des tables/bases de données répliquées de manière transparente, et vous n'avez pas à vous en préoccuper. Avec les tables fédérées, vous devez exécuter vos requêtes au moins deux fois. Un pour la table "locale" et un pour chaque table "distante". Et vous rencontrerez des problèmes avec les transactions: ils ne sont pas supportés du tout sur les tables fédérées.

1
$con1 = mysql_connect("mysite1.com", "username1", "password1"); 
if (!$con1) {die('Could not connect: ' . mysql_error());} 
mysql_select_db("database1", $con1); 

$result = mysql_query('SELECT * FROM `some_table`', $con1); 
$query = array(); 
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { 
    $query[] = '('.implode(',', $row).')'; 
} 

$con2 = mysql_connect("mysite2.com", "username2", "password2"); 
if (!$con2) {die('Could not connect: ' . mysql_error());} 
mysql_select_db("database2", $con2); 

mysql_query('INSERT INTO `some_table` VALUES '.implode(',', $query).';', $con2); 
0

Vous pouvez utiliser une base de données 3ème partie synchroniseur tels que http://www.quest.com/toad-for-mysql/ (gratuit)

+0

Remarque rapide à ce sujet: n'est plus gratuit.Un essai gratuit est disponible cependant. – H2ONOCK

+0

@ H2ONOCK Hmm, oui Dell a racheté Quest. Je pense que c'est encore un freeware, mais vous devrez peut-être vous inscrire pour l'obtenir. – Petah

2

MySQL fait un outil de migration assistant qui le fera. Cette fonctionnalité peut être dépliée dans le Workbench maintenant.

Vous pouvez également envisager de faire ce qui suit:

de mysql1 se connecter à mysql1: SELECT * FROM table INTO OUTFILE filename

de mysql1 se connecter à mysql2: LOAD DATA LOCAL INFILE filename INTO TABLE table

Ce sera assez rapide, mais il a gagné » t être une copie parfaite si vous faites des insertions dans mysql1 pendant que cela se passe.

Si vous avez besoin de ces paramètres pour rester synchronisés, la réplication est définitivement la solution.

0

Essayez ceci:

// origin 
$dblink1=mysql_connect('mysite1.com', 'user1', 'password1'); 
mysql_select_db('db1', $dblink1); 

// destination 
$dblink2=mysql_connect('mysite2.com', 'user2', 'password2'); 
mysql_select_db('db2',$dblink2); 

$res_from = mysql_query("show tables", $dblink1); 
if($res_from === FALSE) { 
    die(mysql_error()); // for error handling 
} 

while($table = mysql_fetch_array($res_from)) { 
echo($table[0] . "<br />"); // optional, only for show the name tables 

$table=$table[0]; 

$tableinfo = mysql_fetch_array(mysql_query("SHOW CREATE TABLE $table ",$dblink1)); // retrieve table structure from mysite1.com 

mysql_query(" $tableinfo[1] ",$dblink2); // use found structure to make table on mysite2.com 

$res_to = mysql_query("SELECT * FROM $table ",$dblink1); // select all content from table mysite1.com 
while ($row = mysql_fetch_array($res_to, MYSQL_ASSOC)) { 
    $sql_error = ""; 
    mysql_query("INSERT INTO $table (".implode(", ",array_keys($row)).") VALUES ('".implode("', '",array_values($row))."')",$dblink2); // insert one row into new table on mysite2.com`enter code here` 
    $sql_error = mysql_error($dblink2); 
} 
if ($sql_error) { 
    echo $sql_error; 
}else { 
    echo "copy table ".$table." done.<br />"; 
} 
    flush(); 
} 

mysql_close($dblink1); 
mysql_close($dblink2); 

IMPORTANT! assurez-vous que vous avez un utilisateur avec tous les privilèges dans le mysql de mysite1.com Dans tous les cas, vous pouvez en créer un: CREATE USER 'myuser' @ '%' IDENTIFIÉ PAR 'mypassword'; ACCÉDER À TOUS SUR *. * À myuser;

Questions connexes