2016-01-16 67 views
1

我在2個不同的服務器上有匹配的數據庫(mysql複製不是一個選項)。 我需要查看是否有一個記錄從一個表2中丟失,如果是這樣,則截斷表2,然後從表1複製到表2。 每個表位於不同的IP /服務器上。如何將遠程服務器上的表從遠程服務器上的表複製到不同遠程數據庫上的表中mysql5.6與PDO

代碼:

  $pdoyd = new PDO(
        'mysql:host=' . DB_HOST_YODA . ';dbname=' . DB_DATABASE_DNS, 
        DB_USER_DNS, 
        DB_PASSWORD 
      ); 
      $pdoyd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $pdoyd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      $truntbl = array('cryptokeys', 'domains', 'records'); 
      foreach($truntbl as $tbl){ 
        $sql = 'truncate '.$tbl; 
        $statementyd = $pdoyd->prepare($sql); 
        $useryd = $statementyd->execute(); 
        var_dump($statementyd); 
        echo '<br>'; 
      } 

什麼是缺失的記錄從一個表1級的服務器上覆制到另一臺不同的服務器上的一個有效的方法?

+0

看看http://stackoverflow.com/questions/15577073/how-to-sync-two-mysql-tables – Matt

回答

1

您可以打開兩個連接。使用一個從源服務器讀取,另外兩個插入目標服務器。當您嘗試覆蓋現有行時,請使用ON DUPLICATE KEY IGNORE選項來防止出現錯誤,以便僅插入缺失的行。

$pdo1 = new PDO('mysql:host=server1;dbname=xxx', $username1, $password1); 
$pdo2 = new PDO('mysql:host=servrer2; dbname=xxx', $username2, $password2); 

$insert_stmt = $pdo2->prepare("INSERT INTO yourTable (col1, col2, col3, ...) VALUES (:col1, :col2, :col3, ...) ON DUPLICATE KEY IGNORE"); 
$select_results = $pdo1->query("SELECT * FROM yourTable"); 
while ($row = $select_results->fetch(PDO::FETCH_ASSOC)) { 
    $insert_stmt->execute($row); 
} 
+0

嘿,兄弟,我有一些問題得到這些值到表中。你知道一個解決辦法嗎?https://bpaste.net/show/7ae8b04dd187 – doeJ

+0

改變'fetchAll'到'fetch'。或者使用'foreach $ select_results-> fetchAll(PDO :: FETCH_ASSOC)作爲$ row'而不是'while'。 – Barmar

0

轉到您的PHPAdmin並嘗試導出表。然後在文本編輯器中打開.sql文件,找到缺失的數據。最後,刪除任何重複數據,並嘗試使用.sql文件中的MySQL代碼並將其放入具有目標的終端中。

+0

Howdo你建議與PDO做到這一點? – Shadow

+0

@Angus Leung我在PDO兄弟中間。我不想用GUI做任何事情。我要讓Timbuktu的joe schmuckatelli訪問我的後端數據庫? o.0這是一個功能是在一個自定義的應用程序。但是,謝謝你。 – doeJ

+0

太棒了!希望你成功! –

1

如果你只需要檢查缺失的記錄,不更改的記錄,那麼你有兩個選擇:

  1. 兩個表的主鍵拉入PHP數組並使用array_diff()函數來獲取列表在一張桌子上存在並且不在另一張桌子中的pks。如果表中沒有那麼多記錄,則此方法很有效。

  2. 從一個表中拉出主鍵,並使用批量插入或加載數據infile sql命令將它們插入另一個數據庫中的臨時表中。之後,您可以在where子句中使用左連接和空標準來獲取其他表中不可用的pks列表。

在較長時間內,您可能會嘗試使用自動增量字段或時間戳記來跟蹤進度,以確定哪些記錄已完全同步。您只需檢查後續記錄。

+0

其實關鍵並不重要。如何將其從一個表複製到另一個表中,而在不同的服務器上仍然是主要問題。應該只是一個簡單的一行SQL查詢,如「將ipaddress.database.table1複製到differentipaddress.database.table1 ...這些密鑰的順序可以是任意的,原始的將會很好,但如果沒有則不會是biggie。 – doeJ

+0

您不能這樣做,這兩臺服務器沒有直接連接,你必須通過php傳輸數據。 – Shadow

+0

顯然,你可以將一個系統中的完整表導出到一個文件中,並將它導入到另一臺服務器中,而php僅用於傳輸文件。 – Shadow