PostgreSQL診斷系列(2/6):鎖問題排查全攻略——揪出“阻塞元兇”

🔗 接上一篇《PostgreSQL全方位體檢指南》,今天我們深入數據庫的“神經系統”——鎖機制,解決最令人頭疼的“卡頓”問題。

你是否經歷過:

  • 某個SQL執行著就不動了?
  • 應用界面卡在“加載中”?
  • UPDATE 語句遲遲不返回?

這些癥狀,很可能是因為 鎖等待(Lock Wait)。PostgreSQL雖然以并發性能著稱,但不當的操作仍會導致阻塞。今天,我就教你用一條SQL,精準定位“誰在等誰”。


🧠 核心原理:PostgreSQL的“交通規則”

PostgreSQL使用多版本并發控制(MVCC),但在修改數據時仍需加鎖,就像交通路口的紅綠燈:

  • 行鎖(Row-Level Locks):修改某行時鎖定該行。
  • 表鎖(Table-Level Locks):DDL操作(如加字段)會鎖整個表。
  • 死鎖(Deadlock):兩個事務互相等待,系統自動終止一個。

如果“紅綠燈”出問題(鎖等待),就會導致“交通堵塞”。


🔍 核心SQL:實時抓取“阻塞現場”


SELECTblocked_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
FROMpg_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_pid:被阻塞的進程ID
  • blocking_pid:造成阻塞的進程ID
  • blocked_statement:被卡住的SQL
  • current_statement_in_blocking_process:正在執行的“罪魁禍首”SQL

🎯 實戰案例:


blocked_pid: 12345
blocking_pid: 67890
blocked_statement: UPDATE orders SET status = 'paid' WHERE id = 1;
current_statement_in_blocking_process: BEGIN; UPDATE users SET points = points + 100;

→ 說明 67890 事務未提交,導致 12345 無法更新訂單。


🚨 常見鎖類型與應對策略

鎖類型常見場景解決方案
RowExclusiveLockUPDATE/DELETE確保事務及時提交
ShareLockCREATE INDEX改用 CREATE INDEX CONCURRENTLY
AccessExclusiveLockALTER TABLE避免在高峰期執行
ExclusiveLockSELECT FOR UPDATE縮短事務范圍

💡 技巧:

使用 pg_locks + pg_stat_activity 聯合查詢,可識別長時間持有鎖的會話。


? 三步排錯法

  1. 定位阻塞者:運行上述SQL,找出 blocking_pid

  2. 查看其狀態

    
    SELECT pid, state, query, query_start
    FROM pg_stat_activity
    WHERE pid = 67890;  -- 替換為blocking_pid
  3. 決策處理

    • 如果是正常長事務 → 等待
    • 如果是空閑事務(idle in transaction)→ 終止
    • 強制終止:SELECT pg_terminate_backend(67890);

🛡? 預防勝于治療

  • 短事務原則:避免在事務中執行耗時操作(如網絡請求)。

  • 合理使用索引:減少鎖掃描的行數。

  • 監控長事務

    
    -- 查看執行超過5分鐘的事務
    SELECT pid, query, now() - query_start AS duration
    FROM pg_stat_activity
    WHERE state = 'active'
    AND now() - query_start > '5 minutes'::interval;

📣 總結

鎖問題不可怕,關鍵是要有“現場取證”的能力:

  • 🔍 用 pg_locks 抓取阻塞關系
  • 🚨 識別常見鎖類型與風險操作
  • ? 三步法快速恢復服務
  • 🛡? 通過監控預防問題復發

🔗 下期預告:

下一篇《PostgreSQL性能瓶頸定位:緩沖池、I/O與臨時文件》,我們將深入內存與磁盤,找出性能的“隱形殺手”!

📌 點贊 + 收藏,讓數據庫不再“卡卡卡”!

👉 鎖,不再是你的噩夢!

強烈推薦,使用AI自動診斷

看完是不是覺得要記下好多的SQL,排查步驟又繁瑣,不要擔心,在 AI 的時代,讓大模型來替我們排查分析數據庫問題,推薦一款開源好用的MCP Server 工具:SmartDB_MCP ,它不僅能讓AI與多種數據庫“暢聊無阻”,還能像瑞士軍刀一樣,提供從SQL優化到數據庫健康檢測分析的一站式解決方案。
github地址 : https://github.com/wenb1n-dev/SmartDB_MCP
博文地址:SmartDB:AI與數據庫的“翻譯官”,開啟無縫交互新時代!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/94445.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/94445.shtml
英文地址,請注明出處:http://en.pswp.cn/web/94445.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

crc16是什么算法

核心概念?CRC16? 是一種循環冗余校驗算法,屬于哈希函數的一種。它的核心目的是檢測數據的錯誤,通常用于數字網絡和存儲設備中,來驗證數據在傳輸或存儲后是否依然完整、無誤。你可以把它想象成一個數據的“指紋”或“摘要”。發送方計算出一…

Day8--HOT100--160. 相交鏈表,206. 反轉鏈表,234. 回文鏈表,876. 鏈表的中間結點

Day8–HOT100–160. 相交鏈表,206. 反轉鏈表,234. 回文鏈表,876. 鏈表的中間結點 每日刷題系列。今天的題目是力扣HOT100題單。 鏈表題目。 160. 相交鏈表 思路【我】: 1,計算鏈表長度 2,令A為較短鏈&am…

Rust面試題及詳細答案120道(58-65)-- 集合類型

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

Horse3D游戲引擎研發筆記(八):在QtOpenGL環境下,按需加載彩虹四邊形的頂點屬性 (Unity、Unreal Engine、Three.js與Godot)

在上一篇博客中,我們探討了如何在QtOpenGL環境下使用改進的Uniform變量管理方式繪制多彩四邊形。本文將延續這一主題,深入探討如何在QtOpenGL環境下按需加載彩虹四邊形的頂點屬性。這一功能是Horse3D引擎渲染系統的重要組成部分,旨在實現靈活…

模塊化設計+微米級精度,GelSight Modulus 觸覺型3D輪廓儀深入檢測“盲區”

當航空航天工程師在精密艙體中搜尋微米級缺陷,汽車檢查員在車間復雜結構里排查隱患,能源領域創新者嘗試突破檢測邊界時,深耕視觸覺 3D 顯微技術的企業——GelSight,正以全新研發的GelSight Modulus觸覺型3D輪廓儀(簡稱…

Pytorch安裝詳細步驟

第一步:檢查顯卡支持的的CUDA版本 1.打開NVIDIA控制面板 首先鼠標右擊桌面-顯示更多選項-NVIDIA控制面板-點擊彈出界面右上角的(系統信息)-點擊彈出界面的(組件) 2.查看驅動版本 打開系統信息 點擊組件,查看 以觀測到紅色方框內的信息可以看到(NVIDIA CUDA 13.0.…

2025職場進階:低門檻技能實用手冊

每到年初,都會有人問:如果只能投入有限的時間與預算,先考哪一兩本證書更劃算?本文把近兩年的崗位需求、學習可獲得性與花費周期做了綜合權衡,給出一個以“先提升通用能力,再疊加行業資質”為主線的組合方案…

SDC命令詳解:使用set_timing_derate命令進行約束

相關閱讀 SDC命令詳解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目錄 指定降額比例 指定降額對象列表/集合 指定沿 指定最大、最小條件 指定早、晚條件 指定路徑的類型 指定降額類型 指定約束 指定增量 寫在最后 由于制造…

C++語言程序設計——03 進制ASCII碼

目錄一、進制表示與轉換(一)不同進制表示(二)進制轉換方法二、ASCII 碼(一)ASCII 碼表(二)ASCII 碼轉換(三)大小寫英文字母轉換【總結:如何記憶AS…

AtCoder Beginner Contest 420-Toggle Maze

題目描述 有一個 H行 W 列的網格。用 (i,j) 表示位于第 i 行(從上往下數)第 j 列(從左往右數)的格子。每個格子的狀態用字符 Ai,j表示,含義如下: . :空格子。 #’ :障礙格子。 S &am…

20、DMA----釋放CPU壓力,加快傳輸

1、DMA介紹DMA,全稱為:Direct Memory Access,即直接存儲器訪問。DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬件為RAM與I/O設備開辟一條直接傳送數據的通路,能使…

深入OpenHarmony OTA硬核升級

技術背景 OpenHarmony OTA(Over-The-Air)升級子系統為設備提供了遠程升級能力,通過統一的升級接口屏蔽底層芯片差異,支持輕量系統、小型系統和標準系統的全量升級、差分升級和變分區升級。 核心特性 跨系統支持:覆蓋輕量系統(Hi3861)、小型系統(Hi3516DV300)、標準系…

華為iVS1800接入SVMSPro平臺

華為iVS1800接入SVMSPro平臺 ** 華為好望Huawei HolosensIVS1800智能視頻云平臺采用首款昇騰310加持的嵌入式系統智能微邊緣,獨俱普惠AI鴻力。一臺融合存儲、計算、檢索功能,滿足小型園區、社區、銀行網點、超市等場景安防需求,小機大智。 …

《異形戰機2》v2.0.4數字豪華版,3D橫版射擊再臨,機體武器海量升級

[游戲名稱]: 《異形戰機2》v2.0.4數字豪華版 [軟件大小]: 17.7 GB [軟件大小]: 夸克網盤 | 百度網盤 游戲介紹 《異形戰機:最終版2》續作震撼登場!經典橫版射擊全面升級:3D 畫面炫目、關卡與機體海量擴充,只為帶來酣暢淋漓的滅…

Java 異常(Throwable)

1. Throwable Throwable: 所有異常和錯誤的根類。實現 Throwable 或其子類的對象才能被 throw 或 catch。 Error: 表示嚴重的系統級問題,通常不應該被捕獲或處理,程序通常無法從中恢復。 Exception: 表示程序可以處理的問題。分為 運行時異常、 受檢異常…

rocketmq常用命令

官方文檔 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ運維管理命令mqadm…

【C++詳解】哈希表概念與實現 開放定址法和鏈地址法、處理哈希沖突、哈希函數介紹

文章目錄一、unordered系列的使用unordered_set類的介紹unordered_set和set的使?差異unordered_map和map的使?差異unordered_xxx的哈希相關接?二、哈希表實現哈希概念直接定址法哈希沖突負載因?將關鍵字轉為整數哈希函數除法散列法/除留余數法乘法散列法處理哈希沖突開放定…

電影感人文街拍擺攤紀實攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色介紹電影感人文街拍擺攤紀實攝影后期 Lr 調色是一種專注于捕捉街頭生活煙火氣的攝影風格,通過 Lightroom 后期調色賦予畫面電影般的敘事感和情感深度。這種風格以擺攤小販、市井行人、街頭場景為主體,強調真實、自然的生活瞬間。調色核心在于低飽和暖…

【數據分享】298個地級市人工智能企業數量(1990-2023)

數據介紹引言人工智能產業作為數字經濟的核心驅動力,其發展規模與分布格局深刻反映區域科技創新活力與產業升級潛力。為助力相關研究,本文分享一份涵蓋全國 298 個地級市 1990-2023 年的人工智能企業核心數據,包含人工智能企業存量和人工智能…

LeetCode 面試經典 150_雙指針_驗證回文串(25_125_C++_簡單)(雙指針)

LeetCode 面試經典 150_數組/字符串_驗證回文串(25_125_C_簡單)題目描述:輸入輸出樣例:題解:解題思路:思路一(雙指針):代碼實現代碼實現(思路一(雙…