使用从机转储的MySQL增量备份(InnoDB和MyISAM)

使用从机转储的MySQL增量备份(InnoDB和MyISAM),mysql,backup,replication,innodb,myisam,Mysql,Backup,Replication,Innodb,Myisam,假设我已经有一个主数据库服务器和一个从数据库服务器正在运行 我想在混合中引入增量备份/时间点恢复。因为我已经有了用于复制的二进制日志,所以它应该像进行完全备份和存储日志位置一样简单 然而,我的服务器上既有MyISAM表,也有InnoDB表,对于每种情况下如何进行完整备份,似乎都有相互矛盾的建议。如果它是严格意义上的InnoDB,我可以使用--single事务处理mysqldump,但该选项警告我MyISAM可能仍然会被更改 我的问题如下: (1) MySQL手册建议备份以下内容是否合理 mysq

假设我已经有一个主数据库服务器和一个从数据库服务器正在运行

我想在混合中引入增量备份/时间点恢复。因为我已经有了用于复制的二进制日志,所以它应该像进行完全备份和存储日志位置一样简单

然而,我的服务器上既有MyISAM表,也有InnoDB表,对于每种情况下如何进行完整备份,似乎都有相互矛盾的建议。如果它是严格意义上的InnoDB,我可以使用--single事务处理mysqldump,但该选项警告我MyISAM可能仍然会被更改

我的问题如下:

(1) MySQL手册建议备份以下内容是否合理

mysqldump--单事务--刷新日志--主数据=2--所有数据库>whatever.sql

…将不合适,因为MyISAM表可能会更改(表不会用--single transaction锁定),因此新日志文件将启动,但它可能包含对MyISAM表的查询,这些表在进入转储之前实际上已经在服务器上运行过(增量恢复会在不需要查询时尝试重新执行这些查询)

(2) 是使用MyISAM和InnoDB表获得“正确”完整备份的唯一方法--锁定所有表?(或者在此时关闭服务器/复制文件,因为所有文件都已锁定)

我假设这些问题的答案是肯定的,但如果我错了,请纠正我,因为我的下一个想法是基于它的

我希望将主服务器上的中断降至最低,因此我正在考虑根据以下说明对从服务器进行完全转储:

这些方向实际上是为了设置一个从机的从机,但我想知道,以下是合理的吗

每天一次:

  • 阻止奴隶
  • 显示从属状态并获取主日志文件和位置
  • 在未对从属服务器(MyISAM或InnoDB)进行任何更改的情况下对其进行完全转储
  • 再次启动奴隶机
  • 将我的完整转储移到某个备份目录中的主服务器
  • 在恢复的情况下:

  • 从上面的(5)恢复到完全转储
  • 运行时间点恢复,使用此处的位置从上面(2)中的位置转到我要恢复到的任何位置
  • 这是合法的吗?我不明白为什么奴隶的完全倾卸和主人的完全倾卸会有任何不同,所以看起来是可以的


    感谢您的帮助!

    您的一天一次计划非常合理,原因很简单:您首先停止了从机。不会有新的事务。我想提出一些其他建议

    在从机上,请在/etc/my.cnf中设置以下内容

    [mysqld]
    innodb_max_dirty_pages_pct=0
    
    原因如下:

    在从属服务器处理mysqldump时,如果任何表在innodb缓冲池中注册了脏页,则必须将这些页刷新到磁盘。我注意到在mysqldump中,您已经发出了此选项。默认情况下,innodb_max_dirty_pages_pct为90。任何脏页都必须写入磁盘。如果innodb_max_dirty_pages_pct为零l同时,刷新innodb缓冲池更快

    您可以在不重新启动mysql的情况下动态设置。只需运行以下命令:

    SET GLOBAL innodb_max_dirty_pages_pct = 0;
    
    这将使innodb缓冲池保持精简

    我还看到您的mysqldump命令中有--master data=2。这只有在从机上启用二进制日志时才有效。否则,您需要从主机检索主日志和位置,因为mysqldump不能这样做。下面是如何从从从机获取主机日志文件和位置:

    步骤1)运行“显示从属状态\G”并重新编辑到ShowSlaveStatus.txt

    步骤2)从ShowSlaveStatus.txt获取以下信息
    中继主机日志文件
    执行主日志位置

    步骤3)将这两个值写入转储文件的后面

    还有一件事:


    请在mysqldump命令中添加--routines--triggers。您永远不知道何时会决定编写存储过程和触发器。此外,无需锁定表,因为从机已停止。

    您的每日一次计划非常合理,原因很简单:您首先停止了从机。不会有新的交易。我想提出一些额外的建议

    在从机上,请在/etc/my.cnf中设置以下内容

    [mysqld]
    innodb_max_dirty_pages_pct=0
    
    原因如下:

    在从属服务器处理mysqldump时,如果任何表在innodb缓冲池中注册了脏页,则必须将这些页刷新到磁盘。我注意到在你的mysqldump中你已经发布了这个选项。默认情况下,innodb_max_dirty_pages_pct为90。任何脏页都必须写入磁盘。如果innodb_max_dirty_pages_pct始终为零,则刷新innodb缓冲池会更快

    您可以在不重新启动mysql的情况下动态设置。只需运行以下命令:

    SET GLOBAL innodb_max_dirty_pages_pct = 0;
    
    这将使innodb缓冲池保持精简

    我还看到--master data=2在mysqldump命令中。只有在从机上启用二进制日志时,这才有效。如果没有,则需要从主日志中检索主日志和位置,因为mysqldump不能这样做。以下是如何从从属服务器获取主服务器的日志文件和位置:

    步骤1)运行“显示从属状态\G”并重新编辑到ShowSlaveStatus.txt

    步骤2)从ShowSlaveStatus.txt获取以下信息
    中继主机日志文件
    执行主日志位置

    步骤3)将这两个值写入转储文件的后面

    还有一件事:

    请在mysqldump命令中添加--routines--triggers。您永远不知道何时会决定编写存储过程和触发器。另外,如果从机停止,则无需锁定表