zabbix mysql 8g优化_Zabbix分区优化
Zabbix分区优化
Zabbix数据库优化
目的: 快速清理历史数据,并减少数据存储容量
方法: 历史表使用分区表(删除分区表速度快),使用Tokudb引擎(适合大量insert少量update和select等日志表)
Zabbix版本: 3.4
涉及表项:
存储不同类型item的历史数据,最终1小时或者1天等段时间的绘图数据从其中获取
history、history_log、history_str、history_text、history_uint
存储不同类型item的历史趋势数据,每隔一小时从历史数据中统计一次,并计算统计区间的平均值,最大值,最小值trends、trends_uint
zabbix的db有做分表 根据这个来的
https://www.zabbix.org/wiki/Docs/howto/mysql_partition
cronjob里的脚本包括了建新表和删除旧表,用mysql的procedure控制,删除旧表可以释放空间
想要修改短一点,需要修改procedure partition_maintenance_all里规定的时间
我的做法是Drop旧procedure再创建新的关闭zabbix的housekeeper功能login mysql zabbix
DROP PROCEDURE IF EXISTS partition_maintenance_all
根据需要修改括号内第三列的时间,估计得改成45或者30了。每列的定义请参照最上面给的链接
再手动跑下cronjob内的那个指令就好
[root@sg-gop-10-65-200-90 mysql]# grep -Ev '^$|#' /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix
StartPollers=500
StartPingers=50
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
CacheSize=8G
TrendCacheSize=1G
Timeout=15
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
[root@sg-gop-10-65-200-90 percona-server.conf.d]# grep -Ev '^$|#' /etc/percona-server.conf.d/mysqld.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_connections=1000
# login mysql
mysql -uroot -p
zabbix
mysql> use zabbix;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show variables like '%dir%';
+-----------------------------------------+-------------------------------------+
| Variable_name | Value |
+-----------------------------------------+-------------------------------------+
| basedir | /usr/ |
| binlog_direct_non_transactional_updates | OFF |
| character_sets_dir | /usr/share/percona-server/charsets/ |
| datadir | /var/lib/mysql/ |
| ignore_db_dirs | |
| innodb_data_home_dir | |
| innodb_log_group_home_dir | ./ |
| innodb_max_dirty_pages_pct | 75.000000 |
| innodb_max_dirty_pages_pct_lwm | 0.000000 |
| innodb_tmpdir | |
| innodb_undo_directory | ./ |
| lc_messages_dir | /usr/share/percona-server/ |
| plugin_dir | /usr/lib64/mysql/plugin/ |
| slave_load_tmpdir | /tmp |
| tmpdir | /tmp |
+-----------------------------------------+-------------------------------------+
15 rows in set (0.07 sec)
mysql>
SELECT table_name AS "Tables",
round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = 'zabbix'
ORDER BY (data_length + index_length) DESC;
+----------------------------+------------+
| Tables | Size in MB |
+----------------------------+------------+
| history | 545043.75 |
| history_uint | 44729.66 |
| trends | 13500.41 |
| trends_uint | 1666.66 |
| history_text | 650.31 |
# Zabbix > 3.2, history 30, Trends 300
#cat partition.sql
DELIMITER $$
CREATE PROCEDURE `partition_create`(SCHEMANAMEvarchar(64), TABLENAME varchar(64), PARTITIONNAME varchar(64), CLOCK int)
BEGIN
/*
SCHEMANAME = The DB schema in which to make changes
TABLENAME = The table with partitions to potentially delete
PARTITIONNAME = The name of the partition to create
*/
/*
Verify that the partition does not already exist
*/
DECLARE RETROWS INT;
SELECT COUNT(1) INTO RETROWS
FROM information_schema.partitions
WHERE table_schema = SCHEMANAME AND table_name = TABLENAME ANDpartition_description >= CLOCK;
IF RETROWS = 0 THEN
/*
1. Print a messageindicating that a partition was created.
2. Create the SQL to createthe partition.
3. Execute the SQL from #2.
*/
SELECT CONCAT( "partition_create(", SCHEMANAME, ",",TABLENAME, ",", PARTITIONNAME, ",", CLOCK, ")" )AS msg;
SET @sql = CONCAT( 'ALTER TABLE ', SCHEMANAME, '.', TABLENAME, ' ADDPARTITION (PARTITION ', PARTITIONNAME, ' VALUES LESS THAN (', CLOCK, '));' );
PREPARE STMT FROM @sql;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF;
END$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE `partition_drop`(SCHEMANAMEVARCHAR(64), TABLENAME VARCHAR(64), DELETE_BELOW_PARTITION_DATE BIGINT)
BEGIN
/*
SCHEMANAME = The DB schema in which tomake changes
TABLENAME = The table with partitions to potentially delete
DELETE_BELOW_PARTITION_DATE = Delete any partitions with names that aredates older than this one (yyyy-mm-dd)
*/
DECLARE done INT DEFAULT FALSE;
DECLARE drop_part_name VARCHAR(16);
/*
Get a list of all the partitions that are older than the date
in DELETE_BELOW_PARTITION_DATE. All partitions are prefixed with
a "p", so use SUBSTRING TOget rid of that character.
*/
DECLARE myCursor CURSOR FOR
SELECT partition_name
FROM information_schema.partitions
WHERE table_schema = SCHEMANAME AND table_name = TABLENAME ANDCAST(SUBSTRING(partition_name FROM 2) AS UNSIGNED)
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
/*
Create the basics for when we need to drop the partition. Also, create
@drop_partitions to hold a comma-delimited list of all partitions that
should be deleted.
*/
SET @alter_header = CONCAT("ALTER TABLE ", SCHEMANAME,".", TABLENAME, " DROP PARTITION ");
SET @drop_partitions = "";
/*
Start looping through all the partitions that are too old.
*/
OPEN myCursor;
read_loop: LOOP
FETCH myCursor INTO drop_part_name;
IF done THEN
LEAVE read_loop;
END IF;
SET @drop_partitions = IF(@drop_partitions = "",drop_part_name, CONCAT(@drop_partitions, ",", drop_part_name));
END LOOP;
IF @drop_partitions != "" THEN
/*
1. Build the SQL to drop allthe necessary partitions.
2. Run the SQL to drop thepartitions.
3. Print out the tablepartitions that were deleted.
*/
SET @full_sql = CONCAT(@alter_header, @drop_partitions, ";");
PREPARE STMT FROM @full_sql;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`,@drop_partitions AS `partitions_deleted`;
ELSE
/*
No partitions are beingdeleted, so print out "N/A" (Not applicable) to indicate
that no changes were made.
*/
SELECT CONCAT(SCHEMANAME, ".", TABLENAME) AS `table`,"N/A" AS `partitions_deleted`;
END IF;
END$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE`partition_maintenance`(SCHEMA_NAME VARCHAR(32), TABLE_NAME VARCHAR(32),KEEP_DATA_DAYS INT, HOURLY_INTERVAL INT, CREATE_NEXT_INTERVALS INT)
BEGIN
DECLARE OLDER_THAN_PARTITION_DATE VARCHAR(16);
DECLARE PARTITION_NAME VARCHAR(16);
DECLARE OLD_PARTITION_NAME VARCHAR(16);
DECLARE LESS_THAN_TIMESTAMP INT;
DECLARE CUR_TIME INT;
CALL partition_verify(SCHEMA_NAME,TABLE_NAME, HOURLY_INTERVAL);
SET CUR_TIME = UNIX_TIMESTAMP(DATE_FORMAT(NOW(), '%Y-%m-%d 00:00:00'));
SET @__interval = 1;
create_loop: LOOP
IF @__interval > CREATE_NEXT_INTERVALS THEN
LEAVE create_loop;
END IF;
SET LESS_THAN_TIMESTAMP = CUR_TIME + (HOURLY_INTERVAL * @__interval *3600);
SET PARTITION_NAME = FROM_UNIXTIME(CUR_TIME + HOURLY_INTERVAL *(@__interval - 1) * 3600, 'p%Y%m%d%H00');
IF(PARTITION_NAME != OLD_PARTITION_NAME) THEN
CALLpartition_create(SCHEMA_NAME, TABLE_NAME, PARTITION_NAME, LESS_THAN_TIMESTAMP);
END IF;
SET @__interval=@__interval+1;
SET OLD_PARTITION_NAME = PARTITION_NAME;
END LOOP;
SET OLDER_THAN_PARTITION_DATE=DATE_FORMAT(DATE_SUB(NOW(), INTERVALKEEP_DATA_DAYS DAY), '%Y%m%d0000');
CALL partition_drop(SCHEMA_NAME, TABLE_NAME, OLDER_THAN_PARTITION_DATE);
END$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE `partition_verify`(SCHEMANAMEVARCHAR(64), TABLENAME VARCHAR(64), HOURLYINTERVAL INT(11))
BEGIN
DECLARE PARTITION_NAME VARCHAR(16);
DECLARE RETROWS INT(11);
DECLARE FUTURE_TIMESTAMP TIMESTAMP;
/*
* Check if any partitions exist for the given SCHEMANAME.TABLENAME.
*/
SELECT COUNT(1) INTO RETROWS
FROM information_schema.partitions
WHERE table_schema = SCHEMANAME AND table_name = TABLENAME ANDpartition_name IS NULL;
/*
* If partitions do not exist, go ahead and partition the table
*/
IFRETROWS = 1 THEN
/*
* Take the current date at 00:00:00 and add HOURLYINTERVAL to it. This is the timestamp below which we willstore values.
* We begin partitioning based on the beginning of a day. This is because we don't want to generate arandom partition
* that won't necessarily fall in line with the desired partition naming(ie: if the hour interval is 24 hours, we could
* end up creating a partition now named "p201403270600" whenall other partitions will be like "p201403280000").
*/
SET FUTURE_TIMESTAMP = TIMESTAMPADD(HOUR, HOURLYINTERVAL,CONCAT(CURDATE(), " ", '00:00:00'));
SET PARTITION_NAME = DATE_FORMAT(CURDATE(), 'p%Y%m%d%H00');
-- Create the partitioning query
SET @__PARTITION_SQL = CONCAT("ALTER TABLE ", SCHEMANAME,".", TABLENAME, " PARTITION BY RANGE(`clock`)");
SET @__PARTITION_SQL = CONCAT(@__PARTITION_SQL, "(PARTITION ",PARTITION_NAME, " VALUES LESS THAN (",UNIX_TIMESTAMP(FUTURE_TIMESTAMP), "));");
-- Run the partitioning query
PREPARE STMT FROM @__PARTITION_SQL;
EXECUTE STMT;
DEALLOCATE PREPARE STMT;
END IF;
END$$
DELIMITER ;
DELIMITER $$
CREATE PROCEDURE`partition_maintenance_all`(SCHEMA_NAME VARCHAR(32))
BEGIN
CALL partition_maintenance(SCHEMA_NAME, 'history', 30, 24, 14);
CALL partition_maintenance(SCHEMA_NAME, 'history_log', 30, 24, 14);
CALL partition_maintenance(SCHEMA_NAME, 'history_str', 30, 24, 14);
CALL partition_maintenance(SCHEMA_NAME, 'history_text', 30, 24, 14);
CALLpartition_maintenance(SCHEMA_NAME, 'history_uint', 30, 24, 14);
CALL partition_maintenance(SCHEMA_NAME, 'trends', 120, 24, 14);
CALL partition_maintenance(SCHEMA_NAME, 'trends_uint', 120, 24, 14);
END$$
DELIMITER ;
# import partition.sql
mysql -u'zabbix' -p'zabbix' zabbix < partition.sql
# run
nohup mysql -u'zabbix' -p'zabbix' 'zabbix' -e "CALL partition_maintenance_all('zabbix')" &> /root/partition.log&
tail -f /root/partition.log
# 查看过程逻辑
show create procedure partition_maintenance_all \G;
# 删除存储过程
drop procedure if exists partition_maintenance_all;
# 查看存储过程
show procedure status like 'partition_maintenance%' \G;
# 查看
show create table history
# crontab
[root@sg-gop-10-65-200-90 wangao]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
15 3 * * * root bash /opt/sa_scripts/zabbix_partitioning.sh
[root@sg-gop-10-65-200-90 wangao]# cat /opt/sa_scripts/zabbix_partitioning.sh
#!/bin/bash
user='zabbix'
password='zabbix'
database='zabbix'
mysql -u${user} -p$password $database -e "CALL partition_maintenance_all('zabbix');"
zabbix mysql 8g优化_Zabbix分区优化相关推荐
- zabbix mysql 8g优化_zabbix mysql调优
SELECT table_name AS "Tables", round(((data_length + index_length) / 1024 / 1024), 2) &quo ...
- mysql zabbix优化_zabbix性能优化中的几个中肯建议(104)
随着zabbix的广泛应用,少数人的zabbix服务器在性能上出现瓶颈,或者在未来会出现性能方面的瓶颈,接下来讨论几个有效并且简单的优化方案. 服务器硬件 想通过几个简单的配置让服务器提高成倍的性能, ...
- zabbix mysql主从延迟_zabbix监控mysql主从同步和延迟
一.环境需求 主机A: zabbix-server 主机B: zabbix-agent/mysql从 二.主机B操作 1.添加监控脚本 vim /data/zabbix/mysql_slave_che ...
- zabbix mysql监控告警_Zabbix监控mysql配置及故障告警配置
同时介绍了触发器的创建及zabbix通过邮件方式告警配置. 一.配置自带模板监控mysql 1.提供配置文件模板 文件位置在源码包/usr/local/src/zabbix-3.0.4/conf/za ...
- zabbix mysql 脚本路径_Zabbix监控MySQL脚本
监控思路: 先在Zabbix主机上面配置好MySQL服务器的信息,添加好Zabbix自带的Template App MySQL模版,然后去MySQL服务器上安装agent,再添加MySQL监控脚本. ...
- zabbix mysql复制延迟_Zabbix监控mysql主从复制状态
原理 mysql slave show slave status\G 在输出信息中查看I/O线程和SQL线程的状态值(YES为正常,NO为错误) Slave_IO_Running: Yes Slave ...
- zabbix mysql 表空间_Zabbix监控达梦数据库表空间
技术实现思路 利用Zabbix监控工具的定制功能.借鉴Zabbix对Oracle的监控原理,实现达梦数据库表空间监控.通过自动发现脚本发现达梦数据库表空间,然后再制定额外的属于达梦表空间的监控项,配置 ...
- zabbix mysql优化 my.cnf_zabbix数据库优化之数据库优化(二)
zabbix数据库优化之数据库优化二 简介 数据库history设置是保存7天.然后如果你没有分区.虽然数据在减少但是表空间不会减少.浪费硬盘空间的同事缓存内的cache部分也没有被释放.分区后可以迁 ...
- mysql每10万条数据分区_WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案...
1. 背景 项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实需求是将地方坐标系坐标反转成WGS84坐标,如果现在需要将其转换成百度坐标系数据.常规方案是先建立好整个该市的本地坐标和百度坐标 ...
最新文章
- 机器学习与高维信息检索 - Note 6 - 核, 核方法与核函数(Kernels and the Kernel Trick)
- CSDN 十大技术主题盘点-AI篇
- Canny-VO: 基于几何3D-2D边缘对准的RGB-D视觉里程计
- 网络设备中的集线器(Hub)是什么?—Vecloud微云
- 大数据审计的发展_从历史的角度看大数据审计发展
- sql server(常用)
- Oracle中通过Job实现定时同步两个数据表之间的数据
- 鸿蒙硬件HI3861-I2C-MCP23017
- Vue 在beaforeCreate时获取data中的数据
- 使用 Xilinx Documentation Navigator 查看官方文档
- 计算机网络第1章概述
- windows执行命令来运行loadrunner录制好的脚本(收藏)
- Xpath--使用Xpath爬取糗事百科成人版图片
- Quartz是什么?
- 蜗店SaaS系统功能介绍
- 职场常用的办公软件,操作很方便
- 关于cmd打开时提示“系统找不到指定的路径”问题
- java精尽面试题MySQL面试高频一百问(工程师方向)
- V3S-Zero 网络篇章 Linux5.2
- 游戏小程序源码 一起来找茬
热门文章
- @value报错_Excel这都是些啥?#VALUE!、#DIVO!、#NUM!、#REF!、#NULL!、#NA!
- python里面ca_Python SSL服务器提供中间CA证书
- 基于canoe 新建一个lin工程_CANoe教程 | 高级编程 - C Library API
- Jquery的html方法里包含特殊字符的处理,类似双引号之类的
- c语言是一门对标识符大小写敏感的程序设计语言,《C语言程序设计》课程自测题...
- dword类型和十进制有什么区别_微信小商店有几种类型,有什么区别?
- python php 通信,Python和php通信乱码问题解决方法
- 测量左右磁极的原片磁铁
- 来自于参赛队伍所反映的总决赛落选之后的建议
- 全国大学生智能汽车竞赛-百度线下赛道报名开始!