後臺的server(數據庫,tomcat等server),通常通過文本來記錄日誌,對於Oracle這樣重量級的數據庫,日誌文件非常詳細,當出現了故障需要排查時,就可以分析查看日誌文件。Diagnosticfiles的作用就在於此。
日誌文件分爲兩類:
1. Alter file
和Trace File (每個進程一個,在該進程生命週期內創建)不同,AlertFile 只有一個,它隨着時間的推移體積逐漸增大,它存放的地址可以通過BACKGROUND_DUMP_DEST或USER_DUMP_DEST來確定。它記錄了數據庫運行中的各種動作和啓動參數,因此可以通過複製alertfile中的參數來構建一個pfile。
/*==================演示構建pfile的過程====================*/
SQL> showparameter dump
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_core_dump string partial
background_dump_dest string /oracle/diag/rdbms/orcl/orcl/trace
core_dump_dest string /oracle/diag/rdbms/orcl/orcl/cdump
max_dump_file_size string unlimited
shadow_core_dump string partial
user_dump_dest string /oracle/diag/rdbms/orcl/orcl/trace
[oracle@localhost ~]$ cd /oracle/diag/rdbms/orcl/orcl/trace
[oracle@localhost trace]$ ls
alert_orcl.log orcl_j002_2553.trc orcl_ora_1708.trc # alert file cdmp_20140903174944 orcl_j002_2553.trm orcl_ora_1708.trm orcl_cjq0_1743.trc orcl_j002_27675.trc orcl_ora_1709.trc orcl_cjq0_1743.trm orcl_j002_27675.trm orcl_ora_1709.trm orcl_cjq0_1833.trc orcl_j002_8505.trc orcl_ora_1727.trc
[oracle@localhost trace]$ vim alert_orcl.log
Tue Aug 05 18:25:23 2014 Starting ORACLE instance (normal) ... control_files = "/oracle/oradata/orcl/control01.ctl" control_files ="/oracle/flash_recovery_area/orcl/control02.ctl" db_block_size = 8192 compatible = "11.2.0.0.0" db_recovery_file_dest ="/oracle/flash_recovery_area"
=======將alter_orcl.log中的參數複製到一個新文件mickey_orcl.ora中=========
[oracle@localhost ~]$ cd /oracle/11g/dbs
[oracle@localhost dbs]$ vim mickey_orcl.ora
processes = 150 memory_target = 404M control_files ="/oracle/oradata/orcl/control01.ctl" control_files ="/oracle/flash_recovery_area/orcl/control02.ctl" db_block_size = 8192 compatible = "11.2.0.0.0" db_recovery_file_dest ="/oracle/flash_recovery_area" db_recovery_file_dest_size= 3852M undo_tablespace = "UNDOTBS1" remote_login_passwordfile= "EXCLUSIVE" db_domain = "" dispatchers = "(PROTOCOL=TCP)(SERVICE=orclXDB)" audit_file_dest ="/oracle/admin/orcl/adump" audit_trail = "DB" db_name = "orcl" open_cursors = 300 diagnostic_dest = "/oracle"
==========Shut Down數據庫,然後用mickey_orcl.ora作爲PFILE來啓動數據庫======
SQL> shutdownimmediate
Database closed. Database dismounted. ORACLE instance shut down. --關閉數據庫
SQL> startuppfile=$ORACLE_HOME/dbs/mickey_orcl.ora
ORACLE instance started. Total System Global Area 422670336 bytes Fixed Size 1336960 bytes Variable Size 260049280 bytes Database Buffers 155189248 bytes Redo Buffers 6094848 bytes Database mounted. Database opened. -- 能夠用通過alert_orcl.log創建的pfile來正常啓動數據庫
2.Trace file:
a) Backgroun Trace Files
b) User Trace Files
Background Trace File記錄的是數據庫本身的信息,而UserTrace File記錄的則是單個用戶操作數據庫時發生的事。它不止記錄用戶會話中發生的錯誤,也可以主動記錄所有操作:
1.在sessionlevel上使用alter命令來記錄
2.在Instancelevel上設置啓動參數,但是不建議這樣做,因爲數據庫連接的用戶數量可能是巨大的,每個操作都記錄會加重數據庫的負擔。
/*========演示使用alter方式更改sesssion level 的trace file的記錄狀況========*/
[oracle@localhost dbs]$ ps -ef | grep oracle
oracle 11437 1 001:37 ? 00:00:02/oracle/11g/bin/tnslsnr LISTENER -inherit root 14314 1372 005:57 ? 00:00:00 sshd: oracle[priv] oracle 1433214314 0 05:57 ? 00:00:00 sshd: oracle@pts/0 oracle 1436514364 0 05:57 pts/1 00:00:00 -bash oracle 1492214333 0 06:59 pts/0 00:00:00 sqlplus oracle 15498 1 007:46 ? 00:00:00 ora_pmon_orcl ... oracle 15559 14922 0 07:46 ? 00:00:00oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) # 當前登陸的用戶 oracle 1558714365 2 07:47 pts/1 00:00:00 ps -ef oracle 1558814365 0 07:47 pts/1 00:00:00 grep oracle # 啓動數據庫中當前的進程
==========再開啓一個終端以system用戶登陸數據庫============
[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 11.2.0.1.0 Production on Tue Sep 9 07:49:452014 Copyright (c) 1982, 2009, Oracle. All rights reserved.
SQL> conn system
Enter password: Connected.
=======再次查看進程========
[oracle@localhost dbs]$ ps -ef | grep oracle
oracle 11437 1 001:37 ? 00:00:02/oracle/11g/bin/tnslsnr LISTENER -inherit ... oracle 15498 1 007:46 ? 00:00:00 ora_pmon_orcl oracle 15532 1 007:46 ? 00:00:00 ora_s000_orcl oracle 1555914922 0 07:46 ? 00:00:00 oracleorcl(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) # 原來登陸的用戶 oracle 15561 1 007:46 ? 00:00:00 ora_qmnc_orcl ... oracle 1560515604 0 07:49 pts/2 00:00:00 -bash oracle 1563115605 0 07:49 pts/2 00:00:00 sqlplus oracle 15805 15803 0 08:08 ? 00:00:00 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq))) # 新增的登錄用戶 oracle 15648 1 007:51 ? 00:00:00 ora_smco_orcl oracle 1565614365 4 07:52 pts/1 00:00:00 ps -ef oracle 1565714365 0 07:52 pts/1 00:00:00 grep oracle
===========SYS查看當前的sql_trace=============
SQL> showparameter sql_trace
NAME TYPE VALUE ------------------------------------ ---------------------------------- sql_trace boolean FALSE -- false 說明不記錄
=========system用戶更改sql_trace的參數=============
SQL> altersession set sql_trace = true;
Session altered.
SQL> showparameter sql_trace;
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ sql_trace boolean TRUE
========system用戶執行一條sql語句=============
SQL> select *from dual;
D - X
=========查看進程號爲15805的trace file ======
[oracle@localhost dbs]$ cd /oracle/diag/rdbms/orcl/orcl/trace
[oracle@localhost trace]$ ls
... orcl_ora_15293.trc orcl_ora_15405.trm orcl_ora_15805.trc orcl_ora_15293.trm orcl_ora_15451.trc orcl_ora_15805.trm orcl_ora_15395.trc orcl_ora_15451.trm orcl_ora_1594.trc ... orcl_ora_15395.trm orcl_ora_15559.trc orcl_ora_1594.trm orcl_ora_15405.trc orcl_ora_15559.trm
[oracle@localhost trace]$ tail -f orcl_ora_15805.trc
*** CLIENT ID:() 2014-09-09 08:08:44.925 ... alter session set sql_trace=true ... select * from dual # 記錄下了system用戶執行的查詢語句過程 END OF STMT FETCH #3:c=0,e=3,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,plh=272002086,tim=1410264754691221