繁体   English   中英

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

[英]Can I use MySql Create Select on two different servers with PHP?

我试图在两个不同的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中的数据放入重新创建的表中。 谢谢

更新:就这样我可以清楚。 如果所有内容都在同一台服务器上并且我只有一个数据库连接,则代码可以工作。 我相信是因为创建表选择我有问题。 此SQL需要同时使用两个服务器。 create table用于一个刚刚删除它的表的数据库,但select是从第二个连接的数据库中选择的 - 同一个SQL语句中的两个连接。

是的,在您的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上的新表上插入记录

只用一句话就没有神奇的方法。

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

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

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

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

如果要在$ db1上运行SQL,请使用此方法

mysql_query($sql, $db1);

如果要在$ db2上运行SQL,请使用此方法

mysql_query($sql, $db2);

我不认为这是最好的数据库设计Johnny,当然取决于你想要实现的目标。 如果您只是想在两台服务器上存储数据以实现冗余,那么您应该使用MySQL Replication。 如果您为了高可用性而分离数据,那么请考虑数据分片,分区并明确地查看MySQL代理。

这些将允许您完成应用程序之外的所有工作,因此您不必更改应用程序,以防分片/分区/备份/冗余方案发生更改。 这些工具使您的应用程序完全不可见。

对不起,如果这是偏离主题。

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

1)实现mysql异步复制。 这将与您尝试在PHP中执行相同的操作,但效率会更高。 Mysql文档:复制

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM