2010-10-22 79 views
5

我想在兩個不同的MySQL服務器之間使用PHP和MySQL的Create Table Select。我不確定這可以用SQL來完成。我沒有得到任何錯誤,但我一事無成之一:我可以在兩臺使用PHP的服務器上使用MySql Create Select嗎?

<?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不會將其轉到其他服務器並進行選擇。

從做一些閱讀我發現有人相似,有人說它不能做,並看看聯合表,這將不適合我。

如果這不能做到上面沒有人知道一種方法來做我在做什麼?我將刪除表上的副本,並根據主表中的表重新創建它們。然後我選擇主數據放入重新創建的表格。謝謝

更新: 就這樣,我可以清楚。如果所有內容都在同一臺服務器上,並且我只有一個數據庫連接,則該代碼可以工作這是因爲創建表選擇,我有問題,我相信。此SQL需要同時使用兩臺服務器。 create table用於一個數據庫,只刪除它的表,但select從第二個連接的數據庫中選擇 - 在同一個SQL語句中有兩個連接。

+0

@phill我會,如果我得到的答案是正確的。我試着回頭看看它們,但很多時候它們只是錯誤的,或者我沒有測試過它們。 – johnny 2010-10-22 14:39:34

+0

只需快速瀏覽一些您認爲已經回答的老問題,並提供多種解決方案。注意我只看了PHP的問題,但對於大多數問題和解決方案,還有更多的答案。 – 2010-10-22 15:03:49

+0

@這不是我的經驗,但我很樂意檢查他們,如果他們給出正確的答案。我不想保留任何人的觀點並欣賞所有答案。 – johnny 2010-10-25 15:24:07

回答

7

是的,在您的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個結果上$db1

新表

  • 插入記錄有在只有一句話這樣做的沒有魔法方式。

  • +0

    問題出在創建選擇插入。該聲明包含兩臺服務器。首先它在服務器1上創建新表,但選擇來自服務器2。所以我不確定這將如何幫助我。我希望我不明白簡單的事情。謝謝。 – johnny 2010-10-22 14:35:35

    +0

    不可以。您將無法直接插入一個服務器中的一個句子到另一個服務器。您需要:在SERVER1上運行查詢,在SERVER2上創建TABLE,使用在SERVER1上運行的查詢結果填充新表。沒有直接的做法,你將不得不在單獨的句子上執行插入。 – 2010-10-22 14:39:32

    +0

    @pablo不會意味着拼出所有的列,如:爲每個表插入tbl1(a,b,c,...)值(a,b,c,...)? – johnny 2010-10-22 14:45:05

    0

    如果你想在$ DB1使用運行SQL刪除您查詢

    的$ DB2數據庫連接這個

    mysql_query($sql, $db1); 
    

    如果你想運行在$ DB2使用這種

    mysql_query($sql, $db2); 
    
    SQL
    +0

    問題是create select使用兩臺服務器。 – johnny 2010-10-22 14:36:35

    0

    我不認爲這是最好的數據庫設計約翰尼,當然取決於你想達到什麼。如果你只是想在兩臺服務器上存儲冗餘數據,你應該使用MySQL複製。如果您爲了高可用性目的而分離數據,那麼考慮數據分片和分區,並且確實要看看MySQL代理。

    這些將使您可以在應用程序之外執行所有工作,因此在分片/分區/備份/冗餘方案更改的情況下,您不必更改應用程序。這些工具使您的應用程序完全不可見。

    對不起,如果這是題外話。

    3

    你在正確的軌道上,但缺少重要的一點。您的PHP代碼已經打開了與db1和db2的連接,但這並不意味着db1服務器知道db2服務器。因此,您無法將db1中的查詢與db2一起傳遞,並期望它從中獲取行。您的PHP腳本必須充當中介。

    您需要發出select語句以從db1表中選擇行,然後循環發出db2插入語句的結果。當然,在你發出create table語句來創建空白表之後,你會這樣做。我還假設你正在嘗試'從表中選擇'技巧,因爲你不知道如何發佈create table來複制db1中表格的佈局。你見過這個嗎?

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

    +0

    我正在做創建表選擇的原因,但我不知道另一種方式來做到這一點。我不確定你在你提供的鏈接中告訴我什麼。它只是向我展示了create table語句。感謝您瞭解我的代碼。 – johnny 2010-10-22 14:43:11

    +0

    對不起。我所說的是,如果你想重新創建db2中的表,就像它在db1中一樣,你可以在db1上發出該語句,然後採用它給你的create語句並在db2上發出該語句以獲得表的精確副本定義。一旦你創建了表格,你可以按照上面的建議填充數據。 – bot403 2010-10-22 14:51:18

    0

    有你的問候有幾個選擇來設置此功能。

    1)實現mysql異步複製。這會做你想要在PHP中做同樣的事情,但會更有效率。 Mysql Documentation: Replication

    2)修復腳本以將數據從主服務器傳輸到備份服務器。 這可以通過創建表並將結果逐行加載到備份服務器的表中來完成。