2013-06-05 38 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

好主意。修改我的答案以获得某种校验和 –

相关问题