加入收藏 | 设为首页 | 会员中心 | 我要投稿 拼字网 - 核心网 (https://www.hexinwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

deadlock导致MySQL Hang解析

发布时间:2022-03-23 19:35:37 所属栏目:MySql教程 来源:互联网
导读:问题现象: MySQL 实例Hang 住,链接不断累积然后达到连接数上限,所有涉及事务的操作及连接的操作都被卡住,CPU 及负载较低; 问题处理: MySQL 主库Hang 住不可用,临时解决方法只能重启实例或者切换到备库,以保持业务持续可用; 问题原因: 错误监控线程
      问题现象:
 
      MySQL 实例Hang 住,链接不断累积然后达到连接数上限,所有涉及事务的操作及连接的操作都被卡住,CPU 及负载较低;
 
问题处理:
 
      MySQL 主库Hang 住不可用,临时解决方法只能重启实例或者切换到备库,以保持业务持续可用;
 
问题原因:
 
      错误监控线程(srv_error_monitor_thread)中调用 log_get_lsn 中的方法存在问题,不能解决 memory barrier 在mutex_exit 退出时可能导致的问题;
 deadlock导致MySQL Hang解析
问题分析过程:
 
对现场信息使用 pt-pmp 进行归类,详情见文档cti.pt_pmp ,简单说明如下:
  pthread_cond_wait,os_cond_wait(os0sync.cc:214),os_event_wait_low(os0sync.cc:214),sync_array_wait_event(sync0arr.cc:424),mutex_spin_wait(sync0sync.cc:580),mutex_enter_func(sync0sync.ic:218),pfs_mutex_enter_func(sync0sync.ic:218),srv_export_innodb_status(sync0sync.ic:218),innodb_export_status(ha_innodb.cc:12442),show_innodb_vars(ha_innodb.cc:12442),show_status_array(sql_show.cc:2597),fill_status(sql_show.cc:6749),do_fill_table(sql_show.cc:7416),get_schema_tables_result(sql_show.cc:7416),JOIN::prepare_result(sql_select.cc:823),JOIN::exec(sql_executor.cc:116),mysql_execute_select(sql_select.cc:1100),mysql_select(sql_select.cc:1100),handle_select(sql_select.cc:110),execute_sqlcom_select(sql_parse.cc:5134),mysql_execute_command(sql_parse.cc:2612),mysql_parse(sql_parse.cc:6386),dispatch_command(sql_parse.cc:1340),do_command(sql_parse.cc:1037),do_handle_one_connection(sql_connect.cc:982),handle_one_connection(sql_connect.cc:898),pfs_spawn_thread(pfs.cc:1860),start_thread(libpthread.so.0),clone(libc.so.6)
 
这个线程获取了 Lock_status, 但是在获取 srv_innodb_monitor_mutex时被阻塞
 
1 pthread_cond_wait,os_cond_wait(os0sync.cc:214),os_event_wait_low(os0sync.cc:214),sync_array_wait_event(sync0arr.cc:424),mutex_spin_wait(sync0sync.cc:580),mutex_enter_func(sync0sync.ic:218),pfs_mutex_enter_func(sync0sync.ic:218),log_print(sync0sync.ic:218),srv_printf_innodb_monitor(srv0srv.cc:1233),innodb_show_status(ha_innodb.cc:12491),innobase_show_status(ha_innodb.cc:12491),ha_show_status(handler.cc:6980),mysql_execute_command(sql_parse.cc:2836),mysql_parse(sql_parse.cc:6386),dispatch_command(sql_parse.cc:1340),do_command(sql_parse.cc:1037),do_handle_one_connection(sql_connect.cc:982),handle_one_connection(sql_connect.cc:898),pfs_spawn_thread(pfs.cc:1860),start_thread(libpthread.so.0),clone(libc.so.6)
 
这个线程获取了 srv_innodb_monitor_mutex,但是在获取 log_sys->mutex时被阻塞
  __lll_lock_wait(libpthread.so.0),_L_lock_791(libpthread.so.0),pthread_mutex_lock(libpthread.so.0),inline_mysql_mutex_lock(mysql_thread.h:690),next_event(mysql_thread.h:690),exec_relay_log_event(mysql_thread.h:690),handle_slave_sql(mysql_thread.h:690),pfs_spawn_thread(pfs.cc:1860),start_thread(libpthread.so.0),clone(libc.so.6)
 
sql thread 在获取 lock_log 被阻塞,原因是 lock_log 被 IO thread 线程获取。

(编辑:拼字网 - 核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!