Oracle中快速尋找鎖與鎖等待

來源:互聯網
上載者:User

  資料庫的鎖是比較耗費資源的,特別是發生鎖等待的時候,我們必須找到發生等待的鎖,有可能的話,殺掉該進程。

  可以通過alter system kill session‘sid,serial#’ 或者alter system disconnect session'sid,serial#' immediate; 來殺掉會話

  下面語句將尋找到資料庫中所有的DML語句產生的鎖,還可以發現任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。

  SELECT /*+ rule */s.username,
  decode(l.type,'TM','TABLELOCK','TX','ROW LOCK',NULL) LOCK_LEVEL,
  o.owner,o.object_name,o.object_type,
  s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
  FROM v$session s,v$lockl,dba_objects o
  WHERE l.sid = s.sid
  AND l.id1 = o.object_id(+)
  AND s.username is NOT NULL

  如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待,以下的語句可以查詢到誰鎖了表,而誰在等待。
  SELECT /*+ rule */ lpad(' ',decode(l.xidusn,0,3,0))||l.oracle_username User_name,
  o.owner,o.object_name,o.object_type,s.sid,s.serial#
  FROM v$locked_objectl,dba_objects o,v$session s
  WHERE l.object_id=o.object_id
  AND l.session_id=s.sid
  ORDER BY o.object_id,xidusnDESC

  以上查詢結果是一個樹狀結構,如果有子節點,則表示有等待發生。如果想知道鎖用了哪個復原段,還可以關聯到V$rollname,其中xidusn就是復原段的USN

  [Q] 如何有效刪除一個大表(extent數很多的表)
  [A] 一個有很多(100k)extent的表,如果只是簡單地用drop table的話,會很大量消耗CPU(Oracle要對fet$、uet$資料字典進行操作),可能會用上幾天的時間,較好的方法是分多次刪除extent,以減輕這種消耗:
  1. truncate table big-table reuse storage;
  2. alter table big-tabledeallocate unused keep 2000m ( 原來大小的n-1/n);
  3. alter table big-tabledeallocate unused keep 1500m ;
  ....
  4. drop table big-table;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.