【SQL】Oracle 归档日志暴增原因分析

客户反映 数据库无法连接或者直接跟工程师说,因归档最近暴增,造成空间紧张,引起数据库无法使用,需协助检查归档暴增原因。

我们可以通过以下命令查看:

1.检查块改变最多的对象

redo大量产生是由于发生了大量的块改变,所以检查块改变最多的对象. 。 如下示例,是检测近一小时内容,我们可以根据需求,判断时间范围。

SQL> select * from (
  select to_char(begin_interval_time,'yyyy/mm/dd hh24:mi:ss') snap_time,
  dhsso.object_name,sum(db_block_changes_delta)
  from dba_hist_seg_stat dhss,dba_hist_seg_stat_obj dhsso,
  dba_hist_snapshot dhs
  where dhs.snap_id=dhss.snap_id
  a  2    3    4    5    6    7  nd dhs.instance_number=dhss.instance_number
  and dhss.obj#=dhsso.obj#
  and dhss.dataobj#=dhsso.dataobj#
  and begin_interval_time > sysdate-60/1440
  group by to_char(begin_interval_time,'yyyy/mm/dd hh24:mi:ss'),dhsso.object_name
  order by 3 desc
) wher  8    9   10   11   12   13  e rownum<=10;
SNAP_TIME         OBJECT_NAME            SUM(DB_BLOCK_CHANGES_DELTA)
-------------------- ------------------------------ ---------------------------
2021/08/17 14:01:00  TEST_REDO                          52000
2021/08/17 14:01:00  WRH$_EVENT_HISTOGRAM_PK                     96
2021/08/17 14:01:00  WRH$_SYSMETRIC_HISTORY_INDEX                 96
2021/08/17 14:01:00  WRI$_ADV_PARAMETERS                     80
2021/08/17 14:01:00  JOB$                             80
2021/08/17 14:01:00  WRH$_PARAMETER_PK                         80
2021/08/17 14:01:00  WRM$_SNAPSHOT_DETAILS_INDEX                 64
2021/08/17 14:01:00  WRM$_SNAPSHOT_DETAILS                     64
2021/08/17 14:01:00  WRI$_ADV_PARAMETERS_PK                     64
2021/08/17 14:01:00  SMON_SCN_TIME                         48
10 rows selected.

2.根据检查对象结果,确认sql语句

col snap_time for a20
col sql_text for a100
col inst_id for 99
col execs for a6
select to_char(begin_interval_time,'yyyy/mm/dd hh24:mi:ss') snap_time,
    dbms_lob.substr(sql_text,4000,1) sql_text,dhss.instance_number inst_id,dhss.sSQL> SQL> SQL> SQL> SQL>   2  ql_id,
    executions_delta execs,rows_processed_delta
  from dba_hist_sqlstat dhss,dba_hist_snapshot dhs,dba_hist_sqltext dhst
  where upper(dhst.sql_text) like '%TEST_REDO%'
  and dhss.snap_id=dhs.snap_id
  and dhss.instance_number=dhs.instance_number
    3    4    5    6    7    8  and dhss.sql_id=dhst.sql_id;
SNAP_TIME         SQL_TEXT                                                  INST_ID SQL_ID    EXECS ROWS_PROCESSED_DELTA
-------------------- ---------------------------------------------------------------------------------------------------- ------- ------------- ----- --------------------
2021/08/17 14:01:00  insert into test_redo select * from test_redo                                1 5w8pb7t27c85n     3            651084
2021/08/17 14:01:00  SELECT /* OPT_DYN_SAMP */ /*+ ALL_ROWS IGNORE_WHERE_CLAUSE NO_PARALLEL(SAMPLESUB) opt_param('paralle    1 2uduyzqnf46yg     1             1
             l_execution_enabled', 'false') NO_PARALLEL_INDEX(SAMPLESUB) NO_SQL_TUNE */ NVL(SUM(C1),:"SYS_B_0"),
             NVL(SUM(C2),:"SYS_B_1") FROM (SELECT /*+ NO_PARALLEL("TEST_REDO") FULL("TEST_REDO") NO_PARALLEL_INDE
             X("TEST_REDO") */ :"SYS_B_2" AS C1, :"SYS_B_3" AS C2 FROM "MYTEST"."TEST_REDO" SAMPLE BLOCK (:"SYS_B
             _4" , :"SYS_B_5") SEED (:"SYS_B_6") "TEST_REDO") SAMPLESUB

3.根据SQL_ID确认是什么程序发起的sql

SQL> col SQL_OPNAME for a20
col MACHINE for a16
col PROGRAM for a28
col SQL_EXEC_START for a20
select SQL_OPNAME,SQL_PLAN_HASH_VALUE,to_char(SQL_EXEC_START,'yyyy/mm/dd hh24:mi:ss') SQL_EXEC_START,MACHINE,PROGRAM 
from v$active_session_history where sql_id='5w8pSQL> SQL> SQL> SQL>   2  b7t27c85n';
SQL_OPNAME         SQL_PLAN_HASH_VALUE SQL_EXEC_START       MACHINE           PROGRAM
-------------------- ------------------- -------------------- ---------------- ----------------------------
INSERT                  2389758278 2021/08/17 14:48:29  myasm           sqlplus@myasm (TNS V1-V3)
INSERT                  2389758278 2021/08/17 14:48:29  myasm           sqlplus@myasm (TNS V1-V3)
INSERT                  2389758278 2021/08/17 14:48:29  myasm           sqlplus@myasm (TNS V1-V3)
INSERT                  2389758278 2021/08/17 14:48:26  myasm           sqlplus@myasm (TNS V1-V3)
INSERT                  2389758278 2021/08/17 14:48:16  myasm           sqlplus@myasm (TNS V1-V3)

附,环境准备

SQL> create table test_redo as select *from dba_objects;
Table created.
SQL> insert into test_redo select * from test_redo;
93012 rows created.
SQL> /
186024 rows created.
SQL> /
372048 rows created.
SQL> commit;
Commit complete.
SQL> 
SQL> /
Commit complete.

参考:

  • 《收获不止sql优化》 第五章
请使用浏览器的分享功能分享到微信等