postgresql數據庫大量鎖表的問題解決


一、postgresql數據庫出現鎖表問題排查

 1 //查詢鎖表的情況
 2 SELECT 
3
  A.locktype, 4   A.DATABASE, 5   A.pid, 6   A.relation, 7   b.relname 8 FROM 9   pg_locks 10 A JOIN pg_class b ON A.relation = b.oid;
11
12 //殺死進程 13 select pg_terminate_backend(pid); //pid為進程id號

//用於查詢系統進程狀態的表

select * from pg_stat_activity;

主要關注waiting 是否等待中,stat 進程狀態, query 具體語句

當waiting 為t 的進行需要特別注意,query可以查看到具體語句,然后進行查殺

最終的原因排查為,mq擁堵導致一些流程走不了,代碼流程又涉及到更新等操作,產生數據庫鎖 一直占用着連接的資源 。

二、鎖類型 8種:(pgsql源碼的src/include/storage/lock.h文件)

/* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */
#define NoLock                          0
#define AccessShareLock                 1 /* SELECT */
#define RowShareLock                    2 /* SELECT FOR UPDATE/FOR SHARE */
#define RowExclusiveLock                3 /* INSERT, UPDATE, DELETE */
#define ShareUpdateExclusiveLock        4 /* VACUUM (non-FULL),ANALYZE, CREATE
                                           * INDEX CONCURRENTLY */
#define ShareLock                       5 /* CREATE INDEX (WITHOUT CONCURRENTLY) */
#define ShareRowExclusiveLock           6 /* like EXCLUSIVE MODE, but allows ROW
                                           * SHARE */
#define ExclusiveLock                   7 /* blocks ROW SHARE/SELECT...FOR
                                           * UPDATE */
#define AccessExclusiveLock             8 /* ALTER TABLE, DROP TABLE, VACUUM
                                           * FULL, and unqualified LOCK TABLE */

 

三、鎖沖突(可以看出哪些鎖會發生沖突)

四、可加鎖對象的定義(pgsql源碼src/include/storage/lock.h文件)

 1 typedef enum LockTagType
 2 {
 3   LOCKTAG_RELATION, /* whole relation */
 4   /* ID info for a relation is DB OID + REL OID; DB OID = 0 if shared */
 5   LOCKTAG_RELATION_EXTEND, /* the right to extend a relation */
 6   /* same ID info as RELATION */
 7   LOCKTAG_PAGE, /* one page of a relation */
 8   /* ID info for a page is RELATION info + BlockNumber */
 9   LOCKTAG_TUPLE, /* one physical tuple */
10   /* ID info for a tuple is PAGE info + OffsetNumber */
11   LOCKTAG_TRANSACTION, /* transaction (for waiting for xact done) */
12   /* ID info for a transaction is its TransactionId */
13   LOCKTAG_VIRTUALTRANSACTION, /* virtual transaction (ditto) */
14   /* ID info for a virtual transaction is its VirtualTransactionId */
15   LOCKTAG_OBJECT, /* non-relation database object */
16   /* ID info for an object is DB OID + CLASS OID + OBJECT OID + SUBID */
17 
18 /*
19 * Note: object ID has same representation as in pg_depend and
20 * pg_description, but notice that we are constraining SUBID to 16 bits.
21 * Also, we use DB OID = 0 for shared objects such as tablespaces.
22 */
23   LOCKTAG_USERLOCK, /* reserved for old contrib/userlock code */
24   LOCKTAG_ADVISORY /* advisory user locks */
25 } LockTagType;

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM