2013-06-05 37 views
1

目前,我正在使用主從複製(MySQL)作爲備份計劃。主飼料任何更新/插入查詢從屬數據庫,我會自動設置從屬服務器的日程安排進行定期完整備份。我最關心的是可能有一種罕見的情況,即我的奴隸可能與我的主人沒有相同的數據。驗證主從數據庫是否具有相同的數據

有什麼辦法可以確認我的奴隸擁有與我的主數據庫相同的數據。通常,我隨機檢查一些表的ID,如果最新的ID是相同的,那麼我認爲它們更可能具有相同的數據(至少具有相同的行數)。

這個問題可以適用於其他StackExchange網站,如S tackExchange - Database AdministratorsServerfault,但我更喜歡這裏,因爲這個網站有最活躍的人,這個問題是不完全不相關的程序員。但是,如果您認爲不合適,請隨時移動。

回答

0

我找到了解決辦法,但不能從SQL直接完成,所以我決定寫如下腳本:

<?php 
    function tablesCheckSum($host, $database, $user, $pass) { 
     try { 
      $db = new PDO("mysql:host={$host}; dbname={$database}", $user, $pass); 
      $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

      $result = $db->query('SHOW TABLES;')->fetchAll(); 

      // Construct tables 
      foreach($result as $value) { 
       $row = $db->query("CHECKSUM TABLE `" . $value[0] . "`")->fetch(); 
       $tables[substr($row[0], strlen($database) + 1)] = $row[1]; 
      } 
     } catch(PDOException $ex) { 
      print_r($ex->getMessage()); 
     } 

     return $tables; 
    } 

    // Collecting all the 
    $db1 = tablesCheckSum('host1', 'db1', 'root', 'pass'); 
    $db2 = tablesCheckSum('host2', 'db1', 'root', 'pass'); 
?> 


<table> 
    <tr> 
     <td>Table Name</td> 
     <td>DB1 Checksum</td> 
     <td>DB2 Checksum</td> 
     <td>Matched?</td> 
    </tr> 
<?php 
    foreach($db1 as $key => $value) { 
?> 
    <tr> 
     <td><?php echo $key; ?></td> 
     <td><?php echo $value; ?></td> 
     <td><?php echo $db2[$key]; ?></td> 
     <td><?php echo ($value == $db2[$key])?'True':'False'; ?></td> 
    </tr> 
<?php 
    } 
?> 
</table> 
1

一個想法是比較對主表的總大小,並將其與從屬節點上的表的總SIE:

select sum(data_length + index_length) "Tables Size in Bytes" 
from information_schema.tables; 

授予它不會告訴你是否有完全一樣的數據但是數據的機會有什麼不同,但是數據的大小正好是,一樣嗎?

編輯

您可以進一步擴展這種通過串聯下面的元數據,創造一種校驗值:

  • 總錶行

  • 總數據長度

  • 總指數長度

事情是這樣的:

select cast(concat(sum(table_rows),sum(data_length),sum(index_length)) as char) as checkSum from information_schema.tables; 

只是一個想法....

+0

+1表示想法,但有可能固定大小的列可能有一個或兩個不同的值,並且表的大小仍然相同。 – invisal

+1

我想知道是否有某種方式來生成兩個數據庫之間的校驗和值並檢查它是否相同。 – invisal

+0

好主意。修改我的答案以獲得某種校驗和 –

相關問題