ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY
트러블 슈팅
ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY
주의: 여기에 사용된 스크립트는 오라클에서 제공되어진 스크립트를 베이스로 작성되었으나, 사용함에 있어서 리스크가 있음을 명심해야 하며, 사용 전 자신의 DB에 맞는 정확한 내용인지 확인하시기 바랍니다.
SYSAUX에 용량은 있는데 SYS.WRH$_ACTIVE_SESSION_HISTORY 테이블를 확장 할 수 없다고 나올때 처리하는 방법입니다.
SYSAUX의 사용 내역을 확인.
SQL> select occupant_name, space_usage_kbytes from v$sysaux_occupants order by 2; OCCUPANT_NAME SPACE_USAGE_KBYTES ---------------------------------------------------------------- ------------------ AUDIT_TABLES 0 ORDIM/ORDPLUGINS 0 ORDIM/SI_INFORMTN_SCHEMA 0 ULTRASEARCH 0 TSM 0 ULTRASEARCH_DEMO_USER 0 STATSPACK 0 AUTO_TASK 384 ORDIM 448 EM_MONITORING_USER 768 STREAMS 1024 LOGSTDBY 1408 JOB_SCHEDULER 1472 PL/SCOPE 1600 SQL_MANAGEMENT_BASE 1728 SMON_SCN_TIME 3328 WM 3584 EXPRESSION_FILTER 3712 TEXT 3840 SM/OTHER 8448 XSAMD 9024 LOGMNR 13696 ORDIM/ORDDATA 13888 SM/ADVISOR 22272 AO 39104 XSOQHIST 39104 EM 47168 SDO 76032 SM/OPTSTAT 76288 XDB 130176 SM/AWR 550336
쿼리뿐만 아니라 @?/rdbms/admin/awrinfo.sql 스크립트를 이용해 조회 가능합니다.
OMPONENT MB SEGMENT_NAME - % SPACE_USED SEGMENT_TYPE --------- --------- --------------------------------------------------------------------- --------------- ... ASH 19.0 WRH$_ACTIVE_SESSION_HISTORY.WRH$_ACTIVE_2469019682_0 - 94% TABLE PARTITION ASH 3.0 WRH$_ACTIVE_SESSION_HISTORY_PK.WRH$_ACTIVE_2469019682_0 - 79% INDEX PARTITION RAC 8.0 WRH$_DLM_MISC.WRH$_DLM_MI_2469019682_0 - 93% TABLE PARTITION
해당 문제관한 자료는 아래 문서에서 찾을 수 있습니다.
AWR Data Uses Significant Space in the SYSAUX Tablespace (Doc ID 287679.1)
해당 쿼리를 통해 ASH ROW를 확인할수 있습니다.
SELECT COUNT(1) Orphaned_ASH_Rows FROM wrh$_active_session_history a WHERE NOT EXISTS (SELECT 1 FROM wrm$_snapshot WHERE snap_id = a.snap_id AND dbid = a.dbid AND instance_number = a.instance_number); ORPHANED_ASH_ROWS ----------------- 62819
해당 예제에는 row가 몇개 없지만 이 것이 굉장히 많을 경우 아래 쿼리를 이용해서 공간을 정리 할 수 있습니다.
DELETE FROM wrh$_active_session_history a WHERE NOT EXISTS (SELECT 1 FROM wrm$_snapshot WHERE snap_id = a.snap_id AND dbid = a.dbid AND instance_number = a.instance_number ); alter table WRH$_ACTIVE_SESSION_HISTORY shrink space;
위 과정은 단지 정리를 통해 해결 하는 방법으로, 패치를 하지 않으면 지속적으로 발생 할 수 있습니다.
아래와 같은 스크립트로 문제가 발생하는 것에 대한 추적 로그를 남길수 있는데, 각자의 DB에 맞게 수정해서 사용하시기 바랍니다.
pool ash_purge_job.lst prompt 2013/10/28 by Jed S. Walker prompt This procedure is to handle an 11.2.0 bug that results in orphaned records in wrh$_active_session_history prompt this procedure runs against SYS data so be careful. prompt As a pre-caution it should not run as the SYS user prompt Due to this the procedure generates a trace file on completion so that there is prompt something available to make sure it isn`t totally forgotten. prompt prompt Hit Enter to continue prompt accept continue -- Do user level stuff whenever sqlerror exit accept running_user prompt "Enter the name of the user that will own/run this job: " accept running_pwd prompt "Enter the password for user &&running_user : " -- grant necessary privileges only connect / as sysdba grant select on sys.wrm$_snapshot to &&running_user; grant select,delete on wrh$_active_session_history to &&running_user; grant execute on dbms_system to &&running_user; -- get password, connect, and install spool off connect &&running_user/&&running_pwd spool ash_purge_job.lst append whenever sqlerror continue -- create the procedure create procedure clean_ash is v_proc_name varchar2(35):='clean_ash'; v_user_name varchar2(35):='&&running_user'; v_commit_size number:=10000; v_commit_count number; v_total_count number; v_notes varchar2(4000); begin v_total_count:=0; --initialize loop DELETE FROM sys.wrh$_active_session_history a WHERE NOT EXISTS (SELECT 1 FROM sys.wrm$_snapshot WHERE snap_id = a.snap_id AND dbid = a.dbid AND instance_number = a.instance_number ) and rownum <= v_commit_size; v_commit_count:=sql%rowcount; commit; v_total_count:=v_total_count+v_commit_count; if v_commit_count = 0 then exit; -- end loop for now end if; end loop; -- write a note for the trace file v_notes:=''; -- start variable v_notes:=v_notes || 'Written by Jed S. Walker October 28th, 2013 ' || chr(10); v_notes:=v_notes || 'WARNING! The author of this script has no liability for any damage caused by your use of this script.' || chr(10); v_notes:=v_notes || 'Please reference MOS ID 387914.1' || chr(10); v_notes:=v_notes || 'This is a trace file from an automated job running ' || v_user_name || '.' || v_proc_name || chr(10); v_notes:=v_notes || 'This job removes orphaned records in WRH$_ACTIVE_SESSION_HISTORY due to an Oracle 11.2.0.x bug' || chr(10); v_notes:=v_notes || 'You should make sure the bug still applies if you continue to run this job in releases above 11.2.0.3 ' || chr(10); v_notes:=v_notes || 'If your SYSAUX tablespace, specifically component SM/AWR, has grown too large for comfort, you should run' || chr(10); v_notes:=v_notes || 'alter table WRH\$_ACTIVE_SESSION_HISTORY shrink space;' || chr(10); v_notes:=v_notes || 'to recover the space after this script has cleaned out the orphaned records.' || chr(10); v_notes:=v_notes || '' || chr(10); v_notes:=v_notes || '' || chr(10); if v_total_count = 0 then v_notes:=v_notes || 'ORA-20444: This run removed ' || v_total_count || ' orphaned records.' || chr(10); v_notes:=v_notes || 'If the count remains zero for several days, then chances are' || chr(10); v_notes:=v_notes || 'you are on a version higher than 11.2.0.3 and this bug may have been fixed.' || chr(10); v_notes:=v_notes || 'Verify the bug fix and if good then you should remove this job to avoid any unintended consequences.' || chr(10); else v_notes:=v_notes || 'This run removed ' || v_total_count || ' orphaned records.' || chr(10); v_notes:=v_notes || 'It appears the bug is not fixed so you should continue to let this run unless Oracle Support recommends otherwise.' || chr(10); v_notes:=v_notes || 'Have a great day!' || chr(10); end if; -- create the trace file sys.dbms_system.ksdwrt(1,v_notes); exception when others then v_notes:=v_notes || 'ORA-20445: ' || v_user_name || '.' || v_proc_name || ' failed.' || chr(10); v_notes:=v_notes || 'Oracle error "' ||SQLERRM|| chr(10); sys.dbms_system.ksdwrt(1,v_notes); end clean_ash; / show errors -- create the job to run once per day so table never grows too big begin dbms_scheduler.create_job(job_name=>'CLEAN_ASH_JOB', job_type=>'STORED_PROCEDURE', job_action=>'clean_ash', number_of_arguments=>0, repeat_interval=>'FREQ=Daily;BYHOUR=12;BYMINUTE=0', enabled=>true, comments=>'Special job to mitigate MOS ID 387914.1 in Oracle 11.2.0.3.x, see trace files for notes.'); end; / -- verify set pages 50 linesize 120 col owner format a20 col object_type format a20 col object_name format a20 col status format a20 select owner, object_type, object_name, status from dba_objects where object_name in ('CLEAN_ASH','CLEAN_ASH_JOB'); prompt Done, please check for errors prompt You are currently logged in as: show user spool off
만약 RAC에서 사용하길 원한다면 각각의 노드에서 한번씩 사용합니다. 또는 아래 쿼리를 이용해서 job 스케쥴러에 등록합니다.
select log_date, owner, job_name, status, error#, actual_start_date,run_duration, instance_id from dba_scheduler_job_run_details where job_name = 'CLEAN_ASH_JOB' order by actual_start_date;
최신 댓글