Oracle統計產生日誌&數據增長&增量

1、如何度量增刪改操作產生的日誌量

  • 在SQL*Plus中使用autotrace功能,根據統計信息獲取

當在SQL*Plus中啓用autotrace跟蹤後,在執行了特定的DML語句時,Oracle會顯示該語句的統計信息,其中,Redo size一欄表示的就是該操作產生的Redo的數量:

SQL> set autotrace trace stat
SQL> insert into test
 2 select empno,ename from scott.emp;
已創建12行。
Statistics
----------------------------------------------------------
       189 recursive calls
         2 db block gets
        37 consistent gets
         4 physical reads
       564 redo size
       778 bytes sent via SQL*Net to client
       823 bytes received via SQL*Net from client
         4 SQL*Net roundtrips to/from client
         1 sorts (memory)
         0 sorts (disk)
        12 rows processed
  • 通過v$mystat查詢:

Oracle通過v$mystat視圖記錄當前session的統計信息,也可以從該視圖中查詢得到session的Redo生成情況:

SQL> col name for a30
SQL> select a.name,b.value
 2 from v$statname a,v$mystat b
 3 where a.statistic#=b.statistic# and a.name='redo size';
 
NAME                               VALUE
------------------------------ ----------
redo size                              5000
 
SQL> insert into test
 2 select empno,ename from scott.emp;
已創建12行。
 
SQL> select a.name,b.value
 2 from v$statname a,v$mystat b
 3 where a.statistic#=b.statistic# and a.name='redo size';
 
NAME                               VALUE
------------------------------ ----------
redo size                              5564
 
SQL> select 5564-5000 from dual;
 
 5564-5000
----------
      564
  • 通過v$sysstat查詢來估算每天產生日誌量

對於數據庫全局redo的生成量,可以通過v$sysstat視圖來查詢得到:

SQL> col value for 999999999999
SQL> select name,value from v$sysstat
 2 where name='redo size';
 
NAME                                  VALUE
------------------------------ -------------
redo size                          11471552

從v$sysstat視圖中得到的是自數據庫實例啓動以來累計日誌生成量,可以根據實例啓動時間來大致估算每天數據庫的日誌生成量:

SQL> select
  (select value/1024/1024/1024 from v$sysstat where name='redo size')/
  (select sysdate-(select startup_time from v$instance) from dual)
  redo_gb_per_day from dual;
 
REDO_GB_PER_DAY
---------------
    .073238253

2、根據歸檔日誌估算數據增量情況

資料庫地址:E:/1@Repository IT/1.0@Oracle/1.0.D@Oracle腳本&工具/oracle腳本/統計日誌產生情況

  • 按天統計
alter session set nls_date_format='yyyy-mm-dd';
set echo off 
set feedback off
select logtime,  
       count(*) log_cnt,  
       round(sum(blocks * block_size) / 1024 / 1024 /1024) Gbsize  
  from (select a.THREAD#,  
               trunc(first_time) as logtime,  
               a.BLOCKS,  
               a.BLOCK_SIZE  
          from v$archived_log a  
         where a.DEST_ID = 1  
           and a.FIRST_TIME between to_date('2016-10-01 00:00','yyyy-mm-dd HH24:mi') and to_date('2016-10-20 18:00','yyyy-mm-dd HH24:mi'))  
 group by logtime 
 order by logtime desc; 
  • 按小時統計
alter session set nls_date_format='yyyy-mm-dd HH24';
set echo off 
set feedback off
select logtime,  
       count(*) log_cnt,  
       round(sum(blocks * block_size) / 1024 / 1024) mbsize  
  from (select a.THREAD#,  
               trunc(first_time, 'hh') as logtime,  
               a.BLOCKS,  
               a.BLOCK_SIZE  
          from v$archived_log a  
         where a.DEST_ID = 1  
           and a.FIRST_TIME between to_date('2018-11-02 07:00','yyyy-mm-dd HH24:mi') and to_date('2018-11-02 12:00','yyyy-mm-dd HH24:mi'))  
 group by logtime 
 order by logtime desc; 
  • 按線程統計
select logtime, 
             thread#,
         count(*) log_cnt,  
         round(sum(blocks * block_size) / 1024 / 1024) mbsize  
    from (select a.THREAD#,  
                 trunc(first_time, 'hh') as logtime,  
                 a.BLOCKS,  
                 a.BLOCK_SIZE  
            from v$archived_log a  
           where a.DEST_ID = 1  
             and a.FIRST_TIME between to_date('2016-10-26 22:00','yyyy-mm-dd HH24:mi') and to_date('2016-10-27 01:00','yyyy-mm-dd HH24:mi'))  
   group by logtime,thread# 
   order by thread# asc,logtime desc; 

3、DBA_HIST_SYSSTAT計算redo產生量(AWR中profile “redo size”)

  • 每秒產生多少redo
set lines 160 pages 1000 echo off feedback off
col stat_name for a25
col date_time for a40
col BEGIN_INTERVAL_TIME for a20
col END_INTERVAL_TIME for a20
prompt "Enter the date in DD-Mon-YY Format and Stats you want to trend like 'redo size','physical reads','physical writes','session logical reads' etc."

WITH sysstat AS
(select sn.begin_interval_time begin_interval_time,
         sn.end_interval_time end_interval_time,
         ss.stat_name stat_name,
         ss.value e_value,
         lag(ss.value, 1) over(order by ss.snap_id) b_value
    from dba_hist_sysstat ss, dba_hist_snapshot sn
   where trunc(sn.begin_interval_time) >= sysdate-7
     and ss.snap_id = sn.snap_id
     and ss.dbid = sn.dbid
     and ss.instance_number = sn.instance_number
     and ss.dbid = (select dbid from v$database)
     and ss.instance_number = (select instance_number from v$instance)
     and ss.stat_name = 'redo size')
select to_char(BEGIN_INTERVAL_TIME, 'mm/dd/yy_hh24_mi') || to_char(END_INTERVAL_TIME, '_hh24_mi') date_time,
stat_name,
round((e_value - nvl(b_value,0)) / (extract(day from(end_interval_time - begin_interval_time)) * 24 * 60 * 60
+ extract(hour from(end_interval_time - begin_interval_time)) * 60 * 60
+ extract(minute from(end_interval_time - begin_interval_time)) * 60 + extract(second from(end_interval_time - begin_interval_time))),0) per_sec
from sysstat where(e_value - nvl(b_value,0)) > 0 and nvl(b_value,0) > 0
/
  • 每小時產生多少redo
WITH times AS
 (SELECT /*+ MATERIALIZE */
   hour_end_time
    FROM (SELECT (TRUNC(SYSDATE, 'HH') + (2 / 24)) - (ROWNUM / 24) hour_end_time
            FROM DUAL
          CONNECT BY ROWNUM <= (1 * 24) + 3),
         v$database
   WHERE log_mode = 'ARCHIVELOG')
SELECT hour_end_time, NVL(ROUND(SUM(size_mb), 3), 0) size_mb, i.instance_name
  FROM(
SELECT hour_end_time, CASE WHEN(hour_end_time - (1 / 24)) > lag_next_time THEN(next_time + (1 / 24) - hour_end_time) * (size_mb / (next_time - lag_next_time)) ELSE 0 END + CASE WHEN hour_end_time < lead_next_time THEN(hour_end_time - next_time) * (lead_size_mb / (lead_next_time - next_time)) ELSE 0 END + CASE WHEN lag_next_time > (hour_end_time - (1 / 24)) THEN size_mb ELSE 0 END + CASE WHEN next_time IS NULL THEN(1 / 24) * LAST_VALUE(CASE WHEN next_time IS NOT NULL AND lag_next_time IS NULL THEN 0 ELSE(size_mb / (next_time - lag_next_time)) END IGNORE NULLS) OVER(
 ORDER BY hour_end_time DESC, next_time DESC) ELSE 0 END size_mb
  FROM(
SELECT t.hour_end_time, arc.next_time, arc.lag_next_time, LEAD(arc.next_time) OVER(
 ORDER BY arc.next_time ASC) lead_next_time, arc.size_mb, LEAD(arc.size_mb) OVER(
 ORDER BY arc.next_time ASC) lead_size_mb
  FROM times t,(
SELECT next_time, size_mb, LAG(next_time) OVER(
 ORDER BY next_time) lag_next_time
  FROM(
SELECT next_time, SUM(size_mb) size_mb
  FROM(
SELECT DISTINCT a.sequence#, a.next_time, ROUND(a.blocks * a.block_size / 1024 / 1024) size_mb
  FROM v$archived_log a,(
SELECT /*+ no_merge */
CASE WHEN TO_NUMBER(pt.VALUE) = 0 THEN 1 ELSE TO_NUMBER(pt.VALUE) END VALUE
  FROM v$parameter pt
 WHERE pt.name = 'thread') pt
 WHERE a.next_time > SYSDATE - 3 AND a.thread# = pt.VALUE AND ROUND(a.blocks * a.block_size / 1024 / 1024) > 0)
 GROUP BY next_time)) arc
 WHERE t.hour_end_time = (TRUNC(arc.next_time(+), 'HH') + (1 / 24)))
 WHERE hour_end_time > TRUNC(SYSDATE, 'HH') - 1 - (1 / 24)), v$instance i
 WHERE hour_end_time <= TRUNC(SYSDATE, 'HH')
 GROUP BY hour_end_time, i.instance_name
 ORDER BY hour_end_time
 /

4、根據dba_hist_tbspc_space_usage表空間維度估算容量增長情況

從表空間歷史使用空間維度,可以比較準確的估算出oracle數據庫容量增長情況,以此來判斷是否需要擴容…

  • 按天來估算所有表空間每天增長量情況
      select tmp.rtime,
                tablespace_usedsize_kb,
                tablespace_size_kb,
                (tablespace_usedsize_kb -
                LAG(tablespace_usedsize_kb, 1, NULL) OVER(ORDER BY tmp.rtime)) AS DIFF_KB
           from (select min(rtime) rtime,
                            sum(tablespace_usedsize_kb) tablespace_usedsize_kb,
                            sum(tablespace_size_kb) tablespace_size_kb
                       from (select rtime,
                                    e.tablespace_id,
                                    (e.tablespace_usedsize) * (f.block_size) / 1024 tablespace_usedsize_kb,
                                    (e.tablespace_size) * (f.block_size) / 1024 tablespace_size_kb
                               from dba_hist_tbspc_space_usage e,
                                    dba_tablespaces            f,
                                    v$tablespace               g
                              where e.tablespace_id = g.TS#
                                and f.tablespace_name = g.NAME
        and f.contents not in ('TEMPORARY','UNDO'))
                      group by rtime) tmp,
                (select min(rtime) rtime
                   from (select min(rtime) rtime,
                            sum(tablespace_usedsize_kb) tablespace_usedsize_kb,
                            sum(tablespace_size_kb) tablespace_size_kb
                       from (select rtime,
                                    e.tablespace_id,
                                    (e.tablespace_usedsize) * (f.block_size) / 1024 tablespace_usedsize_kb,
                                    (e.tablespace_size) * (f.block_size) / 1024 tablespace_size_kb
                               from dba_hist_tbspc_space_usage e,
                                    dba_tablespaces            f,
                                    v$tablespace               g
                              where e.tablespace_id = g.TS#
                                and f.tablespace_name = g.NAME)
                      group by rtime) tmp
                  group by substr(rtime, 1, 10)) t2
          where t2.rtime = tmp.rtime;
  • 估算某表空間每天的增長量情況,篩選具體表空間
      select tmp.rtime,
                tablespace_usedsize_kb,
                tablespace_size_kb,
                (tablespace_usedsize_kb -
                LAG(tablespace_usedsize_kb, 1, NULL) OVER(ORDER BY tmp.rtime)) AS DIFF_KB
           from (select min(rtime) rtime,
                            sum(tablespace_usedsize_kb) tablespace_usedsize_kb,
                            sum(tablespace_size_kb) tablespace_size_kb
                       from (select rtime,
                                    e.tablespace_id,
                                    (e.tablespace_usedsize) * (f.block_size) / 1024 tablespace_usedsize_kb,
                                    (e.tablespace_size) * (f.block_size) / 1024 tablespace_size_kb
                               from dba_hist_tbspc_space_usage e,
                                    dba_tablespaces            f,
                                    v$tablespace               g
                              where e.tablespace_id = g.TS#
                                and f.tablespace_name = g.NAME
        and f.contents not in ('TEMPORARY','UNDO') and f.contents in (upper('&tbs_name')))
                      group by rtime) tmp,
                (select min(rtime) rtime
                   from (select min(rtime) rtime,
                            sum(tablespace_usedsize_kb) tablespace_usedsize_kb,
                            sum(tablespace_size_kb) tablespace_size_kb
                       from (select rtime,
                                    e.tablespace_id,
                                    (e.tablespace_usedsize) * (f.block_size) / 1024 tablespace_usedsize_kb,
                                    (e.tablespace_size) * (f.block_size) / 1024 tablespace_size_kb
                               from dba_hist_tbspc_space_usage e,
                                    dba_tablespaces            f,
                                    v$tablespace               g
                              where e.tablespace_id = g.TS#
                                and f.tablespace_name = g.NAME)
                      group by rtime) tmp
                  group by substr(rtime, 1, 10)) t2
          where t2.rtime = tmp.rtime;

5、根據dba_hist_seg_stat估算對象數據增長情況

dba_hist_seg_stat數據字典視圖裏面記錄了每個對象相對於前面快照,變化的數據塊情況。

  • 估算所有對象某段時間內數據塊增長情況
column owner format a16
column object_name format a36
column start_day format a11
column block_increase format 9999999999

select obj.owner,
       obj.object_name,
       to_char(sn.BEGIN_INTERVAL_TIME, 'yyyy-mm-dd') start_day,
       sum(a.db_block_changes_delta) block_increase
  from dba_hist_seg_stat a, dba_hist_snapshot sn, dba_objects obj
 where sn.snap_id = a.snap_id
   and obj.object_id = a.obj#
   and obj.owner not in ('SYS', 'SYSTEM')
   and end_interval_time between to_timestamp('2019-09-24', 'yyyy-mm-dd') and
       to_timestamp('2019-09-24', 'yyyy-mm-dd')
 group by obj.owner,
          obj.object_name,
          to_char(sn.BEGIN_INTERVAL_TIME, 'yyyy-mm-dd')
 order by obj.owner, obj.object_name;
  • 估算某用戶下對象,某段時間內數據塊增長情況
column owner format a16
column object_name format a36
column start_day format a11
column block_increase format 9999999999

select obj.owner,
       obj.object_name,
       to_char(sn.BEGIN_INTERVAL_TIME, 'yyyy-mm-dd') start_day,
       sum(a.db_block_changes_delta) block_increase
  from dba_hist_seg_stat a, dba_hist_snapshot sn, dba_objects obj
 where sn.snap_id = a.snap_id
   and obj.object_id = a.obj#
   and obj.owner in (upper('&usr_name'))
   and obj.object_name = upper('&obj_name')
   and end_interval_time between to_timestamp('2019-09-24', 'yyyy-mm-dd') and
       to_timestamp('2019-09-24', 'yyyy-mm-dd')
 group by obj.owner,
          obj.object_name,
          to_char(sn.BEGIN_INTERVAL_TIME, 'yyyy-mm-dd')
 order by obj.owner, obj.object_name;

5、根據DBA_TAB_MODIFICATIONS統計表上增刪改次數

Database Reference對DBA_TAB_MODIFICATIONS解釋是,記錄了自從上一次收集統計信息後,表上數據被修改的記錄。所以,使用的時候需要先查詢下上次收集統計信息是啥時候:

select OWNER,TABLE_NAME,to_char(LAST_ANALYZED,'yyyy-mm-dd hh24:mi:ss') from dba_tables where table_name=upper('table_name');

set linesize 200
col TABLE_OWNER for a20
col TABLE_NAME for a26
col TIMESTAMP for a16
col count(INSERTS) for 9999999
col count(UPDATES) for 9999999
col count(DELETES) for 9999999
select TABLE_OWNER,TABLE_NAME,to_char(TIMESTAMP,'yyyy-mm-dd hh24') TIMESTAMP,count(INSERTS),count(UPDATES),count(DELETES) from DBA_TAB_MODIFICATIONS where TABLE_NAME=upper('table_name') group by TABLE_OWNER,TABLE_NAME,to_char(TIMESTAMP,'yyyy-mm-dd hh24') order by TIMESTAMP desc;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章