代码之家  ›  专栏  ›  技术社区  ›  johnny

我可以用PHP在两个不同的服务器上使用MySql Create Select吗?

  •  5
  • johnny  · 技术社区  · 14 年前

    <?php
    $dbname = 'cms';
    $dbmaster = 'cmsms';
    
    $db1 = mysql_connect('localhost', 'root', 'secret');
    if (!$db1) {
        echo 'Could not connect to mysql';
        exit;
    }
    
    $db2 = mysql_connect('server2', 'root', 'secret');
    if (!$db2) {
        echo 'Could not connect to mysql';
        exit;
    }
    
    mysql_select_db("$dbname", $db1) or die ("Unable to select database");
    mysql_select_db("$dbmaster", $db2) or die ("Unable to select database");
    
    $sql = "SHOW TABLES FROM $dbname";
    $result = mysql_query($sql, $db1);
    
    if (!$result) {
        echo "DB Error, could not list tables\n";
        echo 'MySQL Error: ' . mysql_error();
        exit;
    }
    
    while ($row = mysql_fetch_row($result)) {
        $sql = "DROP TABLE `$row[0]`";
        mysql_query($sql, $db1);
        echo "Table rows: {$row[0]} Deleted <br/>";
        $sql = "CREATE TABLE $row[0] SELECT * FROM $db2.$dbmaster.$row[0] ";
        mysql_query($sql, $db1);
        echo "Table: {$row[0]} created <br/>";
    
    }
    echo "<br/>done...";
    
    mysql_free_result($result);
    ?>
    

    那一行:

    $sql = "CREATE TABLE $row[0] SELECT * FROM $db2.$dbmaster.$row[0] ";
    

    只是不起作用。$db2不会让它转到另一个服务器并选择。

    如果这不能在上面做,有人知道我在做什么吗?我正在删除副本上的表,并根据主控中的表重新创建它们。然后,我在master中选择要放入重新创建的表中的数据。谢谢你

    更新: 创建表选择 我有问题, 我相信

    5 回复  |  直到 14 年前
        1
  •  7
  •   Pablo Santa Cruz    14 年前

    是的,在您的PHP脚本上,您可以在您有权访问的所有不同服务器上执行您想要的所有查询。

    您没有在 $sql 不过。在运行 mysql_query 功能。

    $sql = "SHOW TABLES FROM $dbname";
    $result = mysql_query($sql, $db1);
    

    是错误的。应该是:

    $sql = "SHOW TABLES";
    $result = mysql_query($sql, $db1);
    

    通过使用 $db1 关于第二个参数 mysql_查询 您已经指定只显示该数据库中的表。

    对其他句子进行同样的推理,你应该能够得到你想要的结果。

    $sql = "CREATE TABLE $row[0] SELECT * FROM $db2.$dbmaster.$row[0] ";
    

    如果要从中插入行 $db2 新创建的表 ,您需要:

    1. 在上运行查询 $二字
    2. 在上创建表 $db1美元
    3. 迭代 结果
    4. 在上的新表上插入记录 $db1美元

    没有 只用一句话就能做到。

        2
  •  3
  •   bot403    14 年前

    您需要发出一个select语句来从db1的表中选择行,然后在为db2发出insert语句的结果上循环。当然,在创建CREATETABLE语句创建空白表之后,您这样做。我还假设您正在尝试“createtableselectfrom”技巧,因为您不知道如何发出create table来复制db1中的表布局。你看到这个了吗?

    http://dev.mysql.com/doc/refman/5.0/en/show-create-table.html

        3
  •  0
  •   Phill Pafford    14 年前

    从查询中删除$db2数据库连接

    如果要在$db1上运行SQL,请使用以下命令

    mysql_query($sql, $db1);
    

    mysql_query($sql, $db2);
    
        4
  •  0
  •   kovshenin    14 年前

    我不认为这是最好的数据库设计,约翰尼,当然取决于你想达到的目标。如果只想在两台服务器上存储数据以实现冗余,那么应该使用MySQL复制。如果为了高可用性而分离数据,那么请考虑数据分片、分区,并且一定要查看MySQL代理。

    这将使您可以在应用程序之外完成所有工作,因此在分片/分区/备份/冗余方案更改时,您不必更改应用程序。这样的工具使您的应用程序完全看不到它。

    抱歉,如果这不是话题。

        5
  •  0
  •   CtRanger    14 年前

    关于设置这个,您有几个选择。

    1) 实现mysql异步复制。这将与您在PHP中所做的相同,但会更有效。 Mysql Documentation: Replication

    2) 修复脚本以将数据从主服务器流到备份服务器。 这可以通过创建表,然后将结果逐行加载到备份服务器的表中来完成。