問題描述
PLSQL無法登錄,普通用戶使用sqlplus登錄hang住,只能通過sys用戶登錄
一、分析
1.會話分析
set linesize 600;
col sid format a500;
col username format a20;
col event format a60;
SQL> select sid,username,event,p1,p2,p3 from v$session where status='ACTIVE' and username is not null;
SID USERNAME EVENT P1 P2 P3
---------- -------------------- ------------------------------------------------------------ ---------- ---------- ----------
########## MASK buffer busy waits 44 3578 1
########## DBSNMP buffer busy waits 44 3578 1
########## SYSMAN buffer busy waits 44 3578 1
########## SYSMAN log file switch (checkpoint incomplete) 0 0 0
########## SYSMAN log file switch (checkpoint incomplete) 0 0 0
########## MASK buffer busy waits 44 3578 1
########## SYSMAN buffer busy waits 44 3578 1
########## MASK buffer busy waits 44 3578 1
########## SYSMAN buffer busy waits 44 3578 1
########## SYSTEM buffer busy waits 44 3578 1
########## SYSMAN buffer busy waits 44 3578 1
2.hang analyze介紹
通常除了systemstate dump,最好同時生成hang analyze來直觀地瞭解數據庫進程間的等待關係。
2.1 單實例
$sqlplus / as sysdba
或者
$sqlplus -prelim / as sysdba <==當數據庫已經很慢或者hang到無法連接
SQL>alter session set tracefile_identifier='mytrace';
SQL>oradebug setmypid
SQL>oradebug unlimit;
SQL>oradebug dump hanganalyze 3
等1~2分鐘
SQL>oradebug dump hanganalyze 3
等1~2分鐘
SQL>oradebug dump hanganalyze 3
SQL>oradebug tracefile_name;
SQL>oradebug close_trace
SQL> alter session set tracefile_identifier='mytrace';
Session altered.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug unlimit;
Statement processed.
SQL> oradebug dump hanganalyze 3
Statement processed.
SQL> oradebug dump hanganalyze 3
Statement processed.
SQL> oradebug dump hanganalyze 3
Statement processed.
SQL> oradebug tracefile_name;
/u01/app/oracle/diag/rdbms/s***2/s***2/trace/s***2_ora_23481_mytrace.trc
SQL> oradebug close_trace
Statement processed.
SQL> exit
截圖:
[2275]/1/2276/13241/0xb0149aa98/13053/LEAF_NW/
該行表示sid,serial#爲2276,13241會話持有鎖 數據庫實例編號 會話sid 會話serial# 會話的地址saddr 會話對應的操作系統ID 表明會話是否等待 如有值,表明是持鎖會話的CHAIN編號,否則爲空
[2275]/1/2276/13241/0xb0149aa98/13053/LEAF_NW/
trace文件分析參考鏈接:http://blog.itpub.net/9240380/viewspace-1823479/
3.查看會話
3.1查看對應的sid和serial會話信息
select status from v$session where sid=2276 and serial#=13241;
3.2查看長時間持有latch的SQL語句
SELECT s.sql_hash_value,s.sql_id, l.name
FROM V$SESSION s, V$LATCHHOLDER l
WHERE s.sid = l.sid;
3.3查看指定sql_id對應的SQL語句
select sql_fulltext from v$sqlarea where sql_id='4ducr8st4ruas';
3.4查看日誌組信息
select * from v$log;
從下圖可以發現非current狀態的日誌組均爲active狀態,懷疑日誌文件太小
二、處理
1.增加日誌組
ALTER DATABASE ADD LOGFILE GROUP 4('/u01/app/oracle/oradata/s***2/redo04.log') SIZE 1024M;
ALTER DATABASE ADD LOGFILE GROUP 5('/u01/app/oracle/oradata/s***2/redo05.log') SIZE 1024M;
ALTER DATABASE ADD LOGFILE GROUP 6('/u01/app/oracle/oradata/s***2/redo06.log') SIZE 1024M;
--切換日誌組
alter system switch logfile;
2.查看審計
show parameter audit_trail
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
audit_trail string DB
--關閉審計
SQL> alter system set audit_trail=FALSE scope=spfile;
System altered.
--重啓數據庫
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 4.6900E+10 bytes
Fixed Size 2239016 bytes
Variable Size 3.2883E+10 bytes
Database Buffers 1.3959E+10 bytes
Redo Buffers 55869440 bytes
Database mounted.
Database opened.
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
audit_trail string FALSE
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
3.登錄檢查恢復正常
$sqlplus m**k/******
SQL*Plus: Release 11.2.0.3.0 Production on Mon Feb 26 17:09:00 2018
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select status from v$session where sid=2276 and serial#=13241;
no rows selected
三、補充知識
1.hang analyze
oradebug hanganalyze 3產生的TRACE FILE包括3部分內容
第一部分:
Chains most likely to have caused the hang:
[a] Chain 1 Signature: 'rdbms ipc message'<='log file switch (checkpoint incomplete)'<='buffer busy waits'
Chain 1 Signature Hash: 0x4110dae0
[b] Chain 2 Signature: <not in a wait><='latch: cache buffers chains'
Chain 2 Signature Hash: 0xccebf225
[c] Chain 3 Signature: 'rdbms ipc message'<='enq: CR - block range reuse ckpt'<='buffer busy waits'
Chain 3 Signature Hash: 0x11bdab12
第二部分(當然這裏面又分爲intersecting chains或者non-intersecting chains)
第三部分:
Extra information that will be dumped at higher levels:
[level 4] : 3 node dumps -- [LEAF] [LEAF_NW]
[level 5] : 66 node dumps -- [NO_WAIT] [INVOL_WT] [SINGLE_NODE] [NLEAF] [SINGLE_NODE_NW]
State of ALL nodes
([nodenum]/cnode/sid/sess_srno/session/ospid/state/[adjlist]):
[1]/1/2/33209/0xb0913ba18/14107/NLEAF/[1421]
[2]/1/3/56281/0xb110bda68/21150/NLEAF/[3552]
[143]/1/144/589/0xb01111318/2007/NLEAF/[1421]
[285]/1/286/3181/0xaf112d4d0/13267/NLEAF/[1988]
[286]/1/287/2703/0xaf912f5c8/21152/NLEAF/[3552]
[427]/1/428/437/0xb11173570/2120/NLEAF/[1421]
[428]/1/429/1867/0xae917a538/26749/NLEAF/[1988]
[569]/1/570/7907/0xb512010f8/2126/NLEAF/[1988]
[571]/1/572/16555/0xb111aee90/26751/NLEAF/[428]
[711]/1/712/4255/0xaf91e50d0/2122/NLEAF/[1988]
[714]/1/715/25733/0xb09268760/20010/NLEAF/[1421]
[853]/1/854/5489/0xae9230040/2124/NLEAF/[1421]
...
1.1各部分說明
● 根據其每列含義
([nodenum]/cnode/sid/sess_srno/session/ospid/state/[adjlist]):
數據庫實例編號 會話sid 會話serial# 會話的地址saddr 會話對應的操作系統ID 表明會話是否等待 如有值,表明是持鎖會話的CHAIN編號,否則爲空
[163] / 1 / 164 / 10419 / 0xdc9ea7e0 / 4046 / NLEAF / [301]
● non-intersecting chains的特色就是所包含的會話的阻塞會話,不隸屬於任何chain
而intersecting chains包含的會話的阻塞會話隸屬於另一個chains中的持鎖會話,也就是說chains包含在另一個chains中
● chains中包括每個會話以及阻塞會話的詳細信息,包括SID,PID,SPID以及當前運行的SQL
所調用堆棧;以及近期的歷史等待會話列表
● 關於 ([nodenum]/cnode/sid/sess_srno/session/ospid/state/[adjlist]) 中的state列的各值含義如下,暫不全面(仍需要進一步測試)
○ NLEAF表明是等待會話
○ SINGLE_NODE表明它是等待任何會話或資源
○ LEAF表明它是持鎖會話,即它不等待任何會話或資源
○ LEAF_NEW它也是持鎖會話
2.日誌組成員操作
查看日誌組成員路徑
select * from v$logfile;
2.1 添加日誌組成員
ALTER DATABASE ADD LOGFILE GROUP 4('/u01/app/oracle/oradata/s***2/redo04.log') SIZE 1024M;
2.2 切換日誌組
alter system switch logfile;
2.3 刪除日誌組成員
當日志組成員狀態爲INACTIVE時可以刪除 如下:
alter database drop logfile member '/u01/app/oracle/oradata/s***2/redo01.log';
3.審計功能檢查
3.1 檢查審計功能
show parameter audit_trail
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
audit_trail string DB
3.2 關閉審計
SQL> alter system set audit_trail=FALSE scope=spfile;
System altered.
3.3 重啓數據庫
SQL> shutdown immediate;
SQL> startup
3.4 檢查審計功能
SQL> show parameter audit_trail
NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
audit_trail string FALSE