MariaDB/MySQL: 获取InnoDB的校验和table
MariaDB/MySQL: Get checksum of InnoDB table
如何在 InnoDB table 上获得可靠的校验和?我想要类似 MyISAM 的 CHECKSUM TABLE foo QUICK;
的东西,而且它需要很快。我正在开发一种工具来可靠地监控数据库中的变化并迅速做出反应。
InnoDB tables 不更新 information_schema.TABLES
中的 UPDATE_TIME
,我不能随意将自动更新的 last_update 列添加到 table 所以我可以做到 MAX(last_update)
。无论如何,它不适用于删除。另外,我对只有整秒精度的时间戳引入的竞争条件不满意。
我看到有人建议使用 information_schema.INNODB_SYS_TABLESTATS
中的 NUM_ROWS
和 MODIFIED_COUNTER
作为校验和,但在我对 MariaDB 10.0 的测试中,这些值在 UPDATE
查询。
每次客户端写入 InnoDB 时,日志序列号都会增加。
mysql> pager grep "Log sequence number"
PAGER set to 'grep "Log sequence number"'
mysql> show engine innodb status\G
Log sequence number 243755747560
1 row in set (0.00 sec)
要知道哪个 table 被修改了,您可以扫描重做日志。看REDO日志文件格式的说明https://www.sba-research.org/wp-content/uploads/publications/WSDF2012_InnoDB.pdf
另一种方法:开启binlog。所有的改变都归于它。监控它。
更新时 MODIFIED_COUNTER 未更改是 MySQL 和 MariaDB 中的错误。报告为 http://bugs.mysql.com/bug.php?id=77301 我想我会等待这个问题得到修复,因为它很好地解决了我的问题。
如何在 InnoDB table 上获得可靠的校验和?我想要类似 MyISAM 的 CHECKSUM TABLE foo QUICK;
的东西,而且它需要很快。我正在开发一种工具来可靠地监控数据库中的变化并迅速做出反应。
InnoDB tables 不更新 information_schema.TABLES
中的 UPDATE_TIME
,我不能随意将自动更新的 last_update 列添加到 table 所以我可以做到 MAX(last_update)
。无论如何,它不适用于删除。另外,我对只有整秒精度的时间戳引入的竞争条件不满意。
我看到有人建议使用 information_schema.INNODB_SYS_TABLESTATS
中的 NUM_ROWS
和 MODIFIED_COUNTER
作为校验和,但在我对 MariaDB 10.0 的测试中,这些值在 UPDATE
查询。
每次客户端写入 InnoDB 时,日志序列号都会增加。
mysql> pager grep "Log sequence number"
PAGER set to 'grep "Log sequence number"'
mysql> show engine innodb status\G
Log sequence number 243755747560
1 row in set (0.00 sec)
要知道哪个 table 被修改了,您可以扫描重做日志。看REDO日志文件格式的说明https://www.sba-research.org/wp-content/uploads/publications/WSDF2012_InnoDB.pdf
另一种方法:开启binlog。所有的改变都归于它。监控它。
更新时 MODIFIED_COUNTER 未更改是 MySQL 和 MariaDB 中的错误。报告为 http://bugs.mysql.com/bug.php?id=77301 我想我会等待这个问题得到修复,因为它很好地解决了我的问题。