【问题标题】:mysqldump or mysqlhotcopy to backup large MySQL database?mysqldump 或 mysqlhotcopy 备份大型 MySQL 数据库?
【发布时间】:2009-06-03 04:18:00
【问题描述】:

我有一些 NAS 存储可以通过我的专用托管服务提供商进行备份。我使用 WHM 设置自动每日备份来备份数据库和帐户。服务器托管一个站点。当它进行备份时,它会进行 mysql 转储,并且在进行备份的整个过程中基本上都会关闭站点,因为在转储发生时没有人可以连接到数据库。该网站通常会关闭大约 30 秒到一分钟(这可能看起来不多,但对于这种网站来说,这是一个真正的问题)。

是否有更好的备份方法来避免这种情况发生(mysqlhotcopy 或 Maatkit 会更好吗?),无论是备份到 NAS 的不同方法,还是根本不使用 NAS 并使用其他方法。

【问题讨论】:

    标签: mysql backup mysqldump


    【解决方案1】:

    mysqlhotcopy 比 mysqldump 快,但不做 InnoDB。

    为了进行备份,我使用复制并在从属设备上进行转储。在备份过程中,您的停机时间为 0,并且没有负载峰值。

    【讨论】:

    • 我真的不想为一整台额外的服务器付费,只是做备份。我刚刚读到的东西是 Maatkit,它的并行 mysqldump 听起来很有趣。我的服务器有 16 个 CPU,所以这基本上是让从属服务器进行备份的下一个最佳选择吗?
    • 我知道这是一个迟到的回复,但不是 - 磁盘是这里的限制因素,更多的 CPU 不会帮助你。如果你的原。数据库被拆分为 3 个磁盘,而您正在复制到 3 个其他磁盘,它会快近 3 倍
    【解决方案2】:

    对于 InnoDB,没有复制的最佳解决方案似乎是:

    mysqldump mydbname --result-file=mydbname.sql --verbose --single-transaction
    

    这使用 InnoDB 的事务快照功能,并允许正常(写入!)数据库操作而不会中断。使用--master-data=1,您甚至应该能够自动记录快照的二进制日志位置。但是,在同一服务器上的多个数据库上单独执行此操作时,二进制日志位置似乎毫无价值。

    一个缺点是当你有一些 MyISAM 表时它不能正常工作。我自己使用 MySQL 的全文索引,它需要未分区的 MyISAM 表。但是,可以这样安排,MyISAM 表只是辅助数据集,将 InnoDB 表中已经存在的文本转储到其中,以便在需要时可以从头开始重建 MyISAM 表。我有一个脚本,它检查数据库的表类型并使用--single-transaction 而不是--lock-tables,只要一个数据库中只有 InnoDB 表。

    另一个解决方案是使用一些磁盘或文件系统快照功能,例如 LVM。但是,由于 LVM 极其愚蠢的写时备份机制(被错误地声称是 COW,这不是常识),当存在快照时写入时,这将是一个相当大的性能损失。因此,一个非常好的解决方案似乎是 Solaris ZFS 或 FreeBSD UFS 上的 MySQL。两者都支持有效的快照,并且由于它们的年龄而相对稳定。 Btrfs 也有高效的快照,但仍是 BETA。

    【讨论】:

      【解决方案3】:

      您不需要另一台服务器,只需在同一台机器上的沙箱中安装另一个 MySQL。负载可能会稍微飙升,但您不会遇到任何锁定问题。

      【讨论】:

        【解决方案4】:

        好吧,还有另一种相当有效的快照技术:mdraid1 -- Linux softraid level 1。如果你在 mdraid1 上运行 MySQL,只需插入另一个磁盘,让它同步,停止 mysql,进行同步,删除第三个和同步raid组件,重启mysql。如果您在 raid1 中使用位图,则重新同步以拍摄另一个快照通常非常快....

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-25
          • 1970-01-01
          • 2021-09-12
          • 2014-02-11
          • 1970-01-01
          相关资源
          最近更新 更多