文章目錄
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;