热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

优化zabbix表结构的一些思考

刚过完年,在日常检查服务器备份数据的时候发现zabbix的mysql备份文件异常庞大,考虑到zabbix会在日常监控服务器状态时定期发送一些告警信息以及监控时保存的SQL记

刚过完年,在日常检查服务器备份数据的时候发现zabbix的mysql备份文件异常庞大,考虑到zabbix会在日常监控服务器状态时定期发送一些告警信息以及监控时保存的SQL记

刚过完年,在日常检查服务器备份数据的时候发现zabbix的mysql备份文件异常庞大,考虑到zabbix会在日常监控服务器状态时定期发送一些告警信息以及监控时保存的SQL记录,所以查看了下zabbix的数据库表,发现mysql系统库文件下zabbix的数据库目录本身并不是很大,也就几百M,但发现同目录下的ibdata1文件异常庞大,达到了4.7G.


zabbix本身日常的监控数据量很大是事实,但为什么感觉没保存在zabbix目录下?且ibdata1为什么这么巨大?


网上查阅了zabbix的数据库存储原理,发现zabbix库是使用的innodb引擎的共享表空间,innodb把数据和索引都放在ibdata1下,随着数据增长,ibdata1会越来越大。性能方面会有影响。


然后就很好奇zabbix为什么会使用innodb的共享表空间存储数据,网上查看到一段资料写到

----------------------------------------------------------------------------------------

使用过MySQL的同学,刚开始接触最多的莫过于MyISAM表引擎了,这种引擎的数据库会分别创建三个文件:表结构、表索引、表数据空间。我们可以将某个数据库目录直接迁移到其他数据库也可以正常工作。

然而当你使用InnoDB的时候,一切都变了。InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。

在MySQL的配置文件[mysqld]部分,增加innodb_file_per_table参数,可以修改InnoDB为独立表空间模式,每个数据库的每个表都会生成一个数据空间。


独立表空间

优点:

1.每个表都有自已独立的表空间。

2.每个表的数据和索引都会存在自已的表空间中。

3.可以实现单表在不同的数据库中移动。

4.空间可以回收(drop/truncate table方式操作表空间不能自动回收)

5.对于使用独立表空间的表,不管怎么删除,表空间的碎片不会太严重的影响性能,而且还有机会处理。


缺点:

单表增加比共享空间方式更大。


结论:

共享表空间在Insert操作上有一些优势,但在其它都没独立表空间表现好。

当启用独立表空间时,请合理调整一下 innodb_open_files 参数。

----------------------------------------------------------------------------------------

原来默认情况下innodb会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中ibdata1,而且增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。


所以决定将innodb的共享表空间改成独立表空间,然后以后单独备份zabbix数据库时就不会备份整个数据库文件,导致系统资源浪费,最后再做一个定期的清理zabbix历史记录脚本,这样就不会担心以后备份文件过大,导致服务器硬盘容量紧张.


OK,开始干活....


系统环境:

-------------------------------

SYSYTEM: CentOS 6.3 x64

APACHE: httpd-2.4.4

MYSQL: mysql-5.6.10

PHP: php-5.4.13

ZABBIX: Zabbix 2.2.0rc2

-------------------------------


1.查看bdata1文件大小

# cd /usr/local/mysql/data

# du -sh *

-------------------------------------

4.0K file-test.xxx.cn.pid

4.0K file-test-relay-bin.000001

4.0K file-test-relay-bin.index

4.7G ibdata1

5.0M ib_logfile0

5.0M ib_logfile1

780K mysql

146M Syslog

4.0K webserver01.xxx.cn.pid

43M zabbix

--------------------------------------


共享表数据空间文件ibdata1大小已经达到了4.7G


登陆MySQL查看哪些表占用了空间

# mysql -uroot -p

-----------------------------------------

> select table_name, (data_length+index_length)/1024/1024 as total_mb, table_rows from information_schema.tables where table_schema='zabbix';

-----------------------------------------


+-----------------------+---------------+------------+

| table_name | total_mb | table_rows |

+-----------------------+---------------+------------+

| acknowledges | 0.06250000 | 0 |

....

| help_items | 0.04687500 | 103 |

| history | 2841.00000000 | 34957883 |

| history_log | 0.04687500 | 0 |

...

| history_text | 0.04687500 | 0 |

| history_uint | 1563.98437500 | 23940661 |

| history_uint_sync | 0.04687500 | 0 |

...

| timeperiods | 0.01562500 | 0 |

| trends | 17.89564700 | 145780 |

| trends_uint | 25.567894000 | 271256 |

...

103 rows in set (1.46 sec)


可以看到,history表的记录已经达到了3G,34957883条,即3千多万条,同时history_unit也比较大,达到了1G,约2百多万条;

另外就是trends,trends_uint中也存在一些数据。

由于数据量太大,,按照普通的方式delete数据的话基本上不太可能。

因为我们每天会自动发送数据报表,所以决定直接采用truncate table的方式来快速清空这些表的数据,再使用mysqldump导出数据,删除共享表空间数据文件,重新导入数据。


2.停止相关服务,避免改造时写入数据

# /etc/init.d/zabbix_server stop

# /usr/local/apache2/bin/apachectl stop


3.清空历史数据

# mysql -uroot -p123456

---------------------------------------------

mysql > use zabbix;

mysql > truncate table history;

mysql > optimize table history;

mysql > truncate table history_uint;

mysql > optimize table history_uint;

mysql > truncate table trends;

mysql > optimize table trends;

mysql > truncate table trends_uint;

mysql > optimize table trends_uint;

------------------------------------------


4.备份数据

# mysqldump -uroot -p123456 zabbix > ~/zabbix_bak.sql


5.停止数据库

# service mysqld stop


6.删除共享表空间数据文件

# cd /usr/local/mysql/data

# rm -rf ibdata1 ib_logfile0 ib_logfile1


7.增加innodb_file_per_table独立表空间参数

# vi /etc/my.cnf

在[mysqld]下添加一行

-------------------------------

innodb_file_per_table=1

-------------------------------


8.启动MySQL

# service mysqld start


9.查看参数是否生效

# mysql -uroot -p123456

----------------------------------------------

mysql> show variables like '%per_table%';

+-----------------------+-------+

| Variable_name | Value |

+-----------------------+-------+

| innodb_file_per_table | ON |

+-----------------------+-------+

1 row in set (0.00 sec)

------------------------------------------------


10.重新导入数据

# mysql -uroot -p123456 zabbix <~/zabbix.sql


11.编写zabbix自动清理历史数据的脚本,保留30天的数据

# vi /etc/rc.d/zabbix_olddata_clean.sh

---------------------------------------------

#!/bin/bash


DATE=`date -d "30 days ago"`

CLOCK=`date +%s -d "${DATE}"`

USER="root"

PW="123456"

DB="zabbix"

MYSQL="mysql -u$USER -p$PW"


function zabbix_olddata_clean(){

for TABLE in history trends

do

${MYSQL} <

USE ${DB};

DELETE FROM ${TABLE} WHERE clock <${CLOCK};

OPTIMIZE TABLE ${TABLE};

DELETE FROM ${TABLE}_uint WHERE clock <${CLOCK};

OPTIMIZE TABLE ${TABLE}_uint;

EOF

done

}


zabbix_olddata_clean

---------------------------------------------


12.将该脚本加入计划任务

# crontab -e

加入一条规则,每个月1号凌晨3点35执行此脚本

---------------------------------

35 03 1 * * /bin/sh /etc/rc.d/zabbix_olddata_clean.sh

---------------------------------


13.重启相关服务进程

# /etc/init.d/zabbix_server restart

# /usr/local/apache2/bin/apachectl start

# service crond restart


14.验证

我们首先监控下mysql的数据库记录日志

# tail -f /usr/local/mysql/log/mysql.log


手动执行下此脚本

# sh /etc/rc.d/clean_zabbix_olddata.sh

---------------------------------------------

Table Op Msg_type Msg_text

zabbix.history optimize status OK

Table Op Msg_type Msg_text

zabbix.history_uint optimize status OK

Table Op Msg_type Msg_text

zabbix.trends optimize status OK

Table Op Msg_type Msg_text

zabbix.trends_uint optimize status OK

----------------------------------------------


查看到相关数据库清理语句

----------------------------------------------------

......

6390 Query SELECT DATABASE()

6390 Init DB zabbix

6390 Query DELETE FROM history WHERE clock <1391861640

6390 Query OPTIMIZE TABLE history

140208 10:40:34 6390 Query DELETE FROM history_uint WHERE clock <1391861640

6390 Query OPTIMIZE TABLE history_uint

6391 Connect root@localhost on

6391 Query select @@version_comment limit 1

6391 Query SELECT DATABASE()

6391 Init DB zabbix

6391 Query DELETE FROM trends WHERE clock <1391861640

6390 Quit

6391 Query OPTIMIZE TABLE trends

6391 Query DELETE FROM trends_uint WHERE clock <1391861640

6391 Query OPTIMIZE TABLE trends_uint

6391 Quit

.......

----------------------------------------------------


最后我们查看下系统数据库文件

# cd /usr/local/mysql/data/

# du -sh *

------------------------------------

4.0K file-test.iscard.cn.pid

4.0K file-test-relay-bin.000001

4.0K file-test-relay-bin.index

10M ibdata1

5.0M ib_logfile0

5.0M ib_logfile1

780K mysql

146M Syslog

4.0K webserver01.iscard.cn.pid

42M zabbix

------------------------------------

# ls -lh

----------------------------------------

总用量 21M

-rw-rw---- 1 mysql mysql 6 2月 8 08:30 file-test.xxx.cn.pid

-rw-rw---- 1 mysql mysql 117 9月 9 14:09 file-test-relay-bin.000001

-rw-rw---- 1 mysql mysql 29 9月 9 14:09 file-test-relay-bin.index

-rw-rw---- 1 mysql mysql 10M 2月 8 10:44 ibdata1

-rw-rw---- 1 mysql mysql 5.0M 2月 8 10:44 ib_logfile0

-rw-rw---- 1 mysql mysql 5.0M 2月 8 10:44 ib_logfile1

drwxr-x---. 2 mysql root 4.0K 9月 9 08:32 mysql

drwxr-x--- 2 mysql mysql 4.0K 2月 7 18:22 Syslog

-rwxr-x--- 1 mysql mysql 5 5月 27 2013 webserver01.xxx.cn.pid

drwxr-x--- 2 mysql mysql 12K 2月 8 10:40 zabbix

------------------------------------------

zabbix库文件已经独立到zabbix数据库目录下,ibdata1经过清理和瘦身,终于不会显得太臃肿.



本文出自 “一路向北” 博客,请务必保留此出处

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Oracle分析函数first_value()和last_value()的用法及原理
    本文介绍了Oracle分析函数first_value()和last_value()的用法和原理,以及在查询销售记录日期和部门中的应用。通过示例和解释,详细说明了first_value()和last_value()的功能和不同之处。同时,对于last_value()的结果出现不一样的情况进行了解释,并提供了理解last_value()默认统计范围的方法。该文对于使用Oracle分析函数的开发人员和数据库管理员具有参考价值。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记
    本文介绍了大数据Hadoop生态(20)MapReduce框架原理OutputFormat的开发笔记,包括outputFormat接口实现类、自定义outputFormat步骤和案例。案例中将包含nty的日志输出到nty.log文件,其他日志输出到other.log文件。同时提供了一些相关网址供参考。 ... [详细]
author-avatar
怪话greenup
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有