处理Zabbix历史数据库办法二---使用MySQL表分区 http://blog.51cto.com/john88wang/1771557 一 应用场景描述 我们可以使用MySQL表分区来对history这种大表进行分区,但是一定要在数据量小的时候进行分区,当数据量达到好几十G设置几百G了还是采用第一种方法把数据清理了再作表分区 二 MySQL表分区相关知识点 MySQL的表分区不支持外键。Zabbix2.0以上history和trend相关的表没有使用外键,因此可以使用分区。 MySQL表分区就是将一个大表在逻辑上切分成好几个物理分片。使用MySQL表分区有以下几个好处: 在有些场景下可以明显增加查询性能,特别是对于那些重度使用的表如果是一个单独的分区或者好几个分区就可以明显增加查询性能,因为比起加载整张表的数据到内存,一个分区的数据和索引更容易加载到内存。查看zabbix数据的general日志,可以发现zabbix对于history相关的几张表调用是非常频繁的,所以如果要优化zabbix的数据库重点要优化history这几张大表。 如果查询或者更新主要是使用一个分区,那么性能提升就可以简单地通过顺序访问磁盘上的这个分区而不用使用索引和随机访问整张表。 批量插入和删除执行的时候可以简单地删除或者增加分区,只要当创建分区的时候有计划的创建。ALTER TABLE操作也会很快 MySQL从5.1以后支持表分区。MySQL5.6之前查看是否支持表分区 mysql> show variables like 'have_partitioning'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+ 1 row in set (0.00 sec) MySQL5.6开始查看是否支持表分区 show plugins; mysql> show plugins; +----------------------------+----------+--------------------+----------------------+---------+ | Name | Status | Type | Library | License | +----------------------------+----------+--------------------+----------------------+---------+ | partition | ACTIVE | STORAGE ENGINE | NULL | GPL | +----------------------------+----------+--------------------+----------------------+---------+ 45 rows in set (0.00 sec) 使用rpm包安装mysql5.7.17 三 管理history类表的分区 这里提供两种方案来管理分区: 使用MySQL存储过程 略 使用外部脚本 B.使用外部脚本来执行表分区 使用外部脚本来执行分区比使用存储过程简单,也便于排错。 脚本中注意MySQL的版本号 脚本文件: zabbix_mysql_partition.pl 执行: perl zabbix_mysql_partition.pl 报错解决办法: #Can't locate DateTime.pm yum -y install perl-DateTime #Can't locate DBI.pm yum -y install perl-DBI #install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC ... #Perhaps the DBD::mysql perl module hasn't been fully installed, #or perhaps the capitalisation of 'mysql' isn't right. #Available drivers: DBM, ExampleP, File, Gofer, Proxy, Sponge. # at zabbix_mysql_partition.pl line 39 #https://cpan.metacpan.org/authors/id/C/CA/CAPTTOFU/DBD-mysql-4.046.tar.gz tar -xf DBD-mysql-4.046.tar.gz cd DBD-mysql-4.046 perl Makefile.PL #Can't locate ExtUtils/MakeMaker.pm #yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan make make install crontab -e 0 23 * * * /usr/bin/perl /usr/local/zabbix/zabbix_mysql_partition.pl #/etc/my.cnf socket=/tmp/mysql.sock #Starting zabbix_server: /usr/local/sbin/zabbix_server: error while loading shared libraries: libmysqlclient.so.16: cannot open shared object file: No such file or directory ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.16 /usr/lib64/