DBA指令碼 (2)
二、效能監控
1、資料緩衝區的命中率已經不是效能調整中的主要問題了,但是,過低的命中率肯定是不可以的,在任何情況下,我們必須保證有一個大的data buffer和一個高的命中率。
這個語句可以獲得整體的資料緩衝命中率,越高越好
SELECT a.VALUE + b.VALUE logical_reads,
c.VALUE phys_reads,
round(100*(1-c.value/(a.value+b.value)),4) hit_ratio
FROM v$sysstat a,v$sysstat b,v$sysstat c
WHERE a.NAME='db block gets'
AND b.NAME='consistent gets'
AND c.NAME='physical reads'
2、庫緩衝說明了SQL語句的過載率,當然,一個SQL語句應當被執行的越多越好,如果過載率比較高,就考慮增加共享池大小或者是提高Bind變數的使用
以下語句查詢了Sql語句的過載率,越低越好
SELECT SUM(pins) total_pins,SUM(reloads) total_reloads,
SUM(reloads)/SUM(pins)*100 libcache_reload_ratio
FROM v$librarycache
3、使用者鎖,資料庫的鎖有的時候是比較耗費資源的,特別是發生鎖等待的時候,我們必須找到發生等待的鎖,有可能的話,殺掉該程式。
這個語句將查詢到資料庫中所有的DML語句產生的鎖,還可以發現,任何DML語句其實產生了兩個鎖,一個是表鎖,一個是行鎖。
可以透過alter system kill session ‘sid,serial#’來殺掉會話
SELECT /*+ rule */ s.username,
decode(l.type,'TM','TABLE LOCK',
'TX','ROW LOCK',
NULL) LOCK_LEVEL,
o.owner,o.object_name,o.object_type,
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
FROM v$session s,v$lock l,dba_objects o
WHERE l.sid = s.sid
AND l.id1 = o.object_id(+)
AND s.username is NOT NULL
4、鎖與等待,如果發生了鎖等待,我們可能更想知道是誰鎖了表而引起誰的等待
以下的語句可以查詢到誰鎖了表,而誰在等待。
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#
FROM v$locked_object l,dba_objects o,v$session s
WHERE l.object_id=o.object_id
AND l.session_id=s.sid
ORDER BY o.object_id,xidusn DESC
以上查詢結果是一個樹狀結構,如果有子節點,則表示有等待發生。如果想知道鎖用了哪個回滾段,還可以關聯到V$rollname,其中xidusn就是回滾段的USN
5、如果發生了事務或鎖,想知道哪些回滾段正在被使用嗎?其實透過事務表,我們可以詳細的查詢到事務與回滾段之間的關係。同時,如果關聯會話表,我們則可以知道是哪個會話發動了這個事務。
SELECT s.USERNAME,s.SID,s.SERIAL#,t.UBAFIL "UBA filenum",
t.UBABLK "UBA Block number",t.USED_UBLK "Number os undo Blocks Used",
t.START_TIME,t.STATUS,t.START_SCNB,t.XIDUSN RollID,r.NAME RollName
FROM v$session s,v$transaction t,v$rollname r
WHERE s.SADDR=t.SES_ADDR
AND t.XIDUSN=r.usn
7、如果利用會話跟蹤或者是想檢視某個會話的跟蹤檔案,那麼查詢到OS上的程式或執行緒號是非常重要的,因為檔案的令名中,就包含這個資訊,以下的語句可以查詢到程式或執行緒號,由此就可以找到對應的檔案。
SELECT p1.value||''||p2.value||'_ora_'||p.spid filename
FROM
v$process p,
v$session s,
v$parameter p1,
v$parameter p2
WHERE p1.name = 'user_dump_dest'
AND p2.name = 'db_name'
AND p.addr = s.paddr
AND s.audsid = USERENV ('SESSIONID');
8、在ORACLE 9i中,可以監控索引的使用,如果沒有使用到的索引,完全可以刪除掉,減少DML操作時的操作。
以下就是開始索引監控與停止索引監控的指令碼
set heading off
set echo off
set feedback off
set pages 10000
spool start_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on
------------------------------------------------
set heading off
set echo off
set feedback off
set pages 10000
spool stop_index_monitor.sql
SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'
FROM dba_indexes
WHERE owner = USER;
spool off
set heading on
set echo on
set feedback on
如果需要監控更多的使用者,可以將owner=User改寫成別的
監控結果在檢視v$object_usage中查詢
感謝fenng,他提供了一個更新版的show_space指令碼
CREATE OR REPLACE PROCEDURE show_space
( p_segname IN VARCHAR2,
p_owner IN VARCHAR2 DEFAULT USER,
p_type IN VARCHAR2 DEFAULT 'TABLE',
p_partition IN VARCHAR2 DEFAULT NULL )
-- This procedure uses AUTHID CURRENT USER so it can query DBA_*
-- views using privileges from a ROLE and so it can be installed
-- once per database, instead of once per user who wanted to use it.
AUTHID CURRENT_USER
as
l_free_blks number;
l_total_blocks number;
l_total_bytes number;
l_unused_blocks number;
l_unused_bytes number;
l_LastUsedExtFileId number;
l_LastUsedExtBlockId number;
l_LAST_USED_BLOCK number;
l_segment_space_mgmt varchar2(255);
l_unformatted_blocks number;
l_unformatted_bytes number;
l_fs1_blocks number; l_fs1_bytes number;
l_fs2_blocks number; l_fs2_bytes number;
l_fs3_blocks number; l_fs3_bytes number;
l_fs4_blocks number; l_fs4_bytes number;
l_full_blocks number; l_full_bytes number;
-- Inline procedure to print out numbers nicely formatted
-- with a simple label.
PROCEDURE p( p_label in varchar2, p_num in number )
IS
BEGIN
dbms_output.put_line( rpad(p_label,40,'.') ||
to_char(p_num,'999,999,999,999') );
END;
BEGIN
-- This query is executed dynamically in order to allow this procedure
-- to be created by a user who has access to DBA_SEGMENTS/TABLESPACES
-- via a role as is customary.
-- NOTE: at runtime, the invoker MUST have access to these two
-- views!
-- This query determines if the object is an ASSM object or not.
BEGIN
EXECUTE IMMEDIATE
'select ts.segment_space_management
FROM dba_segments seg, dba_tablespaces ts
WHERE seg.segment_name = :p_segname
AND (:p_partition is null or
seg.partition_name = :p_partition)
AND seg.owner = :p_owner
AND seg.tablespace_name = ts.tablespace_name'
INTO l_segment_space_mgmt
USING p_segname, p_partition, p_partition, p_owner;
EXCEPTION
WHEN too_many_rows THEN
dbms_output.put_line
( 'This must be a partitioned table, use p_partition => ');
RETURN;
END;
-- If the object is in an ASSM tablespace, we must use this API
-- call to get space information; else we use the FREE_BLOCKS
-- API for the user managed segments.
IF l_segment_space_mgmt = 'AUTO'
THEN
dbms_space.space_usage
( p_owner, p_segname, p_type, l_unformatted_blocks,
l_unformatted_bytes, l_fs1_blocks, l_fs1_bytes,
l_fs2_blocks, l_fs2_bytes, l_fs3_blocks, l_fs3_bytes,
l_fs4_blocks, l_fs4_bytes, l_full_blocks, l_full_bytes, p_partition);
p( 'Unformatted Blocks ', l_unformatted_blocks );
p( 'FS1 Blocks (0-25) ', l_fs1_blocks );
p( 'FS2 Blocks (25-50) ', l_fs2_blocks );
p( 'FS3 Blocks (50-75) ', l_fs3_blocks );
p( 'FS4 Blocks (75-100)', l_fs4_blocks );
p( 'Full Blocks ', l_full_blocks );
ELSE
dbms_space.free_blocks(
segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
freelist_group_id => 0,
free_blks => l_free_blks);
p( 'Free Blocks', l_free_blks );
END IF;
-- And then the unused space API call to get the rest of the
-- information.
dbms_space.unused_space
( segment_owner => p_owner,
segment_name => p_segname,
segment_type => p_type,
partition_name => p_partition,
total_blocks => l_total_blocks,
total_bytes => l_total_bytes,
unused_blocks => l_unused_blocks,
unused_bytes => l_unused_bytes,
LAST_USED_EXTENT_FILE_ID => l_LastUsedExtFileId,
LAST_USED_EXTENT_BLOCK_ID => l_LastUsedExtBlockId,
LAST_USED_BLOCK => l_LAST_USED_BLOCK );
p( 'Total Blocks', l_total_blocks );
p( 'Total Bytes', l_total_bytes );
p( 'Total MBytes', trunc(l_total_bytes/1024/1024) );
p( 'Unused Blocks', l_unused_blocks );
p( 'Unused Bytes', l_unused_bytes );
p( 'Last Used Ext FileId', l_LastUsedExtFileId );
p( 'Last Used Ext BlockId', l_LastUsedExtBlockId );
p( 'Last Used Block', l_LAST_USED_BLOCK );
END;
隱含引數:
select a.ksppinm "parameter ", a.ksppdesc "descriptoin "
from x$ksppi a,x$ksppcv b,x$ksppsv c
where a.indx=b.indx and a.indx=c.indx and a.ksppinm like '/_%' escape '/';
Check OS process id from Oracle sid
select spid from v$process
where addr in ( select paddr from v$session where sid=[$sid) ]
Check Oracle sid from OS process id
select sid from v$session
where paddr in ( select addr from v$process where spid=[$pid) ]
Check current SQL in a session
select SQL_TEXT from V$SQLTEXT
where HASH_VALUE =
( select SQL_HASH_VALUE from v$session
where sid = &sid)
order by PIECE
Checking v$session_wait
select * from v$session_wait
where event not like 'rdbms%'
and event not like 'SQL*N%'
and event not like '%timer';
Dictionary Cache Hits
SELECT sum(getmisses)/sum(gets) FROM v$rowcache;
/*It should be < 15%, otherwise Add share_pool_size*/
Check DB object name from file id and block#
select owner,segment_name,segment_type
from dba_extents
where file_id = [$fno and &dno between block_id and block_id + blocks – 1 ]
#尋找hot block
select /*+ ordered */
e.owner ||'.'|| e.segment_name segment_name,
e.extent_id extent#,
x.dbablk - e.block_id + 1 block#,
x.tch,
l.child#
from
sys.v$latch_children l,
sys.x$bh x,
sys.dba_extents e
where
l.name = 'cache buffers chains' and
l.sleeps > &sleep_count and
x.hladdr = l.addr and
e.file_id = x.file# and
x.dbablk between e.block_id and e.block_id + e.blocks - 1;
#找出每個檔案上的等待事件
select df.name,kf.count from v$datafile df,x$kcbfwait kf where (kf.indx+1)=df.file#;
#找出引起等待事件的SQL語句.
select sql_text from v$sqlarea a,v$session b,v$session_wait c where a.address=b.sql_address and b.sid=c.sid and c.event=[$ll]
#監控共享池中哪個物件引起了大的記憶體分配
SELECT * FROM X$KSMLRU WHERE ksmlrsiz > 0;
判斷你是從pfile啟動還是spfile啟動的簡單方法!!!
判斷你是從pfile啟動還是spfile啟動的簡單方法!!!
select decode(count(*), 1, 'spfile', 'pfile' )
from v$spparameter
where rownum=1
and isspecified='TRUE'
/
DECODE
------
spfile
ORACLE常用技巧和指令碼
ORACLE常用技巧和指令碼
1.如何檢視ORACLE的隱含引數?
ORACLE的顯式引數,除了在INIT.ORA檔案中定義的外,在svrmgrl中用"show parameter
*",可以顯示。但ORACLE還有一些引數是以“_”,開頭的。如我們非常熟悉的“_offline_rollback_segments”等。
這些引數可在sys.x$ksppi表中查出。
語句:“select ksppinm from x$ksppi where substr(ksppinm,1,1)='_'; ”
2.如何檢視安裝了哪些ORACLE元件?
進入${ORACLE_HOME}/orainst/,執行./inspdver,顯示安裝元件和版本號。
3.如何檢視ORACLE所佔用共享記憶體的大小?
可用UNIX命令“ipcs”檢視共享記憶體的起始地址、訊號量、訊息佇列。
在svrmgrl下,用“oradebug ipc”,可看出ORACLE佔用共享記憶體的分段和大小。
example:
SVRMGR> oradebug ipc
-------------- Shared memory --------------
Seg Id Address Size
1153 7fe000 784
1154 800000 419430400
1155 19800000 67108864
4.如何檢視當前SQL*PLUS使用者的sid和serial#?
在SQL*PLUS下,執行:
“select sid, serial#, status from v$session
where audsid=userenv('sessionid');”
5.如何檢視當前資料庫的字符集?
在SQL*PLUS下,執行:
“select userenv('language') from dual;”
或:“select userenv('lang') from dual; ”
6.如何檢視資料庫中某使用者,正在執行什麼SQL語句?
根據MACHINE、USERNAME或SID、SERIAL#,連線表V$SESSION和V$SQLTEXT,可查出。
SQL*PLUS語句:
“SELECT SQL_TEXT FROM V$SQL_TEXT T, V$SESSION S WHERE T.ADDRESS=S.SQL_ADDRESS
AND T.HASH_VALUE=S.SQL_HASH_VALUE
AND S.MACHINE='XXXXX' OR USERNAME='XXXXX' -- 檢視某主機名,或使用者名稱
/”
7.如何刪除表中的重複記錄?
例句:
DELETE
FROM table_name a
WHERE rowid > ( SELECT min(rowid)
FROM table_name b
WHERE b.pk_column_1 = a.pk_column_1
and b.pk_column_2 = a.pk_column_2 );
8.手工臨時強制改變伺服器字符集
以sys或system登入系統,sql*plus執行:“create database character set us7ascii;".
有以下錯誤提示:
* create database character set US7ASCII
ERROR at line 1:
ORA-01031: insufficient privileges
實際上,看v$nls_parameters,字符集已更改成功。但重啟資料庫後,資料庫字符集又變回原來的了。
該命令可用於臨時的不同字符集伺服器之間資料倒換之用。
9.怎樣查詢每個instance分配的PCM鎖的數目
用以下命令:
select count(*) "Number of hashed PCM locks" from v$lock_element where bitand(flags,4)<>0
/
select count(*) "Number of fine grain PCM locks" from v$lock_element
where bitand(flags,4)=0
/
10. 怎麼判斷當前正在使用何種SQL最佳化方式?
用explain plan產生EXPLAIN PLAN,檢查PLAN_TABLE中ID=0的POSITION列的值。
e.g.
select decode(nvl(position,-1),-1,'RBO',1,'CBO') from plan_table where id=0
/
11. 做EXPORT時,能否將DUMP檔案分成多個?
ORACLE8I中EXP增加了一個引數FILESIZE,可將一個檔案分成多個:
EXP SCOTT/TIGER FILE=(ORDER_1.DMP,ORDER_2.DMP,ORDER_3.DMP) FILESIZE=1G TABLES=ORDER;
其他版本的ORACLE在UNIX下可利用管道和split分割:
mknod pipe p
split -b 2048m pipe order & #將檔案分割成,每個2GB大小的,以order為字首的檔案:
#orderaa,orderab,orderac,... 並將該程式放在後臺。
EXP SCOTT/TIGER FILE=pipe tables=order
戶如何有效地利用資料字典
使用者如何有效地利用資料字典
ORACLE的資料字典是資料庫的重要組成部分之一,它隨著資料庫的產生而產生, 隨著資料庫的變化而變化,
體現為sys使用者下的一些表和檢視。資料字典名稱是大寫的英文字元。
資料字典裡存有使用者資訊、使用者的許可權資訊、所有資料物件資訊、表的約束條件、統計分析資料庫的檢視等。
我們不能手工修改資料字典裡的資訊。
很多時候,一般的ORACLE使用者不知道如何有效地利用它。
dictionary 全部資料字典表的名稱和解釋,它有一個同義詞dict
dict_column 全部資料字典表裡欄位名稱和解釋
如果我們想查詢跟索引有關的資料字典時,可以用下面這條SQL語句:
SQL>select * from dictionary where instr(comments,'index')>0;
如果我們想知道user_indexes表各欄位名稱的詳細含義,可以用下面這條SQL語句:
SQL>select column_name,comments from dict_columns where table_name='USER_INDEXES';
依此類推,就可以輕鬆知道資料字典的詳細名稱和解釋,不用檢視ORACLE的其它文件資料了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/18921899/viewspace-1017058/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- dba巡檢指令碼指令碼
- DBA救火排殺指令碼指令碼
- 史上最全近百條Oracle DBA日常維護SQL指令碼指令OracleSQL指令碼
- DBA日常維護SQL指令碼_自己編寫的SQL指令碼
- 2. 指令碼、模組、包指令碼
- wrk(2)- Lua 指令碼的使用指令碼
- 主題 2 Shell工具和指令碼指令碼
- 2.awd初階_指令碼掃描指令碼
- [20230414]完善seg2.sql指令碼.txtSQL指令碼
- shell指令碼中/dev/null 2>&1詳解指令碼devNull
- Sqlserver查詢alwayson同步情況指令碼(2)SQLServer指令碼
- Yii2 init 初始化指令碼分析指令碼
- [20190416]完善shared latch測試指令碼2.txt指令碼
- DB2的一些管理用指令碼DB2指令碼
- [20230302]建立完善tpt o2.sql指令碼.txtSQL指令碼
- 理解 shell 指令碼中的常見用法: 2>&1指令碼
- PostgreSQL DBA(2) - 資料庫引數設定#2SQL資料庫
- PostgreSQL DBA(22) - MVCC#2(commit log)SQLMVCC#MIT
- 開始你的第一個JMeter指令碼:利用Jmeter錄製指令碼的2種方法彙總JMeter指令碼
- Vue2 指令Vue
- db2 如何模擬indobt transactions 用到的指令碼DB2指令碼
- [20231101]使用tpt seg2.sql指令碼問題.txtSQL指令碼
- [20220519]完善tpt dash_wait_chains2.sql指令碼.txtAISQL指令碼
- PostgreSQL DBA(5) - PG 11 New Features#2SQL
- Oracle vs PostgreSQL DBA(22)- Oracle VPD#2OracleSQL
- PostgreSQL DBA(144) - pgAdmin(AUTOVACUUM:引數解析#2)SQL
- iOS逆向 Shell指令碼+指令碼重簽名iOS指令碼
- 常用指令碼學習手冊——Bat指令碼指令碼BAT
- Bash指令碼指令碼
- powershell指令碼指令碼
- jpsall指令碼指令碼
- perl指令碼指令碼
- shell指令碼指令碼
- MySQL指令碼MySql指令碼
- java 指令碼Java指令碼
- JMeter指令碼JMeter指令碼
- IDE 執行指令碼後報一長串 “CreateFile () Error: 2”IDE指令碼Error
- [20220422]完善tpt ash ash_index_helperx指令碼2.txtIndex指令碼
- hadoop_批量命令指令碼&同步檔案指令碼Hadoop指令碼