archive log文件大小与redo log文件大小关系探究(4)

GROUP#    THREAD#  SEQUENCE#        STATUS    FIRST_CHANGE#
  ---------- ---------- ---------- ---------------- -------------
      1          1        27          ACTIVE        1831962
      2          1        28          CURRENT        1935906
      3          2        9            CURRENT        1955175
      4          2        8            INACTIVE      1690602


        由于redo wastage的存在,redo log file中间也会存在空白,那这部分空白会不会被丢弃呢?首先看下什么是redo wastage,简单的说就是LGWR进程在写redo log file的时候是按操作系统的标准块为单位进行写入的,具体块的大小,可以使用下述语句进行查询:


1. select max(l.lebsz) log_block_size_kccle
 
2.  from sys.x$kccle l

3.  where l.inst_id = userenv('Instance');
假设标准块大小为512字节,在一次写入操作中一共要写入1036字节数据,那么就需要3个标准块,尽管第三个块没有被写满,但是SGA中redo log写入的指针会跳转到下面一个块,这里的第三个块剩下的空间就被浪费了,这就是redo wastage。减少这种情况的方法就是减少commit次数。
                                             
      下面通过实验观察redo wastage造成的空白会不会在归档的时候被丢弃:
 

--查看redo file大小
 
SQL> select group#,bytes/1024/1024 \"size(M)\" from v$log;

GROUP# size(M)

---------- ----------

1 50

2 50

3 50

--建立测试表

SQL> create table darren(id number,item varchar2(2));

Table created.

--查看当前归档的情况

SQL> select SEQUENCE#,ARCHIVED,status,COMPRESSED from v$archived_log;

SEQUENCE#  ARC S COM
 ---------- --- - ---
    81      YES A NO
    82      YES A NO
    83      YES A NO
    84      YES A NO
    85      YES A NO
    86      YES A NO
    87      YES A NO
    88      YES A NO
    89      YES A NO
    90      YES A NO

--查看当前的redo size和redo wastage

SQL> select name,value from v$sysstat where name in('redo size','redo wastage');

NAME                                      VALUE

--------------------- ------------------------------------------ ----------

redo size                                258664912

redo wastage                              86181420

--向测试表插入数据,产生redo记录

begin

for i in 1..500000 loop

insert into darren values(1,'aa');

commit;

end loop;

end;

--切换一起日志,将insert过程中产生的redo文件全部归档

SQL> alter system archive log current;

System altered.

--查看现在的redo size和redo wastage

SQL> select name,value from v$sysstat where name in('redo size','redo wastage');

NAME          VALUE

---------- ------------

redo size    512888704

redo wastage 202172176

--计算insert过程中产生的redo size和redo wastage

SQL> select 512888704-258664912 redo from dual;

REDO

----------

254223792

SQL> select 202172176-86181420 wastage from dual;

WASTAGE

----------

115990756

--计算redo wastage的比例

SQL> select 115990756/254223792 from dual;

115990756/254223792

-------------------

.456254527

--查看insert 过程中产生的archive log file

SQL> select SEQUENCE#,ARCHIVED,status,COMPRESSED from v$archived_log;

SEQUENCE# ARC S COM

---------- --- - ---

81 YES A NO

82 YES A NO

83 YES A NO

84 YES A NO

85 YES A NO

86 YES A NO

87 YES A NO

88 YES A NO

89 YES A NO

90 YES A NO

91 YES A NO

92 YES A NO

93 YES A NO

94 YES A NO

95 YES A NO

96 YES A NO

97 YES A NO

98 YES A NO

99 YES A NO

从91号归档开始为本次insert操作产生的归档

--查看归档文件大小

[oracle@oracle11g archive]$ ls -trl

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4d6bf6cdfded1b075608d1dae5b00ee0.html