具体情况
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.000078
和 binlog.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 文件大小,调整不重要的数据库日志写入也有助于节约资源。
最后编辑:严锋 更新时间:2025-05-22 13:03