mysql 锁表

show full processlist

发现锁住的进程

使用

kill query id

结束锁住的线程

mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在 mysql启动的时候加入一些参数。如果在my.cnf里面修改,需增加如下几行

long_query_time = 1
log-slow-queries = /var/youpath/slow.log
log-queries-not-using-indexes

long_query_time 是指执行超过多久的sql会被log下来,这里是1秒。
log-slow-queries 设置把日志写在那里,可以为空,系统会给一个缺省的文件host_name -slow.log,我生成的log就在mysql的data目录
log-queries-not-using-indexes 就是字面意思,log下来没有使用索引的query。

 

-s ORDER what to sort by (t, at, l, al, r, ar etc), ‘at’ is default
-t NUM just show the top n queries
-g PATTERN grep: only consider stmts that include this string

-s,是order的顺序,主要有c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙
-t,是top n的意思,即为返回前面多少条的数据
-g,后边可以写一个正则匹配模式,大小写不敏感的

mysqldumpslow -s c -t 20 host-slow.log
上述命令可以看出访问次数最多的20个sql语句

mysqldumpslow -s r -t 20 host-slow.log
上述命令可以看出返回记录集最多的20个sql。

mysqldumpslow -t 10 -s t -g “left join” host-slow.log
这个是按照时间返回前10条里面含有左连接的sql语句

 

 

一.1 获 取锁等待情况
可以通过检查 table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
mysql> show status like 'Table%';
+----------------------------+----------+
| Variable_name | Value |
+----------------------------+----------+
| Table_locks_immediate | 105 |
| Table_locks_waited | 3 |
+----------------------------+----------+
2 rows in set (0.00 sec)
可以通过检查 Innodb_row_lock状态变量来分析系统上的行锁的争夺情况:
mysql> show status like 'innodb_row_lock%';
+----------------------------------------+----------+
| Variable_name | Value |
+----------------------------------------+----------+
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 2001 |
| Innodb_row_lock_time_avg | 667 |
| Innodb_row_lock_time_max | 845 |
| Innodb_row_lock_waits | 3 |
+----------------------------------------+----------+
5 rows in set (0.00 sec)
另外,针对Innodb类型的表,如果 需要察看当前的锁等待情况,可以设置InnoDB Monitors,然后通过Show innodb status察看,设置的方式是:
CREATE TABLE innodb_monitor(a INT) ENGINE=INNODB;
监视器可以通过发出下列语句来被停止:
DROP TABLE innodb_monitor;
设置监视器后,在show innodb status的显示内容中,会有详细的当前锁等待的信息,包括表名、锁类型、锁定记录的情况等等,便于进行进一步的分析和问题的确定。打开监视器以后,默 认情况下每15秒会向日志中记录监控的内容,如果长时间打开会导致.err文件变得非常的巨大,所以我们在确认问题原因之后,要记得删除监控表以关闭监视 器。或者通过使用--console选项来启动服务器以关闭写日志文件。


如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。 
show processlist;只 列出前100条,如果想全列出请使用show full processlist; 
mysql> show processlist;(非常管用哦)
### 三级标题:MySQL的原因 MySQL数据库并发控制机制的一部分,其核心目的是确保数据一致性和事务隔离性。然而,在高并发或事务处理不当的情况下,问题可能频繁出现,主要原因包括: - **资源竞争**:当多个事务尝试同时修改同一张或某一行数据时,MySQL会通过机制控制访问顺序。如果某个事务长时间持有而未释放,其他事务将被阻塞,导致现象[^1]。 - **死**:两个或多个事务彼此等待对方持有的资源,形成循环依赖。例如,事务AX并请求Y,而事务BY并请求X,此时系统进入死状态[^1]。 - **程序逻辑错误**:在多操作中,若事务未按照统一顺序访问资源,例如一个事务先操作A再操作B,而另一个事务则先操作B再操作A,极易引发死[^2]。 - **僵死进程**:在高并发环境下,未正确关闭的数据库连接可能导致进程处于“Locked”状态,持续持有资源,导致无法被其他事务访问[^2]。 ### 三级标题:MySQL的处理机制 MySQL机制主要依赖于InnoDB存储引擎,其处理方式如下: - **类型**:InnoDB支持行级。行级用于提高并发性能,但增加了死风险;通常用于DDL操作,如 `ALTER TABLE`,会定整张[^1]。 - **死检测与超时**: - InnoDB引擎具备自动死检测功能,一旦检测到死,会回滚其中一个事务并抛出错误信息,如 `ERROR 1213 (40001): Deadlock found`[^1]。 - 如果事务等待的时间超过系统设定的阈值(默认50秒),MySQL将抛出 `ERROR 1205 (HY000): Lock wait timeout exceeded` 错误。 - **等待机制**:事务在请求时,若资源被其他事务占用,会进入等待状态。可通过以下命令查看当前情况: ```sql SHOW OPEN TABLES WHERE In_use > 0; -- 查看当前被定的 SHOW ENGINE INNODB STATUS; -- 查看最近一次死的详细信息 ``` 输出中将包含事务ID、等待的类型及等待时间等关键信息。 ### 三级标题:MySQL的解决方法 针对问题,可采取以下措施进行排查与处理: - **立即解除**: - 查看当前活动的进程并杀死阻塞进程: ```sql SHOW PROCESSLIST; -- 查找状态为 'Locked' 或 'Waiting for lock' 的进程 KILL <thread_id>; -- 假设找到进程ID为14,则执行 KILL 14 ``` 该方法可快速释放被占用的资源。 - 查看当前被定的: ```sql SHOW OPEN TABLES WHERE In_use > 0; ``` 用于定位具体被对象。 - **预防死**: - **统一访问顺序**:确保事务在访问多个时按照统一顺序进行,避免交叉等待,从而降低死概率[^2]。 - **优化事务执行时间**:减少事务中SQL语句的执行时间,避免在事务中执行复杂逻辑,及时提交事务以释放。 - **设置等待超时**:通过调整 `innodb_lock_wait_timeout` 参数控制事务等待的最长时间,避免长时间阻塞: ```ini innodb_lock_wait_timeout = 30 ``` - **监控与自动化处理**: - 定期运行脚本监控数据库连接状态,自动清理僵死进程: ```bash mysql -u root -p<password> -e "SHOW PROCESSLIST" | grep -i "Locked" | awk '{print $1}' | xargs -r kill ``` 该脚本可定期检测并杀死定状态的连接[^2]。 - 分析死日志: ```sql SHOW ENGINE INNODB STATUS; ``` 可获取最近一次死的详细信息,包括事务等待资源、持有的等,用于优化SQL语句和事务逻辑。 - **其他优化建议**: - **使用索引**:确保查询语句使用索引,避免全扫描带来的竞争问题。 - **调整事务隔离级别**:适当降低事务隔离级别(如从 `REPEATABLE READ` 改为 `READ COMMITTED`)可减少的持有范围,降低冲突概率[^1]。 - **限制长事务**:在应用层设置事务执行时间上限,避免长时间未提交的事务占用资源。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值