![](/img/trans.png)
[英]mysql structural replication from master to slave with slave data intact
[英]Verify that master and slave database have the same data
目前,我正在使用主从复制(MySQL)作为备份计划。 主服务器将任何更新/插入查询提供给从属数据库,我会自动在从属服务器中设置时间表以进行常规的完全备份。 我最担心的是,在极少数情况下,我的从服务器可能与我的主机没有相同的数据。
有什么方法可以确认我的从服务器具有与主数据库相同的数据 。 通常,我会随机检查某些表的ID,如果最新的ID是相同的,则我认为它们更有可能具有相同的数据(至少具有相同的行数)。
这个问题可能更适合其他StackExchange网站,例如S tackExchange-Database Administrators和Serverfault ,但是我在这里更喜欢,因为该站点上的人员最活跃,并且这个问题与程序员并不完全无关。 但是,如果您认为不合适,请随时提出。
一种想法是比较主服务器上表的总大小,并将其与从服务器上表的总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;
只是一个想法....
我找到了一个解决方案,但是不能直接通过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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.