日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle死锁trace,Oracle 学习之性能优化(十)锁

發布時間:2025/3/19 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle死锁trace,Oracle 学习之性能优化(十)锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

鎖(lock)是用于防止在訪問相同的資源(包括用戶對象、系統對象、內存、Oralce數據字典中的共享數據結構,最常見的是數據庫表Table對象)時 ,事務之間的有害性 交互(存、取)的一種機制。

不同類型的鎖,代表了當前用戶是允許還是阻止其它用戶對相同資源的同時存取,從而確保不破壞系統數據的完整性、一致性和并行性。

加鎖是實現數據庫并發控制的一個非常重要的技術。當事務在對某個數據對象進行操作前,先向系統發出請求,對其加鎖。加鎖后事務就對該數據對象有了一定的控制,在該事務釋放鎖之前,其他的事務不能對此數據對象進行更新操作。

鎖的分類DML鎖:SELECT、INSERT、UPDATE、DELETE、MERGE操作

DDL鎖:CREATE和ALTER語句操作

內部鎖和閂:Oracle使用這些鎖來包含內部數據結構,例如:Oracle查詢生成的執行計劃,執行計劃會保存在庫緩存中,當使用這個執行計劃時,會對其加一個閂(latch)

DML鎖

用于確保一次只能一個人修改某行數據。而且你正常處理這個表時,別人不能刪除這個表。TX鎖,事務發起第一個修改時,會得到一個TX鎖(事務鎖),而且會一直持有這個事務,直到事務結束(COMMIT或者ROLLBACK)。事務中修改或者select for update的每一行都會指向該事務的TX鎖。

TM鎖,用于確保在修改表內容時,表的結構不被改變。

下面舉例說明

登錄到scott用戶,并確定session idSQL>?grant?select?any?dictionary?to?scott;

Grant?succeeded.

SQL>?conn?scott/tiger

SQL>?select?sid?from?v$mystat?where?rownum=1;

SID

----------

37

SQL>

另開啟一個會話,監控鎖的使用情況SQL>?set?linesize?200

SQL>?select?*?from?v$lock?where?sid=37;

ADDR?KADDR?SID?TY????????ID1??ID2???LMODE????REQUEST?CTIME????BLOCK

----------------?----------------?----------?--?----------?----------?----------?----------?----------?----------

0000000090D8FC88?0000000090D8FCE0??37?AE????????100????0???????4??0???4810

SQL>

會話1執行更新操作SQL>?update?emp?set?ename=initcap(ename);

14?rows?updated.

會話2查看結果SQL>?/

ADDR?KADDR?SID?TY????????ID1??ID2???LMODE????REQUEST?CTIME????BLOCK

----------------?----------------?----------?--?----------?----------?----------?----------?----------?----------

0000000090D8FC88?0000000090D8FCE0??37?AE????????100????0???????4??0???9440

00007FF9EEDA4AB0?00007FF9EEDA4B10??37?TM??????87108????0???????3??0?????30

000000008F673658?000000008F6736D0??37?TX?????131074??908???????6??0?????30

多了一個事務鎖,一個TM鎖。

會話1中再執行另一個表的更新操作SQL>?update?dept?set?dname=initcap(dname);

4?rows?updated.

會話2查看結果SQL>?/

ADDR?KADDR?SID?TY????????ID1??ID2???LMODE????REQUEST?CTIME????BLOCK

----------------?----------------?----------?--?----------?----------?----------?----------?----------?----------

0000000090D8FC88?0000000090D8FCE0??37?AE????????100????0???????4??0??11740

00007FF9EEDA7B58?00007FF9EEDA7BB8??37?TM??????87108????0???????3??0???2330

00007FF9EEDA7B58?00007FF9EEDA7BB8??37?TM??????87106????0???????3??0????270

000000008F673658?000000008F6736D0??37?TX?????131074??908???????6??0???2330

事務鎖沒有變,但是又多了一個TM鎖。

對于TM鎖來說,id1的值是對象的IDSQL>?COL?OBJECT_NAME?FOR?A30

SQL>?select?OBJECT_NAME,OBJECT_ID?from?dba_objects?where?owner='SCOTT'?AND?OBJECT_NAME?IN?('DEPT','EMP');

OBJECT_NAMEOBJECT_ID

------------------------------?----------

DEPT????87106

EMP????87108

對于TX鎖,id1是通過事務id轉換來的。

我們先查看下事務的相關信息SQL>?SELECT?addr,xidusn,xidslot,xidsqn?FROM?V$TRANSACTION;

ADDR?????XIDUSN????XIDSLOT???XIDSQN

----------------?----------?----------?----------

000000008F673658??2?????2??????908

ADDR與TX鎖的ADDR對應,XIDUSN表示回滾段編號,XIDSLOT表示事務表上的編號,XIDSQN表示sequence(覆蓋次數)

TX鎖的id1的值等于XIDUSN*power(2,16)+XIDSLOTSQL>?select?2*power(2,16)+2?from?dual;

2*POWER(2,16)+2

---------------

131074

事務表、回滾塊、事務槽 三者之間的關系如下:

對于TX鎖,并沒有一個視圖能提供事務修改了哪些行。行鎖的信息是保存在數據塊中的。

下面我們將dept的數據塊dump出,查看塊的詳細信息SQL>?select?dbms_rowid.rowid_relative_fno(rowid)?fno,dbms_rowid.rowid_block_number(rowid)?bno?from?dept;

FNO??BNO

----------?----------

4??135

4??135

4??135

4??135

只占用了一個數據塊,將該塊dumpSQL>?alter?system?dump?datafile?4?block?135;

System?altered.

SQL>?SELECT????d.VALUE

||?'/'

||?LOWER?(RTRIM?(i.instance,?CHR?(0)))

||?'_ora_'

||?p.spid

||?'.trc'

trace_file_name

FROM?(SELECT?p.spid

FROM?v$mystat?m,?v$session?s,?v$process?p

WHERE?m.statistic??2????3????4????5????6????7????8????9???10??#?=?1?AND?s.sid?=?m.sid?AND?p.addr?=?s.paddr)?p,

(SELECT?t.instance

FROM?v$thread?t,?v$parameter?v

WHERE?????v.name?=?'thread'

AND?(v.VALUE?=?0?OR?t.thread#?=?TO_NUMBER?(v.VALUE)))?i,

(SELECT?VALUE

11???12???13???14???15???16??FROM?v$parameter

WHERE?name?=?'user_dump_dest')?d;????17

TRACE_FILE_NAME

--------------------------------------------------------------------------------

/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_5593.trc

查看trace文件Block?header?dump:??0x01000087

Object?id?on?Block??Y

seg/obj:?0x15442??csc:?0x00.fab7a??itc:?2??flg:?E??typ:?1?-?DATA

brn:?0??bdba:?0x1000080?ver:?0x01?opc:?0

inc:?0??exflg:?0

Itl???????????Xid??????????????????Uba?????????Flag??Lck????????Scn/Fsc

0x01???0x0009.002.00000364??0x00c167b0.009a.2e??C---????0??scn?0x0000.000e0ef0

0x02???0x0002.002.0000038c??0x00c00591.0088.26??----????4??fsc?0x0000.00000000

bdba:?0x01000087

data_block_dump,data?header?at?0x7f23e518ea64

===============

tsiz:?0x1f98

hsiz:?0x1a

pbl:?0x7f23e518ea64

76543210

flag=--------

ntab=1

nrow=4

frre=-1

fsbo=0x1a

fseo=0x1f3c

avsp=0x1f22

tosp=0x1f22

0xe:pti[0]nrow=4offs=0

0x12:pri[0]offs=0x1f7e

0x14:pri[1]offs=0x1f68

0x16:pri[2]offs=0x1f54

0x18:pri[3]offs=0x1f3c

block_row_dump:

tab?0,?row?0,?@0x1f7e

tl:?26?fb:?--H-FL--?lb:?0x2??cc:?3

col??0:?[?2]??c1?0b

col??1:?[10]??41?63?63?6f?75?6e?74?69?6e?67

col??2:?[?8]??4e?45?57?20?59?4f?52?4b

tab?0,?row?1,?@0x1f68

tl:?22?fb:?--H-FL--?lb:?0x2??cc:?3

col??0:?[?2]??c1?15

col??1:?[?8]??52?65?73?65?61?72?63?68

col??2:?[?6]??44?41?4c?4c?41?53

tab?0,?row?2,?@0x1f54

tl:?20?fb:?--H-FL--?lb:?0x2??cc:?3

col??0:?[?2]??c1?1f

col??1:?[?5]??53?61?6c?65?73

col??2:?[?7]??43?48?49?43?41?47?4f

tab?0,?row?3,?@0x1f3c

tl:?24?fb:?--H-FL--?lb:?0x2??cc:?3

col??0:?[?2]??c1?29

col??1:?[10]??4f?70?65?72?61?74?69?6f?6e?73

col??2:?[?6]??42?4f?53?54?4f?4e

end_of_block_dump

End?dump?data?blocks?tsn:?4?file#:?4?minblk?135?maxblk?135

1)lb: 0x2表示改行數據被鎖定,標志為2,它表示ITL事務槽的第二條事務信息;而第二條事務信息

的flag為空,表示沒有提交,所以該行被鎖定了(當然我們開需要查看事務表中的提交標志)。

2)Lck=4表示鎖定了4行數據。

鎖的mode有如下幾種

死鎖-deadlock定義:當兩個用戶希望持有對方的資源時就會發生死鎖.即兩個用戶互相等待對方釋放資源時,oracle認定為產生了死鎖,在這種情況下,將以犧牲一個用戶作為代價,另一個用戶繼續執行,犧牲的用戶的事務將回滾.例子:會話1,執行如下操作SQL>?conn?scott/tiger

Connected.

SQL>?update?dept?set?dname=lower(dname);

4?rows?updated.

會話2,執行如下操作SQL>?conn?scott/tiger

Connected.

SQL>?update?emp?set?ename=lower(ename);

14?rows?updated.

會話1,再執行對emp的更新SQL>?update?emp?set?ename=lower(ename);

此時會話1被阻塞。

會話2,執行對dept表的更新SQL>??update?dept?set?dname=lower(dname);

此時會話2也被阻塞,但是會話1會報一個死鎖的錯誤SQL>?update?emp?set?ename=lower(ename);

update?emp?set?ename=lower(ename)

*

ERROR?at?line?1:

ORA-00060:?deadlock?detected?while?waiting?for?resource

會話1需要提交或者回滾,會話2才能正常執行。

Oracle的死鎖問題實際上很少見,如果發生,基本上都是不正確的程序設計造成的,經過調整后,基本上都會避免死鎖的發生。

總結

以上是生活随笔為你收集整理的oracle死锁trace,Oracle 学习之性能优化(十)锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。