记一次ptosc造成meta lock案例

故障场景:

ptosc操作一张表时pt进程hang住不动,并且从库监控告警running threads飙升。

pt脚本:

time pt-online-schema-change --alter 'create index idx_create_at(create_at)' --print --charset utf8 --chunk-time 0.500000 --critical-load Threads_connected:3000,Threads_running:500 --max-load Threads_connected:3000,Threads_running:500 --check-replication-filters --check-alter --recurse=1 --max-lag 1.000000 --check-interval 1.000000 --alter-foreign-keys-method=auto --execute --statistics --no-version-check --progress percentage,1 --user=dba --password='test.1q' --host=127.0.0.1 --port=3306 D=jianzhi_rpo,t=jz_rpo_option_log 

show processlist 发现异常如下:

*************************** 1. row ***************************
           ID: 27592
         USER: root
         HOST: 127.0.0.1:24149
           DB: jianzhi_rpo
      COMMAND: Query
         TIME: 342
        STATE: Waiting for table metadata lock
         INFO: CREATE TRIGGER `pt_osc_jianzhi_rpo_jz_rpo_option_log_del` AFTER DELETE ON `jianzhi_rpo`.`jz_rpo_option_log` FOR EACH ROW DELETE IGNORE FROM `jianzhi_rpo`.`_jz_rpo_option_log_new` WHERE `jianzhi_rpo`.`_jz_rpo_option_log_new`.`id` <=> OLD.`id`
      TIME_MS: 341779
    ROWS_SENT: 0
ROWS_EXAMINED: 0

表结构如下:

CREATE TABLE `jz_rpo_option_log` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `opt_uid` int(11) NOT NULL DEFAULT '0' COMMENT '操作人ID',
  `opt_type` int(11) NOT NULL DEFAULT '0' COMMENT '操作类型',
  `org_resume_uid` int(11) NOT NULL DEFAULT '0' COMMENT '被操作的简历ID',
  `owner_id` int(11) NOT NULL DEFAULT '0' COMMENT '归属人',
  `project_id` int(11) NOT NULL DEFAULT '0' COMMENT '相关项目ID',
  `project_name` varchar(512) NOT NULL DEFAULT '' COMMENT '项目名称冗余',
  `content` text COMMENT '备注内容',
  `bak_int` int(11) NOT NULL DEFAULT '0' COMMENT '冗余字段1',
  `bak_varchar` varchar(512) NOT NULL DEFAULT '' COMMENT '冗余备用2',
  `create_at` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_at` int(11) NOT NULL DEFAULT '0' COMMENT '更新时间',
  `org_processing_status` int(11) NOT NULL DEFAULT '0' COMMENT '原处理状态',
  `org_contact_status` int(11) NOT NULL DEFAULT '0' COMMENT '原沟通状态',
  `reason` varchar(50) NOT NULL DEFAULT '0' COMMENT '简历失败原因',
  `resource` int(11) NOT NULL DEFAULT '-1' COMMENT '来源',
  PRIMARY KEY (`id`),
  KEY `idx_resume_uid_type_upt` (`org_resume_uid`,`opt_type`,`update_at`)
) ENGINE=InnoDB AUTO_INCREMENT=8495943 DEFAULT CHARSET=utf8 COMMENT='操作日志'

故障复现:

1、在测试环境创建测试表

2、session1

use jianzhi_rpo
begin;
select * from jz_rpo_option_log;

3、session2

use jianzhi_rpo
CREATE TRIGGER `pt_osc_jianzhi_rpo_jz_rpo_option_log_del` AFTER DELETE ON `jianzhi_rpo`.`jz_rpo_option_log` FOR EACH ROW DELETE IGNORE FROM `jianzhi_rpo`.`_jz_rpo_option_log_new` WHERE `jianzhi_rpo`.`_jz_rpo_option_log_new`.`id` <=> OLD.`id`;

此时session处于等待中

4、查看processlist

5、session3 进行正常查询,此时查询语句也处于等待中

再次查看processlist

 

问题总结:

线上造成ptosc进程hang住的主要原因是某个进程进行select查询时居然开启了事务并且没有及时提交。

解决方法:

通过和开发同事沟通,发现pymysql连接数据库时默认是开启了事务,并且没有自动提交。

在代码中加入db.autocommit(True)问题得到解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值