迁移zabbix引发的一次MySQL锁阻塞

本文详细记录了在整体迁移Zabbix过程中遇到的历史数据过大问题及其解决办法,包括删除旧历史数据、使用truncate命令以及处理MySQL锁阻塞现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体迁移zabbix,备份数据库时发现history开头的表都很大(8GB+)。zabbix的数据存储机制让zabbix每小时对history*表进行统计,统计值(最大值、最小值、平均值)放到trends*表中。注:zabbix配置监控项时有历史数据保存时间、趋势数据保存时间两项,分别对应history*、trends*。
备份zabbix数据库,由于history*表很大,为了减轻备份压力和缩短迁移时间决定抛弃一部分历史数据(7天前的数据全部删掉).
1、根据表中clock字段,删除几张大表7天前的数据(类似这样的语句)。

  

mysql> delete from history_uint where clock<unix_timestamp(adddate(now(),-7));
mysql> delete from history where clock<unix_timestamp(adddate(now(),-7));

2、然后就是无尽的等待这个事务的完成,数据太多发现没有半天是删不完的,决定kill这个线程然后truncate这些表,放弃所有的历史数据(必尽还有每小时统计一次的趋势数据,不用担心)

mysql> show processlist;
mysql> kill 136765
mysql> truncate table history_uint


3、发现truncate表时没有之前快了,不是感觉变慢了而是根本就没有执行的感觉。查看一下线程状态,是这样的。

***************************26. row***************************
Id: 384238681
User: root
db: zabbix
Host: localhost
Command: Query
Time: 385
State: Waiting for table metadate lock
Info: truncate table history_uint
***************************27. row***************************


truncate在等待一个锁,除了这个线程,还有好几个insert 、select等待锁:

***************************29. row***************************
Id: 384163828
User: zabbix
db: zabbix
Host: localhost
Command: Query
Time: 379
State: Waiting for table metadate lock
Info: select min(clock) from history_unit where itemid=28041
***************************30. row***************************

***************************30. row***************************
Id: 384244861
User: zabbix
db: zabbix
Host: localhost
Command: Query
Time: 53
State: Waiting for table metadate lock
Info: insert into history_unit (itemid,clock,value,ns) values (27326,1431400946,724714852352,435254068) ... ... ... ...
***************************31. row***************************


4、发现这个现象,有种不好了感觉,为了蔡某大神。大神就是大神,果然专业,一看就知道问题所在了。
大神的意思是这样的:
truncate没有拿到mdl锁,MySQL在回滚delete回滚结束前持有mdl锁,truncate被锁后续insert被truncate锁(表锁),杀掉truncate就可以正常 insert、select,完成delete回滚,回滚完成后就可以truncate了。这是一种锁阻塞现象。
按照大神的意思操作,杀掉truncate线程,等待MySQL的delete回滚结束,然后truncate表,然后、然后就顺利完成了zabbix数据库迁移。
文章出处:http://www.xiaomastack.com/2015/05/14/mysql-lock/

### 升级 Zabbix 4.0 至 Zabbix 6.0 的 MySQL 数据库迁移 #### 停止现有 Zabbix 服务 为了确保数据一致性,在执行任何数据库操作之前,应当先停止正在运行的 Zabbix 服务[^1]。 ```bash systemctl stop zabbix-server ``` #### 备份当前 Zabbix 数据库 备份现有的 Zabbix 数据库是非常重要的一步,以防万一出现问题可以恢复原始状态。可以通过导出 SQL 文件来完成这一步骤: ```bash mysqldump -u root -p zabbix > zabbix_backup.sql ``` #### 准备新环境并安装 Zabbix 6.0 按照官方文档准备新的操作系统环境,并安装对应版本的 Zabbix Server 和 Web 接口组件。对于基于 RedHat/CentOS 的系统来说,可能涉及如下 RPM 包的下载与安装[^4]: - `zabbix-apache-conf` - `zabbix-selinux-policy` - `zabbix-server-mysql` 或者 `zabbix-server-pgsql`(如果计划切换到 PostgreSQL) - `zabbix-sql-scripts` - `zabbix-web` - `zabbix-web-deps` - `zabbix-web-mysql` 或者 `zabbix-web-pgsql` 注意这里选择了适合 MySQL 版本的相关软件包。 #### 更新 MySQL 配置以满足 Zabbix 6.0 要求 由于目标是迁移到支持 MySQL 8.0 的环境中,因此需要确认 MySQL 已经更新到了至少 8.0 版本以上[^3]。此外还需要调整一些参数设置使得它们兼容于新版 Zabbix: - 设置字符集为 utf8mb4 - 修改 sql_mode 参数移除 ONLY_FULL_GROUP_BY 模式 这些更改可以在 `/etc/my.cnf.d/zabbix_server.conf` 中实现。 #### 进行数据库结构转换 一旦所有准备工作就绪,则可以根据官方指南逐步导入旧版的数据表定义以及历史记录等信息。具体命令可能是这样的形式[^2]: ```bash mysql -uzabbix -pzabbix_password zabbix < /usr/share/doc/zabbix*/create/mysql/schema.sql mysql -pzabbix_password zabbix < /usr/share/doc/zabbix*/create/mysql/images.sql mysql -uzabbix -pzabbix_password zabbix < /usr/share/doc/zabbix*/create/mysql/data.sql ``` 请注意替换其中的用户名、密码路径等内容为你自己的实际情况。 #### 启动服务验证配置有效性 最后启动 Zabbix Server 并通过浏览器访问前端界面测试整个系统的可用性和功能完整性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值