【问题标题】:insert into a MySQL database on a different server插入到不同服务器上的 MySQL 数据库中
【发布时间】:2010-10-17 23:20:46
【问题描述】:

在 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

【问题讨论】:

  • 只需将数据导出为sql文件,然后导入服务器即可。

标签: php mysql


【解决方案1】:

无法按照您的想法完成。您可以设置 federated table 并从中复制。使用mysqldump 然后加载它创建的文件可能更简单。

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

【讨论】:

    【解决方案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);
    

    【讨论】:

      【解决方案3】:

      MySQL 制作了一个迁移助手工具来执行此操作。这个功能现在可能会被合并到 Workbench 中。

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

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

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

      这会很快,但如果您在此过程中插入到 mysql1 中,这将不是一个完美的副本。

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

      【讨论】:

        【解决方案4】:

        一个 mysql 连接句柄不能在不同的服务器之间共享。它专门与您打开它的服务器相关联,并且将保留在该服务器上。

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

        对于联合表,您必须至少运行两次查询。一个用于“本地”表,一个用于每个“远程”表。而且您会遇到事务问题:联邦表根本不支持它们。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 快速说明:不再免费。不过可以免费试用。
          • @H2ONOCK 嗯,是的,戴尔收购了 Quest。我认为它仍然是免费软件,但您可能需要注册才能获得它。
          【解决方案6】:

          试试这个:

          // 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 中拥有具有所有权限的用户 在任何情况下,您都可以这样做: CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword'; GRANT ALL ON *.* to myuser;

          【讨论】:

            猜你喜欢
            • 2013-04-08
            • 1970-01-01
            • 1970-01-01
            • 2020-05-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-30
            • 2014-05-01
            相关资源
            最近更新 更多