欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PostgreSQL死鎖排查與解決指南

 更新時間:2025年11月05日 09:56:21   作者:Moshow鄭鍇  
數據庫死鎖是后端開發(fā)者和DBA經常遇到的棘手問題,本文將手把手教你如何排查和解決PostgreSQL中的死鎖問題,需要的朋友可以參考下

PostgreSQL 16默認會記錄死鎖嗎?

答案是不會! 

雖然PostgreSQL 16具備死鎖檢測機制(在等待鎖超過deadlock_timeout后會自動檢測并解決死鎖),但默認不會將死鎖的詳細信息記錄到日志中。這就意味著你知道發(fā)生了死鎖,卻不知道具體原因!

如何配置死鎖日志記錄

1. 修改配置文件

找到PostgreSQL數據目錄下的postgresql.conf文件,添加以下配置:

# 記錄鎖等待信息(關鍵?。?
log_lock_waits = on
 
# 死鎖檢測超時時間(默認1秒)
deadlock_timeout = 1s
 
# 日志級別至少設置為log
log_min_messages = log
 
# 詳細的日志前綴
log_line_prefix = '%t [%p]: db=%d,user=%u,app=%a,client=%h '

2. 重新加載配置

-- 在psql中執(zhí)行
SELECT pg_reload_conf();

或者使用命令行:

pg_ctl reload -D /path/to/your/data/directory

死鎖日志分析實例

配置完成后,當死鎖發(fā)生時,你會在日志中看到類似這樣的詳細信息:

2025-11-02 10:23:41.123 CST [12345]: LOG:  ?? Powered by Moshow 鄭鍇 | 更多技術干貨:https://zhengkai.blog.csdn.net
2025-11-02 10:23:41.123 CST [12345]: LOG:  process 12345 detected deadlock while waiting for ShareLock on transaction 123456 after 1000.123 ms
2025-11-02 10:23:41.123 CST [12345]: DETAIL:  Process holding the lock: 12346. Wait queue: .
2025-11-02 10:23:41.123 CST [12345]: PROCESS 12345: 等待事務 123456 的 ShareLock; 被進程 12346 阻塞.
2025-11-02 10:23:41.123 CST [12345]: PROCESS 12345: 執(zhí)行語句: UPDATE accounts SET balance = balance - 100.00 WHERE user_id = 1;
2025-11-02 10:23:41.123 CST [12346]: PROCESS 12346: 等待事務 123457 的 ShareLock; 被進程 12345 阻塞.
2025-11-02 10:23:41.123 CST [12346]: PROCESS 12346: 執(zhí)行語句: UPDATE accounts SET balance = balance + 50.00 WHERE user_id = 2;
2025-11-02 10:23:41.123 CST [12345]: ERROR:  deadlock detected

如何解讀這個日志:

  • 涉及進程:進程12345和12346
  • 死鎖場景:兩個進程互相等待對方釋放鎖
  • 執(zhí)行的SQL:兩個UPDATE語句在競爭相同的資源
  • 解決方案:PostgreSQL選擇中止進程12345的事務
    • 溫和終止(優(yōu)先嘗試):     SELECT pg_terminate_backend(12345);
    • 強制終止(若溫和方式失?。?  SELECT pg_cancel_backend(12345);

實時監(jiān)控:系統(tǒng)視圖分析

除了查看日志,你還可以實時監(jiān)控當前的鎖等待情況:

強大的鎖等待查詢語句

--?? Powered by Moshow 鄭鍇 | 更多技術干貨:https://zhengkai.blog.csdn.net
SELECT
    blocked_locks.pid AS blocked_pid,
    blocked_activity.usename AS blocked_user,
    blocking_locks.pid AS blocking_pid,
    blocking_activity.usename AS blocking_user,
    blocked_activity.query AS blocked_statement,
    blocking_activity.query AS current_statement_in_blocking_process,
    blocked_activity.application_name AS blocked_application,
    blocking_activity.application_name AS blocking_application
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity 
    ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks 
    ON blocking_locks.locktype = blocked_locks.locktype
    AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
    AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
    AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
    AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
    AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
    AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
    AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
    AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
    AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
    AND blocking_locks.pid != blocked_locks.pid
JOIN pg_catalog.pg_stat_activity blocking_activity 
    ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.granted;

查詢結果示例:

blocked_pidblocked_userblocking_pidblocking_userblocked_statement
12345app_user12346app_userUPDATE accounts SET balance = balance - 100 WHERE user_id = 1
12347web_user12348batch_userDELETE FROM orders WHERE status = 'cancelled'

這個查詢能幫你:

  • 實時發(fā)現阻塞情況
  • 識別阻塞的源頭
  • 看到具體的阻塞SQL語句
  • 在死鎖發(fā)生前進行干預

最佳實踐建議

  • 生產環(huán)境務必配置日志:log_lock_waits = on 是你的生命線
  • 合理設置超時:deadlock_timeout 保持默認1秒即可
  • 定期檢查日志:關注 pg_stat_database 中死鎖計數器的變化
  • 代碼層面預防:確保事務中的SQL操作順序一致
  • 實時監(jiān)控:使用系統(tǒng)視圖查詢作為輔助診斷工具

預防勝于治療!通過合理的應用設計和數據庫配置,可以大大減少死鎖的發(fā)生頻率。

以上就是PostgreSQL死鎖排查與解決指南的詳細內容,更多關于PostgreSQL死鎖排查的資料請關注腳本之家其它相關文章!

相關文章

  • Vcenter清理/storage/archive空間的處理方式

    Vcenter清理/storage/archive空間的處理方式

    通過SSH登陸到Vcenter并檢查/storage/archive目錄發(fā)現占用過高,該目錄用于存儲歸檔的日志文件和歷史數據,解決方案是保留近30天的歸檔文件,這篇文章主要給大家介紹了關于Vcenter清理/storage/archive空間的處理方式,需要的朋友可以參考下
    2024-11-11
  • Postgresql通過查詢進行更新的操作

    Postgresql通過查詢進行更新的操作

    這篇文章主要介紹了Postgresql通過查詢進行更新的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 將PostgreSQL的數據實時同步到Doris的技巧分享

    將PostgreSQL的數據實時同步到Doris的技巧分享

    眾所周知,在兩個毫不相干的數據管理系統(tǒng)之間進行數據同步,特別是實時同步,其復雜程度足以讓高級DBA腦瓜疼,本文給大家介紹了將PostgreSQL的數據實時同步到Doris的技巧分享,需要的朋友可以參考下
    2024-03-03
  • postgreSQL數據庫默認用戶postgres常用命令分享

    postgreSQL數據庫默認用戶postgres常用命令分享

    這篇文章主要介紹了postgreSQL數據庫默認用戶postgres常用命令分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL?auto_explain的具體使用

    PostgreSQL?auto_explain的具體使用

    PostgreSQL auto_explain插件自動記錄慢SQL執(zhí)行計劃,支持全局、會話及用戶級別加載,具有一定的參考價值,感興趣的可以了解一下
    2025-06-06
  • postgresql 切換 log、xlog日志的實現

    postgresql 切換 log、xlog日志的實現

    這篇文章主要介紹了postgresql 切換 log、xlog日志的實現方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL 實現sql放入文件批量執(zhí)行

    PostgreSQL 實現sql放入文件批量執(zhí)行

    這篇文章主要介紹了PostgreSQL 實現sql放入文件批量執(zhí)行,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • PostgreSQL數據庫字符串拼接、大小寫轉換以及substring詳解

    PostgreSQL數據庫字符串拼接、大小寫轉換以及substring詳解

    在日常工作中會遇到將多行的值拼接為一個值展現,下面這篇文章主要給大家介紹了關于PostgreSQL數據庫字符串拼接、大小寫轉換以及substring的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • 解決sqoop從postgresql拉數據,報錯TCP/IP連接的問題

    解決sqoop從postgresql拉數據,報錯TCP/IP連接的問題

    這篇文章主要介紹了解決sqoop從postgresql拉數據,報錯TCP/IP連接的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL數據庫中窗口函數的語法與使用

    PostgreSQL數據庫中窗口函數的語法與使用

    這PostgreSQL中提供了窗口函數,一個窗口函數在一系列與當前行有某種關聯的表行上進行一種計算。下面這篇文章主要給大家介紹了關于PostgreSQL數據庫中窗口函數的語法與使用的相關資料,需要的朋友可以參考下
    2019-03-03

最新評論