首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么变量(S)寻找保持MySQL扫描速度的所有数据库表,当它开始?

问什么变量(S)寻找保持MySQL扫描速度的所有数据库表,当它开始?
EN

Database Administration用户
提问于 2014-03-05 08:49:42
回答 2查看 699关注 0票数 1

我们有几千个小型数据库,总.ibd文件约为800000份。

我们注意到,MySQL需要几分钟才能停止,但大约需要两个小时才能开始。

例如,当MySQL启动时,它的进程ID为26980,如果我们查看下面的命令,我们可以看到MySQL按字母顺序扫描所有数据库表。

代码语言:javascript
复制
watch -n 1  'ls -l /proc/26980/fd | grep .ibd'

在最初的几分钟内,mysql的速度大约是每秒2个数据库,但大约一个小时后,速度逐渐下降到每10秒1个数据库,因为速度一直在变慢,可能有某种缓存已经耗尽。

我的问题是,在所有数据库表启动时,需要寻找哪些变量(S)来保持MySQL扫描的速度?

我们试着玩table_open_cache,table_definition_cache,tmp_table_size,但是它似乎不影响这个速度。

更新1

我们将所有数据文件复制到测试服务器,并安装Percona 56-5.6.15来代替Percona集群。服务器启动时间是正常的,它是在几分钟内开始,而我们集群的所有节点大约需要2小时才能启动。

我们尝试以隔离模式启动集群,在这种模式中,集群不与集群中的其他节点连接。启动时间仍为2小时。

更新2

我们在具有相同数据的测试服务器上安装了Percona群集。它正常工作,服务器在几分钟内启动,尽管有相同数量的数据库。测试服务器是一个小的VPS,而主服务器是巨大的。我们将my.cnf从主服务器复制到VPS,以确保所有变量相同。

在更新2之后,我们不知道为什么我们所有的节点都是这样的。

EN

回答 2

Database Administration用户

回答已采纳

发布于 2014-03-10 06:59:25

问题是open_files_limit

代码语言:javascript
复制
open_files_limit = 1048570

删除此行后,启动时间从大约2小时缩短到仅1.5分钟。令人惊讶的是,缺省值服务器的讨论实际上比给定的要高得多。

代码语言:javascript
复制
mysql> show global variables like 'open_files_limit';
+------------------+---------+
| Variable_name    | Value   |
+------------------+---------+
| open_files_limit | 3145728 |
+------------------+---------+
票数 1
EN

Database Administration用户

发布于 2014-03-05 14:27:15

加速关机/启动

由于您正在处理InnoDB存储引擎,因此需要考虑MySQL在启动和关闭期间所做的事情。

在关闭期间,InnoDB倾向于冻结所有事务,InnoDB缓冲池中的脏页被刷新。在启动期间,InnoDB崩溃恢复将前滚事务日志中的任何剩余更改。在InnoDB崩溃恢复期间,还可以扫描InnoDB双写缓冲区。

我认为第一个变量应该将诺姆b_快地_关机设置为0。

请注意MySQL文档:

InnoDB关闭模式。如果值为0,则InnoDB在关闭之前会缓慢关闭、彻底清除和插入缓冲区合并。如果值为1(默认值),InnoDB在关机时跳过这些操作,这是一个称为快速关闭的进程。如果值为2时,InnoDB会刷新日志并冷地关闭,就好像MySQL已经崩溃一样;没有丢失提交的事务,但是崩溃恢复操作会使下一个启动时间更长。在大量数据仍然被缓冲的极端情况下,缓慢的关闭可能需要几分钟,甚至几个小时。在升级或降低MySQL主要版本之间的级别之前,使用慢速关闭技术,以便在升级过程更新文件格式时充分准备所有数据文件。在紧急情况或故障排除情况下使用innodb_fast_shutdown=2,以便在数据有损坏风险的情况下获得绝对最快的关闭。

好的,这样就可以更快地启动了。代价是更长的关机时间。

有什么可以加快关机的吗?是的!

更频繁地从写入磁盘的InnoDB缓冲区池获取脏页。怎么做到的?

您需要设置诺姆b_最大值_脏的_页面_pct = 0。通过这样做,关闭过程可以减少将脏页刷新到.ibd文件所需的时间。

还有什么可以帮助创业的吗?是的,还有一个。

启动mysql时,InnoDB缓冲池通常在分配后为空。

您可以让mysql保存缓冲池中所有16 in页的块号。只需添加诺姆b_缓冲器_池子_加载_在…_启动和诺姆b_缓冲器_池子_转储_在…_关机即可。这不会花很长时间,因为它将块号写入二进制文件,而不是块本身。

更大数量的文件

InnoDB对于打开的文件(诺姆b)的默认设置是MySQL 5.5的300。对于MySQL 5.6,理想的数字是为您设置的。您可能还需要增加此值。一旦达到此限制,InnoDB可能会缓存打开的文件。

您可能需要通过将值提高到100000或200000来进行补偿。您还可以增加操作系统中允许MySQL拥有更多文件句柄的ULIMIT并将打开_文件_限制设置为最大值。

我还建议增加DB Server中的RAM。

摘要

下面是您需要添加的选项

代码语言:javascript
复制
[mysqld]
innodb_fast_shutdown=0
innodb_max_dirty_pages_pct=0
innodb_buffer_pool_load_at_startup=1
innodb_buffer_pool_dump_at_shutdown=1
innodb_open_files=(much higher value)
open_files_limit=(much higher value)

根据环境的不同,您可能不需要所有四个选项。也许将诺姆b_快地_关机设置为2比0更好。如果您有低写入活动,那么诺姆b_最大值_脏的_页面_pct的默认设置可能是好的。无论如何,测试哪些选项可以帮助您关机和启动。

请记住,诺姆b_缓冲器_池子_加载_在…_启动和诺姆b_缓冲器_池子_转储_在…_关机用于MySQL 5.6。因此,请检查正在使用的Percona版本是否有这两个选项。

试试看!

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/60165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档