我正在尝试在两个不同的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语句中的两个连接。
答案 0 :(得分:7)
是的,在您的PHP脚本上,您可以在您有权访问和访问的所有不同服务器上执行所需的所有查询。
但您没有在$sql
上指定数据库。您在运行mysql_query
函数时指定它。
所以,你的代码:
$sql = "SHOW TABLES FROM $dbname";
$result = mysql_query($sql, $db1);
错了。它应该只是:
$sql = "SHOW TABLES";
$result = mysql_query($sql, $db1);
在$db1
的第二个参数上使用mysql_query
,您已经指定要仅显示该数据库中的表。
对其他句子采用相同的推理,你应该能够得到你想要的结果。
你将无法做到这一点:
$sql = "CREATE TABLE $row[0] SELECT * FROM $db2.$dbmaster.$row[0] ";
如果要将$db2
中的行插入新创建的表中$db1
,则需要:
$db2
上运行查询以获得结果$db1
$db2
结果$db1
没有 magic 方法只能在一个句子中执行此操作。
答案 1 :(得分:3)
你走在正确的轨道上,却错过了重要的一点。您的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
答案 2 :(得分:0)
从查询中删除$ db2数据库连接
如果要在$ db1上运行SQL,请使用此
mysql_query($sql, $db1);
如果要在$ db2上运行SQL,请使用此
mysql_query($sql, $db2);
答案 3 :(得分:0)
我不认为这是最好的数据库设计Johnny,当然取决于你想要实现的目标。如果您只是想在两台服务器上存储数据以实现冗余,那么您应该使用MySQL Replication。如果您为了高可用性而分离数据,那么请考虑数据分片,分区并明确地查看MySQL代理。
这些将允许您完成应用程序之外的所有工作,因此您不必更改应用程序,以防分片/分区/备份/冗余方案发生更改。这些工具使您的应用程序完全不可见。
很抱歉,如果这是偏离主题的话。
答案 4 :(得分:0)
关于设置它,你有几个选择。
1)实现mysql异步复制。这将与您尝试在PHP中执行相同的操作,但效率会更高。 Mysql Documentation: Replication
2)修复脚本以将数据从主服务器流式传输到备份服务器。 这可以通过创建表然后逐行将结果加载到备份服务器的表中来完成。