故障场景:
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)问题得到解决。