解决Ubuntu MariaDB锁表问题可按以下步骤操作:
一、识别锁表情况
- 查看锁表进程:使用
SHOW FULL PROCESSLIST命令查看所有线程,重点关注State列中Waiting for table metadata lock等异常状态的进程。 - 查看锁信息:通过
SHOW OPEN TABLES WHERE In_use > 0查看被锁定的表,或查询INFORMATION_SCHEMA.INNODB_TRX、INFORMATION_SCHEMA.INNODB_LOCKS表获取事务锁和锁等待详情。
二、处理锁表问题
- 终止异常进程:若发现长时间占用锁的进程,使用
KILL [进程ID]命令终止(需确保不影响业务)。 - 优化事务设计:
- 缩小事务范围,避免大事务长时间持有锁。
- 按固定顺序访问表和行,减少死锁概率。
- 降低事务隔离级别(如从
REPEATABLE READ调整为READ COMMITTED)。
- 调整锁等待超时:通过
SET GLOBAL innodb_lock_wait_timeout = [秒数]设置超时时间,避免无限等待。
三、预防锁表问题
- 合理使用索引:确保查询和更新操作使用索引,减少全表扫描导致的锁范围扩大。
- 定期维护数据库:优化表结构、重建索引,清理碎片以提升性能。
- 监控与告警:通过
SHOW GLOBAL STATUS LIKE 'Innodb_deadlocks'监控死锁次数,结合日志分析死锁原因。
四、集群环境特殊处理
若为MariaDB Galera Cluster集群,出现死锁时可尝试重启节点服务,或通过KILL -9强制终止异常进程(需谨慎操作,可能引发数据不一致)。
注意:操作前建议先备份数据,生产环境需在低峰期进行,避免影响业务。