【问题标题】:MySQL can take more than an hour to startMySQL 可能需要一个多小时才能启动
【发布时间】:2017-02-20 15:36:31
【问题描述】:

我有一个 mysql (Percona) 5.7 实例,有超过 100 万个表。 当我启动数据库时,可能需要一个多小时才能启动。 错误日志没有显示任何内容,但是当我跟踪 mysqld_safe 时,我发现 MySQL 正在获取数据库中每个文件的统计信息。

知道为什么会发生这种情况吗? 另外,请不要建议修复我的架构,这是一个黑盒。

谢谢

【问题讨论】:

  • 哇,有很多桌子。在旁注中,这个问题可能更适合dba.stackexchange.com
  • 一百万张表?获取一个新的黑盒。
  • 出色的数据库设计 - 100 万个表 * 1 个 InnoDB 表的 3 个句柄 = 300 万个文件句柄。
  • 哇。这是在谈论驴领域。效果不好并不奇怪,它完全有效。
  • 您是否尝试向机器添加更多资源? RAM,磁盘空间?你需要重新设计你的数据库。为什么你有这么多桌子?

标签: mysql percona


【解决方案1】:

结果证明这是 2 个问题(除了数百万张表)!

  1. 当 MySQL 启动并且需要崩溃恢复时,从 5.7.17 开始,它需要遍历您的 datadir 来构建它的字典。这将在未来的版本(8.0)中取消,因为 MySQL 将拥有自己的目录,并且不再依赖 datadir 内容。 Doc 表示不再这样做了。这是真的和假的。它不会读取 ibd 文件的第一页,但会执行文件统计。 Filed Bug
  2. 一旦完成 (1),它就会启动一个新进程,“执行 'SELECT * FROM INFORMATION_SCHEMA.TABLES;'使用已弃用的分区引擎获取表列表。”。那当然是再次打开所有文件。如果您认为不需要它,请使用 disable-partition-engine-check。 Doc

所有这些都可以使用 sysdig 观察到。非常强大且方便的 dtrace 类工具。

sysdig proc.name=mysqld | grep "打开 fd="

好的,现在是减少文件数量的时候了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多