【问题标题】:Can I use MySql Create Select on two different servers with PHP?我可以使用 PHP 在两个不同的服务器上使用 MySql Create Select 吗?
【发布时间】:2010-10-22 14:19:15
【问题描述】:

我正在尝试在两个不同的 MySQL 服务器之间使用 PHP 和 MySQL 的 Create Table Select。我不确定这可以用 SQL 来完成。我没有收到任何错误,但我什么也没做:

<?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 不会让它转到其他服务器并选择。

通过阅读 SO,我找到了类似的人,有人说无法完成并查看联合表,这对我不起作用。

如果上面无法做到这一点,是否有人知道我正在做的事情的方法?我将表放在副本上并根据主表中的表重新创建它们。然后我选择master中的数据放入重新创建的表中。谢谢

更新: 只是为了让我清楚。如果一切都在同一台服务器上并且我只有一个数据库连接,则该代码有效。正是由于create table select,我遇到了问题,我相信。此 SQL 需要同时使用两台服务器。创建表适用于刚刚删除表的一个数据库,但 select 是从第二个连接的数据库中选择的 - 同一 SQL 语句中的两个连接。

【问题讨论】:

  • @phill 如果我得到正确的答案,我会的。我尝试回去查看它们,但很多时候它们完全是错误的,或者我没有测试它们。
  • 只是快速浏览一下您的一些较早的问题,我认为它们已经得到了解答,并提供了多种解决方案。请注意,我只查看了 PHP 问题,但对于您的大多数问题,您的大多数问题都有一个以上的答案以及可接受的解决方案。
  • @phill 这不是我的经验,但我很乐意检查他们是否给出了正确的答案。我不想保留任何人的观点并感谢所有答案。

标签: php sql mysql


【解决方案1】:

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

您没有在$sql 上指定您的数据库。您在运行mysql_query 函数时指定它。

所以,你的代码:

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

错了。它应该只是:

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

通过在mysql_query 的第二个参数上使用$db1,您已经指定要仅显示该数据库中的表。

按照其他句子的相同推理,你应该能够得到你想要的结果。

你不能这样做:

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

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

  1. $db2 上运行查询以获取结果
  2. $db1 上创建表
  3. 迭代$db2 结果
  4. $db1 的新表中插入记录

没有魔法方法可以仅用一句话来做到这一点。

【讨论】:

  • 问题出在 Create Select Insert 中。该声明包含两个服务器。首先它在服务器一上创建新表,但选择来自服务器二。所以我不确定这对我有什么帮助。我希望我只是不明白一些简单的事情。谢谢。
  • 没有。您将无法将一个句子从一台服务器直接插入到另一台服务器中。您需要:在 SERVER1 上运行查询,在 SERVER2 上创建 TABLE,使用在 SERVER1 上运行的查询结果填充新表。没有直接的方法可以做到这一点,您必须在单独的句子中执行插入。
  • @pablo 并不意味着拼出所有列,例如:插入到 tbl1 (a, b, c, ...) 中的每个值 (a,b,c,...)桌子?
  • @johnny:是的,但如果需要,您可以随时从 METADATA 生成句子。
  • @pablo 我也不需要做一个非常完整的创建表来使我的结构正确,因为我不能使用创建表选择吗?
【解决方案2】:

您在正确的轨道上,但错过了重要的一点。您的 PHP 代码已打开到 db1 和 db2 的连接,但这并不意味着 db1 服务器知道 db2 服务器。因此,您不能向 db1 传递其中包含 db2 的查询并期望它从中获取行。您的 PHP 脚本必须充当中介。

您需要发出一条选择语句来从 db1 的表中选择行,然后循环遍历为 db2 发出插入语句的结果。当然,您在发出 create table 语句以创建空白表之后执行此操作。我还假设您正在尝试“create table select from”技巧,因为您不知道如何发出 create table 以复制 db1 中的表布局。你见过这个吗?

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

【讨论】:

  • 出于这个原因,我正在创建表选择,但我不知道另一种方法。我不确定您在提供的链接中告诉我什么。它只是向我展示了 create table 语句。感谢您理解我的代码。
  • 对不起。我的意思是,如果您想在 db2 中完全按照 db1 中的方式重新创建表,您可以在 db1 上发出该语句,然后使用它给您的 create 语句并在 db2 上发出该语句以获得该表的精确副本定义。创建表格后,您可以按照我上面的建议用数据填充它。
【解决方案3】:

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

如果你想在 $db1 上运行 SQL 使用这个

mysql_query($sql, $db1);

如果你想在 $db2 上运行 SQL 使用这个

mysql_query($sql, $db2);

【讨论】:

  • 问题是create select使用了两台服务器。
【解决方案4】:

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

这些可以让您完成应用程序之外的所有工作,因此您不必更改应用程序,以防您的分片/分区/备份/冗余方案发生变化。此类工具使您的应用程序完全看不到它。

很抱歉,如果这是题外话。

【讨论】:

    【解决方案5】:

    在设置方面,您有几个选择。

    1) 实现mysql异步复制。这将与您在 PHP 中尝试做的事情相同,但效率更高。 Mysql Documentation: Replication

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多