查詢(xún)我們數(shù)據(jù)庫(kù)正在執(zhí)行的SQL語(yǔ)句,下面會(huì)用到與操作系統(tǒng)相關(guān)的一些方法來(lái)實(shí)現(xiàn)它刊苍。在實(shí)現(xiàn)之前靖苇,先來(lái)聊聊Oracle是怎么樣建立一個(gè)會(huì)話(huà)的。
拋開(kāi)網(wǎng)絡(luò)這一方面班缰,簡(jiǎn)單點(diǎn)來(lái)說(shuō)贤壁,Oracle客戶(hù)端通過(guò)sqlplus與Oracle服務(wù)器建立連接,在建立連接之前埠忘,Oracle客戶(hù)端先向服務(wù)器的監(jiān)聽(tīng)發(fā)送一個(gè)請(qǐng)求脾拆,監(jiān)聽(tīng)接收到請(qǐng)求后,SQL·NET首先檢查用戶(hù)是否能登陸莹妒,或者用戶(hù)名密碼是否正確名船,正確的話(huà)則建立一個(gè)會(huì)話(huà),建立會(huì)話(huà)之后旨怠,服務(wù)器端Oracle用戶(hù)也會(huì)創(chuàng)建一個(gè)服務(wù)器進(jìn)程oracle[Oracle_SID] (LOCAL=NO)來(lái)負(fù)責(zé)與該客戶(hù)端通訊渠驼,執(zhí)行會(huì)話(huà)在服務(wù)器端的操作。
那么鉴腻,當(dāng)我們執(zhí)行一條SQL語(yǔ)句時(shí)迷扇,首先要先通過(guò)操作系統(tǒng)的oracleorcl進(jìn)程將SQL語(yǔ)句寫(xiě)入到16進(jìn)制的內(nèi)存地址中,形成了進(jìn)程的paddr爽哎◎严可以通過(guò)數(shù)據(jù)庫(kù)的v$process查詢(xún)oracleorcl的spid得到paddr。注意课锌,這paddr是操作系統(tǒng)的內(nèi)存地址的厨内,想要進(jìn)一步從paddr中得到正在執(zhí)行的SQL語(yǔ)句,還要知道這個(gè)paddr映射在數(shù)據(jù)庫(kù)中的sql_address,所以能看到v$process的paddr和v$session的sql_address是映射關(guān)系的雏胃,并且在內(nèi)存地址中都是16進(jìn)制请毛。前者是OS中進(jìn)程所共享的內(nèi)存空間,后者是Oracle數(shù)據(jù)庫(kù)分配PGA的Private SQL Area(私有SQL區(qū))中會(huì)話(huà)執(zhí)行SQL時(shí)使用的內(nèi)存空間瞭亮。
得到sql_address之后获印,已經(jīng)很清楚得知道SQL語(yǔ)句存放在Oracle數(shù)據(jù)庫(kù)中的SQL地址,接著要借助下一個(gè)動(dòng)態(tài)性能視圖:V$SQLAREA街州,這個(gè)視圖詳細(xì)的記載了SQL地址(sql_address)對(duì)應(yīng)的SQL語(yǔ)句(sql_text)兼丰,只需要加上一個(gè)where條件子句就能得到當(dāng)前執(zhí)行的SQL語(yǔ)句了。
?來(lái)看看流程圖是怎么走的唆缴。
下面貼上SQL語(yǔ)句來(lái)鳍征。
SELECT sql_text FROM v$sqlarea where address in(
SELECT sql_address from v$session where paddr in(
SELECT addr FROM v$process where spid=3141));
3141是服務(wù)器進(jìn)程的pid。
----------------
以上內(nèi)容純粹是個(gè)人學(xué)習(xí)面徽,如有錯(cuò)誤艳丛,請(qǐng)一起探討更正,謝謝趟紊!