【问题标题】:Is there a faster way to load mysqldumps? [duplicate]有没有更快的方法来加载 mysqldumps? [复制]
【发布时间】:2009-07-10 21:26:19
【问题描述】:

可能重复:
Speeding up mysql dumps and imports

mysqldump 相当快,但使用mysql my_database < my_dump_file.sql 加载中型数据库(20-30 兆)的转储需要几分钟时间

是否有一些我可以调整的 mysql 设置来加快负载?有没有更好的方法来加载保存的数据?

我已经尝试将 mysqlimport 实用程序与基于 CSV 的转储一起使用。这些加载速度稍快 - 但不是明显 - 更快。我很想只复制原始数据库文件,但这似乎是个坏主意。

【问题讨论】:

  • 仅供参考...我的 Raid 5 驱动器出现故障,这导致 MySQL 还原的性能非常差。通常需要 40 分钟的时间是 24 小时。仅供参考。

标签: mysql mysqldump mysql-management


【解决方案1】:

假设您正在使用 InnoDB...

我有一堆现有的 mysqldump 输出文件,我想在合理的时间内导入这些文件。这些表(每个文件一个)大约 500MB,每个包含大约 5,000,000 行数据。使用以下参数,我能够将插入时间从 32 分钟减少到 3 分钟以下。

innodb_flush_log_at_trx_commit = 2
innodb_log_file_size = 256M
innodb_flush_method = O_DIRECT

您还需要有一个相当大的innodb_buffer_pool_size 设置。

因为我的插入是一次性的,所以后来我恢复了设置。如果您打算长期使用它们,请确保您知道它们在做什么。

我在Cedric Nilly's blog 上找到了使用这些设置的建议,每个设置的详细说明可以在MySQL documentation 中找到。

【讨论】:

  • 这是我第二次使用这种方法了。在这两种情况下(不同的数据库),它将导入时间从几小时缩短到几分钟。谢谢!
  • 我最近不得不为一个包含约 8 列且主要是 int 数据的简单表执行此操作。在应用这些之前,我得到了大约 30 次插入/秒(禁用索引)。更改后,我获得了约 600 次插入/秒。最大的胜利来自将 innodb_flush_log_at_trx_commit 从“1”(默认)设置为“2”,它刷新写入以记录每一秒,而不是在每个事务上(当自动提交为真时,在每次插入之后。默认情况下为真)
  • 你能解释一下编辑这个值时会发生什么吗?让我们了解。我刚用这个,速度很棒。
【解决方案2】:

【讨论】:

  • 谢谢,这正是我想要的!
  • 描述说软件有bug,不应该用于备份或重要数据!太糟糕了......我想知道我是否可以在不同的表上并行运行多个 mysqldumps 以获得加速?
【解决方案3】:

确保在转储时使用 mysqldump 的 --opt 选项。这将使用批量插入语法、延迟键更新等...


如果您只使用 MyISAM 表,您可以通过停止服务器、将它们复制到停止的服务器并启动它来安全地复制它们。

如果您不想停止源站服务器,可以按照以下步骤操作:

  1. 获取所有表的读锁
  2. 刷新所有表
  3. 复制文件
  4. 解锁表格

但我很确定,当您将它们放置到位时,您的复制到服务器需要停止。

【讨论】:

  • 其实这就是mysqlhotcopy的作用
  • 遗憾的是,我只有一张赞成票。按照您的建议,使用 --opt 选项更改执行 mysqldump 的方式,将导入时间缩短了 5 个小时!
  • @Nate 现在你的导入速度更快肯定还有其他原因,因为--opt 在 mysqldump 中默认启用。至少从 v5.5 (2010) 开始就是这样。
【解决方案4】:

试试 https://launchpad.net/mydumper - 多线程 mysql 备份/恢复,比 mysqldump http://vbtechsupport.com/1695/ 快 3 到 10 倍

【讨论】:

    【解决方案5】:

    您确定数据是健全的,并且没有任何文件系统或系统性能问题吗?对于一个 20-30 兆的数据库来说,几分钟是很长的时间。我使用的是 2GB RAM、320GB HD 和标准 2.1GHz 处理器的 MacBook。我抓起我的一个数据库进行快速基准测试:

    gavinlaking$ du -sm 2009-07-12.glis
    74  2009-07-12.glis
    gavinlaking$ mysql -pxxx -e "drop database glis"
    gavinlaking$ mysql -pxxx -e "create database glis"
    gavinlaking$ time mysql -pxxx glis < 2009-07-12.glis 
    
    real    0m17.009s
    user    0m2.021s
    sys 0m0.301s
    

    74 兆字节的文件需要 17 秒。这对我来说似乎很活泼。即使它大 4 倍(接近 300 兆字节),它也可以在不到 70 秒内完成。

    【讨论】:

      【解决方案6】:

      有一种方法可以使用 LVM 快照进行备份和恢复,这对您来说可能是一个有趣的选择。

      考虑使用 LVM 来获取 MySQL 数据目录的快照,而不是执行 mysqldump。使用 LVM 快照可以让您拥有近乎实时的备份能力,支持所有存储引擎,以及令人难以置信的快速恢复。引用下面的链接,

      “恢复时间与放回数据和标准 MySQL 崩溃恢复一样快,而且还可以进一步缩短。”

      http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/

      【讨论】:

        猜你喜欢
        • 2011-03-24
        • 2016-12-11
        • 1970-01-01
        • 2020-02-28
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 2018-12-12
        • 2016-02-06
        相关资源
        最近更新 更多