oracle解除表鎖 oracle鎖表、解鎖的語句?
oracle鎖表、解鎖的語句?一些ORACLE中的進(jìn)程被殺掉后,狀態(tài)被置為"killed",但是鎖定的資源很長時(shí)間不釋放,有時(shí)實(shí)在沒辦法,只好重啟數(shù)據(jù)庫。現(xiàn)在提供一種方法解決這種問題,那就是在ORAC
oracle鎖表、解鎖的語句?
一些ORACLE中的進(jìn)程被殺掉后,狀態(tài)被置為"killed",但是鎖定的資源很長時(shí)間不釋放,有時(shí)實(shí)在沒辦法,只好重啟數(shù)據(jù)庫?,F(xiàn)在提供一種方法解決這種問題,那就是在ORACLE中殺不掉的,在OS一級再殺。
1.下面的語句用來查詢哪些對象被鎖:selectobject_name,machine,s.sid,s.serial#fromv$locked_objectl,dba_objectso,v$sessionswherel.object_id = o.object_idandl.session_id=s.sid
2.下面的語句用來殺死一個(gè)進(jìn)程:altersystemkillsession"24,111"(其中24,111分別是上面查詢出的sid,serial#)【注】以上兩步,可以通過Oracle的管理控制臺來執(zhí)行。
3.如果利用上面的命令殺死一個(gè)進(jìn)程后,進(jìn)程狀態(tài)被置為"killed",但是鎖定的資源很長時(shí)間沒有被釋放,那么可以在os一級再殺死相應(yīng)的進(jìn)程(線程),首先執(zhí)行下面的語句獲得進(jìn)程(線程)號:selectspid,osuser,s.programfromv$sessions,v$processpwheres.paddr=p.addrands.sid=24(24是上面的sid)4.在OS上殺死這個(gè)進(jìn)程(線程):1)在unix上,用root身份執(zhí)行命令:#kill-912345(即第3步查詢出的spid)2)在windows(unix也適用)用orakill殺死線程,orakill是oracle提供的一個(gè)可執(zhí)行命令,語法為:orakillsidthread其中:sid:表示要?dú)⑺赖倪M(jìn)程屬于的實(shí)例名thread:是要?dú)⒌舻木€程號,即第3步查詢出的spid。例:c:>orakillorcl12345
oracle行級鎖和表級鎖的區(qū)別?
1. 程序中非數(shù)據(jù)庫交互操作導(dǎo)致事務(wù)掛起
將接口調(diào)用或者文件操作等這一類非數(shù)據(jù)庫交互操作嵌入在 SQL 事務(wù)代碼之中,那么整個(gè)事務(wù)很有可能因此掛起(接口不通等待超時(shí)或是上傳下載大附件)。
2. 事務(wù)中包含性能較差的查詢 SQL
事務(wù)中存在慢查詢,導(dǎo)致同一個(gè)事務(wù)中的其他 DML 無法及時(shí)釋放占用的行鎖,引起行鎖等待。
3. 單個(gè)事務(wù)中包含大量 SQL
通常是由于在事務(wù)代碼中加入 for 循環(huán)導(dǎo)致,雖然單個(gè) SQL 運(yùn)行很快,但是 SQL 數(shù)量一大,事務(wù)就會(huì)很慢。
4. 級聯(lián)更新 SQL 執(zhí)行時(shí)間較久
這類 SQL 容易讓人產(chǎn)生錯(cuò)覺,例如:update A set ... where ...in (select B) 這類級聯(lián)更新,不僅會(huì)占用 A 表上的行鎖,也會(huì)占用 B 表上的行鎖,當(dāng) SQL 執(zhí)行較久時(shí),很容易引起 B 表上的行鎖等待。
5. 磁盤問題導(dǎo)致的事務(wù)掛起
極少出現(xiàn)的情形,比如存儲(chǔ)突然離線,SQL 執(zhí)行會(huì)卡在內(nèi)核調(diào)用磁盤的步驟上,一直等待,事務(wù)無法提交。
綜上可以看出,如果事務(wù)長時(shí)間未提交,且事務(wù)中包含了 DML 操作,那么就有可能產(chǎn)生行鎖等待,引起報(bào)錯(cuò)。