1

目前,我使用主从复制(MySQL)作为备份计划。主服务器将任何更新/插入查询提供给从数据库,我会自动在从服务器中设置一个计划来定期进行完整备份。我最担心的是,在极少数情况下,我的奴隶可能没有与我的主人相同的数据。

有什么方法可以确认我的从属数据库与我的主数据库具有相同的数据。通常,我会随机检查一些表的 ID,如果最新的 ID 相同,那么我认为它们更有可能具有相同的数据(至少具有相同的行数)。

这个问题可能更适合其他 StackExchange 网站,例如 S tackExchange - Database AdministratorsServerfault,但我更喜欢这里,因为这个网站有最活跃的人,而且这个问题与程序员并非完全无关。但是,如果您认为不合适,请随意移动。

4

2 回答 2

1

一个想法是比较master上表的总大小,并将其与slave上表的总大小进行比较:

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;

只是一个想法....

于 2013-06-05T11:08:29.773 回答
1

我找到了一个解决方案,但不能直接从 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>
于 2013-06-08T07:48:53.197 回答