mysql - 在 MySQL 中执行超大 (20 GB) .sql 文件的更高速度选项

标签 mysql large-files database-restore navicat high-speed-computing

我的公司收到了一个超过 20 GB 的 .sql 文件,以响应政府对数据的请求。我没有很多选项可以以不同的格式获取数据,因此我需要有关如何在合理的时间内导入数据的选项。我正在使用 Navicat 的批处理执行工具在高端服务器(Win 2008 64 位,MySQL 5.1)上运行它。它已经运行了 14 个小时,并且没有接近完成的迹象。

有没有人知道这种交易的任何更高速度的选择?或者,鉴于大文件大小,这是我应该期待的吗?

谢谢

最佳答案

我猜你的意思是它是由 mysqldump 生成的文件作为数据库的备份,所以它主要包含CREATE TABLEINSERT声明。

(但严格来说,SQL 脚本可以包含任何内容,例如长期运行的存储过程的定义和执行、导致死锁的查询等。我假设情况并非如此。)

考虑到您有备份文件并且无法更改文件类型,您可以采取以下措施来加快恢复速度:

  • 禁用外键检查: SET FOREIGN_KEY_CHECKS=0 (记得重新启用
    然后)。也禁用唯一检查: SET UNIQUE_CHECKS=0
  • 确保您的 key_buffer_size 如果您使用 MyISAM 表,则设置得尽可能大。默认为 8MB,最大为 4GB。我会尝试 1GB。

    这些最初的提示来自 Baron Schwartz 的帖子:http://lists.mysql.com/mysql/206866
  • 确保您的 innodb_buffer_pool_size 如果您使用 InnoDB 表,则设置得尽可能大。默认为 8MB,最大为 4GB。我会尝试 1GB。
  • 套装 innodb_flush_log_at_trx_commit = 2 如果您使用 InnoDB 表,则在恢复期间。
  • @Mark B 在下面向 disable keys 添加了一个很好的建议在恢复期间。这是你如何做到的:
    ALTER TABLE <table-name> DISABLE KEYS;
    ...run your restore...
    ALTER TABLE <table-name> ENABLE KEYS;
    

    但该命令一次仅影响一张表。您必须为每个表发出单独的命令。也就是说,通常情况下一个表比其他表大得多,因此您可能只需要禁用该大表的键。

    此外,如果包含您的恢复的 SQL 脚本删除并重新创建表,这将绕过禁用键。在创建表之后和插入行之前,您必须找到某种方法来插入禁用键的命令。您可能需要通过 sed 发挥创意在将 SQL 脚本提供给 mysql 客户端之前对其进行预处理。
  • 使用 Percona Server 版本的 mysqldump,带有 --innodb-optimize-keys选项。
  • 关于mysql - 在 MySQL 中执行超大 (20 GB) .sql 文件的更高速度选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811809/

    相关文章:

    upload - 在 asp.net core 6 中上传大文件时出错(HTTP 错误 413.1 - 请求实体太大)

    mysql - 在 mysql 中导入 70MB csv 文件需要大约 70 小时?

    读取大型 CSV 文件时出现 Java 内存不足消息

    mysql - 从旧驱动器转移 MySQL 数据库

    sql-server - 从 bak 文件恢复原始 MDF 文件

    php - 如何防止使用php将符号存储在数据库中?

    mysql - 更改列名的动态过程

    MySQL:如何使用 GROUP BY 选择每个组的第 N 个值

    java - SQL 查询包含选定的自动增量行时无法执行

    mysql - 当表有数千万条记录时,使用 "mysql mydb < mydb.sql"重新创建 MySQL DB 非常慢。如何改进呢?