01, 查詢鎖表情況
SQL> select * from gp_toolkit.gp_locks_on_relation WHERE lorrelname like '%wpp_cdefect_glass_f%';
詳細查詢: SELECT pid,rolname, rsqname, granted, current_query, datname FROM pg_roles, gp_toolkit.gp_resqueue_status, pg_locks, pg_stat_activity WHERE pg_roles.rolresqueue=pg_locks.objid AND pg_locks.objid=gp_toolkit.gp_resqueue_status.queueid AND pg_stat_activity.procpid=pg_locks.pid;
02, 鎖相關視圖描述
pg_stat_activity
視圖pg_stat_activity每行顯示一個服務器進程同時詳細描述與之關聯的用戶會話和查詢。只有在檢查視圖的用戶是超級用戶或者是正在報告的進程的擁有者時,這些列才可見。
名稱 |
類型 |
描述 |
datid |
oid |
數據庫OID |
datname |
name |
數據庫名稱 |
procpid |
integer |
服務進程的進程ID |
sess_id |
integer |
會話ID |
usesysid |
oid |
角色ID |
usename |
name |
角色名 |
current_query |
text |
進程正在執行的當前查詢 |
waiting |
boolean |
如果正等待一個鎖則為真,否則為假 |
query_start |
timestamptz |
查詢開始執行的時間 |
backend_start |
timestamptz |
后台進程開始的時間 |
client_addr |
inet |
客戶端地址 |
client_port |
integer |
客戶端端口 |
application_name |
text |
客戶端應用名 |
xact_start |
timestamptz |
事務開始時間 |
waiting_reason |
text |
服務進程正在等待的原因。值可以是:lock或replication |
重點關注procpid,current_query,waiting,waiting_reason等列。
pg_locks
pg_locks 視圖提供了有關在Greenplum數據庫中由開放事務持有的鎖的信息的訪問。pg_locks 包含一行關於每個積極可鎖對象,請求的鎖模式和相關事務。 因此,如果多個事務正在持有或等待其上的鎖,同樣的可鎖對象可能會出現多次。 但是,目前沒有鎖的對象根本就不會出現。
有幾種不同類型的可鎖對象:整個關系(如表),關系的個別頁,關系的個別元組,事務Id和通用數據庫對象。另外,擴展關系的權利表示為單獨的可鎖對象。
列 |
類型 |
描述 |
locktype |
text |
可鎖對象的類型:relation,extend,page,tuple,transactionid,object,userlock,resource queue,或advisory |
database |
oid |
該對象存在的數據庫的Oid,如果該對象是共享對象,則為0。如果對象是事務ID,則為空。 |
relation |
oid |
關系的Oid,如果對象不是關系或者關系的一部分,則為NULL。 |
page |
integer |
關系中的頁碼,如果對象不是元組或者關系頁則為NULL |
tuple |
smallint |
頁中的元組號,如果該對象不是個元組則為NULL。 |
transactionid |
xid |
事務的Id,如果該對象不是一個事務Id,則為NULL。 |
classid |
oid |
包含對象的系統目錄的Oid,如果對象不是一般數據庫對象,則為NULL。 |
objid |
oid |
其系統目錄中對象的Oid,如果對象不是一般數據庫對象,則為NULL。 |
objsubid |
smallint |
對一個表列來說,這是列號(classid和objid引用表本身)。對於所有其他的對象類型,此列為0。如果對象不是數據庫對象,則為NULL。 |
transaction |
xid |
等待或持有該鎖的事務的Id。 |
pid |
integer |
持有或等待該鎖的事務進程的進程Id,如果鎖由准備(prepared)的事務持有,則為NULL。 |
mode |
text |
該進程所持有或期望的鎖模式的名稱。 |
granted |
boolean |
鎖被持有為真,鎖為等待為假。 |
mppsessionid |
integer |
與鎖相關的客戶端會話的id。 |
mppiswriter |
boolean |
指明該鎖是否由一個寫進程所持有。 |
gp_segment_id |
integer |
該Greenplum持有該鎖的段的id(dbid) |
重點關注pid,mode,granted等列。
gp_toolkit.gp_locks_on_relation
該視圖顯示了當前所有表上持有鎖,以及查詢關聯的鎖的相關聯的會話信息。該視圖能夠被所有用戶訪問,但是非超級用戶只能夠看到他們有權限訪問的關系上持有的鎖。
列 描述
lorlocktype 能夠加鎖對象的類型:relation、 extend、page、tuple、transactionid、object、userlock、resource queue以及advisory
lordatabase 對象存在的數據庫對象ID,如果對象為一個共享對象則該值為0。
lorrelname 關系名。
lorrelation 關系對象ID。
lortransaction 鎖所影響的事務ID 。
lorpid 持有或者等待該鎖的服務器端進程的進程ID 。如果該鎖被一個預備事務持有則為NULL。
lormode 由該進程持有或者要求的鎖模式名。
lorgranted 顯示是否該鎖被授予(true)或者未被授予(false)。
lorcurrentquery 會話中的當前查詢。
03,解決鎖問題
select pg_terminate_backend(procpid);
執行對應的pid即可完成清理