oracle 歸檔日誌

歸檔日誌(Archive Log)是非活動的重做日誌備份.通過使用歸檔日誌,可以保留所有重做歷史記錄,當數據庫處於ARCHIVELOG模式並進行日誌切換式,後臺進程ARCH會將重做日誌的內容保存到歸檔日誌中.當數據庫出現介質失敗時,使用數據文件備份,歸檔日誌和重做日誌可以完全恢復數據庫.


日誌操作模式:ARCHIVELOG NOARCHIVELOG


1,改變日誌操作模式:

檢查當前日誌操作模式

SELECT log_mode from v$database;

關閉數據庫,然後裝載數據庫

SHUTDOWN IMMEDIATE
STARTUP MOUNT

改變日誌操作模式,然後打開數據庫

ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;


2,執行手工歸檔

從oracle database 10g開始,當將日誌操作模式轉變未ARCHIVELOG模式時,oracle會自動啓動ARCH進程.如果要使用手工歸檔.那麼在改變日誌操作模式時必須使用命令ALTER DATABASE ARCHIVELOG MANUAL.

需要注意,使用手工歸檔方式,數據庫管理員必須手工執行歸檔命令.如果沒有執行手工歸檔命令,日誌組的原有內容將不能被覆蓋.ALTER DATABASE ARCHIVELOG MANUAL 命令是爲了與先前的版本兼容而保留的,.將來的oracle版本會淘汰該命令,使用手工歸檔方式是,數據庫管理員可以執行以下命令歸檔重做日誌:

ALTER SYSTEM ARCHIVELOG ALL;


3,配置歸檔進程

初始化參數LOG_ARCHIVE_MAX_PROCESSES用於指定例程初始啓動的最大歸檔進程個數,當將數據庫轉變爲ARCHIVELOG模式時,默認情況下oracle會自動啓動兩個歸檔進程.通過改變初始化參數LOG_ARCHIVE_MAX_PROCESS的值,可以動態地增加或降低歸檔進程的個數:

ALTER SYSTEM SET LOG_ARCHIVE_MAX_PROCESSES=3;

配置歸檔位置和文件格式

當數據庫處於ARCHIVELOG模式時,如果進行日誌切換,後臺進程將自動生成歸檔日誌,歸檔日誌的默認位置爲%oracle_home%rdbms,在oracle database 10g中,歸檔日誌的默認文件格式爲ARC%S_%R.%T.爲了改變歸檔日誌的位置和名稱格式,必須改變相應的初始化參數,


1,初始化參數LOG_ARCHIVE_FORMAT用於指定歸檔日誌的文件名格式,設置該初始化參數時,可以指定以下匹配符:

%s: 日誌序列號:

%S: 日誌序列號(帶有前導0)

%t: 重做線程編號.

%T: 重做線程編號(帶有前導0)

%a: 活動ID號

%d: 數據庫ID號

%r RESETLOGS的ID值.

從10g開始,配置歸檔日誌文件格式時,必須帶有%s,%t和%r匹配符,配置了歸檔文件格式後,必須重啓數據庫.


2,使用LOG_ARCHIVE_DEST配置歸檔位置

如果不使用備用數據庫,只需要將歸檔日誌存放到本地目錄.配置本地歸檔位置可以使用初始化參數LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST,其中,第一個參數用於設置第一個歸檔位置,第二個參數用於指定第二個歸檔位置.

ALTER SYSTEM SET log_archive_dest='d:demoarchive1';

ALTER SYSTEM SET log_archive_duplex_dest='d:demoarchive2';


3,使用LOG_ARCHIVE_DEST_n配置多個歸檔位置.

初始化參數LOG_ARCHIVE_DEST_n用於指定多個歸檔位置,該參數最多可以指定10個歸檔位置.通過使用初始化參數LOG_ARCHIVE_DEST_n,不僅可以配置本地歸檔位置,還可以配置遠程歸檔位置.

如果既要在主節點上生成歸檔日誌,又要將歸檔日誌傳遞到備用節點,那麼必須使用參數LOG_ARCHIVE_DEST_n.該參數與LOG_ARCHIVE_DEST具有如下區別;

初始化參數LOG_ARCHIVE_DEST_n可以配置本地歸檔位置和遠程歸檔位置,而初始化參數LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST只能配置本地歸檔位置.

初始化參數LOG_ARCHIVE_DEST_n可以配置多達10個歸檔位置,而初始化參數LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST最多隻能配置兩個歸檔位置.

初始化參數LOG_ARCHIVE_DEST_n 不能與初始化參數LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST同時使用.

因爲初始化參數LOG_ARCHIVE_DEST_n不能與初始化參數LOG_ARCHIVE_DEST和LOG_ARCHIVE_DUPLEX_DEST同時使用,所以必須禁用初始化參數LOG_ARCHVE_DEST和LOG_ARCHIVE_DUPLEX_DEST.當使用初始化參數LOG_ARCHIVE_DEST_n配置本地歸檔位置時,需要指定LOCALTION選項.當配置遠程歸檔位置時,需要指定SERVICE選項.


示例如下:

ALTER SYSTEM SET log_archive_duplex_dest='';

ALTER SYSTEM SET log_archive_dest='';

ALTER SYSTEM SET log_archive_dest_1='location=d:demoarchive1';

ALTER SYSTEM SET log_archive_dest_2='location=d:demoarchive2';

ALTER SYSTEM SET log_archive_dest_3='location=d:demoarchive3';

ALTER SYSTEM SET log_archive_dest_4='service=standby';


配置遠程歸檔位置時,SERVICE選項需要指定遠程數據庫的網絡服務名(在tnsnames.ora文件中配置)


4,使用LOG_ARCHIVE_DEST_n選項

使用初始化參數LOG_ARCHIVE_DEST_n配置歸檔位置時,可以在歸檔位置上指定OPTIONAL或MANDATORY選項.指定MANDATORY選項時,可以設置REOPEN屬性.

OPTIONAL:該選項是默認選項.使用該選項時,無論歸檔是否成功,都可以覆蓋重做日誌.

MANDATORY:強制歸檔.使用該選項時,只有在歸檔成功之後,重做日誌才能被覆蓋.

REOPEN:該屬性用於指定重新歸檔的時間間隔,默認值爲300秒,必須跟在MANDATORY後.

例:

Alter system set log_archive_dest_1=’location=d:demoarchive1 mandatory’;
Alter system set log_archive_dest_2=’location=d:demoarchive2 mandatory reopen=500’;
Alter system set log_archive_dest_3=’location=d:demoarchive3 optional’;


5,控制本地歸檔成功的最小個數.

使用初始化參數LOG_ARCHIVE_MIN_SUCCEED_DEST控制本地歸檔的最小成功個數

Alter system set log_archive_min_succeed_dest=2;


6,使用初始化參數LOG_ARCHIVE_DEST_STATE_n控制歸檔位置的可用性.設置該參數爲ENABLE(默認值),表示會激活相應的歸檔位置;設置該參數爲DEFER,表示禁用相應歸檔位置.當歸檔日誌所在磁盤損壞或填滿時,DBA需要暫時禁用該歸檔位置.

Alter system set log_archive_dest_state_3=defer;(禁用)
Alter system set log_archive_dest_state_3=enable;(啓用)


顯示歸檔日誌信息

1,使用ARCHIVE LOG LIST命令可以顯示日誌操作模式,歸檔位置,自動歸檔機器要歸檔的日誌序列號等信息.


2顯示日誌操作模式

SELECT name,log_mode FROM v$database;


3,顯示歸檔日誌信息.

Col name format a46
Select name, swquence#, first_change# FROM v$archived_log;

Name用於表示歸檔日誌文件名,sequence#用於表示歸檔日誌對應的日誌序列號,firs_change#用於標識歸檔日誌的起始SCN值.


4、執行介質恢復時,需要使用歸檔日誌文件,此四必須準確定位歸檔日誌的存放位置.通過查詢動態性能視圖v$archive_dest可以取得歸檔日誌所在目錄.

SELECT destination FROM v$archive dest;


5,顯示日誌歷史信息

SELECT * FROM v$loghist;

THREAD#用於標識重做線程號,SEQUNCE#用於標識日誌序列號,FIRST_CHANGE#用於標識日誌序列號對應的起始SCN值,FIRST_TIME用於標識起始SCN的發生時間.SWICTH_CHANGE#用於標識日誌切換的SCN值.


6.顯示歸檔進程信息.

進行日誌切換時,ARCH進程會自動將重做日誌內容複製到歸檔日誌中,爲了加快歸檔速度,應該啓用多個ARCH進程.通過查詢動態性能視圖V$ARCHIVE_PROCESSES可以顯示所有歸檔進程的信息!

SELECT * FROM v$archive_processes;

Porcess用於標識ARCH進程的編號,status用於標識ARCH進程的狀態(ACTIVE:活動,STOPPED:未啓動),log_sequence用於標識正在進行歸檔的日誌序列號,state用於標識ARCH進程的工作狀態

==========================================
用Oracle歸檔日誌進行恢復的方法



用Oracle歸檔日誌進行恢復的方法
聯機重演日誌沒有丟失應使用完成恢復,如聯機重演日誌損壞,而又沒有備份,就只能進行不完全恢復。

一、完全恢復:
1.使用命令“svrmgrl”調用行方式服務器管理;
2.輸入命令“connect internal”,然後輸入命令“startup mount’;
3.輸入命令“recover database;”
4.按下ENTER,接受默認值。
5.然後輸入命令“alter database open;”完成數據庫恢復。

二、不完全恢復
警告:
應用不完成恢復前,必須將數據庫做一次完全冷備份,因爲應用不完全恢復後,聯機重演日誌將重置,以前的所有日誌不可用。
如果恢復不成功,數據庫就不能使用了。再次強調,做完全冷備份後再應用不完全恢復。

1).基於變化的恢復(change-based recovery)
     要執行基於變化的恢復,需要知道丟失日誌之前的系統寫入歸檔重演日誌的最大的變化號(SCN),然後可以啓動恢復語句恢復數據庫直到改變scn_number,其中比scn_number是寫到已歸檔重演日誌文件順序號386的SCN(即,小於丟失日誌順序號387的SCN)。可以從V$log_history視圖中得到SCN信息。

select first_change# from v$log_history where sequence#=387;

其中387爲最後一個有效的日誌文件號加1,該例是查找386.
知道了SCN後,使用下述步驟完成恢復
1.使用命令“svrmgrl”調用行方式服務器管理;
2.輸入命令“connect internal”,然後輸入命令“startup mount’;
3.輸入命令“recover database until change 9999;”
4.在回答Oracle第一個歸檔重演日誌建議信息時,輸入“auto”,Oracle在找到第387號重演日誌之前停止恢復。
5.用命令“alter database open resetlogs;”打開數據庫。(應用該命令前請確認數據庫已備份,如打開失敗,日誌將不可用)

2).基於停止的恢復(cancel-based recovery)
1.使用命令“svrmgrl”調用行方式服務器管理;
2.輸入命令“connect internal”,然後輸入命令“startup mount’;
3.輸入命令“recover database until cancel;”,Oracle提示需要的第一個歸檔重演日誌文件名.按下ENTER鍵接受缺省文件名,並且—路ENTER直到詢問順序號387的日誌。輸入“cancel”,停止恢復操作。
4.用命令“alter database open resetlogs;”打開數據庫。(應用該命令前請確認數據庫已備份,如打開失敗,日誌將不可用)

3).基於時間的恢復(time-based recovery)
爲使用基於時間的恢復,必須知道記錄在V$log_history歸檔重演日誌序號387(丟失重演日誌)的時間,通過執行查詢語句“select time from v$log_history where sequence#=387;”得到。本例得到的時間是:2002-06-23 14:42:04

現在開始實施恢復。
1.使用命令“svrmgrl”調用行方式服務器管理;
2.輸入命令“connect internal”,然後輸入命令“startup mount’;
3.輸入命令“recover database until time '2002/06/23 14:42:04';”,Oracle提示需要的第一個歸檔重演日誌文件名,輸入“auto”,Oracle恢復歸檔重演日誌直到序號爲387的日誌,停止恢復操作。
4.用命令“alter database open resetlogs;”打開數據庫。(應用該命令前請確認已數據庫已備份,如打開失敗,日誌將不可用)

提示: 使用基於時間的恢復,時間的格式是YYYY/MM/DD HH24:MI:SS,並且用單引號括起。

附:如何啓用Oracle的歸檔方式
1.參照以下內容編輯init.ora文件:
log_archive_start = true
log_archive_dest_1 = " LOCATION=D:\Oracle\oradata\ORCL\archive "
og_archive_format = %%ORACLE_SID%%T%TS%S.ARC
2.關閉數據庫
svrmgrl> connect internal
svrmgrl> shutdown normal
3.然後啓動實例並安裝該數據庫,但不打開數據庫。
svrmgrl> startup mount
4.接着,發佈下列更改數據庫的命令。
Svrmgrl> alter database archivelog;
5.現在,數據庫已經更改爲歸檔方式,您可以打開數據庫。
svrmgrl> alter database open;

提示:也可以使用DBA studio工具啓用數據庫的歸檔方式,操作很簡單

=============================================================
ORACLE歸檔模式的設置



在ORACLE 數據庫的開發環境和測試環境中,數據庫的日誌模式和自動歸檔模式一般都是不設置的,這樣有利於系統應用的調整,也免的生成大量的歸檔日誌文件將磁盤空間大量的消耗。但在系統上線,成爲生產環境時,將其設置爲日誌模式並自動歸檔就相當重要了,因爲,這是保證系統的安全性,有效預防災難的重要措施。這樣,通過定時備份數據庫和在兩次備份間隔之間的日誌文件,可以有效的恢復這段時間的任何時間點的數據,可以在很多時候挽回或最大可能的減少數據丟失。

一、 要使OARCLE 數據庫進行日誌的自動歸檔,需要做兩方面的事情;
1.是數據庫日誌模式的設置(可爲Archive Mode 和No Archive Mode);2.就是自動歸檔模式設置(Automatic archival,可爲Enabled 和Disabled)。

二、 如何查看數據庫的現行日誌和自動歸檔模式的設置
可用archive log list 命令來查看。
運行在日誌自動歸檔模式下的數據庫系統查看結果如下(一般是生產環境):
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /backup/archivelog
Oldest online log sequence 2131
Next log sequence to archive 2133
Current log sequence 2133
沒有啓動數據庫日誌模式和自動歸檔的數據庫系統查看結果如下(一般是測試環境):
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/product/8.1.7/dbs/arch
Oldest online log sequence 194
Current log sequence 196

三. 數據庫日誌模式的設置
在創建數據庫時,可以在CREATE DATABASE 語句中指定數據庫的日誌模式。假如沒有指明,則缺省爲NOARCHIVELOG 模式。由於如果在創建數據庫時指明是Archive Mode的話,會增加約20%的創建時間,而在以後啓動INSTANCE 時再設置的話,一般只用去幾秒的時間,所以一般在創建數據庫時是不設置爲ARCHIVE MODE 的。
將數據庫的日誌模式設置切換(Archive Mode 和No Archive Mode 之間的切換)的步驟和操作如下:
1. 關閉運行的數據庫實例
SQL> shutdown
在進行日誌模式切換之前,必須將運行的數據庫正常關閉。
2. 備份數據庫
該備份跟以後產生的日誌一起用於將來的災難恢復(很重要,如要改爲歸檔日誌模式,沒有這個數據庫備份,僅有日誌文件是無法從該時間點恢復的)。
3. 啓動數據庫實例到mount 狀態,但不要打開。
SQL> startup mount
4. 切換數據庫日誌模式。
SQL> alter database archivelog;(設置數據庫爲歸檔日誌模式)或
SQL> alter database noarchivelog;(設置數據庫爲非歸檔日誌模式)
5. 打開數據庫
SQL> alter database open;
6. 確認數據庫現在處於歸檔日誌模式。
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination for example: $ORACLE_HOME/dbs/arch
Oldest on-line log sequence 275
Next log sequence 277
Current log sequence 278
7. 將這個時間點的redo logs 歸檔
SQL> archive log all;
8. 確認新產生的日誌文件已在相應的歸檔目錄下面。

四. 自動歸檔模式設置(Automatic archival,可爲Enabled 和Disabled)。
在該模式下,數據庫啓動一個arch 進程,專門負責將redo logs 寫到系統歸檔設備的相應目錄下。在數據庫的參數文件中設置參數(一般是在$ORACLE_HOME/dbs/init*.ora 文件中):
LOG_ARCHIVE_START=
LOG_ARCHIVE_DEST=
LOG_ARCHIVE_FORMAT=
LOG_ARCHIVE_START:
如要求自動歸檔的話,則設爲TRUE,如要求爲非自動歸檔的話,則設爲FALSE
LOG_ARCHIVE_DEST:
該參數設定了archive logs 歸檔存放的路徑。
LOG_ARCHIVE_FORMAT:
該參數設定了archive logs 的命名格式。例如,如將格式設爲: arch%s.arc
log 文件將爲: arch1.arc, arch2.arc, arch3.arc
這幾個參數設置只有在數據庫實例啓動前設置才能生效,如果在數據庫運行中進行設置,要使其生效,必須重起數據庫。
如果數據庫正在運行中,不能即刻重起,要設置其爲自動歸檔模式,則做如下操作:
SQL> ALTER SYSTEM ARCHIVE LOG START;
如要設置其爲非自動歸檔模式(取消自動歸檔),則:
SQL> ALTER SYSTEM ARCHIVE LOG STOP;
但如果數據庫重起後,給語句修改的結果就失效了,自動歸檔的設置還是按照系統參數文件中的LOG_ARCHIVE_START 的值來設置。

五. 幾種設置情況:
1. Database log mode Archive Mode,Automatic archival Enabled
這是在大部分生產環境中的ORACLE 數據庫日誌及歸檔模式設置,這種情況下,做好數據庫的定期備份(有熱備和冷備)和歸檔日誌備份,可有效的將數據庫恢復到有歸檔日誌的全部時間點。
2. Database log mode Archive Mode,Automatic archival Disabled
這種情況下,數據庫不能自動歸檔,需要進行手工歸檔。如果所有在線日誌都寫滿了,又沒有的及時進行手工歸檔的話,由於LGWR 沒有可用的在線日誌可寫,數據庫將會掛在這兒,只有進行手工歸檔後,有可用的在線日誌後才能繼續。在生產環境中應該避免這種情況。
手工歸檔操作如下:
SQL> ALTER SYSTEM ARCHIVE LOG ALL;
數據庫將會把在線日誌進行歸檔處理
3. Database log mode NO Archive Mode,Automatic archival Enabled
有些情況下,數據庫管理員只在數據庫參數文件中設置了LOG_ARCHIVE_START=TRUE,然後在數據庫起來後查看到ARCH 歸檔進程已經起來了,可是儘管ORACLE 已經作了幾次日誌切換,但還是沒有歸檔日誌,這時的設置就是這種情況,如果數據庫不是處在ARVHIVELOG 模式,redolog 還是不會被歸檔。
4. Database log mode NO Archive Mode,Automatic archival Disabled
這種設置是剛安裝的oracle 數據庫的缺省設置,開發環境也大部分如此。即沒有進行歸檔。


如何手工刪除歸檔日誌文件?(如果採用RMNA備份後則不用手工刪除)
一、先手工刪除歸檔日誌文件
二、用RMAN刪除數據庫記錄的歸檔列表信息
1) 進入本數據庫的rman,在命令行模式輸入"rman target /",進入rman,查看提示,確認連接的是否是本庫?
2) 查看歸檔日誌文件的狀態:
RMAN> list archivelog all;
3) 刪除操作系統中的日誌文件(到操作系統級進行手工刪除,也可以是第一步;
4) 將歸檔日誌信息進行更新;
RMAN> crosscheck archivelog all;
RMAN> delete expired archivelog all; (確認時鍵入"yes")
RMAN> exit


=================================================================


9個重要的視圖
Ref: http://blog.itpub.net/post/7923/49453
1)v$lock
給出了鎖的信息,如type字段, user type locks有3種:TM,TX,UL,system type locks有多種,常見的有:MR,RT,XR,TS等。我們只關心TM,TX鎖。

當TM鎖時,id1字段表示object_id;當TX鎖時,trunc(id1/power(2,16))代表了回滾段號。

lmode字段,session持有的鎖的模式,有6種:
0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)

request字段,process請求的鎖的模式,取值範圍與lmode相同。

ctime字段,已持有或等待鎖的時間。

block字段,是否阻塞其它鎖申請,當block=1時說明這個session阻塞了別的session。


2)v$sqlarea

共享池中存儲的sql和一些相關的信息,如累計的執行次數(executions),邏輯讀(buffer_gets),物理讀(disk_reads)等統計信息。

根據address和hash_value可以定位一條sql。sql_text字段存的這個sql的前1000個字符。查找整個的sql還需去v$sqltext或者v$sqltext_with_newlines。


3)v$session

所有當前session的信息,包括一些用戶信息如username,terminal,program,logon_time等,command字段表示session執行的什麼命令。

通過v$session.paddr=v$process.addr跟process相關,通過v$session.taddr=v$transaction.addr跟trancation相關。

通過sid可以到相關視圖中查詢與這個session相關的各種信息,如v$sesstat中有session的統計信息,v$sess_io中有session的io統計信息,v$session_wait中有session的等待信息,v$session_event中有session在一段時間內所等待的各種事件的信息。

根據lockwait字段可以查詢當前正在等待的鎖的相關信息:
select * from v$lock where kaddr in (select lockwait from v$session where sid=&sid);

(sql_address,sql_hash_value),(prev_sql_addr,prev_hash_value) 根據這兩組字段, 可以查詢到當前session正在執行的或者最近一次執行的sql語句的詳細信息:
select * from v$sqltext where address = &sql_address and hash_value = &sql_hash_value;


4)v$sesstat

根據session id可以得到這個session的統計信息:
select a.name,b.value
from v$statname a,v$sesstat b
where a.STATISTIC#=b.STATISTIC#
and b.sid=&sid
and b.value <>0
order by b.value;


5)v$session_wait

--這部分抄襲 xzh的blog
根據session id可以得到這個session的等待情況。

event字段表示等待事件。

p1、p2、p3告訴我們等待事件的具體含義,如果wait event是db file scattered read,p1=file_id/p2=block_id/p3=blocks,然後通過dba_extents即可確定出熱點對象;如果是latch free的話,p2爲閂鎖號,它指向v$latch。

P1RAW,P2RAW,P3RAW列對應P1,P2,P3的十六進制值;P1TEXT,P2TEXT,P3TEXT列對應P1,P2,P3列的解釋。

--求等待事件及其對應的latch

col event format a32
col name format a32
select sid,event,p1 as file_id, p2 as "block_id/latch", p3 as blocks,l.name
from v$session_wait sw,v$latch l
where event not like '%SQL%' and event not like '%rdbms%'
and event not like '%mon%' and sw.p2 = l.latch#(+);

--求等待事件及其熱點對象

col owner format a18
col segment_name format a32
col segment_type format a32
select owner,segment_name,segment_type
from dba_extents
where file_id = &file_id and &block_id between block_id
and block_id + &blocks - 1;

--綜合以上兩條sql,同時顯示latch及熱點對象(速度較慢)

select sw.sid,event,l.name,de.segment_name
from v$session_wait sw,v$latch l,dba_extents de
where event not like '%SQL%' and event not like '%rdbms%'
and event not like '%mon%' and sw.p2 = l.latch#(+) and sw.p1 = de.file_id(+) and p2 between de.block_id and de.block_id + de.blocks - 1;

--如果是非空閒等待事件,通過等待會話的sid可以求出該會話在執行的sql

select sql_text
from v$sqltext_with_newlines st,v$session se
where st.address=se.sql_address and st.hash_value=se.sql_hash_value
and se.sid =&wait_sid order by piece;


6)v$process

根據session id可以查到操作系統進程的信息:
select * from v$process where addr in (select paddr from v$session where sid=&sid );
spid字段是操作系統進程號,可以用來進行 kill -9 spid 這麼一個操作。

可以找到 unix命令 top 出來的最耗cpu資源的pid,根據pid最耗資源的sql:
SELECT /*+ ORDERED */
sql_text
FROM v$sqltext a
WHERE (a.hash_value, a.address) IN (
SELECT DECODE (sql_hash_value,
0, prev_hash_value,
sql_hash_value
),
DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
FROM v$session b
WHERE b.paddr = (SELECT addr
FROM v$process c
WHERE c.spid = '&pid'))
ORDER BY piece ASC
/


7)v$transaction

根據session id可以查到當前session正在執行的事務信息:
select * from v$transaction where addr in (select taddr from v$session where sid=&sid );

看下面這兩個字段可以看到事務進行到什麼程度了:
USED_UBLK
NUMBER
Number of undo blocks used

USED_UREC
NUMBER
Number of undo records used

重複查詢這兩個值,可以看到變化,可以估計事務的進度,尤其是長時間的回滾操作,當這兩個值爲0,回滾也就完成了。


8)v$sort_usage

temp表空間的使用情況,當temp表空間變得巨大的時候,根據session_addr可以得到session id,根據sqladdr和sqlhash可以得到正在執行的sql:
select se.username,se.sid,su.extents,su.blocks*to_number(rtrim(p.value)) as Space,tablespace,segtype,sql_text
from v$sort_usage su,v$parameter p,v$session se,v$sql s
where p.name='db_block_size'
and su.session_addr=se.saddr
and s.hash_value=su.sqlhash
and s.address=su.sqladdr
order by se.username,se.sid;


9)v$sysstat
所有instance的統計信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章