oracle查看鎖及session執行中的sql(總結分享)
這篇文章為大家帶來了關於Oracle的相關知識,其中主要介紹了查看鎖及session執行中的sql的相關問題,下面一起來看一下,希望對大家有幫助。
推薦教學:《Oracle影片教學》
本文測試資料的資料庫環境:Oracle 11g
為什麼說是session執行中的sql呢,某個session的sql執行記錄好像取得不到,也看了很多的博文,網上很多有說透過視圖v$active_session_history和v$sqlarea關聯sql_id就能查詢到某個session的sql執行記錄,經過實踐發現是不行的(透過表dba_hist_active_sess_history試過了也是不行),某些sql的sql_id在v$active_session_history根本就沒有記錄,我嘗試修改參數:control_management_pack_access,發現我沒有權限,而且我對了一下,參數值是正常的,該參數數據庫是開啟的,參考博文:Oracle V$ACTIVE_SESSION_HISTORY查詢沒有數據- wazz_s - 博客園
透過v$sqlarea檢視能查詢到sql的執行記錄,但卻無法查到執行該sql的sessionid,如果有這個sessionid該多好,我就能查到那個人執行了該sql 。
如果我想要查詢導致鎖定表的那一條sql,網上大部分的博文都是這樣教的,透過查詢視圖v$session得到對應的prev_sql_addr字段值,記為值A,然後透過值A作為視圖v$sqlarea欄位address的查詢條件值,然後就可以查詢到對應的sql記錄了。這個作為練習測試你是可以找到找到鎖表的sql,但是在正常生產環境下大部分情況下你是獲取不到的,為什麼呢,請看下文的介紹。
本文以探索的方式學習,為了確保資料的準確性,我開了三個資料庫會話,分別記為session1、session2、session3,具體步驟如下:
1 在會話session1中新測試表及測試資料
--新建测试表 create table zxy_table(zxy_id int,zxy_name varchar2(20)); --插入数据 insert into zxy_table(zxy_id,zxy_name) values(1,'zxy1'); insert into zxy_table(zxy_id,zxy_name) values(2,'zxy2'); insert into zxy_table(zxy_id,zxy_name) values(3,'zxy3'); insert into zxy_table(zxy_id,zxy_name) values(4,'zxy4'); commit;
2 查看session1的會話Id
select userenv('sid') from dual;
可以看到會話Id為2546
3 在session1中,透過select for update的對錶zxy_table的某一行進行鎖定,如下:
select * from zxy_table where zxy_name='zxy1' for update;
4 在session2中,查詢到該會話id為2189:
然後在session2中對錶zxy_table值為zxy_name='zxy1'的行進行update,如下:
update zxy_table set zxy_name='zxy1_modify' where zxy_name='zxy1';
然後看到該sql已經被堵塞了,如下圖:
#5 然後我們來到會話session3查看鎖定表的情況了
首先查看表v$locked_object
select * from v$locked_object;
可以看到造成鎖定表的會話id為2546,就是前面的session1,同時object_id為110154,當然咯,在生成環境中,你看到的肯定不只一筆記錄,你要多執行幾遍,執行n遍後,還能看到的記錄,證明這條記錄就是鎖表的記錄
透過object_id :110154查詢dba4_objects表格查詢詳細鎖定表的資訊
select object_name as 被锁的表名称,obj.* from dba_objects obj where object_id='110154';
透過sessionid:2546查詢檢視v$session
select s.prev_sql_addr, module as 客户端工具名称, s.user# as 数据库账号名, s.osuser as 连接数据库客户端对应的window账号名称, s.machine as 连接数据库客户端对应的计算机名称, s.* from v$session s where sid='2546';
select * from v$sqlarea where address='000000012E045E28';############ 從上圖可以看到造成鎖表的語句了,但是很多博文到了這一步就完事了,這樣查詢真的可靠嗎?答案是不可靠的,你可以回到session1中隨便執行一條sql ,如下:###
select * from zxy_table;###然後你再到session3執行###
select s.prev_sql_addr, module as 客户端工具名称, s.user# as 数据库账号名, s.osuser as 连接数据库客户端对应的window账号名称, s.machine as 连接数据库客户端对应的计算机名称, s.* from v$session s where sid='2546';#########
再看看prev_sql_addr是不是变了,从000000012E045E28变为了00000001FB03CEC0,再通过00000001FB03CEC0查询视图v$sqlarea
select * from v$sqlarea where address='00000001FB03CEC0';
得到的sql_text是select * from zxy_table,你敢说这条sql导致了锁表吗?所有只能说是session1当前执行的sql,而且你很难保证session1执行完锁表的sql: select * from zxy_table where zxy_name='zxy1' for update且在提交前不再执行别的sql,这就是前文提出的问题的答案。
推荐教程:《Oracle视频教程》
以上是oracle查看鎖及session執行中的sql(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

要安全、徹底地卸載MySQL並清理所有殘留文件,需遵循以下步驟:1.停止MySQL服務;2.卸載MySQL軟件包;3.清理配置文件和數據目錄;4.驗證卸載是否徹底。

Oracle不僅是數據庫公司,還是雲計算和ERP系統的領導者。 1.Oracle提供從數據庫到雲服務和ERP系統的全面解決方案。 2.OracleCloud挑戰AWS和Azure,提供IaaS、PaaS和SaaS服務。 3.Oracle的ERP系統如E-BusinessSuite和FusionApplications幫助企業優化運營。

MongoDB適合非結構化數據和高擴展性需求,Oracle適合需要嚴格數據一致性的場景。 1.MongoDB靈活存儲不同結構數據,適合社交媒體和物聯網。 2.Oracle結構化數據模型確保數據完整性,適用於金融交易。 3.MongoDB通過分片橫向擴展,Oracle通過RAC縱向擴展。 4.MongoDB維護成本低,Oracle維護成本高但支持完善。

MySQL和Oracle的主要區別在於許可證、功能和優勢。 1.許可證:MySQL提供GPL許可證,免費使用,Oracle採用專有許可證,價格昂貴。 2.功能:MySQL功能簡單,適合Web應用和中小型企業,Oracle功能強大,適合大規模數據和復雜業務。 3.優勢:MySQL開源免費,適合初創公司,Oracle性能可靠,適合大型企業。

MySQL和Oracle在性能和可擴展性上的區別在於:1.MySQL在小型到中型數據集上表現更好,適合快速擴展和高效讀寫;2.Oracle在處理大型數據集和復雜查詢時更具優勢,適合高可用性和復雜業務邏輯。 MySQL通過主從復制和分片技術實現擴展,而Oracle通過RAC實現高可用性和擴展性。

MySQL採用GPL和商業許可,適合小型和開源項目;Oracle採用商業許可,適合需要高性能的企業。 MySQL的GPL許可免費,商業許可需付費;Oracle許可費用按處理器或用戶計算,成本較高。

學習Java不走彎路的關鍵是:1.理解核心概念和語法;2.多實踐;3.理解內存管理和垃圾回收;4.加入在線社區;5.閱讀別人的代碼;6.了解常見庫和框架;7.學習處理常見錯誤;8.制定學習計劃並循序漸進。這些方法能幫助你高效掌握Java編程。

在不同的應用場景下,選擇MongoDB還是Oracle取決於具體需求:1)如果需要處理大量非結構化數據且對數據一致性要求不高,選擇MongoDB;2)如果需要嚴格的數據一致性和復雜查詢,選擇Oracle。
