使用Perl'确定MySQL状态;DBI模块

使用Perl'确定MySQL状态;DBI模块,mysql,perl,dbi,Mysql,Perl,Dbi,我正在使用Perl脚本转储MySQL数据库的内容。我使用的Perl模块是CPAN的DBI。有没有办法告诉我,自从上次转储以来,数据库的状态是否发生了变化,这样我就不需要重新转储数据库了?如果您的服务器启用了二进制日志记录,您应该能够将SHOW binary LOGS的输出与以前的运行进行比较,以查看是否有任何变化。如果您的所有表都使用InnoDB引擎,我猜您可以检查: 如果自上次检查InnoDB表以来,该表已被写入,则该值将增加 可能有误报。快速检查表明,该值在以下期间和之后增加: START

我正在使用Perl脚本转储MySQL数据库的内容。我使用的Perl模块是CPAN的DBI。有没有办法告诉我,自从上次转储以来,数据库的状态是否发生了变化,这样我就不需要重新转储数据库了?

如果您的服务器启用了二进制日志记录,您应该能够将
SHOW binary LOGS
的输出与以前的运行进行比较,以查看是否有任何变化。

如果您的所有表都使用InnoDB引擎,我猜您可以检查:

如果自上次检查InnoDB表以来,该表已被写入,则该值将增加

可能有误报。快速检查表明,该值在以下期间和之后增加:

START TRANSACTION; INSERT INTO [...]; ROLLBACK;
但我相信,如果发生任何写入,该值必须更改。在上一次转储开始之前和当前转储完成之后检查它,如果它的值保持不变,并且所有表都是InnoDB,则转储应该是相同的

也就是说

如果您需要转储整个MySQL数据库,并且您完全关心一致性,那么您几乎肯定希望使用以下方法生成该转储:

或者,如果
SHOW TABLE STATUS
显示所有表都在使用InnoDB引擎

mysqldump --single-transaction databasename
这具有相同的效果,但可能会在更短的时间内锁定表

出于许多原因,试图编写自己的脚本以获得一致的转储几乎肯定是一个坏主意。(很难知道您何时成功;这意味着可能会出现错误;具有一致性的错误可能会产生微妙的破坏性影响,这是最糟糕的;您的脚本将更慢,并且可能会使用更多的RAM。)


默认情况下,
mysqldump
以标准SQL发出其输出。如果您想自己操作数据,可以通过添加
--tab=filename

或自己操作来获得以制表符分隔的输出。在数据库中创建一个“日志表”,并在每次进行数据转储时插入表名和时间戳。我想应该是几行DBI代码


HTH

MySQL是否提供了这样的功能?显示二进制日志代表什么?@syker:哪些日志文件中写入了多少数据;如果这是不变的,您的数据库应该是不变的。
mysqldump databasename
mysqldump --single-transaction databasename