本篇内容介绍了“生产数据库意外重启的分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!先交代一下数据库版本:崩溃故障排除绝不是一项有趣的任务,特别是如果MySQL没有报告崩溃的原因。例如,当MySQL内存不足时。数据库邮件告警提醒发来的消息:登录 Grafana 监控面板,数据库连接在哪个时间段曾有幅度的增长。顺手检查一下之前的服务器邮件监控告警记录,上一个时间点,内存占用率99%,这说明了数据库连接的幅度增长,可能是压垮服务器的最后一根稻草。其实导致OOM的直接原因并不复杂,就是因为服务器内存不足,内核需要回收内存,回收内存就是kill掉服务器上使用内存最多的程序,而MySQL服务可能就是使用内存最多,所以就OOM了。我们带着这个疑问来排查一下日志:小伙伴们继续往下看:当out of memory发生时,outofmemory函数会选择一个内核认为犯有分配过多内存 “罪行”的进程,并杀死该进程。显然 Mysql 就是哪个“罪人”。随后 MySql 会自动重启。重启以后,内存是下来了,但是临近下班的时候,差不多又又又占满了。找到MySql进程,执行以下top -p pid,内存使用52.4g1)查看MySQL全局占用多少内存查询结果为:2)查看performance_schema占用多少内存查询结果为:3)查看每个线程占用多少内存查询结果为:查看当前线程最终结果为:4)查看 memory 存储引擎占用多少内存查询结果为:以上四项加起来差不多也就27975MB,差不错28G的样子,但是 MySql 进程显示占用了52.4G,那么剩下24.4G去哪了?此线程池非彼连接池,其实两者是有很大区别的,连接池一般在客户端设置,而线程池是在DB服务器上配置;另外连接池可以取到避免了连接频繁创建和销毁,但是无法取到控制MySQL活动线程数的目标,在高并发场景下,无法取到保护DB的作用。比较好的方式是将连接池和线程池结合起来使用。关于线程池的一些参数:该参数是配置线程模型,默认情况是one-thread-per-connection,也就是不启用线程池。将该参数设置为pool-of-threads即启用了线程池。该参数是设置线程池的Group的数量,默认为系统CPU的个数,充分利用CPU资源。该参数设置group中的最大线程数,每个group的最大线程数为threadpooloversubscribe+1,注意listener线程不包含在内。高优先级队列的控制参数,有三个值(transactions/statements/none),默认是transactions,三个值的含义如下:transactions:对于已经启动事务的语句放到高优先级队列中,不过还取决于后面的threadpoolhighpriotickets参数statements:这个模式所有的语句都会放到高优先级队列中,不会使用到低优先级队列none:这个模式不使用高优先级队列该参数控制每个连接最多语序多少次被放入高优先级队列中,默认为4294967295,注意这个参数只有在threadpoolhighpriomode为transactio免费主机域名ns的时候才有效果。worker线程最大空闲时间,默认为60秒,超过限制后会退出。该参数用来免费主机域名限制线程池最大的线程数,超过该限制后将无法再创建更多的线程,默认为100000。该参数设置timer线程的检测group是否异常的时间间隔,默认为500ms。最终配置如下:备注:线程池在Percona,MariaDB,Oracle MySQL企业版中提供,Oracle MySQL社区版并不提供。线程池貌似并不会直接导致内存不回收,网上有说同时开启Thread pool和PS会出现内存泄露,但是 目前Percona server 5.7.21-20+版本已经修复了这个问题,显然是不存在的。由于是生产环境,这个问题拖得时间有点长,那么慢查询会不会影响内存使用问题呢?带着这个问题,查看了慢查询后台列表,在数据库奔溃的前一个时间段,的确有不少慢查询语句。但是这并不能在一定程度上说明问题,由于服务器的 MySql 服务在杀死之前,内存已经见底,此时连接数并不多,也就三四十来个左右,大多处于休眠状态,并且此时已经占用了大部分的Swap空间。也就是说,在资源有限的情况下必定会出现不少慢查询语句。“生产数据库意外重启的分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注云技术网站,小编将为大家输出更多高质量的实用文章!
相关推荐: ORACLE-LINUX环境字符界面单实例如何安装
这篇文章将为大家详细讲解有关ORACLE-LINUX环境字符界面单实例如何安装,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 vi /etc/sysconfig/network-scripts/ifcfg-eth2 vi /…