資料庫鎖問題排查

2021-10-02 19:29:22 字數 4690 閱讀 9049

oracle:

awr(sql執行等資訊)->alert(報錯資訊)->trance日誌

1、檢視哪些會話鎖了哪些表

select l.session_id,o.owner,o.object_name

from v$locked_object l,dba_objects o

where l.object_id=o.object_id;

2、查詢鎖表的會話資訊

select s.username,s.sid,s.serial#,s.logon_time

from  v$locked_object l,v$session s

where l.session_id=s.sid 

order by s.logon_time;

3、根據查詢出的sid和serial#查詢會話資訊

select * from v$session where sid=48 and serial#=387;

4、根據3中查詢到的sql_id資訊查詢該會話執行的是什麼sql導致鎖

select sql_fulltext from v$sql where sql_id='5updgzg8hrrua';

---------------method 2---------------------

drop table ac_branch cascade constraints;

create table ac_branch

(branch              varchar2(20 char) primary key not null,

settle_level        varchar2(20 char) not null,

settle_branch       varchar2(20 char),

settle_subject      varchar2(30 char),

settle_acct_seq     varchar2(20 char),

settle_subject_up   varchar2(30 char),

settle_acct_seq_up  varchar2(20 char)

)set autocommit off;

show autocommit;

select * from ac_branch where branch='1';

select * from ac_branch where branch='1' for update;

insert into ac_branch values('1', '2', '3', '4', '5', '6', '7');

2.鎖查詢sql:

select * from v$session where type='user' and username='test';      --會話的詳細資訊

select * from v$process;    --顯示oracle所有程序的資訊(包括後台程序和伺服器程序)

select * from v$lock;   --用於顯示鎖的資訊,通過與v$session進行連線查詢,可以顯示占有鎖的會話,以及等待鎖的會話

select a.username,a.machine,b.lmode,b.request from v$session a,v$lock b

where a.sid=b.sid and a.type='user'; 

select * from v$locked_object; --顯示被加鎖的資料庫物件,通過與dba_object進行連線查詢,

--可以顯示具體的物件名及執行加鎖操作的oracle使用者名稱

--(dba_為dba使用者擁有或可以訪問的物件,all_為當前使用者擁有或可以訪問的物件,user_為當前使用者擁有的物件)

select a.oracle_username,b.owner||'.'||b.object_name object from v$locked_object a,dba_objects b   

where a.object_id = b.object_id;

select * from v$session_wait;   --查詢使用者當前的等待資訊. 以檢視當前的語句為什麼這麼慢/在等待什麼資源.

select * from v$sqlarea;    --根據sql_text進行group by的結果,v$sql中為每一條sql保留乙個條目

select * from dba_objects;

排查問題:

1. 查詢出被鎖物件(表)被哪幾個會話占用

select b.owner,b.object_name,a.session_id,a.locked_mode from v$locked_object a,dba_objects b where b.object_id = a.object_id;

2. 查詢出會話的相關資訊(會話唯一標識sid+serial#,鎖等待的sql_id,sql開始執行時間sql_exec_id;持有鎖會話的上一執行pre_sql_id,持有鎖會話上一執行sql的執行時間pre_exec_start)

select b.username,b.sid,b.serial#,b.logon_time,b.sql_id,b.sql_exec_start,b.prev_sql_id,b.prev_exec_start,b.module from v$locked_object a,v$session b where a.session_id = b.sid ;

3. 查詢鎖等待(或持有鎖會話的上一執行sql)的sql資訊:

select sql_id,sql_text,sql_fulltext,last_active_time,module,action,parsing_schema_name from v$sql where sql_id = '89k3d****r37p';

4. 查詢指定時間執行的sql:

select sql_id,sql_text,sql_fulltext,last_active_time,module,action,parsing_schema_name from v$sql where last_active_time=to_date('2019-11-05 15:05:33','yyyy-mm-dd hh24:mi:ss');

5. 確認若是認為原因導致的鎖,則kill掉會話:

alter system kill session'525,18065';

mysql:

1.查詢設定事務隔離級別(不同的事務隔離級別可能解決髒讀、不可重複讀、泛讀的問題)

select @@tx_isolation;

set session transaction isolation level serializable;        --read uncommitted | read committed | repeatable | serializable

2.查詢事務、鎖、會話(mysql程序列表)的sql:

information_schema.processlist    當前會話(程序)列表

information_schema.innodb_trx    當前正在執行的事務(含sql已經執行完成,但事務沒有提交的事務,事務提交後,事務結束)

information_schema.innodb_lock_waits    鎖等待和持有鎖的關係

information_schema.innodb_locks        鎖的相關資訊(所等待的原因)

-- 查詢當前的會話 有 哪些有事務正在執行

select a.*,'分隔' as 分隔,b.* from 

information_schema.processlist a        -- 連線mysql的會話(程序列表)

left join

information_schema.innodb_trx b        -- 正在執行的事務(事務從開始到commit,記錄會一直存在,sql語句執行完則不會顯示正在執行的sql。查詢也會啟事務)

on a.id = b.trx_mysql_thread_id;

--  鎖等待和持有鎖的相互關係(request為需要鎖的事務id和鎖等待id,block為加鎖的事務id和持有鎖id)

select * from information_schema.innodb_lock_waits;

-- 鎖等待的原因

select * from information_schema.innodb_locks;

3.kill持有鎖的會話:

kill + id

4.測試相關語句:

mysql -h 10.7.20.160 -p 3306 -u root -proot

show variables like '%autocommit%';

set autocommit=off;

select * from ac_branch where branch='1';

select * from ac_branch where branch='1' for update;

insert into ac_branch value ('10', '2', '3', '4', '5', '6', '7');

commit;

資料庫鎖問題

為了保證資料的一致性。mysql資料庫存在多種資料引擎,mysql各儲存引擎使用了三種型別 級別 的鎖定機制 表級鎖定,行級鎖定和頁級鎖定。1.表級鎖 表級鎖一次會將整個表鎖定,所可以很好的避免死鎖問題 1 鎖定粒度大,鎖衝突概率高 併發度低 2 好處是不會出現死鎖 開銷小 獲取鎖和釋放鎖的速度很快...

資料庫鎖表問題

當多使用者對資料庫進行併發操作時是容易導致資料不一致的問題。一般解決方法是,盡量從業務邏輯的角度來規避這種問題,避免使用資料庫的鎖表功能,容易引起一些問題,如死鎖,長時間的等待鎖的釋放等。如有些系統,從業務邏輯上分析是無需鎖表的,如客戶關係管理系統,自己的使用者只能自己檢視修改,其它人沒有許可權檢視...

資料庫的鎖問題

事務的併發控制協議 oracle採用類似於多版本兩段鎖的協議 multiversion two phase lock protocol 多版本兩段鎖協議對唯讀事務和更新書屋加以區別,如果是唯讀事務則採用多版本控制協議,如果是更新事務則採用強兩段鎖協議。鎖分共享鎖 shared 和排他鎖 exclus...