【问题标题】:Sometimes import data Mysql in Docker very slow有时在Docker中导入数据Mysql很慢
【发布时间】:2017-03-10 06:38:24
【问题描述】:

我有一个超过 1GB 的 *.SQL 文件,当我在本地或 Vagrant 上导入 Mysql 时,它总是成功。但是使用相同的文件,我在 Docker 上导入 Mysql,速度非常慢(大约 10MB / 15 分钟)。我检查了很多次,结果都是一样的。 我尝试了很多文件;它似乎发生在指定的文件中。我不知道原因。我需要帮助。

这是我的 docker-compose.yml:

version: "2.0"
services:
 database:
  image: "mysql/mysql-server:5.5"
  ports:
   - "3307:3306"
  volumes:
   - "db:/var/lib/mysql"
   - ./sql:/home/sql
  environment:
   MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
 volumes:
  db: {}

【问题讨论】:

  • 可能是 SQL 文件是通过本地 TCP/IP 连接从 磁盘传输到 dockerized mysql 的,因此速度很慢,并且文件不是通过 直接磁盘读取命令导入的。在容器的文件系统中复制/保留 SQL 文件,然后尝试导入。
  • @SACHIN:它只出现在任何文件中,而不是所有文件中。
  • 是的,尝试建议并没有什么坏处。尽管它可能看起来很奇怪或可能不起作用。我了解我们都通过在精彩的 stackoverflow 网站上分享我们的经验来学习。
  • @SACHIN:谢谢,我尝试了大多数情况,但没有成功。
  • 我提出了问题的优先级

标签: mysql docker docker-compose


【解决方案1】:

我在 Windows 中使用 docker ... 我的解决方案是将 .sql 文件移动到 Docker mysql 容器并手动执行导入。

  • 从您的 mysql 生产服务器导出 .sql...

  • 将文件复制到Docker mysql容器中

docker cp base_ok.sql docker_mysql_1:/home/base_ok.sql

  • 进入docker mysql容器的bash

    docker exec -ti docker_mysql_1 bash

  • 导入 DDBB

    mysql -p -u root magento < base_ok.sql

请注意,我的 docker 容器是 docker_mysql_1,您可以通过键入 docker ps 列出所有容器

【讨论】:

  • 我总是将 *.sql 文件移动到 Docker 容器并导入。但在这种情况下,它是无效的
  • 为我工作以进行初始导入。但是后来很慢。我在容器中使用 mysql,并公开端口 3306 (-p 3306:3306)。我的应用程序正在主机上运行。使用此配置,对 mysql 的访问速度会慢 10 倍。有什么想法吗?
【解决方案2】:

我回答有点晚了,但我对此感到很困惑,我认为该解决方案可以帮助其他人。

我已经阅读了很多,我在我的 ext4 文件系统中尝试了 barrier=0,但没有。最后,对我有用的简单解决方案是将 innodb 缓冲池大小扩大到一个不错的值

mysql.cnf:

[mysql]
innodb_buffer_pool_size=128M

就是这样。

您可以将现有的 conf 复制到本地目录,然后挂载它: docker cp -a

<container>:/etc/mysql/conf.d mysql_conf
# change mysql.cnf
docker run ... -v /path/to/mysql_conf:/etc/mysql/conf.d ...

或者据我所知,将其直接传递给 docker run:

docker run ... mysql:latest --innodb-buffer-pool-size=128M

更新

我发现该解决方案本身还不够,它有时会以某种方式工作,而对其他人仍然如此缓慢(不深究原因)。

由于我只是在我的电脑上使用它作为mysql的开发版本,我并不特别担心数据损坏等问题,所以我现在有:

[mysql]
innodb_buffer_pool_chunk_size=128M
innodb_buffer_pool_size = 128M
innodb_buffer_pool_instances = 4
innodb_read_io_threads = 4
innodb_write_io_threads = 4

innodb_flush_log_at_trx_commit = 2
innodb_file_per_table = 1

innodb_flush_method = O_DIRECT
innodb_doublewrite = 0
innodb_support_xa = 0
innodb_checksums = 0

general_log = 0
slow_query_log = 0

innodb_lru_scan_depth=256

然后我在所有表上启动了一个优化表,以确保“innodb_file_per_table”有效。

如果您在生产环境中,请相应地调整您最害怕的选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 2013-08-03
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多