具体情况

zabbix server启动就退出,发现最后的结果在zabbix-server.log里面查看,有这样一行代码

  9116:20241013:131428.950 1: /lib64/libc.so.6(__libc_start_main+0xf5) [0x7f8c64b2a555]
  9116:20241013:131428.950 0: ./zabbix_server: poller #1 [got 10 values in 0.018646 sec, getting values]() [0x44e504]
  9116:20241013:131428.950 [file:dbconfig.c,line:86] __zbx_mem_realloc(): out of memory (requested 149184 bytes)
  9116:20241013:131428.951 [file:dbconfig.c,line:86] __zbx_mem_realloc(): please increase CacheSize configuration parameter

是最近出现的情况,这个机器内存这有2个G,因此查看mysql的内存,发现内存占用28%,查看日志,如下;

[root@zbserver mysql]# ll
total 2108320
-rw-r----- 1 mysql mysql         56 Nov 22  2023 auto.cnf
-rw-r----- 1 mysql mysql 1073744099 Sep 21 23:58 binlog.000078
-rw-r----- 1 mysql mysql  936419183 Sep 29 08:36 binlog.000079
-rw-r----- 1 mysql mysql    1438529 Oct 13 13:29 binlog.000080
-rw-r----- 1 mysql mysql      12926 Oct 13 13:41 binlog.000081
-rw-r----- 1 mysql mysql         64 Oct 13 13:31 binlog.index
-rw------- 1 mysql mysql       1676 Nov 22  2023 ca-key.pem
-rw-r--r-- 1 mysql mysql       1112 Nov 22  2023 ca.pem
-rw-r--r-- 1 mysql mysql       1112 Nov 22  2023 client-cert.pem
-rw------- 1 mysql mysql       1680 Nov 22  2023 client-key.pem
-rw-r----- 1 mysql mysql     196608 Oct 13 13:41 #ib_16384_0.dblwr
-rw-r----- 1 mysql mysql    8585216 Oct 13 13:14 #ib_16384_1.dblwr
-rw-r----- 1 mysql mysql      18289 Oct 13 13:29 ib_buffer_pool
-rw-r----- 1 mysql mysql   12582912 Oct 13 13:41 ibdata1
-rw-r----- 1 mysql mysql   12582912 Oct 13 13:31 ibtmp1
drwxr-x--- 2 mysql mysql       4096 Oct 13 13:31 #innodb_redo
drwxr-x--- 2 mysql mysql        187 Oct 13 13:31 #innodb_temp
drwxr-x--- 2 mysql mysql        143 Nov 22  2023 mysql
-rw-r----- 1 mysql mysql   29360128 Oct 13 13:41 mysql.ibd
srwxrwxrwx 1 mysql mysql          0 Oct 13 13:31 mysql.sock
-rw------- 1 mysql mysql          5 Oct 13 13:31 mysql.sock.lock
drwxr-x--- 2 mysql mysql       8192 Nov 22  2023 performance_schema
-rw------- 1 mysql mysql       1680 Nov 22  2023 private_key.pem
-rw-r--r-- 1 mysql mysql        452 Nov 22  2023 public_key.pem
-rw-r--r-- 1 mysql mysql       1112 Nov 22  2023 server-cert.pem
-rw------- 1 mysql mysql       1676 Nov 22  2023 server-key.pem
drwxr-x--- 2 mysql mysql         28 Nov 22  2023 sys
-rw-r----- 1 mysql mysql   33554432 Oct 13 13:41 undo_001
-rw-r----- 1 mysql mysql   50331648 Oct 13 13:41 undo_002
drwxr-x--- 2 mysql mysql       8192 Nov 22  2023 zabbix

从 MySQL 目录来看,binlog 文件占用了相当大的空间,尤其是 binlog.000078binlog.000079,这两个文件接近 1GB。
这样就要减少binlog日志的大小。

1. 设置 expire_logs_days 清理过期 binlog

目前 binlog 文件积累了较多,占用大量空间。可以设置 expire_logs_days 来定期清理过期的 binlog 文件。假设你不需要保留较长时间的 binlog 文件,可以将其设置为 3 天:

my.cnf 文件中添加:

   [mysqld]
   expire_logs_days = 3

这将自动删除超过 3 天的 binlog 文件,减小占用空间。然后,重启 MySQL 服务使设置生效:

   sudo systemctl restart mysql

2. 手动删除旧的 binlog

你可以手动删除不再需要的 binlog 文件。由于 binlog 文件已经积累较多,你可以清理掉早期文件。假如你想删除 binlog.000078 之前的所有日志:

   PURGE BINARY LOGS TO 'binlog.000079';

或者清理某个日期之前的日志:

   PURGE BINARY LOGS BEFORE '2024-10-01 00:00:00';

3. 调整单个 binlog 文件大小

目前的 binlog 文件大小接近 1GB,导致文件过大且不易管理。你可以设置 max_binlog_size 限制 binlog 文件的大小。例如,将 binlog 文件限制在 100MB 以内:

my.cnf 文件中添加:

   [mysqld]
   max_binlog_size = 100M

重启 MySQL 服务以应用该更改:

   sudo systemctl restart mysql

4. 优化 InnoDB 相关文件

  • ibdata1: 该文件是 InnoDB 的共享表空间文件,大小为 12MB,正常情况不需要删除或压缩。如果你有多张表的情况下,建议开启 InnoDB 独立表空间功能,以减少 ibdata1 的膨胀。
  • ibtmp1: 这是 InnoDB 的临时表空间文件,大小也是 12MB。可以通过定期重启 MySQL 来清理不再使用的临时表空间。

5. 减少二进制日志的写入频率

如果你不需要频繁的事务日志记录(如用于主从复制或者灾备),可以选择仅对关键数据进行记录。通过调整 binlog-ignore-db 设置,可以减少某些不重要数据库的 binlog 写入:

   [mysqld]
   binlog-ignore-db = test_db

6. 监控 binlog 大小和增长速度

可以通过定期监控 binlog 的大小和增长速度,及时清理不需要的文件。使用以下命令查看当前的 binlog 文件列表和大小:

   SHOW BINARY LOGS;

结合 expire_logs_days 设置,确保日志文件不会无限制增长。

总结

在内存只有 2GB 的情况下,定期清理旧的 binlog 文件和设置合理的日志保留期限将显著优化 MySQL 的空间占用。此外,限制单个 binlog 文件大小,调整不重要的数据库日志写入也有助于节约资源。

作者:严锋  创建时间:2024-10-13 13:44
最后编辑:严锋  更新时间:2025-05-22 13:03