Zabbix的Mysql数据库内存占用高问题分析与处理

问题:1、Zabbix内存使用率高;2、MariaDB没有开启独享表空间

  • 监控发现zabbix内存占用高,且每隔一周左右的时间内存就会用满。
Zabbix的Mysql数据库内存占用高问题分析与处理
  • 登录服务器通过top命令分析内存使用情况
Zabbix的Mysql数据库内存占用高问题分析与处理
服务器一共8G内存,发现Mysql数据库占用4.5G,Mysql的内存占用量最高。
  • 通过ps aux|grep mysql查询Mysql服务状态和Mysql安装目录为/var/lib/mysql
ps aux|grep mysql
[root@instance-1p55pphp ~]# ps aux|grep mysql
mysql      936  0.0  0.0 113416  1608 ?        Ss   11:14   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
mysql     1183  2.5  3.4 1637644 279076 ?      Sl   11:14   0:59 /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mariadb/mariadb.log --pid-file=/var/run/mariadb/mariadb.pid --socket=/var/lib/mysql/mysql.sock
root      5820  0.0  0.0 112816   972 pts/0    S+   11:54   0:00 grep --color=auto mysql
  • 查看Mysql的配置文件
cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
  • 查看Mysql的数据库文件,发现ibdata1文件很大,有6.8G
cd /var/lib/mysql
[root@instance-1p55pphp mysql]# du -sh *
16K	aria_log.00000001
4.0K	aria_log_control
6.8G	ibdata1
5.0M	ib_logfile0
5.0M	ib_logfile1
1004K	mysql
0	mysql.sock
212K	performance_schema
2.3M	zabbix
  • ibdata1 是什么?
ibdata1是InnoDB的共有表空间,默认情况下会把表空间存放在一个文件ibdata1中,会造成这个文件越来越大.
  • ibdata1文件增大的原因有哪些?

原因1:使用InnoDB共享表空间存储数据

参数innodb_file_per_table,控制innodb引擎采用共享表空间存储还是独立表空间存储。

参数innodb_file_per_table为OFF时,innodb采用共享表空间存储。除了存储上面的内容外,新创建表的数据和索引也存放在ibdata1文件中。所以,随着表数目和数据量的增长,ibdata1文件也会逐渐增长。

参数innodb_file_per_table为ON时,innodb采用独立表空间存储。新创建表的数据和索引存放在各自的ibd文件中。ibdata1文件只存储上述内容,一般情况下,文件并不会有明显增长。

这种情况,ibdata1文件在主从间会同步增长。

原因2:UNDO LOG堆积

InnoDB为了实现MVCC多版本并发控制,通过记录更新操作的undo log和redo log来实现。而innoDB的undo log是存放在ibdata1共享表空间的。undo log堆积,是导致ibdata1文件增大的主要原因。这种ibdata1增长的情况一般发生在主库,从库采用单线程同步一般不会有明显问题。

导致undo log堆积的常见场景:

事务长期间不提交或回滚,导致undo log堆积

当事务A对一行数据进行修改时,InnoDB会把对事务A可见的旧版本数据存储一份在undo log中,如果此时又有事务B要修改这行数据,InnoDB又会把对事务B可见的旧版本数据再存储一份在undo log中,以此类推。 如果这条数据当前有N个事务要对其进行修改,那么innoDB就会存储N份历史版本的undo信息。而这些undo信息就存放在ibdata1文件中,这是导致ibdata1增大的主要原因之一。常见的情况:如load data操作;大量并发事务;旧事务长时间不提交或回滚。

为保证大事务中读请求MVCC一致性导致undo log堆积

事务中读取大量数据的SQL长时间不能提交或回滚。在事务开始到事务提交或回滚前的这段时间内,为保证MVCC读版本一致性,对事务要读取表的数据的所有修改操作产生的undo log就一直无法被purge掉造成堆积,从而导致ibdata1增大。这也是导致ibdata1增大的主要原因之一。 常见的情况,如mysqldump逻辑备份时加了–single-transaction,同时其他事务对备份的表有大量的更新操作。

解决方案

MariaDB开启独享表空间

  • 使用独享表空间,将表空间分别单独存放。MySQL开启独享表空间的参数是Innodb_file_per_table,会为每个Innodb表创建一个.ibd的文件。
  • 导出数据库中所有数据
mysqldump -u root -p --all-database > /root/all-database.dump
  • 删除数据库中数据
mysql -u root -p
MariaDB [(none)]> drop database zabbix;
  • 停止MySQL/MariaDB
systemctl stop mysqld.service     #(用于Mysql)
systemctl stop mariadb.service     #(用于MariaDB)
  • 删除ibdata1文件(移动到/tmp下)
mv /var/lib/mysql/ibdata1 /tmp
mv /var/lib/mysql/ib_logfile0 /tmp
mv /var/lib/mysql/ib_logfile1 /tmp
  • 修改my.cnf配置,增加innodb_file_per_table参数,innodb_file_per_table=1
vi /etc/my.cnf
[mysqld]
innodb_file_per_table=1
  • 启动MySQL/MariaDB
systemctl start mysqld.service     #(用于Mysql)
systemctl start mariadb.service     #(用于MariaDB)

优化MariaDB内存占用

  • 修改table_open_cache的值
vi /etc/my.cnf
在mysqld下面添加table_open_cache = 512,我这里预设的值是512,已经可以满足我服务的快速缓存访问了。如果你的表很多,或者并发很多的话,估计这个值需要调大的。
  • 修改table_open_cache的值后,mariadb所占用的内存有所下降,从优化前的4.5G,下降到3G。
Zabbix的Mysql数据库内存占用高问题分析与处理

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/6471

(0)
郭靖的头像郭靖
上一篇 2022年12月23日 下午5:37
下一篇 2023年1月1日 下午8:30

相关推荐

  • 解析Vue中的虚拟DOM与Diff算法:提升性能的利器

    前言 vue中的diff算法时常是面试过程中的考点,本文将为大家讲解何为diff以及diff算法的实现过程。那么在了解diff之前,我们需要先了解虚拟DOM是什么? 虚拟DOM 虚拟 DOM (Virtual DOM,简称 VDOM) 是一种编程概念,意为将目标所需的 UI 通过数据结构“虚拟”地表示出来,保存在内存中,然后将真实的DOM与之保持同步。具体来…

    2024年3月22日
    1.4K00
  • Docker安装部署Redis数据库

    通过Docker部署Redis,比起我们自己编译安装的方式,会更加方便容易管理。今天就来简单分享一下使用Docker部署Redis数据库。 1,拉取镜像 通过下列命令: 2,创建数据卷 通常,类似于MySQL,Redis作为数据库,我们最好还是需要将其配置和数据等等挂载到数据卷以持久化到宿主机。 仍然是使用具名挂载的方式方便管理。 这样就创建了两个数据卷分别…

    2023年1月11日
    1.2K00
  • VMware vSphere中三种磁盘规格(厚置备延迟置零\厚置备置零\Thin Provision)

    在VMware vSphere中,不管是以前的5.1版本,或者是现在的6.5版本,创建虚拟机时,在创建磁盘时,都会让选择磁盘的置备类型,如下图所示,分为: (1)厚置备延迟置零; (2)厚置备置零; (3)Thin Provision(精简置备)。 在创建虚拟机时,可以选择这三种类型的其中一种,如下图所示 这三种类型的磁盘,每一种类型的磁…

    2023年8月11日
    1.0K00
  • 编译安装python3.10,使用ansible管理windows

    前言 以下适用于CentOS7.9,因为ansible又是由python编写的,而yum源仅能下载到python3.6.8。ansible for windows是2019年推出的,需要用到的高版本ansible和插件,所以需要更新到python3.8以上版本才能支持,否则会运行会出现各种错误。 0.设置yum为阿里源 1.准备安装 2.下载安装python…

    2023年2月13日
    1.5K00
  • frp配置多端口内网穿透?frp多端口怎么配置?

    FRP内网穿透应用场景:本地Web服务外网访问、本地开发微信、本地联调支付宝\微信支付、TCP/UDP端口转发 在本机开发好的网站想让客户测试不在需要上传到服务器上面,使用FRP内外网穿透轻松解决;微信开发也不需要在上传到服务器,使用免费FRP内网穿透服务器帮您解决80端口问题,实现微信服务器直接访问到您本机web服务。 使用frp作为内网穿透的时候,有时候…

    2024年5月10日
    1.3K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信