1

現在、マスター/スレーブ レプリケーション (MySQL) をバックアップ プランとして使用しています。マスターは更新/挿入クエリをスレーブデータベースにフィードし、定期的な完全バックアップを行うようにスレーブサーバーでスケジュールを自動的に設定します。私が最も懸念しているのは、スレーブがマスターと同じデータを持っていない可能性があるというまれなケースがあるということです。

私のスレーブが私のマスターデータベースと同じデータを持っていることを確認できる方法はありますか? 通常、いくつかのテーブルの ID をランダムにチェックし、最新の ID が同じである場合、両方が同じデータを持っている可能性が高いと思います (少なくとも、行数は同じです)。

この質問は、 StackExchange - Database AdministratorsServerfaultなどの他の StackExchange Web サイトの方が適している可能性がありますが、このサイトには最もアクティブな人々がいて、この質問はプログラマーにとってまったく無関係ではないため、ここを好みます。ただし、不適切だと思われる場合は、ご自由に移動してください。

4

2 に答える 2

1

1 つのアイデアは、マスターのテーブルの合計サイズを比較し、それをスレーブのテーブルの合計サイズと比較することです。

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 に答える