千家信息网

如何为Zabbix MySQL设置独立表空间innodb_file_per_table

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,如何为Zabbix MySQL设置独立表空间innodb_file_per_table,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你
千家信息网最后更新 2026年11月01日如何为Zabbix MySQL设置独立表空间innodb_file_per_table

如何为Zabbix MySQL设置独立表空间innodb_file_per_table,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

一台zabbix监控系统后台使用的MySQL DB宕掉,连上MySQL DB server看到硬盘快用满了,发现zabbix使用到的MySQL ibdata1文件有300多G,几乎占据了整个硬盘的空间

# df -hFilesystem      Size  Used Avail Use% Mounted on/dev/sda3        99G   15G   79G  17% /devtmpfs        3.9G     0  3.9G   0% /devtmpfs           3.9G     0  3.9G   0% /dev/shmtmpfs           3.9G  8.4M  3.9G   1% /runtmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup/dev/sda1       488M  105M  348M  24% /boot/dev/sda2       378G  355G  4.1G  99% /datatmpfs           798M     0  798M   0% /run/user/0# lltotal 371225844-rw-r----- 1 mysql mysql        16384 Apr 17 21:42 aria_log.00000001-rw-r----- 1 mysql mysql           52 Apr 17 21:42 aria_log_control-rw-rw---- 1 mysql mysql      1224704 Apr 22 22:38 ddl_log.log-rw-r----- 1 mysql mysql 380123480064 Apr 23 13:20 ibdata1-rw-r----- 1 mysql mysql      5242880 Apr 23 13:20 ib_logfile0-rw-r----- 1 mysql mysql      5242880 Apr 23 13:20 ib_logfile1drwx------ 2 mysql mysql         4096 Apr 17 21:42 mysqldrwx------ 2 mysql mysql         4096 Apr 17 21:42 performance_schemadrwx------ 2 mysql mysql         4096 Apr 22 22:38 zabbix

一看db版本,还是使用的MariaDB 5.5.56

# mysql -V
mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

这个版本的DB会默认使用共用表空间,估计没有设置独立表空间,查看果然:

MariaDB [(none)]> show variables like 'innodb_file_per_table';+-----------------------+-------+| Variable_name         | Value |+-----------------------+-------+| innodb_file_per_table | OFF    |+-----------------------+-------+1 row in set (0.00 sec)

这里使用了共用表空间,即使对zabbix大表历史数据清理并执行alter table xxx engine=innodb;也无法收缩空间。

临时改善对策:

因为磁盘已满,为了让zabbix监控尽快恢复使用,请用户对server临时增加了一块500G硬盘。把DB数据copy到空间更大的新盘,并重新挂载原来盘为/data1,挂载新盘为原/data

开启DB服务后,zabbix监控恢复正常

永久改善对策:

Zabbix MySQL DB使用磁盘过大,虽然已经设置了清理历史分区数据任务,但监控数据过多导致现有保持策略还是会用满硬盘。上面说到共用表空间使用的ibdata1文件无法回收,只能想办法删除一部分历史数据且改用独立表空间。

思想:将DB数据导出备份(大表只备份近期历史数据),删除原有共用表空间ibdata1文件,修改独立表空间配置,再导入备份数据,修改清理历史分区数据策略。

查zabbix DB中各表使用大小:

select TABLE_NAME,(sum(DATA_LENGTH)+sum(INDEX_LENGTH))/1024/1024 from information_schema.tables where table_schema="zabbix"GROUP BY TABLE_NAMEORDER BY 2 DESC
TABLE_NAME (sum(DATA_LENGTH)+sum(INDEX_LENGTH))/1024/1024 history_uint 104518.12500000 history 24653.62500000 trends_uint 5394.67187500 events 2808.06250000 event_recovery 1188.37500000 trends 1111.68750000 history_str 200.14062500

1.停止zabbix服务

# systemctl stop zabbix-server

2.导出zabbix DB除两个最大历史表之外基本表结构和数据
# mysqldump -h227.0.0.1 -uroot -p'password' --default-character-set=utf8 --databases zabbix -R --ignore-table=zabbix.history --ignore-table=zabbix.history_uint --log-error=zabbix_base.log > zabbix_base.sql

主要参数说明:

-R 导出procedure 和function

--ignore-table 指定不想导出的表名,如果有多个表不想导出就写多个--ignore-table

3.导出zabbix DB history和history_uint 近7天表数据和结构

因为zabbix table中保存的是时间戳,查出时间对应的时间戳

MariaDB [(none)]> select unix_timestamp('2020-4-16');+-----------------------------+| unix_timestamp('2020-4-16') |+-----------------------------+|                  1586966400 |+-----------------------------+1 row in set (0.00 sec)

导出history近7天表数据和结构

# mysqldump -h227.0.0.1 -uroot -p'password' --default-character-set=utf8 --databases zabbix --tables history --where="clock > 1586966400" --log-error=history.log > history.sql

导出history_uint近7天表数据和结构

# mysqldump -h227.0.0.1 -uroot -p'password' --default-character-set=utf8 --databases zabbix --tables history_uint --where="clock > 1586966400" --log-error=history_uint.log > history_uint.sql

4.关闭DB服务

# systemctl stop mariadb.service

5. 修改innodb_file_per_table独立表空间参数

# vi /etc/my.cnfinnodb_file_per_table=1

6.删除ibdata1和日志文件(注:操作之前尽量做好备份)

# rm -rf ibdata1 # rm -rf ib_logfile0# rm -rf ib_logfile1

注,删除ibdata1主要为了释放空间,重启DB服务后会自动重建一个空的。删除日志文件是为了避免下面error出现:

[Note] InnoDB: The first innodb_system data file 'ibdata1' did not exist. A new tablespace will be created!
[ERROR] InnoDB: redo log file './ib_logfile0' exists. Creating system tablespace with existing redo log files is not recommended. Please delete all redo log files before creating new system tablespace.

7.开启DB服务

# systemctl start mariadb.service

注,开启DB后,ibdata1虽然被删除了,但zabbix DB依然存在,只是DB下面table无法访问了

8. 导入上面备份出来的数据

# mysql -uroot -ppassword -h227.0.0.1 zabbix < zabbix_base.sql# mysql -uroot -ppassword -h227.0.0.1 zabbix < history.sql# mysql -uroot -ppassword -h227.0.0.1 zabbix < history_uint.sql

至此,共用表空间改为独立表空间完成,且/data硬盘使用空间大幅收缩(/data1为临时对策时加的盘,为迁移前DB文件大小)

[root@vswhzb01 mysql]# du -sh *16K     aria_log.000000014.0K    aria_log_control128M    ibdata164M     ib_logfile05.0M    ib_logfile0_old64M     ib_logfile15.0M    ib_logfile1_old1016K   mysql212K    performance_schema41G     zabbix[root@vswhzb01 mysql]# df -hFilesystem      Size  Used Avail Use% Mounted on/dev/sda3        99G   16G   79G  17% /devtmpfs        3.9G     0  3.9G   0% /devtmpfs           3.9G     0  3.9G   0% /dev/shmtmpfs           3.9G  8.4M  3.9G   1% /runtmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup/dev/sda1       488M  105M  348M  24% /boottmpfs           798M     0  798M   0% /run/user/0/dev/sda2       378G   55G  304G  16% /data/dev/sdb1       493G  355G  113G  76% /data1

9.开启zabbix服务

# systemctl start mariadb.service

10.最后,记得调整历史分区删除策略,不然监控数据多了硬盘还是会用完

注:zabbix历史分区删除设定可参考之前文章 http://blog.itpub.net/25583515/viewspace-2638892/

DROP PROCEDURE IF EXISTS zabbix.partition_maintenance_all;DELIMITER $$ CREATE PROCEDURE `partition_maintenance_all`(SCHEMA_NAME VARCHAR(32)) BEGIN                 CALL partition_maintenance(SCHEMA_NAME, 'history', 30, 24, 7);                 CALL partition_maintenance(SCHEMA_NAME, 'history_log', 30, 24, 7);                 CALL partition_maintenance(SCHEMA_NAME, 'history_str', 30, 24, 7);                 CALL partition_maintenance(SCHEMA_NAME, 'history_text', 30, 24, 7);                 CALL partition_maintenance(SCHEMA_NAME, 'history_uint', 15, 24, 7);                 CALL partition_maintenance(SCHEMA_NAME, 'trends', 180, 24, 7);                 CALL partition_maintenance(SCHEMA_NAME, 'trends_uint', 180, 24, 7); END$$ DELIMITER ;

后续,因为已经使用了独立表空间innodb_file_per_table设定,即使硬盘再次被DB用满,使用drop partition等方式可以释放OS磁盘空间

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

空间 数据 历史 独立 硬盘 文件 服务 备份 监控 结构 历史数据 对策 时间 磁盘 策略 还是 参数 多个 大小 文章 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 小米移动互联网科技园 新华互联网科技 工业互联网科技新基建 没上市的科技互联网公司 互联网 卓越科技 礼当家互联网科技 深圳期待互联网科技 互联网实体化科技化 深圳国际航运科技和互联网 顶级互联网科技成果有哪些 互联网还是高科技吗 世界互联网科技公司市值排名 哈尔滨屹滨互联网科技有限公司 科技大学互联网 郑州欣桑互联网科技有限公司 容联科技互联网电商 张家口科技产业互联网平台 美国五大互联网科技公司市值多少 互联网科技大佬云集 上海旺乐尼互联网科技有限公司 上海喔噻互联网科技有限公司 百单网互联网科技有限公司怎么样 互联网公司 科技公司 深圳科技互联网 四川狮子座互联网科技 联恩商钥互联网科技有限公司 互联网科技与管理 城市宝互联网科技有限公司 本届互联网大会上的黑科技 华人运通互联网科技公司
0