-- MySQL查看死锁日志
SHOW ENGINE INNODB STATUS\G
-- PostgreSQL查看锁信息
SELECT * FROM pg_locks;
SELECT * FROM pg_stat_activity WHERE waiting=true;
-- Oracle查看死锁
SELECT * FROM V$LOCKED_OBJECT;
SELECT * FROM DBA_BLOCKERS;
事务优化:
锁参数调整:
-- MySQL设置死锁检测超时
SET GLOBAL innodb_lock_wait_timeout=50;
-- 设置死锁检测
SET GLOBAL innodb_deadlock_detect=ON;
# 找出阻塞的进程并终止
# MySQL
mysql> SHOW PROCESSLIST;
mysql> KILL [process_id];
# PostgreSQL
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE ...;
# 查看高CPU占用进程
top -c
htop
# 查看特定进程的线程
ps -eLf | grep [process_name]
# 使用strace跟踪系统调用
strace -p [pid]
# 使用gdb附加到进程
gdb -p [pid]
# 使用perf分析性能
perf top -p [pid]
# 普通终止
kill [pid]
# 强制终止
kill -9 [pid]
# 批量终止同名进程
pkill -f [process_name]
应用层:
数据库配置:
-- 调整隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 定期维护表统计信息
ANALYZE TABLE [table_name];
代码层面:
系统层面:
# 使用ulimit限制资源
ulimit -t 300 # CPU时间限制(秒)
# 使用cgroups限制资源
cgcreate -g cpu:/[group_name]
cgset -r cpu.cfs_quota_us=50000 [group_name]
# 设置死锁监控脚本
#!/bin/bash
deadlocks=$(mysql -e "SHOW ENGINE INNODB STATUS\G" | grep -c "DEADLOCK")
if [ $deadlocks -gt 0 ]; then
echo "Deadlock detected!" | mail -s "Database Alert" admin@example.com
fi
# 高CPU进程监控
while true; do
top -b -n1 | grep -A10 "%CPU" | awk '$9>90 {print $0}' | mail -s "High CPU Alert" admin@example.com
sleep 60
done
通过以上方法,您可以有效诊断和处理Linux系统中的数据库死锁和死循环问题,并建立预防机制减少类似问题的发生。