插入到不同服务器上的MySQL数据库中

时间:2010-10-17 23:20:46

标签: php mysql

在mysite1.com上运行的脚本中使用PHP和MySQL我试图将mysite2.com上的表中的所有行和列复制到mysite1.com上的相同表(已经创建)中。首先,我连接到两个数据库(我已经在mysite2.com上设置了远程MySQL连接)。

$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);

我无法弄清楚如何格式化“INSERT INTO”sql字符串,以便从mysite2.com获取数据并将其放入mysite1.com。有谁知道怎么做?

INSERT INTO my_table1 SELECT * FROM my_table2

6 个答案:

答案 0 :(得分:4)

无法以你的思维方式完成。您可以设置federated table并从中进行复制。可能更简单,只需使用mysqldump,然后加载它创建的文件。

第三个选项是通过php读取数据并生成INSERT语句,但这是三个选项中最慢的。

答案 1 :(得分:2)

$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);

答案 2 :(得分:2)

MySQL提供了一个迁移辅助工具来完成此任务。此功能现在可以折叠到Workbench中。

您可能还会考虑执行以下操作:

从mysql1连接到mysql1: SELECT * FROM table INTO OUTFILE filename

从mysql1连接到mysql2: LOAD DATA LOCAL INFILE filename INTO TABLE table

这将非常快,但如果您正在进行插入mysql1,它将不是一个完美的副本。

如果您需要这些以保持同步,复制绝对是答案。

答案 3 :(得分:1)

不能在不同服务器之间共享mysql连接句柄。它特别与您打开它的服务器绑定,而这就是它将保留的位置。

有几种选择。 bemace提到了联合表。还有replication。 在这两者中,复制可能是最容易维护的,尽管启动和运行有点痛苦。一旦启动,它将透明地处理复制表/数据库的所有更新,您不必担心它。

使用联合表时,您必须至少运行两次查询。一个用于“本地”表,一个用于每个“远程”表。而且你会遇到交易问题:它们在联合表上根本不受支持。

答案 4 :(得分:0)

您可以使用第三方数据库同步器,例如http://www.quest.com/toad-for-mysql/(免费)

答案 5 :(得分:0)

试试这个:

// 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);

重要!确保你有一个拥有mysite1.com mysql所有权限的用户 无论如何,你可以这样做: 创建用户'myuser'@'%'通过'mypassword'识别;全部授予 * 。*至myuser;