当前位置: 首页 > news >正文

k8s链接数据库故障Waiting for table metadata lock

在这里插入图片描述场景:早上来发现一个程序,链接mysql数据库有点问题,随后排查,因为容器在k8s里面。所以尝试重启了pod没有效果

一、重启pod:
这里是几种在Kubernetes中重启Pod的方法:

  1. 删除Pod,利用Deployment重建
kubectl delete pod mypod

Deployment控制器会重建新的Pod

  1. 使用kubectl edit直接编辑Pod定义,设置spec.restartPolicy为Always

  2. 利用RollingUpdate触发Pod重启:

kubectl rollout restart deployment mydeploy
  1. 利用kubectl exec远程执行重启命令:
kubectl exec mypod -- /bin/sh -c "reboot"
  1. 设置PodTemplate的LastAppliedConfigAnnotation触发重启

以上都是些常用的在K8s中重启Pod的方式。

根据需要选择合适的方法。删除重建和RollingUpdate比较流畅,适合批量重启。exec命令适用于个别Debug场景的重启。

二、强制停止服务
有几种方法可以完全停掉Kubernetes集群中的Pod:

  1. 缩容Deployment:
kubectl scale deployment my-deploy --replicas=0 

这会将Pod的副本数设置为0,停止所有Pod。

  1. 移除Pod selector标签:

编辑Deployment,移除pod模板中的标签,如app=myapp。这会使现有Pod与部署不匹配而被删除。

  1. 编辑Deployment的.spec.paused=true

这会暂停Deployment的操作,停止重新创建Pod。

  1. 删除Namespace:
kubectl delete namespace my-ns

删除命名空间也会删除其中的所有Pod。

所以通过组合使用上述方法,可以完全删除或停止Namespace和Deployment中的Pod。

注意完全停Pod可能会影响服务,要根据实际情况平滑处理。

三、检查mysql
通过show processlist;
发现有大量的Waiting for table metadata lock

命令查询及批量删除:
要批量kill掉那些因等待表元数据锁(Waiting for table metadata lock)而被阻塞的连接,可以使用如下方法:

  1. 查找那些被阻塞的连接:
SELECT * FROM information_schema.processlist 
WHERE state = 'Waiting for table metadata lock'
AND time > 60; 

这会返回所有被阻塞超过60秒的连接。

  1. 然后批量kill掉这些连接:
SELECT concat('KILL ', id, ';') FROM information_schema.processlist
WHERE state = 'Waiting for table metadata lock' 
AND time > 60;

这会生成一系列的KILL语句。

  1. 复制这些KILL语句并执行,就能有效终止那些被长时间阻塞的连接,释放表锁。

注意提前检查需要KILL的连接,避免影响正处理重要任务的连接。

tips:
1.要用对特权账户,有些业务账户无法kill特权账户执行的sql。
2.要有倒序,查看卡在第一个的sql,然后执行kill
在这里插入图片描述
3.应用停止之后,数据库没有新增的输入输出了,然后kill到lock表的ID就可以恢复了

其他解决方法:
MySQL中处理锁表的常用方法有:

  1. 通过show processlist;命令查看是否有锁表现象发生,分析找出发生锁表的session进程。

  2. 通过show engine innodb status\G;命令查看事务是否存在锁等待。

  3. 通过增加索引优化查询改善锁表情况。

  4. 终止或者重启发生锁表的session进程。可以用kill命令终止进程的方式。

  5. 调整隔离级别参数lower_isolation_level,将数据库隔离级别调低,使一些读操作可以忽略锁,从而减少锁表概率。

  6. 调整innodb_lock_wait_timeout参数,让锁等待超过指定秒数后返回错误而不是无限等待锁。

  7. 对于主从数据库,可以kill主库sessionId后使请求被转移到从库上,避开主库上的锁。

综上,MySQL通过参数调整、进程管理、查询优化、读写分离等方式可以有效处理锁表问题。

http://www.lryc.cn/news/263037.html

相关文章:

  • 数字经济如何驱动企业高质量发展? ——核心机制、模式选择与推进路径
  • 机器学习——支持向量机
  • mq的作用
  • AUTOSAR组织引入了Rust语言的原因是什么?有哪些好处?与C++相比它有什么优点?并推荐一些入门学习Rust语言链接等
  • 基于PyCharm实现串口GUI编程
  • 【1.8计算机组成与体系结构】磁盘管理
  • 1663:【 例 1】取石子游戏 1
  • Django去访问web api接口Object of type Session is not JSON serializable
  • 每日一题,二维平面
  • 【jupyter notebook】jupyter notebook 调用另一个jupyter notebook 的函数
  • Linux--学习记录(3)
  • 自然语言处理阅读第一弹
  • Spring Boot+Mybatis设置sql日志打印
  • 步进电机电流设置的3种方法
  • uniapp-使用返回的base64转换成图片
  • 有机面条市场分析:到2026 年的复合年增长率为 5.4%
  • 广州设计周落幕|值得被歌颂的奥力斯特岩板
  • WTN6系列语音芯片:PWM与DAC音频输出在PCB设计中的优势
  • 设计模式 原型模式 与 Spring 原型模式源码解析(包含Bean的创建过程)
  • Docker介绍,Docker安装
  • CLIP 对比学习 源码理解快速学习
  • 6.鸿蒙app_hap_DevEco如何真机调试模式_app安装在手机中
  • 【JVM从入门到实战】(八)垃圾回收(1)
  • LeeCode前端算法基础100题(12)-删除有序数组中的重复项
  • MATLAB图解傅里叶变换(初学者也可以理解)
  • uni-app 用于开发H5项目展示饼图,使用ucharts 饼图示例
  • 回归预测 | MATLAB实现SABO-LSTM基于减法平均优化器优化长短期记忆神经网络的多输入单输出数据回归预测模型 (多指标,多图)
  • JDK bug:ciObjectFactory::create_new_metadata
  • Flink系列之:Over聚合
  • Java开发工具积累(符合阿里巴巴手册规范)