常用的数据库锁等待分析工具需结合不同数据库(如MySQL、Oracle、PostgreSQL、SQL Server)的锁机制设计,核心分为数据库自带工具(无需额外安装,适合快速排查)和第三方专业工具(功能更全面,适合长期监控)。以下按数据库类型分类,详细说明工具的适用场景、核心功能及关键操作:
一、MySQL 锁等待分析工具(InnoDB 引擎为主)
MySQL 锁等待主要集中在 InnoDB 行锁/表锁、死锁,常用工具覆盖“实时排查”“死锁记录”“长期监控”三类场景:
1. 自带命令行工具(快速定位,无需安装)
适用场景:临时排查当前锁等待、死锁,适合开发/测试人员快速定位问题。
核心工具与操作:
- 1.1
show engine innodb status\G
- 核心功能:查看当前 InnoDB 事务、锁等待、死锁详情,是排查锁等待的“第一手资料”。
- 关键操作:
- 执行命令后,重点看 TRANSACTIONS 部分:
- 若存在锁等待,会显示
LOCK WAIT 标记,包含“阻塞事务ID(blocking_trx_id)”“被阻塞SQL”“锁类型(行锁/表锁)”; - 若存在死锁,会显示 LATEST DETECTED DEADLOCK 部分,列出死锁的两个事务SQL、锁模式(如
X锁“排他锁”、S锁“共享锁”)。
- 示例(锁等待信息):---TRANSACTION 12345, ACTIVE 10 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s) MySQL thread id 10, OS thread handle 1234, query id 5678 localhost root updating UPDATE order SET status=1 WHERE id=100 -- 被阻塞的SQL ------- TRX HAS BEEN WAITING 10 SEC FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 123 page no 456 n bits 72 index PRIMARY of table `test`.`order` trx id 12345 lock_mode X locks rec but not gap waiting Record lock, heap no 2 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
- 1.2
information_schema 系统表查询
- 核心功能:通过系统表查询所有锁等待事务、锁类型、涉及表/行,适合批量分析。
- 常用查询语句:
- 查看当前锁等待事务:SELECT trx_id AS 事务ID, trx_state AS 事务状态, trx_wait_started AS 等待开始时间, trx_query AS 等待SQL, blocking_trx_id AS 阻塞事务ID, blocking_pid AS 阻塞进程ID FROM information_schema.INNODB_LOCK_WAITS;
- 查看当前所有锁(行锁/表锁):SELECT lock_id AS 锁ID, lock_trx_id AS 持有锁事务ID, lock_table AS 锁表, lock_mode AS 锁模式, -- X=排他锁, S=共享锁 lock_rec_exists_flag AS 是否行锁 FROM information_schema.INNODB_LOCKS;
2. Percona Toolkit(第三方工具,专业死锁监控)
适用场景:生产环境长期监控死锁、自动记录死锁日志,适合DBA排查高频死锁问题。
核心工具:pt-deadlock-logger
- 功能:实时监控 MySQL 死锁,将死锁详情(事务SQL、锁模式、时间戳)输出到日志文件或数据库表,无需手动执行
show engine innodb status。 - 关键操作:
- 安装 Percona Toolkit(需先安装依赖:
yum install perl-DBI perl-DBD-MySQL); - 执行命令监控死锁并输出到日志:pt-deadlock-logger --user=root --password=123456 --host=localhost --dest=file:///var/log/mysql/deadlock.log
- 查看日志:日志会按时间戳记录每次死锁的“事务1SQL”“事务2SQL”“锁类型”,便于分析死锁原因(如两个事务互相持有对方需要的行锁)。
3. Percona Monitoring and Management(PMM,可视化监控)
适用场景:企业级 MySQL 性能监控,包含锁等待的实时可视化看板,适合团队协作分析。
- 核心功能:
- 提供“锁等待次数”“锁等待时长”“死锁次数”的趋势图;
- 关联展示锁等待对应的 SQL 语句、事务ID,可直接定位到具体业务代码;
- 关键操作:
- 部署 PMM Server(Docker 快速部署)和 PMM Client(安装在 MySQL 服务器);
- 在 PMM 界面的“MySQL InnoDB Locks”看板中,查看:
- 按表分组的锁等待次数(识别锁等待高频表,如下单表
order); - 锁等待时长 Top 10 的 SQL(优先优化长等待 SQL)。
二、Oracle 锁等待分析工具
Oracle 锁机制复杂(行锁、表锁、闩锁等),常用工具覆盖“实时查询”“历史分析”“可视化监控”三类场景:
1. 自带命令行工具(实时排查)
适用场景:临时定位当前锁等待、阻塞会话,适合快速处理紧急问题。
核心工具与操作:
- 1.1 动态性能视图查询
- 核心视图:
v$lock(锁信息)、v$session(会话信息)、v$locked_object(被锁对象)。 - 常用查询语句:
- 查看当前锁等待会话(阻塞与被阻塞关系):SELECT s1.sid 被阻塞会话ID, s1.serial# 被阻塞会话序列号, s1.sql_id 被阻塞SQL_ID, s2.sid 阻塞会话ID, s2.serial# 阻塞会话序列号, l1.type 锁类型, -- TM=表锁, TX=行锁 l1.lmode 持有锁模式, -- 6=排他锁, 3=共享锁 l1.request 等待锁模式 FROM v$lock l1, v$lock l2, v$session s1, v$session s2 WHERE l1.block = 1 -- 阻塞其他会话 AND l2.request > 0 -- 等待锁 AND l1.id1 = l2.id1 AND l1.id2 = l2.id2 AND l1.sid = s2.sid AND l2.sid = s1.sid;
- 根据 SQL_ID 查看具体 SQL 语句:SELECT sql_text FROM v$sql WHERE sql_id = 'xxx'; -- xxx为上述查询的被阻塞SQL_ID
- 1.2
alter system kill session(处理阻塞)
- 功能:杀死阻塞会话,释放锁资源(紧急处理时使用)。
- 操作示例:ALTER SYSTEM KILL SESSION '被阻塞会话ID,被阻塞会话序列号'; -- 如 ALTER SYSTEM KILL SESSION '123,456';
2. AWR/ASH 报告(历史分析)
适用场景:分析历史锁等待趋势、高频锁等待SQL,适合排查非实时但反复出现的锁问题。
- AWR 报告(Automatic Workload Repository):
- 核心功能:记录数据库每小时的性能数据,包含锁等待的“等待次数”“等待时长”,适合长期趋势分析。
- 关键操作:
- 生成 AWR 报告(需有 DBA 权限):@$ORACLE_HOME/rdbms/admin/awrrpt.sql
- 选择报告类型(HTML/TEXT)、时间范围,重点查看 Top 5 Timed Events 部分:
- 若“enqueue waits”(锁等待)排在前5,点击“enqueue waits”查看详情,包含“锁类型”“高频锁等待的 SQL_ID”;
- 查看 Segments by Row Lock Waits 部分,定位锁等待高频表。
- ASH 报告(Active Session History):
- 核心功能:记录活跃会话的实时数据(每10秒采样一次),适合分析最近1小时内的锁等待细节。
- 操作示例:@$ORACLE_HOME/rdbms/admin/ashrpt.sql
- 重点查看 Top Blocking Sessions 部分,识别阻塞源头会话及对应的 SQL。
3. Oracle Enterprise Manager(EM,可视化监控)
适用场景:企业级 Oracle 监控,提供锁等待的实时看板和历史趋势,适合DBA团队长期管理。
- 核心功能:
- 实时展示“锁等待会话数”“阻塞会话数”的仪表盘;
- 提供“锁等待追踪”功能,可直接关联到对应的 SQL 语句、业务表;
- 关键操作:
在 EM 界面的“Performance → Locking”中,查看:
- “Blocking Sessions”:实时阻塞关系图(直观展示谁阻塞谁);
- “Lock Wait History”:按时间维度的锁等待趋势(识别锁等待高峰时段)。
三、PostgreSQL 锁等待分析工具
PostgreSQL 锁机制以“行级锁”为主,常用工具以自带视图和轻量级第三方工具为主:
1. 自带命令行工具(实时排查)
适用场景:临时定位当前锁等待、阻塞会话,操作简单,无需额外安装。
核心工具与操作:
- 1.1 系统视图查询
- 核心视图:
pg_locks(锁信息)、pg_stat_activity(会话活动)。 - 常用查询语句:
- 查看当前锁等待会话(阻塞与被阻塞关系):SELECT a.pid 被阻塞进程ID, a.query 被阻塞SQL, b.pid 阻塞进程ID, b.query 阻塞SQL, l.mode 持有锁模式, -- ExclusiveLock=排他锁, ShareLock=共享锁 l.relation::regclass 被锁表名 FROM pg_locks l JOIN pg_stat_activity a ON l.pid = a.pid JOIN pg_stat_activity b ON l.blocking_pid = b.pid WHERE l.blocking_pid IS NOT NULL; -- 存在阻塞
- 查看锁等待时长:SELECT pid, now() - query_start AS 等待时长, query AS 等待SQL FROM pg_stat_activity WHERE wait_event_type = 'Lock' -- 等待事件类型为锁 AND state = 'active';
- 1.2
pg_blocking_pids 函数(快速定位阻塞PID)
- 功能:根据被阻塞进程ID,快速获取阻塞它的进程ID列表。
- 操作示例:SELECT pg_blocking_pids(1234); -- 1234为被阻塞进程ID,返回阻塞PID列表
- 1.3
pg_terminate_backend(终止阻塞进程)
- 功能:杀死阻塞进程,释放锁资源(紧急处理)。
- 操作示例:SELECT pg_terminate_backend(阻塞进程ID); -- 如 SELECT pg_terminate_backend(5678);
2. pgAdmin(可视化工具)
适用场景:PostgreSQL 官方可视化工具,适合不熟悉命令行的用户,直观查看锁等待。
- 核心功能:
- 在“Dashboard → Server Activity”中,查看所有会话,标记“Wait Event Type = Lock”的会话即为锁等待会话;
- 右键点击阻塞进程,选择“Terminate Backend”即可终止进程,释放锁。
四、SQL Server 锁等待分析工具
SQL Server 锁机制包含“共享锁(S)”“排他锁(X)”“意向锁”等,常用工具以自带视图和 SSMS 为主:
1. 自带命令行工具(实时排查)
核心工具与操作:
- 1.1 系统视图查询
- 核心视图:
sys.dm_tran_locks(锁信息)、sys.dm_exec_sessions(会话信息)、sys.dm_exec_sql_text(SQL文本)。 - 常用查询语句:
- 查看当前锁等待会话:SELECT s.session_id 被阻塞会话ID, t.text 被阻塞SQL, l.request_mode 等待锁模式, -- X=排他锁, S=共享锁 l.resource_type 锁资源类型, -- OBJECT=表锁, KEY=行锁 blocking_session_id 阻塞会话ID FROM sys.dm_tran_locks l JOIN sys.dm_exec_sessions s ON l.session_id = s.session_id CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) t WHERE l.request_status = 'WAIT' -- 等待锁 AND blocking_session_id <> 0; -- 存在阻塞
- 1.2
sp_who2 存储过程(快速查看会话)
- 功能:查看所有会话的状态,标记“BlkBy”列不为0的会话即为被阻塞会话(BlkBy值为阻塞会话ID)。
- 操作示例:EXEC sp_who2;
2. SQL Server Management Studio(SSMS,可视化监控)
适用场景:SQL Server 官方可视化工具,适合快速定位锁等待并处理。
- 核心功能:
- 打开“活动监视器”(右键服务器 → 活动监视器):
- 在“进程”标签中,查看“阻塞者”列,非空值即为被阻塞会话,“阻塞者”值为阻塞会话ID;
- 右键点击阻塞会话,选择“终止进程”即可释放锁。
- 查看锁详情:在“资源等待”标签中,筛选“等待类型”包含“LCK_M_”(锁等待类型,如 LCK_M_X 为排他锁等待),查看等待时长和关联会话。
五、工具选择总结
| | | |
|---|
| show engine innodb status、information_schema | Percona Monitoring and Management(PMM) | Percona Toolkit(pt-deadlock-logger) |
| | Oracle Enterprise Manager(EM) | |
| pg_locks、pg_stat_activity | | pg_stat_statements(关联锁与SQL性能) |
| sp_who2、sys.dm_tran_locks | SQL Server Management Studio(SSMS) | |
选择原则:
- 临时紧急问题:优先用数据库自带命令行工具(无需安装,快速出结果);
- 长期监控:用可视化工具(如 PMM、EM、pgAdmin),适合团队协作;
- 复杂高频问题:用专业分析工具(如 AWR 报告、Percona Toolkit),深入定位根因(如死锁的业务逻辑冲突)。