⑴ 如何查找Oracle session的歷史記錄
首先在任務管理器里看到pid和sid的進程linux下乎春可用top命令進行查看然後查詢v$session查看起sid和#serial#欄位;歲悄耐此時在連接運手v$sql的話就可以知道具體session的內容了。
⑵ 如何查詢oracle資料庫的操作記錄
查詢視圖:v$sqlarea,它是oracle中專門存儲操作的視圖,可以通過它查詢歷史操作。
授權某用戶,查看動態性能視圖的許可權(如簡梁v$latch,v$lock,v$sqlarea,v$sql,v$sysstat)
grant select any dictionary to xxx;
如通過以下查詢語句就蘆咐敗可以得知那個用戶進行了刪除操作陪顫。
select t.SQL_TEXT, t.FIRST_LOAD_TIME
from v$sqlarea t
where t.SQL_TEXT like 'delete%' and t.FIRST_LOAD_TIME like -03-30%'
order by t.FIRST_LOAD_TIME desc
⑶ 如何查詢oracle資料庫的操作記錄
首先,向你介紹一個動態視圖:v$sql
該視圖展示最近一段時間所有執行吵族過的sql語句:
select * from v$sql
即可。
如果報錯找不到v$sql,一般是許可權問題,換sysdba就肯定能查到。
但要注意的是「隱式sql」,很多sql語句是調用執行的,(比如,存儲過程中對dbms包的調用,再如執行create 語句所觸發的對系統表空間、數據升斗弊字典的修改等等。),這些語銷鬧句同樣會展現在v$sql中。
還有其它與sql歷史記錄相關的v$視圖,詳情可以參考Oracle官方文檔《Oracle® Reference》,直接給你個10.2的文檔鏈接,夠方便了吧:
http://www.oracle.com/pls/db102/homepage?remark=tahiti
⑷ oracle查看歷史session
如何知道一個session都執行過哪些SQL語句?(查看當前比較容易,歷史的呢?怎麼復原sql的執行場景——事務關系、執行序列、單SQL還是存儲過程)
【方法一】查詢v$sqltext、v$sqlarea、v$sqlstats視圖
select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;
#對v$sqltext、v$sqlarea查看的是shared pool中的SQL,其時間索引是其解析歷史,因為共享的問題這個查詢可能並不能完整地反映出執行的歷史。
#v$sqlstats信息保留時間比v$sql、v$sqltext、v$sqlarea長,及時SQL已經換出shared pool仍然可查到
【方法二】
聯合v$active_session_history和v$sqlarea
#v$active_session_history 這個表只是個取樣數據,按秒進行,只有在那一秒采樣點處於on cpu或非idle等待的session統計在內。所以可能會不全,有些執行很短的SQL會忽略。這個視圖無法還原完整的session歷史。
#v$sqlarea中有執行過的SQL語橘弊粗句,但並無到session的關聯信息,v$session中只關聯了當前的sql,所以也不行。
查看視圖:dba_hist_sqlstats、dba_hist_sqltext(歷史數據)
oracle多用戶操作有時候會造成session阻塞,形成了鎖表等問題。
可以使用sql語句進行查詢,但用工具更為方便。本文就介紹使用PL/SQL developer工具查看或殺掉oracle的session。
工具/原料 PL/SQL Developer 版本為 8.0.0.1480 方法/步驟 打開PL/SQL Developer,輸入用戶名密碼和資料庫等信息。 在工具欄中選擇tools,在彈出的窗口選擇Sessions。
即可。 如圖所示,所有的session和起sid都列了出來,我們需要找Status為active(活動)的。
點擊一下即可,或者選擇如圖卜清的下拉菜單,選擇 Active sessions. 如圖,現在有兩個活動的session,選擇其中一個session後在下方可以查看此session的更多信息。 在SQL Text一欄中可以查看正在執行的sql語句。
在Locks一欄中,可以查看現在鎖表等信息。 若要殺掉其中一個session,那麼,對這個session一行點擊右鍵,選擇「kill」即可。
除了PL/SQL的ctrl+e的查看方法外還有如下方法:【方法一】查詢v$sql、v$sqltext、v$sqlarea、v$sqlstats視圖select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;#對v$sqltext、v$sqlarea查看的是shared pool中的SQL,其時間索引是其解析歷史,因為共享的問題這個查詢可能並不能完整地反映出執行的歷史。
#v$sqlstats反應的是實例啟動起來的sql執行統計,sql語句本身比v$sqltext/area完整,因為後者有可能失效換出緩存。【方法二】聯合v$active_session_history和v$sqlarea#v$active_session_history 這個表只是個取樣數據,按秒進行,只有在那一秒采樣點處於on cpu或非idle等待的session統計在內。
所以可能會不全,有些執行很短的SQL會忽略。這個視圖無法還原完整的session歷史。
#v$sqlarea中有執行過的SQL語句,但圓鎮並無到session的關聯信息,v$session中只關聯了當前的sql,所以也不行。從v$sqlstat可以查看到資料庫啟動起來的所有SQL信息,但是沒有時間順序關系、沒有執行用戶信息,只有執行次數與資源統計。
從dba_hist_sqlstat可以看到AWR snapshot之間的SQL統計信息,與v$sqlstats比不受實例重啟的影響,因為實例重啟之後v$sqlstats中的信息就清除了。【方法三:session trace】SQL> execute dbms_session.session_trace_enable(true,true);PL/SQL procere successfully pleted.SQL> select count(*) from dba_hist_sqltext; COUNT(*)---------- 478SQL> select * from V$sesstat where rownum=1; SID STATISTIC# VALUE---------- ---------- ---------- 134 0 1SQL> execute dbms_session.session_trace_disable;PL/SQL procere successfully pleted.$ cd $ORACLE_HOME/admin/test/ump$ ls -lrt$ tkprof test_ora_2195620.trc report.txt sys=no explain=no aggregate=yes$ more report.txt --這個文件包括了啟停trace之間所有SQL語句的執行信息,執行計劃、統計【方法四:logminer】只包含DML與DDL語句,不能查詢select語句。
另外需要開啟supplemental logging,默認是沒有開啟的。conn / as sysdba--安裝LOGMINERSQL> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql;SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql;SQL> @$ORACLE_HOME/rdbms/admin/dbmslms.sql;SQL> @$ORACLE_HOME/rdbms/admin/prvtlm.plb;--開啟附加日誌alter database add supplemental log data;--模擬DML操作conn p_chenming/。
SQL> select * from test2;SQL> insert into test2 values(7,77);SQL> mit;conn / as sysdba--切歸檔SQL> alter system switch logfile;SQL> select name,dest_id,thread#,sequence# from v$archived_log; --最後一個即為新的歸檔--新建LOG MINERSQL> execute dbms_logmnr.add_logfile(logfilename=>'/oracle/archive_10g/test/test_1_138_786808434.arc',options=>dbms_logmnr.new); --開始minerSQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--查看結果SQL> col username format a8;SQL> col sql_redo format a50 SQL> select username,s,timestamp,sql_redo from v$logmnr_contents where table_name='TEST2' SQL> select username,s,timestamp,sql_redo from v$logmnr_contents where username='P_CHENMING'; --關閉MINERSQL> execute dbms_logmnr.end_logmnr;--關閉輔助日誌SQL> alter database drop supplemental log data;【總結】查看v$sqlarea只能查看粗略的歷史,因為很多SQL是共享的。查看ASH也不全,因為這是采樣數據,測試的時候基本沒有把SQL查詢出來。
查看V$SQLSTATS能看到所有執行過的sql,以及其執行統計,但是沒有時序、沒有用戶信息。查看TRACE應該是最完整的,但需要在執行SQL前開啟。
查看logminer不能查看select語句,而且默認的系統沒有開啟supplementing log,所以能查看的內容有限。或許還有審計的方法可用,我沒測試。
每種方法都有各自的缺陷,看來很難有一種完備的查看SQL執行歷史的方法。
除了PL/SQL的ctrl+e的查看方法外還有如下方法:【方法一】查詢v$sql、v$sqltext、v$sqlarea、v$sqlstats視圖select * from v$sqlarea t where t.PARSING_SCHEMA_NAME in ('schema') order by t.LAST_ACTIVE_TIME desc;#對v$sqltext、v$sqlarea查看的是shared pool中的SQL,其時間索引是其解析歷史,因為共享的問題這個查詢可能並不能完整地反映出執行的歷史。
#v$sqlstats反應的是實例啟動起來的sql執行統計,sql語句本身比v$sqltext/area完整,因為後者有可能失效換出緩存。【方法二】聯合v$active_session_history和v$sqlarea#v$active_session_history 這個表只是個取樣數據,按秒進行,只有在那一秒采樣點處於on cpu或非idle等待的session統計在內。
所以可能會不全,有些執行很短的SQL會忽略。這個視圖無法還原完整的session歷史。
#v$sqlarea中有執行過的SQL語句,但並無到session的關聯信息,v$session中只關聯了當前的sql,所以也不行。從v$sqlstat可以查看到資料庫啟動起來的所有SQL信息,但是沒有時間順序關系、沒有執行用戶信息,只有執行次數與資源統計。
從dba_hist_sqlstat可以看到AWR snapshot之間的SQL統計信息,與v$sqlstats比不受實例重啟的影響,因為實例重啟之後v$sqlstats中的信息就清除了。【方法三:session trace】SQL> execute dbms_session.session_trace_enable(true,true);PL/SQL procere successfully pleted.SQL> select count(*) from dba_hist_sqltext; COUNT(*)---------- 478SQL> select * from V$sesstat where rownum=1; SID STATISTIC# VALUE---------- ---------- ---------- 134 0 1SQL> execute dbms_session.session_trace_disable;PL/SQL procere successfully pleted.$ cd $ORACLE_HOME/admin/test/ump$ ls -lrt$ tkprof test_ora_2195620.trc report.txt sys=no explain=no aggregate=yes$ more report.txt --這個文件包括了啟停trace之間所有SQL語句的執行信息,執行計劃、統計【方法四:logminer】只包含DML與DDL語句,不能查詢select語句。
另外需要開啟supplemental logging,默認是沒有開啟的。conn / as sysdba--安裝LOGMINERSQL> @$ORACLE_HOME/rdbms/admin/dbmslmd.sql;SQL> @$ORACLE_HOME/rdbms/admin/dbmslm.sql;SQL> @$ORACLE_HOME/rdbms/admin/dbmslms.sql;SQL> @$ORACLE_HOME/rdbms/admin/prvtlm.plb;--開啟附加日誌alter database add supplemental log data;--模擬DML操作conn p_chenming/。
SQL> select * from test2;SQL> insert into test2 values(7,77);SQL> mit;conn / as sysdba--切歸檔SQL> alter system switch logfile;SQL> select name,dest_id,thread#,sequence# from v$archived_log; --最後一個即為新的歸檔--新建LOG MINERSQL> execute dbms_logmnr.add_logfile(logfilename=>'/oracle/archive_10g/test/test_1_138_786808434.arc',options=>dbms_logmnr.new); --開始minerSQL> execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--查看結果SQL> col username format a8;SQL> col sql_redo format a50 SQL> select username,s,timestamp,sql_redo from v$logmnr_contents where table_name='TEST2' SQL> select username,s,timestamp,sql_redo from v$logmnr_contents where username='P_CHENMING'; --關閉MINERSQL> execute dbms_logmnr.end_logmnr;--關閉輔助日誌SQL> alter database drop supplemental log data;【總結】查看v$sqlarea只能查看粗略的歷史,因為很多SQL是共享的。查看ASH也不全,因為這是采樣數據,測試的時候基本沒有把SQL查詢出來。
查看V$SQLSTATS能看到所有執行過的sql,以及其執行統計,但是沒有時序、沒有用戶信息。查看TRACE應該是最完整的,但需要在執行SQL前開啟。
查看logminer不能查看select語句,而且默認的系統沒有開啟supplementing log,所以能查看的內容有限。或許還有審計的方法可用,我沒測試。
每種方法都有各自的缺陷,看來很難有一種完備的查看SQL執行歷史的方法。
select t.sql_id,
t.sql_text,
s.plan_hash_value,
s.optimizer_cost,
s.executions_total,
s.elapsed_time_total,
s.disk_reads_total,
s.buffer_gets_total
from DBA_HIST_SQLSTAT s, DBA_HIST_SQLTEXT t
where s.sql_id=t.sql_id
and t.sql_text like'%存儲過程名稱%';
沒有想到其他好辦法,確實不太好查了,把存儲過程當作SQL來查找吧。
在故障發生時,嘗試用下面的語句抓取資料庫引起故障的點。
/*********************************************************************************************/在oracle中監控死鎖/*********************************************************************************************/SELECT sn.username, m.SID, sn.SERIAL#, m.TYPE, DECODE(m.lmode, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', lmode, LTRIM(TO_CHAR(lmode, 鰶'))) lmode, DECODE(m.request, 0, 'None', 1, 'Null', 2, 'Row Share', 3, 'Row Excl.', 4, 'Share', 5, 'S/Row Excl.', 6, 'Exclusive', request, LTRIM(TO_CHAR(m.request, 鰶'))) request, m.id1, m.id2 FROM v$session sn, v$lock m WHERE (sn.SID = m.SID AND m.request != 0) --存在鎖請求,即被阻塞 OR (sn.SID = m.SID --不存在鎖請求,但是鎖定的對象被其他會話請求鎖定 AND m.request = 0 AND lmode != 4 AND (id1, id2) IN (SELECT s.id1, s.id2 FROM v$lock s WHERE request != 0 AND s.id1 = m.id1 AND s.id2 = m.id2)) ORDER BY id1, id2, m.request; /*********************************************************************************************/定位引起oracle死鎖的sql/*********************************************************************************************/select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object)) /*********************************************************************************************/下面的SQL查詢可以用於確定鎖住資料庫對象的鎖:/*********************************************************************************************/select c.owner, c.object_name, c.object_type, b.sid, b.serial#, b.status, b.osuser, b.machine from v$locked_object a , v$session b, dba_objects c where b.sid = a.session_id and a.object_id = c.object_id; /*********************************************************************************************/顯示哪些會話被鎖住/*********************************************************************************************//* showlock.sql */COLUMN o_name format a10COLUMN lock_type format a20COLUMN object_name format a15SELECT RPAD (oracle_username, 10) o_name, session_id SID, DECODE (locked_mode, 0, 'None', 1, 'Null', 2, 'Row share', 3, 'Row Execlusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive' ) lock_type, object_name, xisn, xidslot, xidsqn FROM v$locked_object, all_objectsWHERE v$locked_object.object_id = all_objects.object_id;/*********************************************************************************************/顯示所有的TM和TX鎖/*********************************************************************************************//* showalllock.sql */SELECT SID, TYPE, id1, id2, DECODE (lmode, 0, 'None', 1, 'Null', 2, 'Row share', 3, 'Row Exclusive', 4, 'Share', 5, 'Share Row Exclusive', 6, 'Exclusive' ) lock_type, request, ctime, BLOCK FROM v$lockWHERE TYPE IN ('TX', 'TM');/*********************************************************************************************/ 在Oracle資料庫中,可以通過kill session的方式來終止一個進程,其基本語法結構為: 被kill掉的session,狀態會被標記為killed,Oracle會在該用戶下一次touch時清除該進程.我們發現當一個session被kill掉以後,該session的paddr被修改,如果有多個session被kill,那麼多個session的paddr都被更改為相同的進程地址:/*********************************************************************************************/alter system kill session 'sid,serial#' ; /*********************************************************************************************/ 在oracle中kill掉的進程有時還需要等待pmon回滾資料庫已經佔有的資源有時候我們需要使用下面的腳本找出那些已經在oracle中kill掉的進程,在操作系統中在kill一次/*********************************************************************************************/select p.addr from v$process p where pid 1 minus select s.paddr from v$session s;$ kill -9 &paddr。
⑸ 如何查詢oracle表的操作日誌記錄
1、打開oracle sql developer工具,沒有此工具的可以去oracle官網下載安裝即可,剛剛安裝完成的是沒有記錄的,只有使用工具執行過後才會留下記錄可以查詢。打開之後不需要連接資料庫就可以查詢到sql記錄了。
⑹ 如何在oracle資料庫中查詢記錄總條數
方法和詳細的操空含作步驟如下:
1、第一步,查詢該庫中的所有表,測試sql,代碼見下圖,轉到下面的步驟。
⑺ oracle資料庫操作記錄怎麼查看
查看歸檔模式
conn
/as
sysdba
archive
log
list
如果資料庫為歸檔模式的話,可以通過logmnr來進行挖掘日誌文件查看這些信息的。如果是非歸檔模式。對不起無法查看了
開啟後台進程跟蹤,
設置參數(initsid.ora)
.backgroudn_mp_dest=目錄名
--
指定根蹤文件存放的路徑稿御知拆御
.user_dmup_test=目錄名
--指定用戶信息跟蹤文件的存放路徑
.用戶的跟蹤文件(.trc),
用TKPROF
來格式化用戶跟蹤文件
SQL
語句跟蹤即可。
.imed_statistics=true;
--設置啟用
sql_trace
=true;
.user_mp_dest=目錄
--指定跟蹤文件的存鍵消放路徑
.max_mp_file_size=5M
--指定跟蹤文件最大尺寸
.SQL_TRACE=TRUE;
.動態改變
:alter
session
set
sql_trace=true;
或者打開生成的跟蹤文件:
默認在..\oralce\admin\user\ump\*.trc,由於oralce
生成的*.trc
直接打開格式不規格,看得很累,可以用tkprof
gk
來格式化
:c:\tkprof
ora00001.trc
a.txt
⑻ 如何在oracle中查詢每個表的記錄條數
1、先查詢本庫的所有表,測試sql,select * from user_tables t where table_name like 'TEST%';可以看到有多張表;
⑼ 請教怎麼查詢ORACLE的歷史操作記錄
這個取決於你用的客戶端是哪個,冊納碰我平時用的州談是 DBArtisan 8.5.2,這個客戶端裡面有個 Logfile菜單,勾選SQL log之後,客戶端就茄旅可以記錄所有SQL操作,只需打開log就可以根據日期翻看所有SQL記錄。 log裡面有個設置文件大小的,我一般設置50M,大致可以存1個多月的腳本數據。
⑽ 如何查詢Oracle資料庫的操作日誌
方法1:使用LogMiner工具
優點伍租:可以完全挖掘日誌內沖橘拿容,找出所有執行過的SQL語句
缺點:
1. 如果沒有啟用歸檔日誌散搭,則只能對聯機日誌進行挖掘
2. 需要掌握LogMiner的用法
訪法2:查看HIST視圖
優點:簡單,只要使用普通的select語句查詢
缺點:Oracle保留約1周的歷史,所以要查太早的就不可能了
-- 找出哪個資料庫用戶用什麼程序在最近三天執行過delete或truncate table的操作
舉例如下:
SELECT c.username,
a.program,
b.sql_text,
b.command_type,
a.sample_time
FROM dba_hist_active_sess_history a
JOIN dba_hist_sqltext b
ON a.sql_id = b.sql_id
JOIN dba_users c
ON a.user_id = c.user_id
WHERE a.sample_time BETWEEN SYSDATE - 3 AND SYSDATE
AND b.command_type IN (7, 85)
ORDER BY a.sample_time DESC;