Oracle归档日志暴增排查优化

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位

进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。

入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

回到顶部## 1、ORACLE归档日志介绍

归档日志暴增是oracle比较常见的问题,遇到归档日志暴增,我们该如何排查:

  • 归档日志暴增一般都是应用或者人为引起的
  • 理解归档日志存储的是什么
  • 如何排查归档日志暴增原因
  • *如何优化归档日志暴增
归档日志(Archive Log)是非活动的重做日志(redo)备份.

通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档日志中.

当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。
所有重做的历史记录,包括DML语句、数据改变等
一般是DML操作大量的数据,导致归档日志暴增
1.SQL语句
2.AWR
3.挖掘归档日志

回到顶部## 2、归档日志暴增排查实战

create table scott.object as select * from dba\_objects;

-- 执行10次
-- insert
insert into scott.object select * from scott.object;
select count(1) from scott.object;
-- 49384448

-- update
update SCOTT.object set owner='aa';

-- delete
delete from SCOTT.object;
truncate table SCOTT.object;
SELECT
    THREAD# id,SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH:MI:SS'),1,5)                          DAY
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'00',1,0)) H00
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'01',1,0)) H01
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'02',1,0)) H02
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'03',1,0)) H03
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'04',1,0)) H04
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'05',1,0)) H05
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'06',1,0)) H06
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'07',1,0)) H07
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'08',1,0)) H08
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'09',1,0)) H09
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'10',1,0)) H10
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'11',1,0)) H11
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'12',1,0)) H12
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'13',1,0)) H13
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'14',1,0)) H14
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'15',1,0)) H15
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'16',1,0)) H16
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'17',1,0)) H17
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'18',1,0)) H18
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'19',1,0)) H19
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'20',1,0)) H20
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'21',1,0)) H21
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'22',1,0)) H22
  , SUM(DECODE(SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH24:MI:SS'),10,2),'23',1,0)) H23
FROM
  v$log\_history  a
GROUP BY SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH:MI:SS'),1,5),THREAD#
ORDER BY id,SUBSTR(TO\_CHAR(first\_time, 'MM/DD/RR HH:MI:SS'),1,5)
/
代表12月19号,H20(20-21时),共切换24个归档日志,如果每一个500M,那么总共约500M*24,对比其余时间,可以说该时间产生异常的归档日志,目标排查改时间段
with aa as
(SELECT IID,
       USERNAME,
       to\_char(BEGIN\_TIME,'mm/dd hh24:mi') begin\_time,
       SQL\_ID,
       decode(COMMAND\_TYPE,3,'SELECT',2,'INSERT',6,'UPDATE',7,'DELETE',189,'MERGE INTO','OTH') "SQL\_TYPE",
       executions "EXEC\_NUM",
       rows\_processed "Change\_NUM"
  FROM (SELECT s.INSTANCE\_NUMBER IID,
               PARSING\_SCHEMA\_NAME USERNAME,COMMAND\_TYPE,
               cast(BEGIN\_INTERVAL\_TIME as date) BEGIN\_TIME,
               s.SQL\_ID,
               executions\_DELTA executions,
               rows\_processed\_DELTA rows\_processed,
               (IOWAIT\_DELTA) /
               1000000 io\_time,
               100*ratio\_to\_report(rows\_processed\_DELTA) over(partition by s.INSTANCE\_NUMBER, BEGIN\_INTERVAL\_TIME) RATIO,
               sum(rows\_processed\_DELTA) over(partition by s.INSTANCE\_NUMBER, BEGIN\_INTERVAL\_TIME) totetime,
               elapsed\_time\_DELTA / 1000000 ETIME,
               CPU\_TIME\_DELTA / 1000000 CPU\_TIME,
               (CLWAIT\_DELTA+APWAIT\_DELTA+CCWAIT\_DELTA+PLSEXEC\_TIME\_DELTA+JAVEXEC\_TIME\_DELTA)/1000000 OTIME,
               row\_number() over(partition by s.INSTANCE\_NUMBER,BEGIN\_INTERVAL\_TIME order by rows\_processed\_DELTA desc) TOP\_D
                   FROM dba\_hist\_sqlstat s, dba\_hist\_snapshot sn,dba\_hist\_sqltext s2
         where s.snap\_id = sn.snap\_id
           and s.INSTANCE\_NUMBER = sn.INSTANCE\_NUMBER
           and rows\_processed\_DELTA is not null
           and s.sql\_id = s2.sql\_id and COMMAND\_TYPE in (2,6,7,189)
           and sn.BEGIN\_INTERVAL\_TIME > sysdate - nvl(180,1)/1440         and PARSING\_SCHEMA\_NAME<>'SYS')
 WHERE TOP\_D <= nvl(20,1) ) select aa.*,s.sql\_fulltext "full\_sql" from aa left join v$sql s on aa.sql\_id="s.sql\_id" order by iid, begin\_time desc,"change\_num" desc < code></=>
&#x67E5;&#x770B;2&#x5C0F;&#x65F6;&#x7684;&#x6570;&#x636E;&#x8BE5;&#x53D8;&#x91CF;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x51FA;Change\_NUM&#x6570;&#x636E;&#x8BE5;&#x53D8;&#x91CF;&#x548C;&#x6267;&#x884C;&#x6B21;&#x6570;EXEC\_NUM&#x548C;SQL&#x8BED;&#x53E5;&#xFF0C;update&#x56DE;&#x6EDA;&#x4E86;&#xFF0C;&#x6240;&#x4EE5;&#x6CA1;&#x6709;&#x8BE5;&#x53D8;&#x91CF;&#x3002;
&#x6B64;&#x65F6;&#x53EF;&#x4EE5;&#x5224;&#x65AD;&#x5927;&#x91CF;&#x63D2;&#x5165;&#x6570;&#x636E;&#x5BFC;&#x81F4;&#x5F52;&#x6863;&#x65E5;&#x5FD7;&#x66B4;&#x589E;&#xFF0C;&#x6B64;&#x65F6;&#x5E76;&#x4E0D;&#x80FD;&#x5224;&#x65AD;update&#x3002;&#x6B64;&#x8BED;&#x53E5;&#x4E0D;&#x4E00;&#x5B9A;&#x6709;&#x6570;&#x636E;&#xFF0C;&#x53EA;&#x80FD;&#x505A;&#x53C2;&#x8003;&#x3002;

创建AWR报告

&#x521B;&#x5EFA;AWR&#x62A5;&#x544A;
@?/rdbms/admin/awrrpt.sql

`
SQL> @?/rdbms/admin/awrrpt.sql

Current Instance
~~~~~~~~~~~~~~~~

DB Id DB Name Inst Num Instance
* 3830097027 1 ….. ….. dbserver01

Using 3830097027 for database Id
Using 1 for instance number

Specify the number of days of snapshots to choose from
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Entering the number of days (n) will result in the most recent
(n) days of snapshots being listed. Pressing without
specifying a number lists all completed snapshots.

Enter value for num_days: 1

Listing the last day’s Completed Snapshots

Snap
Instance DB Name Snap Id Snap Started Level

Original: https://blog.csdn.net/qq_43479892/article/details/125734733
Author: qq_43479892
Title: Oracle归档日志暴增排查优化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/744570/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球