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