常用語句:
sql/plus
sqlplus 'amdocs/Amdocs.Jx.China.110#@ysdb1'
tnsping BSNYSDB12
并行遷移
insert /*+append nologging parallel(8)*/ into
導(dǎo)表
exp ls65_sid/aaaa@ysdb2 tables=ls65_sid.task_plan_detail_t file=/jftgfs01/ibasbill/v70data/task_plan_detail_t.dmp
建同義詞 CREATE? SYNONYM ls6_bill.ACCT_BILL_SEQ FOR ACCT_BILL_SEQ;
show parameter process
dense_rank的用法
select INVOICE_CODE,
? ? ? ? ? ? ? ? INVOICE_CUR_NBR,
? ? ? ? ? ? ? ? INVOICE_END_NBR,
? ? ? ? ? ? ? ? dense_rank() over(ORDER BY INVOICE_SEQ, INVOICE_CODE, INVOICE_END_NBR) rank
? ? ? ? ? FROM INVOICE_STAFF_t
? ? ? ? ? WHERE REGION_ID = :v1
? ? ? ? ? ? AND STAFF_ID = :v2
? ? ? ? ? ? AND STATE in ('USE', 'REC');
建dblink
create? [PUBLIC] database link cashdb
? connect to abm identified by "abm"
? using '(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 134.224.22.75)(PORT = 1521))
(CONNECT_DATA =
? (SERVER = DEDICATED)
? (SERVICE_NAME = cashdb)
? )
)';
select * from v$session;
select * from v$process;
select * from v$sqltext_with_newlines
select replace(syntax,'$MON$','200803') from longshine_object_syntax where? object_name
like 'BILL_INVOICE_DETAIL_$MON$_T' and owner='LS6_BILL' order by object_name ,object_seq,object_type ;
create or replace public synonym BILL_ITEM_TIER_T
? for LS6_PARA.BILL_ITEM_TIER_T;
tmadmin
./nmon
psc
類型轉(zhuǎn)換select? ? Cast(branch_id? as? varchar(40))
時間格式 TO_DATE('2006-05-01 19', 'YYYY-MM-DD HH24')
開放語句并行執(zhí)行的能力,會話級設(shè)置sql的跟蹤。? 一般還需要設(shè)置timed_statistics 。 對dump的跟蹤文件上sql性能跟蹤? alter session enable parallel dml
更改分區(qū) alter table payment_plan_t enable row movement
刷共享池 alter system flush shared_pool
DECODE(value,if1,then1,if2,then2,if3,then3,...,else),
字段允許為空
ALTER TABLE amdocs.abm_check_log MODIFY(? O_PAYMENT_STATE? ? NULL);
alter table amdocs.abm_check_log rename
強(qiáng)制索引
/*+INDEX(SEG IDX_T_RES_ALLOSEG_ALLOID)*/
1、/*+INDEX(SEG IDX_T_RES_ALLOSEG_ALLOID)*/ 這里的/*...*/中間不要有空格
2、表名要用別名,即:以上面的sql語句為例,要使用SEG,而不是T_RES_ALLOSEG
數(shù)據(jù)庫表分析
--分析分區(qū)表
SELECT 'exec dbms_stats.gather_table_stats(ownname => ''' || TABLE_OWNER ||
? ? ? ''',tabname => ''' || TABLE_NAME || ''',partname => ''' ||
? ? ? A.PARTITION_NAME ||
? ? ? ''',granularity => ''PARTITION'',cascade => TRUE,degree => 4);'
? FROM DBA_TAB_PARTITIONS A
WHERE A.TABLE_OWNER? LIKE UPPER('ls6_sid%')
? AND TABLE_NAME IN upper('pricing_section_t')
? AND a.partition_name LIKE 'PART_5%'
;
--非分析分區(qū)表
SELECT 'exec dbms_stats.gather_table_stats(ownname => ''' || OWNER ||
? ? ? ''',tabname => ''' || TABLE_NAME ||''', cascade => TRUE,degree => 4);'
? FROM dba_tables A
WHERE A.OWNER? LIKE? UPPER('ls6_%')
? AND table_name=UPPER('SINGLE_PRICING_SECTION_T');
查看表是否有分析到
select NUM_ROWS,BLOCKS,AVG_SPACE,AVG_ROW_LEN from all_all_tables where owner='LS6_BILL_NC'
AND table_name='EXT_DATA_200805_T';
SELECT 'EXEC DBMS_STATS.GATHER_TABLE_STATS('||chr(39)||OWNER||chr(39)||','||chr(39)||TABLE_NAME||chr(39)||',granularity =>'||chr(39)||'all'||chr(39)||', cascade => true,Block_Sample=>true, Method_Opt=>'||chr(39)||'FOR ALL INDEXED COLUMNS SIZE 1'||chr(39)||');' as syntax FROM ALL_TABLES
WHERE OWNER IN ('LS65_BILL_JA') and? TABLE_NAME IN ('EXT_DATA_200908_T')
ORDER BY OWNER,TABLE_NAME;
60、刪除重復(fù)列的方法
(1) DELETE FROM table_name A WHERE ROWID > (
? ? SELECT min(rowid) FROM table_name B
? ? WHERE A.key_values = B.key_values);
(2) create table table2 as select distinct * from table1;
? ? drop table1;
? ? rename table2 to table1;
(3) Delete from mytable where rowid not in(
? ? ? select max(rowid) from mytable
? ? ? group by column_name );
(4) delete from mytable t1
? ? ? where? exists (select 'x' from my_table t2
? ? ? ? ? ? ? ? ? where t2.key_value1 = t1.key_value1
? ? ? ? ? ? ? ? ? ? and t2.key_value2 = t1.key_value2
? ? ? ? ? ? ? ? ? ? ...
? ? ? ? ? ? ? ? ? ? and t2.rowid > t1.rowid);
-----------循環(huán)操作
declare
? i NUMBER;
BEGIN
? ? for i in 1010..1020 loop
insert into SYSTEM_PARAMETERS_T (REGION_ID, PARA_CLASS, PARA_TYPE, PARA_NAME, PARA_FLAG, PARA_VALUE, REMARK, PARA_LEVEL)
values (i, 'ACCT_DISCT', 'GROUP_REPAT_FALG', '用戶群捆綁優(yōu)惠結(jié)果是否分?jǐn)偟饺捍硖柎a', 'SERV_GROUP_FLAG', '1', '用戶群攤分時攤分號碼獲取方式:1.serv_group_t代表號 0.隨機(jī)', 1);
commit;
? ? end loop;
? ? commit;
end;
回閃表
CREATE TABLE amdocs.llj_bill_sys_1
AS SELECT * FROM ls6_para.bill_system_parameters_t AS OF TIMESTAMP TO_TIMESTAMP('2008-05-06 08:10:00', 'YYYY-MM-DD HH24:MI:SS') ;
--碎片整理? MOVE并且重建索引
select 'ALTER TABLE ' || a.owner || '.' || a.segment_name ||
? ? ? ' MOVE PARTITION? ' || a.partition_name || ' ;'
? from dba_segments a
where a.segment_name in
? ? ? ('OP_QUERY_ITEM_T', 'TASK_PLAN_DETAIL_T', 'ABM_SEQUENCE_T',
? ? ? ? 'CUST_PRICE_PLAN_T', 'ACCT_T', 'ACCT_POST_ADDRESS_T', 'SERV_T',
? ? ? ? 'BLOCK_T', 'PAYMENT_PLAN_T')
? and owner like 'LS65%';
select 'ALTER INDEX ' || a.owner || '.' || a.segment_name ||
? ? ? ' REBUILD? PARTITION ' || a.partition_name || ' TABLESPACE ' ||
? ? ? a.tablespace_name || ';'
? from dba_segments a
where a.segment_name in
? ? ? (select b.index_name
? ? ? ? ? from dba_indexes b
? ? ? ? where b.table_owner like 'LS65%'
? ? ? ? ? and b.table_name in
? ? ? ? ? ? ? ('OP_QUERY_ITEM_T', 'TASK_PLAN_DETAIL_T', 'ABM_SEQUENCE_T',
? ? ? ? ? ? ? ? 'CUST_PRICE_PLAN_T', 'ACCT_T', 'ACCT_POST_ADDRESS_T',
? ? ? ? ? ? ? ? 'SERV_T', 'BLOCK_T', 'PAYMENT_PLAN_T'))
? and owner like 'LS65%';
查看存儲過程使用了哪個表
select * from? sys.source$ a? where obj# in(
select o.obj# from sys.obj$ o, sys.source$ s, sys.user$ u
where o.obj# = s.obj#? and o.owner# = u.user#
and u.name like 'AMDOCS%'
? --and o.type# in (7, 8/*, 9, 11, 12, 13, 14*/)
? )
and upper(a.source) like '%JXJF%'
;
-----替換掉所有存儲過程和function里面的一些dblink 關(guān)鍵字 如下方法需要用oracle dba用戶執(zhí)行
--1)首先備份那些需要重建的存儲過程和function
/*drop table amdocs.cwf_p_f ;*/
create table amdocs.cwf_p_f as
select distinct u.name user_name, o.name object_name ,decode(o.type#, 7, 'PROCEDURE', 8, 'FUNCTION', 9, 'PACKAGE',
? ? ? ? ? ? ? 11, 'PACKAGE BODY', 12, 'TRIGGER', 13, 'TYPE', 14, 'TYPE BODY',
? ? ? ? ? ? ? 'UNDEFINED') type_name
from sys.obj$ o, sys.source$ s, sys.user$ u
where o.obj# = s.obj#? and o.owner# = u.user#
and u.name like 'LS65%' AND (s.source LIKE '%@jxjf%' OR s.source LIKE '%@JXJF%'
or s.source LIKE '%@jxys%' OR s.source LIKE '%@JXYS%'
or s.source LIKE '%@jfdb%' OR s.source LIKE '%@JFDB%'
or s.source LIKE '%@ysdb%' OR s.source LIKE '%@YSDB%')
? and o.type# in (7, 8/*, 9, 11, 12, 13, 14*/) ;
蔡文峰(蔡文峰) 10:13:48
更新的范例 :
update sys.source$ a set source=replace(source,'@ysdb',' ') where obj# in(
select o.obj# from sys.obj$ o, sys.source$ s, sys.user$ u
where o.obj# = s.obj#? and o.owner# = u.user#
and u.name like 'LSPRE%' AND (s.source LIKE '%@ysdb%')
? and o.type# in (7, 8/*, 9, 11, 12, 13, 14*/))
? and (a.source LIKE '%@ysdb%');
SELECT org_id
? ? ? ? ? ? FROM ibas_sid_para.ORGANIZATION_T@to_abmdb3
? ? ? ? ? CONNECT BY PRIOR ORG_ID = PARENT_ORG_ID
? ? ? ? ? START WITH ORG_ID = 2109004000
latch free檢查 步驟如下:
1.找到等待latch free的session的session id(sid)
select sid,event,p1,p1raw from v$session_wait;
2.根據(jù)該session id,查看該session正在執(zhí)行的語句,sql為:
SELECT SQL_TEXT
FROM? V$SQL SQL, V$SESSION S
WHERE SQL.HASH_VALUE = S.SQL_HASH_VALUE
AND? ? SQL.ADDRESS = S.SQL_ADDRESS
AND? ? S.SID = &sid ;
3.再根據(jù)該session id,查看該session的等待狀況.
在會話級,查詢視圖V$SESSION_WAIT時如果有該事件存在,那么該視圖中的
P1-表示Latch地址,也就是進(jìn)程正在等待的latch地址。
P2-表示Latch編號,對應(yīng)于視圖V$LATCHNAME中的latch#。
P3-表示為了獲得該latch而嘗試的次數(shù)。
sql為:
SELECT SID, EVENT, P1TEXT, P1RAW, P2TEXT, P2, SECONDS_IN_WAIT
FROM V$SESSION_WAIT
WHERE SID = &sid ;
4.如果event為latch free,則根據(jù)P2的值,查詢具體的latch free類型,sql為:
SELECT LATCH#, NAME
FROM V$LATCH
WHERE LATCH# = :P2 ;
5.查看系統(tǒng)當(dāng)前最多的LATCH FREE是哪種
SELECT latch#, name, gets, misses, sleeps
FROM? v$latch
WHERE sleeps>0
ORDER BY sleeps;
6.如果較多的LATCH FREE種類,和4中查詢的符合,則根據(jù)P2,查詢這個LATCH存在的子LATCH及其對應(yīng)的類型
SELECT addr, latch#, gets, misses, sleeps
FROM? v$latch_children
WHERE sleeps>0? ? ? ?
AND? ? latch# = 98
ORDER BY sleeps desc ;
7.接著查詢sleep較多的子LATCH都對應(yīng)有哪些對象
select distinct a.owner,a.segment_name,a.segment_type
from? dba_extents a,
? ? ? ? ( select dbarfil,dbablk
? ? ? ? ? from? x$bh
? ? ? ? ? where hladdr in ( select addr
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? from? ( select addr
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? from? v$latch_children
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? order by sleeps desc
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? where rownum < 5
? ? ? ? ? ? ? ? ? ? ? ? ? ? )
? ? ? ? ) b
where a.RELATIVE_FNO = b.dbarfil
and? a.BLOCK_ID <= b.dbablk
and? a.block_id + a.blocks > b.dbablk ;
8.找到對應(yīng)的對象后,檢查運(yùn)行的SQL本身,是否產(chǎn)生錯誤的執(zhí)行計(jì)劃,或者表/索引的分析資料有誤,特別注意表或索引的
并發(fā)度不能開太高,尤其是對OLTP系統(tǒng),否則容易引起大量的(SESSION ALLOCATION/PROCESS ALLOCATION)的
LATCH FREE等待.
9.附:查看v$latchholder和v$lock視圖,看是否有其他對象影響該進(jìn)程.
SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, CTIME, BLOCK
FROM V$LOCK
WHERE SID > 8 ;
SELECT *
FROM? V$LATCHHOLDER ;
select A.segment_name,A.owner,SUM(A.BYTES)/1024/1024 from dba_segments a where A.tablespace_name='LS65_BILL_CASH_DATA_200910_04'
GROUP BY segment_name,A.owner ORDER BY SUM(A.BYTES)/1024/1024 DESC;
----------剩余空間
select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space
where tablespace_name='ITC_BSS'
group by tablespace_name;
select tablespace_name,round(sum(bytes)/1024/1024,2) "M" from dba_free_space
where tablespace_name='BACKUP_DATA'
group by tablespace_name;
LS65_BILL_CASH_DATA_200910_04
看表空間比率
select df.tablespace_name "表空間名",totalspace "總空間M",freespace "剩余空間M",round((1-freespace/totalspace)*100,2) "使用率%"
from
(select tablespace_name,round(sum(bytes)/1024/1024) totalspace
from dba_data_files
group by tablespace_name) df,
(select tablespace_name,round(sum(bytes)/1024/1024) freespace
from dba_free_space
group by tablespace_name) fs
where df.tablespace_name=fs.tablespace_name;
查看可加的表空間,linux下敲
df -g
看索引是否失效
select * from all_indexes where TABLE_OWNER='LS65_ACCT' AND
index_name='I1_RB_FIX_LOCAL_T' ;
select * from all_tables a where a.table_name like '%LLJ%';
select * from? all_objects? a where a.object_name like 'LLJ%';
? ? Select segment_type,owner,Segment_Name,Sum(bytes)/1024/1024 From dba_Extents
where tablespace_name like '%OPER_DATA%' and owner='OPER_GZ'
Group By segment_type, owner,Segment_Name? order by sum(bytes) desc ;
select ds.bytes/1024/1024 "M",ds.*
from dba_segments ds
where ds.tablespace_name = 'LS6_BILL_DATA' and (owner='OPER_FZ' OR owner='OPER_GZ')
AND segment_name like '%ACCT_%'
AND ds.segment_type='TABLE'
and ds.bytes/1024/1024>100
order by ds.bytes/1024/1024 desc,ds.segment_name;
--4.5左右空間
truncate table OPER_FZ.DM_ACCT_ITEM;
truncate table OPER_GZ.DM_ACCT_FUND;
--移動表要另一個表空間? 非分區(qū)表 要重新建立索引
alter table OPER_FZ.DM_DAT_RENT_ALL enable row movement;
alter table OPER_FZ.DM_DAT_RENT_ALL move tablespace LS6_OPER_DATA;
alter table OPER_FZ.DM_DAT_RENT_ALL disable row movement;
--分區(qū)表移動方式
select 'alter table '|| owner ||'.'||segment_name || ' move partition? ' ||partition_name || ' tablespace? bss_double_data;'? from dba_segments where owner='LS6_SID' and segment_name='JX_ACCT_T'
加表空間
select * from dba_data_files where tablespace_name like '%LS6_BILL_DATA_04%';
alter tablespace LS6_BILL_DATA_04 add datafile '/jftgora01/LS6_BILL_DATA_04_4g_04.dbf' SIZE 4094M AUTOEXTEND OFF;
--表空間包含的對象
SELECT * FROM dba_segments
? WHERE segment_name = 'ACCT_RECEIPT_DETAIL_T'and owner='LS6_BILL_NC';
SELECT TABLESPACE_NAME,STATUS,TRUNC(SUM(BLOCKS) * 8 / 1024) ,
COUNT(*)
FROM DBA_UNDO_EXTENTS@to_abmdb
GROUP BY TABLESPACE_NAME, STATUS;
select BEGIN_TIME,END_TIME,MAXQUERYLEN,MAXQUERYSQLID,TUNED_UNDORETENTION from DBA_HIST_UNDOSTAT@to_abmdb order by begin_time desc;
回閃被drop的數(shù)據(jù)
select * from user_recyclebin
FLASHBACK TABLE "BIN$04LhcpnoanfgMAAAAAANPw==$0" TO BEFORE DROP RENAME TO TEST2;
查看鎖表
select c.sid,c.serial#,c.machine,c.program,c.osuser,c.username,b.object_name
from v$locked_object a,all_objects b,v$session c
where a.object_id=b.object_id and a.session_id=c.sid
and c.program like 'TUX%';
? SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
? ? ? id1,? ? id2, lmode, request, type
? FROM V$LOCK
? WHERE (id1, id2, type) IN
? (SELECT id1, id2, type FROM V$LOCK WHERE request>0)
? ? ORDER BY id1,? ? ? request;
select * from v$session_wait ;
select * from? v$session_longops;
select object_name,machine,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;
-----殺進(jìn)程
select * from v$locked_object where object_id=1129274;
select * from v$session where sid=308;
alter system kill session '367,8664' immediate;
select 'alter system kill session ''' || sid || ',' || serial# ||
? ? ? '''immediate;'
? from v$session
where sid in
? ? ? (select session_id
? ? ? ? ? from v$locked_object
? ? ? ? where object_id in
? ? ? ? ? ? ? (select object_id
? ? ? ? ? ? ? ? ? from all_objects
? ? ? ? ? ? ? ? where object_name = 'BILL_QUERY_ITEM_200705_T'))? ? ? ? ? ? ? ?
alter system kill session '308,16829'immediate;
--使用視圖查找:
select * from longshine_table_type_t where table_name=upper('dm_merg_oldfee_price_relation');
--根據(jù)DB_TYPE找具體的連庫方法
select * from ls6_para.database_info_t where db_type=601 and region_id =1016;
--視圖的代用:
select * from longshine_tables where table_name=upper('dm_code_transfer_t');
select * from longshine_tablespace where table_type=upper('dm_code_transfer_t');
select * from longshine_region_group where use_type='SID';
--根據(jù)DB_TYPE找具體的連庫方法
select * from ls6_para_sid.database_info_t where db_type=601 and region_id =1016;
對象查詢
1、用戶
? ? ? ? ? ? ? ? ? ? ? ? 查看當(dāng)前用戶的缺省表空間
? ? ? ? ? ? ? ? ? ? ? ? SQL>select username,default_tablespace from user_users;
? ? ? ? ? ? ? ? ? ? 查看當(dāng)前用戶的角色
? ? ? ? ? ? ? ? ? ? SQL>select * from user_role_privs;
? ? ? ? ? ? ? ? ? ? 查看當(dāng)前用戶的系統(tǒng)權(quán)限和表級權(quán)限
? ? ? ? ? ? ? ? ? ? SQL>select * from user_sys_privs;
? ? ? ? ? ? ? ? ? ? SQL>select * from user_tab_privs;
? ? ? ? ? ? ? ? 2、表
? ? ? ? ? ? ? ? ? ? ? ? 查看用戶下所有的表
? ? ? ? ? ? ? ? ? ? ? ? SQL>select * from user_tables;
? ? ? ? ? ? ? ? ? ? ? ? 查看名稱包含log字符的表
? ? ? ? ? ? ? ? ? ? ? ? SQL>select object_name,object_id from user_objects
? ? ? ? ? ? ? ? ? ? ? ? ? ? where instr(object_name,'LOG')>0;
? ? ? ? ? ? ? ? ? ? ? ? 查看某表的創(chuàng)建時間
? ? ? ? ? ? ? ? ? ? ? ? SQL>select object_name,created from user_objects where
? ? ? ? ? ? object_name=upper('&table_name');
? ? ? ? ? ? ? ? ? ? ? ? 查看某表的大小
? ? ? ? ? ? ? ? ? ? ? ? SQL>select sum(bytes)/(1024*1024) as size(M) from
? ? ? ? ? ? user_segments
? ? ? ? ? ? ? ? ? ? ? ? ? ? where segment_name=upper('&table_name');
? ? ? ? ? ? ? ? ? ? ? ? 查看放在ORACLE的內(nèi)存區(qū)里的表
? ? ? ? ? ? ? ? ? ? ? ? SQL>select table_name,cache from user_tables where
? ? ? ? ? ? instr(cache,'Y')>0;
? ? ? ? ? ? ? ? 3、索引
? ? ? ? ? ? ? ? ? ? ? ? 查看索引個數(shù)和類別
? ? ? ? ? ? ? ? ? ? ? ? SQL>select index_name,index_type,table_name from
? ? ? ? ? ? user_indexes order by table_name;
? ? ? ? ? ? ? ? ? ? ? ? 查看索引被索引的字段
? ? ? ? ? ? ? ? ? ? ? ? SQL>select * from user_ind_columns where
? ? ? ? ? ? index_name=upper('&index_name');
? ? ? ? ? ? ? ? ? ? ? ? 查看索引的大小
? ? ? ? ? ? ? ? ? ? ? ? SQL>select sum(bytes)/(1024*1024) as size(M) from
? ? ? ? ? ? user_segments
? ? ? ? ? ? ? ? ? ? ? ? ? ? where segment_name=upper('&index_name');
? ? ? ? ? ? ? ? 4、序列號
? ? ? ? ? ? ? ? ? ? ? ? 查看序列號,last_number是當(dāng)前值
? ? ? ? ? ? ? ? ? ? ? ? SQL>select * from user_sequences;
? ? ? ? ? ? ? ? 5、視圖
? ? ? ? ? ? ? ? ? ? ? ? 查看視圖的名稱
? ? ? ? ? ? ? ? ? ? ? ? SQL>select view_name from user_views;
? ? ? ? ? ? ? ? ? ? ? ? 查看創(chuàng)建視圖的select語句
? ? ? ? ? ? ? ? ? ? ? ? SQL>set view_name,text_length from user_views;
? ? ? ? ? ? ? ? ? ? ? ? SQL>set long 2000;? ? ? ? ? ? ? ?
? ? ? ? ? ? 說明:可以根據(jù)視圖的text_length值設(shè)定set long 的大小
? ? ? ? ? ? ? ? ? ? ? ? SQL>select text from user_views where
? ? ? ? ? ? view_name=upper('&view_name');
? ? ? ? ? ? ? ? 6、同義詞
? ? ? ? ? ? ? ? ? ? ? ? 查看同義詞的名稱
? ? ? ? ? ? ? ? ? ? ? ? SQL>select * from user_synonyms;
? ? ? ? ? ? ? ? 7、約束條件
? ? ? ? ? ? ? ? ? ? ? ? 查看某表的約束條件
? ? ? ? ? ? ? ? ? ? ? ? SQL>select constraint_name,
? ? ? ? ? ? constraint_type,search_condition, r_constraint_name
? ? ? ? ? ? ? ? ? ? ? ? ? ? from user_constraints where table_name =
? ? ? ? ? ? upper('&table_name');
? ? ? ? ? ? ? ? ? ? SQL>select
c.constraint_name,c.constraint_type,cc.column_name
? ? ? ? ? ? ? ? ? ? ? ? from user_constraints c,user_cons_columns cc
? ? ? ? ? ? ? ? ? ? ? ? where c.owner = upper('&table_owner') and c.table_name =
? ? ? ? ? ? upper('&table_name')
? ? ? ? ? ? ? ? ? ? ? ? and c.owner = cc.owner and c.constraint_name =
? ? ? ? ? ? cc.constraint_name
? ? ? ? ? ? ? ? ? ? ? ? order by cc.position;
? ? ? ? ? ? ? ? 8、存儲函數(shù)和過程
? ? ? ? ? ? ? ? ? ? ? ? 查看函數(shù)和過程的狀態(tài)
? ? ? ? ? ? ? ? ? ? ? ? SQL>select object_name,status from user_objects where
? ? ? ? ? ? object_type='FUNCTION';
? ? ? ? ? ? ? ? ? ? ? ? SQL>select object_name,status from user_objects where
? ? ? ? ? ? object_type='PROCEDURE';
? ? ? ? ? ? ? ? ? ? ? ? 查看函數(shù)和過程的源代碼
? ? ? ? ? ? ? ? ? ? ? ? SQL>select text from all_source where owner=user and
? ? ? ? ? ? name=upper('&plsql_name');
? ? ? ? ? ? 三、查看數(shù)據(jù)庫的SQL
? ? ? ? ? ? 1、查看表空間的名稱及大小
? ? ? ? ? ? ? ? select t.tablespace_name, round(sum(bytes/(1024*1024)),0)
ts_size
? ? ? ? ? ? ? ? from dba_tablespaces t, dba_data_files d
? ? ? ? ? ? ? ? where t.tablespace_name = d.tablespace_name
? ? ? ? ? ? ? ? group by t.tablespace_name;
? ? ? ? ? ? 2、查看表空間物理文件的名稱及大小
? ? ? ? ? ? ? ? select tablespace_name, file_id, file_name,
? ? ? ? ? ? ? ? round(bytes/(1024*1024),0) total_space
? ? ? ? ? ? ? ? from dba_data_files
? ? ? ? ? ? ? ? order by tablespace_name;
? ? ? ? ? ? 3、查看回滾段名稱及大小
? ? ? ? ? ? ? ? select segment_name, tablespace_name, r.status,
? ? ? ? ? ? ? ? (initial_extent/1024) InitialExtent,(next_extent/1024)
? ? ? ? ? ? NextExtent,
? ? ? ? ? ? ? ? max_extents, v.curext CurExtent
? ? ? ? ? ? ? ? From dba_rollback_segs r, v$rollstat v
? ? ? ? ? ? ? ? Where r.segment_id = v.usn(+)
? ? ? ? ? ? ? ? order by segment_name ;
? ? ? ? ? ? 4、查看控制文件
? ? ? ? ? ? ? ? select name from v$controlfile;
? ? ? ? ? ? 5、查看日志文件
? ? ? ? ? ? ? ? select member from v$logfile;
? ? ? ? ? ? 6、查看表空間的使用情況
? ? ? ? ? ? ? ? select sum(bytes)/(1024*1024) as free_space,tablespace_name
? ? ? ? ? ? ? ? from dba_free_space
? ? ? ? ? ? ? ? group by tablespace_name;
? ? ? ? ? ? ? ? Select A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES
? ? ? ? ? ? FREE,
? ? ? ? ? ? ? ? (B.BYTES*100)/A.BYTES % USED,(C.BYTES*100)/A.BYTES % FREE
? ? ? ? ? ? ? ? FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
? ? ? ? ? ? ? ? Where A.TABLESPACE_NAME=B.TABLESPACE_NAME AND
? ? ? ? ? ? A.TABLESPACE_NAME=C.TABLESPACE_NAME;
? ? ? ? ? ? 7、查看數(shù)據(jù)庫庫對象
? ? ? ? ? ? ? ? select owner, object_type, status, count(*) count# from
? ? ? ? ? ? all_objects group by owner, object_type, status;
? ? ? ? ? ? 8、查看數(shù)據(jù)庫的版本
? ? ? ? ? ? ? ? Select version FROM Product_component_version
? ? ? ? ? ? ? ? Where SUBSTR(PRODUCT,1,6)='Oracle';
? ? ? ? ? ? 9、查看數(shù)據(jù)庫的創(chuàng)建日期和歸檔方式
? ? ? ? ? ? ? ? Select Created, Log_Mode, Log_Mode From V$Database;
? ? ? ? ? ? 四、ORACLE用戶連接的管理
? ? ? ? ? ? 用系統(tǒng)管理員,查看當(dāng)前數(shù)據(jù)庫有幾個用戶連接:
? ? ? ? ? ? SQL> select username,sid,serial# from v$session;
? ? ? ? ? ? 如果要停某個連接用
? ? ? ? ? ? SQL> alter system kill session 'sid,serial#';
? ? ? ? ? ? 如果這命令不行,找它UNIX的進(jìn)程數(shù)
? ? ? ? ? ? SQL> select pro.spid from v$session ses,v$process pro where
? ? ? ? ? ? ses.sid=21 and ses.paddr=pro.addr;
? ? ? ? ? ? 說明:21是某個連接的sid數(shù)
? ? ? ? ? ? 然后用 kill 命令殺此進(jìn)程號。
堵塞分析
營收tuxedo服務(wù)堵塞問題分析解決步驟:
查看是否存在分布式的鎖:
查看是否有分布式的鎖:
SELECT inst_id,DECODE(request,0,'Holder: ','Waiter: ')|| sid sess, id1, id2, lmode, request, type
? FROM gV$LOCK WHERE (id1, id2, type) IN
? ? ? ? ? (SELECT id1, id2, type FROM V$LOCK WHERE request>0)
? ORDER BY id1, request;
--這個語句可以看到是否有分布式的鎖。有Holder的即表示有鎖。
2. 查詢oracle客戶端的進(jìn)程號:? ? ? ? ? ? ? ? ?
? ? ? ? SELECT a.process,a.PROGRAM,a.MACHINE,a.COMMAND,a.sid,b.spid
? ? ? ? ? ? ? ? ? from v$session a, v$process b
? ? ? ? ? ? ? ? where a.paddr = b.addr
? ? ? ? ? ? ? ? ? and a.sid in ($sid$);
3. 根據(jù)進(jìn)程號查詢具體tuxedo的serverid
telnet到tuxedo應(yīng)用服務(wù)器上。
ps -ef|grep $pid$;
ibas7 3010760? ? ? 1? 1 23:33:40? ? ? -? 2:21 TUXPAY4 -C dom=ibas7_02 -g 11001 -i 10293 -u jxysap2 -U /ysapp/home/ibas7/bin/ULOG -m 0 -A -r -- -L30 -T0 -cLS65_BILL_NC/A143273934514E615@ysdb2 -s4 -h0 -a1 -b4 -S4 -B4
-i之后是serverid
4. 根據(jù)tuxedo服務(wù)的serverid查詢正在執(zhí)行的tuxedo交易名稱service_name:
echo psr|tmadmin 2>a.out |grep $serverid$ //查詢單個server正在執(zhí)行的交易名
echo psr|tmadmin 2>a.out |grep -v "IDLE" //查詢所有正在執(zhí)行的交易名
5. 根據(jù)進(jìn)程號查詢執(zhí)行的SQL:
select sql_text, executions, buffer_gets
? from v$sqlarea
where address in
? ? ? (SELECT a.sql_address
? ? ? ? ? ? from v$session a, v$process b
? ? ? ? ? where a.paddr = b.addr
? ? ? ? ? ? and b.spid in ($pid$));
6.core和異常自動重啟也會導(dǎo)致數(shù)據(jù)庫鎖
查詢是否存在core文件和core信息,cd bin; ls –al core;
dbx/gdb $SERVER_NAME$ core;
查詢tuxedo的主要服務(wù)有沒有重啟記錄:
grep died ULOG.101608; 查詢當(dāng)天的ULOG日志
7.根據(jù)4, 5, 6 查詢到的service_name再結(jié)合第五步(5)查詢到的執(zhí)行的SQL,結(jié)合程序分析應(yīng)用程序鎖表的原因
應(yīng)急措施:
殺掉orcal鎖,重啟進(jìn)程。
-------------------------------------------------------------------
服務(wù)堵塞(非鎖表狀態(tài),可能只是性能問題)查找方式
1、 登陸76 或者 78 執(zhí)行 sh /ysapp/home/ibas7/tuxedomon.sh
2、如果第二個列表中有服務(wù)顯示就代表這個服務(wù)正在排隊(duì),請求資源。
3、觀察排隊(duì)的服務(wù)在第一個列表中的狀態(tài),同一個ID多次顯示RqDone值不變,代表此服務(wù)正在執(zhí)行,如果時間比較久代表此服務(wù)性能可能有問題。取出此ID值進(jìn)行下面操作。
4、 ps -ef|grep 上面有問題的ID 顯示下面記錄,可能是多條,查找 -i后面的值等于有問題的ID 這樣就只有一條。取出下面第二列,系統(tǒng)進(jìn)程號。?
ibas7? 602358? ? ? 1? 0 09:25:32 pts/12? 0:01 TUXDYNQRY1 -C dom=ibas7_02 -g 20 -i 7003 -u jxysap2 -U /ysapp/home/ibas7/bin/ULOG -m 0 -A -r -- -L30 -T0 -cLS65_BILL/AF4C6A6B6D6A767C627B417@ysdb1 -s1 -h0 -a1 -b1 -S1 -B1
5、根據(jù)進(jìn)程號去數(shù)據(jù)庫查詢此進(jìn)程正在進(jìn)行什么操作。
SELECT * FROM V$SQL S WHERE S.HASH_VALUE IN(
SELECT SQL_HASH_VALUE FROM V$SESSION WHERE process in ('進(jìn)程號'));
強(qiáng)殺分布式鎖
蔡文峰(蔡文峰) 19:59:30
26、如何解決ORA-01591"一個事務(wù)提交的時候,全局事務(wù)還沒未提交"
? ? 錯誤案例(江西) :Sql Error = ORA-01591: lock held by in-doubt distributed transaction 1.25.11662
? ? a、查看有沒有異常的的分布式事務(wù)
? ? select * from dba_2pc_pending;
? ? b、如果有的話,首先需要執(zhí)行
? ? rollback force 'LOCAL_TRANS_ID'或 commit force 'LOCAL_TRANS_ID'
? ? c、如果執(zhí)行報(bào)錯,使用下列命令清除:
? ? ? alter session set "_smu_debug_mode"=4;
? ? ? execute dbms_transaction.purge_lost_db_entry('9.9.3883786');
19:57:11|185128|? ? ? 258|30|? ? -1|FormatOut.cpp? ? ? | 4887|數(shù)據(jù)庫操作錯誤(ORA-01591:
lock held by in-doubt distributed transaction 79.49.34742
? ? a、查看有沒有異常的的分布式事務(wù)
? ? select * from dba_2pc_pending;
? ? b、如果有的話,首先需要執(zhí)行
? ? rollback force '8.62.180149' 或 commit force 'LOCAL_TRANS_ID'
? ? c、如果執(zhí)行報(bào)錯,使用下列命令清除:
? ? ? alter session set "_smu_debug_mode"=4;
? ? ? execute d
蔡文峰(蔡文峰) 11:33:37
bms_transaction.purge_lost_db_entry('72.1.11480');
分析sql
孫曉輝(孫曉輝) 10:02:24
在四臺數(shù)據(jù)庫主機(jī)
進(jìn)入/home/ibas6/sxh目錄下。
蔡文峰(蔡文峰) 10:02:41
?
孫曉輝(孫曉輝) 10:02:51
./top10cpu.sh? CPU前10位的正在執(zhí)行的語句。
孫曉輝(孫曉輝) 10:03:11
./top10mem.sh? 內(nèi)存前10位正在執(zhí)行的語句
主要問題在于ysdb1無法自動切換到y(tǒng)sdb2.
原來是ysdb1的tns配置是先訪問72再訪問74
所以當(dāng)72主機(jī)存活而數(shù)據(jù)庫不在時,72會返回一個信息,這樣oracle就會去訪問74即達(dá)到切換到y(tǒng)sdb2的效果。
而當(dāng)72主機(jī)不存在時,72沒有返回信息,所以oracle就一直等待直至超時之后才去訪問74.
李立健(李立健) 10:40:56
所以后續(xù)建議:
當(dāng)停掉某一臺數(shù)據(jù)庫主機(jī)之后,調(diào)整相當(dāng)計(jì)費(fèi)或者營收主機(jī)的tns配置,只訪問完好的那臺數(shù)據(jù)庫
這樣可以避免切換過程中出現(xiàn)問題。
如果數(shù)據(jù)庫能正常切換,那么就不會存在問題
孫曉輝() 2009年09月07日 11:35:31
/ysapp/home/ibas7/Amdocs/Shai
孫曉輝() 2009年09月07日 11:35:34
78
孫曉輝() 2009年09月07日 11:35:43
sqlplus amdocs/Amdocs.JX.China@ysdb1
conn amdocs/Amdocs.JX.China@ysdb2
孫曉輝() 2009年09月07日 11:36:00
@spreport
sp_8214_8215_72_09_10_20090914
select distinct
? p.sql_id , OPERATION , EXECUTIONS ,
? OBJECT_OWNER,
? OBJECT_NAME , COST , DISK_READS , BUFFER_GETS , elapsed_time / 1000000 elapsed_time,sql_text
? from? v$sql_plan p, v$sqlarea s
? where OPTIONS = 'FULL'
? and p.sql_id = s.sql_id
? and s.elapsed_time > 1000000 -- one second
? and OBJECT_OWNER not like 'SYS%'
? and OBJECT_OWNER not like 'SYSTEM'
? and rownum < 1000
? order by elapsed_time desc
劉金華(劉金華) 09:34:10
? ? select username,sid,opname,
? ? round(sofar*100 / totalwork,0) || '%' as progress,
? ? time_remaining,sql_text
? ? from v$session_longops , v$sql
? ? where time_remaining <> 0
? ? and sql_address = address
? ? and sql_hash_value = hash_value?
劉金華(劉金華) 09:36:08
小李子:
? ? select username,sid,opname,
? ? round(sofar*100 / totalwork,0) || '%' as progress,
? ? time_remaining,sql_text
? ? from v$session_longops , v$sql
? ? where time_remaining <> 0
? ? and sql_address = address
? ? and sql_hash_value = hash_value?
張杭州(張杭州) 09:36:18
select /*+ ORDERED */ sql_text from v$sqltext
where hash_value in (
select sql_hash_value from v$session
where sid in (select a.sid
from v$session_wait a, v$session b
where a.sid=b.sid
and (a.state='-2' or a.state>='0')
and b.status='ACTIVE'))
劉金華(劉金華) 09:36:29
看哪些session進(jìn)行中.......
張杭州(張杭州) 09:37:37
用這個select a.sid,b.serial#,a.state,b.status,b.username,a.event
from v$session_wait a, v$session b
where a.sid=b.sid
and (a.state='-2' or a.state>='0')
and b.status='ACTIVE'
select xidusn,b.object_name, session_id, locked_mode from v$locked_object a,dba_objects b where a.object_id=b.object_id;
查看等待時間
select a.sid,b.serial#,a.state,b.status,b.username,a.SECONDS_IN_WAIT,a.wait_time
from v$session_wait a, v$session b
where a.sid=b.sid and a.wait_time>0 and b.status='ACTIVE'
SELECT DECODE(request,0,'Holder: ','Waiter: ')||sid sess,
? ? ? id1,? ? id2, lmode, request, type
? FROM V$LOCK
? WHERE (id1, id2, type) IN
? (SELECT id1, id2, type FROM V$LOCK WHERE request>0)
? ? ORDER BY id1,? ? ? request;
select * from v$session where sid=上一個語句查到的sess;--查到processid,到后臺應(yīng)用ps -ef|grep processid
--------銷賬時間
? ? select username,sid,opname,
? ? round(sofar*100 / totalwork,0) || '%' as progress,
? ? time_remaining,sql_text
? ? from v$session_longops , v$sql
? ? where time_remaining <> 0
? ? and sql_address = address
? ? and sql_hash_value = hash_value?
--列出使用頻率最高的5個查詢:
select sql_text,executions
from (select sql_text,executions,
? rank() over
? ? (order by executions desc) exec_rank
? from v$sql)
where exec_rank <=5;
--消耗磁盤讀取最多的sql top5:
select disk_reads,sql_text
from (select sql_text,disk_reads,
? dense_rank() over
? ? (order by disk_reads desc) disk_reads_rank
? from v$sql)
where disk_reads_rank <=5;
--找出需要大量緩沖讀取(邏輯讀)操作的查詢:
select buffer_gets,sql_text
from (select sql_text,buffer_gets,
? dense_rank() over
? ? (order by buffer_gets desc) buffer_gets_rank
? from v$sql)
where buffer_gets_rank<=5;
啟停數(shù)據(jù)庫
LINUX 操作系統(tǒng)重啟Oracle數(shù)據(jù)庫的方法步驟 收藏
在實(shí)際的應(yīng)用中,有時候工作數(shù)據(jù)庫需要重新啟動。本文介紹了一個特別實(shí)用的操作步驟,希望對大家有所幫助。
1. 停應(yīng)用層的各種程序
2. 停Oralce的監(jiān)聽進(jìn)程
$ lsnrctl stop
3. 在獨(dú)占的系統(tǒng)用戶下,備份控制文件:
$ sqlplus "/as sysdba"
SQL> alter database backup controlfile to trace;
4. 在獨(dú)占的系統(tǒng)用戶下,手工切換重作日志文件,確保當(dāng)前已修改過的數(shù)據(jù)存入文件:
SQL> alter system switch logfile;
5. 在獨(dú)占的系統(tǒng)用戶下,運(yùn)行下面SQL語句,生成殺數(shù)據(jù)庫用戶連接的kill_all_session.sql文件:
SQL> set head off;
SQL> set feedback off;
SQL> set newpage none;
SQL> spool ./kill_session.sql
SQL> select 'alter system kill session ''' sid ',' serial# ''';' from v$session where username is not null;
SQL> spool off;
6. 在獨(dú)占的系統(tǒng)用戶下,執(zhí)行殺數(shù)據(jù)庫用戶連接的kill_session.sql文件
SQL> @./kill_session.sql
7. 在獨(dú)占的系統(tǒng)用戶下,用immediate方式關(guān)閉數(shù)據(jù)庫:
SQL> shutdown immediate;
或者
SVRMGRL> shutdown immediate;
8. 啟動oralce的監(jiān)聽進(jìn)程
$ lsnrctl start
9. 進(jìn)入獨(dú)占的系統(tǒng)用戶下,啟動Oralce數(shù)據(jù)庫
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup;
或者
$ svrmgrl
SVRMGRL> connect internal;
SVRMGRL> startup;
10.啟動應(yīng)用層的各種程序
hint優(yōu)化
HINT在判斷SQL性能問題時,有時會啟一個快捷作用,是一個調(diào)優(yōu)SQL強(qiáng)大工具
1./*+ driving_site(table)? */ --將過濾的條件于遠(yuǎn)端完成再傳過來,如在A服務(wù)器上過濾再將結(jié)果傳到B服務(wù)器上,原則是哪個表數(shù)據(jù)小就將它與遠(yuǎn)端大表匹配再將結(jié)果返回;
2./*+ index(t idx_id) */--指定索引
3./*+ append */ --數(shù)據(jù)直接插入到高水位上面(與insert連用),外加并行/*+ append parallel(table,4) */
4./*+ index(view.t1 idx_name) */ --對視圖中的基表進(jìn)行指定走索引
5./*+ parallel(table,4) */eg. select /*+ parallel(t1,4) */ * from? t1;并發(fā)執(zhí)行前加alter session enable parallel dml;
注意:當(dāng)使用HINT時如果結(jié)果集不完整或有錯,優(yōu)化器將忽略它;
6.優(yōu)化器相關(guān)
alter system set optimizer_mode=first_rows(all_rows) --系統(tǒng)級別設(shè)置,也可在會話級別session
select? /*+ first_rows(20) */ * from t1 where id<20; --CBO模式
select? /*+ all_rows */ * from t1 where id<20; --CBO模式
-在SQL中使用HINT的優(yōu)先級要高于optimizer_mode的參數(shù)設(shè)定;
select? /*+ rule */ * from t1;? --RBO優(yōu)化器模式
7.訪問路徑相關(guān)的hint
包含:cluster,full,hash,index,no_index,index_asc,index_desc,index_combine,index_join,index_ffs,index_ss,index_ss_asc,index_ss_desc,no_index_ffs,no_index_ss,ordered,leading,use_hash,no_use_hash;
select? /*+ full(t1) */ * from t1;--全表掃描
select? /*+ index(t1 idx_name) */ * from t1 where object_id>2;使用指定索引
select? /*+ no_index(t1 idx_name) */ * from t1 where object_id>2; --不使用指定索引
select? /*+ index_desc(t1 idx_name) */ * from t1 where object_id=2; --按索引降序順序訪問數(shù)據(jù)
select /*+ index_combine(t1 idx_name) */ * from t1;--選擇位圖索引
select /*+ index_ffs(t1? idx_name) */ from t1 where object_id <100; --索引快速全表掃描(把索引當(dāng)作一個表看待)
select /*+ index_join(t1 idx_name1 idx_name2) */ * from t1 where object_id=5 and status='VALID'; --同時使用條件列上的相關(guān)索引
select /*+ index_ss(t1 index_name) */ * from t1 where object_id=99;? --跳躍式掃描
select /*+ leading(t1,t) */ t.* from t,t1 where t1.object_id=t.object_id; --指定t1為驅(qū)動作,優(yōu)化器先訪問此表
select /*+ ordered */ t.* from t,t1 where t1.id=t.id;?? --指定按from 后面表的順序選擇驅(qū)表,t作為驅(qū)動表
select /*+ use_nl(t1,t) */ t.* from t1,t where t1.object_id=t.object_id;--使用NEST LOOP表連接,適合含有小表數(shù)據(jù)關(guān)聯(lián),如一大一小
select /*+ use_hash(t1,t) */ t.* from t1,t where t1.object_id=t.object_id;--使用HASH表連接,適合兩個大表關(guān)聯(lián)
select /*+ use_merge(t1,t) */t.* from t1,t where t1.object_id=t.object_id;--使用合并排序表連接
select /*+ no_use_nl(t1,t) */ t.* from t1,t where t1.object_id=t.object_id; --不使用NEST LOOP表連接
select /*+ no_use_hash(t1,t) */ t.* from t1,t where t1.object_id=t.object_id;--不使用HASH表連接
select /*+ no_use_merge(t1,t) */t.* from t1,t where t1.object_id=t.object_id; --不使用合并排序表連接
8.并行相關(guān)hint
select /*+ parallel(t 4) */ count(*) from t1; --開啟表的4個并行度
select /*+ no_parallel(t) */ count(*) from t1; --不使用并行
表默認(rèn)的degree(user_tables)如果不為0,默認(rèn)開啟并行針對select;
9.其它hint
select /*+ dynamic_sampling(t 4) */ * from t where id>134;--4為采樣級別
select /*+ full(t1) cache(t1) */ object_id from t1;--將表t1放在LRU端最活躍處,相當(dāng)于表屬性的cache(keep);
awr分析
快速閱讀ORACLE的AWR報(bào)告
1????? Oracle AWR中的時間模型
理解AWR報(bào)告之前,要先理解其時間模型,才不致于被混淆。
時間模型,都是從Oracle前端進(jìn)程(Foreground Processes)的角度去理解的,不單獨(dú)統(tǒng)計(jì)后端進(jìn)程(LGWR等)的開銷
DBTime:有時又叫消逝時間(ElapsedTime)、響應(yīng)時間(Response Time),包含CPU Time、Wait Time、IO Time。DB Time columns represents, total time spent by foreground processes. It includes CPU Time, IO Time and Wait time and excludes Idle wait time and time taken by background processes.
CPU Time:數(shù)據(jù)庫的CPU運(yùn)算時間,有時又叫Service Time,包含分析時間(Parse Time)、遞歸調(diào)用時間(Recursive CPU Usage)、其他CPU開銷(CPU Other)。
l? 注1:IOTime,在早期(Oracle 11之前)的Statspack報(bào)告及AWR中沒有單列,在早期statspack中DBTime僅包含CPUTime 和WaitTime
l? 注2:在statspack報(bào)告中才區(qū)分ParseTime/Recursive Usage/CPU Other,AWR中一般不再進(jìn)一步區(qū)分CPU的使用類型,service time也是statspack報(bào)告中對CPU time的另一個稱呼。
2????? 數(shù)據(jù)庫整體負(fù)載信息
DBTime /(Elapsed * CPUs) >= 1,則通常說明數(shù)據(jù)庫負(fù)載重,有明顯等待事件
2.1????? 問題負(fù)載
CPU總共16個,60分鐘的DB Time卻達(dá)到8000多,差距這么大?!
Host Name
Platform
CPUs
Cores
Sockets
Memory (GB)
app2
Linux x86 64-bit
16
16
4
7.68
Snap Id
Snap Time
Sessions
Cursors/Session
Begin Snap:
10445
31-Jan-15 11:00:08
400
1.2
End Snap:
10446
31-Jan-15 12:00:58
200
1.2
Elapsed:
60.84 (mins)
DB Time:
8,544.30 (mins)
2.2????? 正常負(fù)載
DB Name
DB Id
Instance
Inst num
Startup Time
Release
RAC
BSNYSDB
1180525933
bsnysdb1
1
22-7月 -15 02:07
11.2.0.3.0
YES
Host Name
Platform
CPUs
Cores
Sockets
Memory (GB)
sti55l01
AIX-Based Systems (64-bit)
48
12
192.00
Snap Id
Snap Time
Sessions
Cursors/Session
Begin Snap:
22371
01-12月-15 12:00:13
4613
8.7
End Snap:
22375
01-12月-15 16:00:49
4679
9.0
Elapsed:
240.60 (mins)
DB Time:
4,029.99 (mins)
3????? 瓶頸在哪里?
3.1????? 整體處理原則:Top 5 Timed Foreground Eventà查看相應(yīng)的TOP SQL
即先看TOP5 事件,重點(diǎn)處理排在第一位的事件;然后根據(jù)事件,查看對應(yīng)的SQL排序列表,確定可能的問題SQL及優(yōu)化方法。
3.2????? Top 5 Timed Foreground Event
Top 5事件是非常重要的信息,通過它可以判斷出這段時間數(shù)據(jù)庫的瓶頸是什么,重點(diǎn)處理排在第一位的事件。
對HB/ABM而言,正常情況下排在第一位的事件為DB CPU,否則需要考慮優(yōu)化。
常見事件如下表所示(……這個列表待刷新……):
事件名
原因
處理辦法
DB CPU
一般是SQL性能問題,訪問量過大或沒有走合適的索引
查看SQL ordered by CPU Time、SQL ordered by Gets,優(yōu)化前面的SQL
db file sequential read
大量的索引掃描
查看SQL ordered by Reads、SQL ordered by physical reads,優(yōu)化前面的SQL
db file scattered read
大量的全表掃描
查看SQL ordered by Reads、SQL ordered by physical reads,優(yōu)化前面的SQL
log file sync
Commit太頻繁了。當(dāng)一個用戶提交或回滾數(shù)據(jù)時,LGWR將會話的redo記錄從日志緩沖區(qū)填充到日志文件中,用戶的進(jìn)程必須等待這個填充工作完成。
修改應(yīng)用程序的提交頻率, 為減少這個等待事件,須一次提交更多記錄,或者將重做日志REDO LOG 文件放在不同的物理磁盤上,提高I/O的性能。
log file switch (checkpoint incomplete)
Redo log file太小了,導(dǎo)致日志需要切換時,前一個日志的數(shù)據(jù)還沒有完全寫到數(shù)據(jù)文件中
增加redo log日志組
log file switch (archiving needed)
這個等待事件出現(xiàn)時通常是因?yàn)槿罩窘M循環(huán)寫滿以后,第一個日志歸檔尚未完成,出現(xiàn)該等待。出現(xiàn)該等待,可能表示io 存在問題。
以考慮增大日志文件和增加日志組;移動歸檔文件到快速磁盤;調(diào)整log_archive_max_processes。
buffer busy waits
熱塊,并發(fā)的線程經(jīng)常更新同一個數(shù)據(jù)塊(不是相同的數(shù)據(jù))
當(dāng)一個會話試圖修改一個數(shù)據(jù)塊,但這個數(shù)據(jù)塊正在被另一個會話修改時。
當(dāng)一個會話需要讀取一個數(shù)據(jù)塊,但這個數(shù)據(jù)塊正在被另一個會話讀取到內(nèi)存中時。
可以在awr的Buffer Wait Statistics部分檢查是哪部分的熱塊,如果是數(shù)據(jù)的,查看Segments by Buffer Busy Waits部分,可以看到是哪個表的問題。解決辦法:減少更新的頻率,盡量將數(shù)據(jù)分布到不同的數(shù)據(jù)塊中。
TOP 5事件舉例:
Top 5 Timed Foreground Events
Event
Waits
Time(s)
Avg wait (ms)
% DB time
Wait Class
db file sequential read
15,188,833
81,138
5
33.56
User I/O
DB CPU
59,059
24.42
SQL*Net message from dblink
589,972
13,348
23
5.52
Network
enq: TX - row lock contention
63,138
10,465
166
4.33
Application
log file sync
3,157,833
4,888
2
2.02
Commit
3.3????? TOP SQL
SQL統(tǒng)計(jì)信息包含了監(jiān)控期間的SQL按各種維度的統(tǒng)計(jì)信息。主要含如下內(nèi)容:
SQL列表
含義
適用場景
SQL ordered by Elapsed Time
總時間Elapsed Time最長的Top SQL
結(jié)合其余Top使用,較少單獨(dú)使用
SQL ordered by CPU Time
總CPU時間最長的Top SQL
DB CPU事件時
SQL ordered by User I/O Wait Time
總IO等待時間最長的Top SQL
很少單獨(dú)使用
SQL ordered by Gets
邏輯讀最多的Top SQL
DB CPU事件時
SQL ordered by Reads
物理讀最多的Top SQL
db file sequential read或
db file scattered read事件時
SQL ordered by Physical Reads (UnOptimized)
未優(yōu)化的物理讀最多的Top SQL
db file sequential read或
db file scattered read事件時
SQL ordered by Executions
執(zhí)行次數(shù)最多的Top SQL
很少單獨(dú)使用
SQL ordered by Parse Calls
軟解析次數(shù)最多的Top SQL
?
SQL ordered by Sharable Memory
占用Library Cache最多的Top SQL
?
SQL ordered by Version Count
版本數(shù)最多的Top SQL
任何時候都值得分析,關(guān)注未使用綁定變量的SQL
SQL ordered by Cluster Wait Time
ClusterWaitTime最長的Top SQL
GC事件時?
Complete List of SQL Text
監(jiān)控期間SQL完整語法列表
4????? CPU是瓶頸嗎?
正常情況下,DB CPU事件應(yīng)是TOP1事件的。那DB CPU事件是TOP 1的時候系統(tǒng)就正常了?不一定,此時要結(jié)合AWR中的Host CPU與Instance CPU看。
Host CPU (CPUs: 48 Cores: 12 Sockets: )
Load Average Begin
Load Average End
%User
%System
%WIO
%Idle
12.61
14.47
15.3
4.9
5.1
79.8
Instance CPU
%Total CPU
%Busy CPU
%DB time waiting for CPU (Resource Manager)
9.2
45.6
0.0
Host CPU表示數(shù)據(jù)庫主機(jī)的CPU情況,%Idle表示CPU的空閑程度,該值若低于40%,則說明數(shù)據(jù)庫主機(jī)的CPU可能是瓶頸。
Instance CPU表示數(shù)據(jù)庫實(shí)例占用的CPU情況,數(shù)據(jù)庫主機(jī)CPU高(Host CPU中的%Idle值小)不一定是數(shù)據(jù)庫實(shí)例導(dǎo)致的,也可能有其他進(jìn)程在運(yùn)行(這種情況比較少)。%Total CPU表示數(shù)據(jù)庫實(shí)例占用的CPU,%Busy CPU表示數(shù)據(jù)庫實(shí)例的CPU占用/服務(wù)器的CPU占用。
若確定是數(shù)據(jù)庫實(shí)例的CPU導(dǎo)致的主機(jī)CPU高,則結(jié)合上述的TOPSQL,查看、優(yōu)化對應(yīng)的模塊。
l? 注3:在早期(Oracle 11之前)的AWR中沒有Host CPU及Instance CPU,此時應(yīng)考慮使用主機(jī)層面的TOP工具進(jìn)行綜合判斷。
5????? 其他問題
5.1????? 時間跨度多長合適?
AWR是基于一段時長的統(tǒng)計(jì)報(bào)告。太長,問題可能被大量的正常信息給覆蓋;太短,問題可能還未體現(xiàn)在報(bào)告中。
查問題時,一般以30分鐘~1小時的AWR報(bào)告為宜。若要更短時間的分析,則一般用ASH報(bào)告,其分析方法與AWR報(bào)告類似。
tmp表空間的使用
Oracle查詢temp表空間的名字和位置
select tablespace_name,file_name from dba_temp_files;
Oracle查詢temp表空間的使用率
select tablespace_name,round(free_space/1024/1024/1024,2) "free(GB)",round(tablespace_size/1024/1024/1024,2) "total(GB)",round(nvl(free_space,0)*100/tablespace_size,3) "Free percent"
from dba_temp_free_space;