使用Perl的DBI模块确定MySQL状态

时间:2010-08-10 01:33:57

标签: mysql perl dbi

我正在使用Perl脚本来转储MySQL数据库的内容。我正在使用的Perl模块是CPAN的DBI。是否有任何方法可以判断自上次转储以来db的状态是否已更改,以便我不需要重新转储数据库?

3 个答案:

答案 0 :(得分:1)

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

SHOW STATUS LIKE 'innodb_buffer_pool_write_requests';

如果自上次检查后对任何InnoDB表进行了写操作,那么该值将会增加。

可能存在误报。快速检查显示在a:

期间和之后该值会增加
START TRANSACTION; INSERT INTO [...]; ROLLBACK;

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

那说......

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

mysqldump databasename

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

mysqldump --single-transaction databasename

具有相同的效果,但可能会在很短的时间内锁定您的表格。

由于很多原因,尝试编写自己的脚本以获得一致的转储几乎肯定是个坏主意。 (很难知道你什么时候成功;这意味着错误很可能;一致性的错误可能会产生微妙的破坏性影响,这是最糟糕的;你的脚本会慢一点,可能会使用更多的RAM。)

默认情况下,mysqldump在标准SQL中发出其输出。如果您想自己操作数据,可以通过添加--tab=filename来获得制表符分隔的输出。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

或者,亲自动手。在数据库中创建“日志表”,并在每次执行数据转储时插入表名和时间戳。应该是我想的几行DBI代码。

HTH