ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle实验记录 (oracle 详细分析redo(5))

oracle实验记录 (oracle 详细分析redo(5))

原创 Linux操作系统 作者:fufuh2o 时间:2009-10-23 14:30:58 0 删除 编辑

关于减少redo生成,减少后恢复问题,select产生redo问题

 


对insert语句,undo只要记录下刚插入的rowid ,对update ,undo要记录被更新的字段的旧值,对delete ,undo刚必须记录下整行数据
由于redo是 保护undo的 从上面dump结构中可以看到undo,这样 undo越多 redo也就 越多

减少redo, nologging,APPEDN(oracle不建议这样做,因为将造成数据丢失后无法恢复)
可以显著的少生成redo 但不是不生成(对于数据字典的改动还是会生成的)
将实验archive log mode ,noarchive log mode

 

 

archive log mode下 cats ,insert
SQL> show user
USER 为 "XH"
SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
     10096

SQL> create table t1 as select * from dba_objects;

表已创建。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
   5832192

 

SQL> select 5921268-10096 from dual;

5921268-10096
-------------
      5911172

SQL> create table t2 nologging as select * from dba_objects;

表已创建。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
   5921268

SQL> select 5921268-5832192 from dual;

5921268-5832192
---------------
          89076
可以看到 ctas 时 t2 采用nologging 这样 redo 少 很多

SQL> select logging,owner  from dba_tables where table_name='T2';

LOG OWNER
--- ------------------------------
NO  XH

SQL> select logging,owner  from dba_tables where table_name='T1';

LOG OWNER
--- ------------------------------
YES XH

可以 看 到t1 为logging表属性,t2为nologging属性

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
   5921268

SQL>
SQL> insert into t1 select * from dba_objects;

已创建50410行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  11580920

SQL> select 11580920-5921268 from dual;

11580920-5921268
----------------
         5659652

SQL> insert into t2 select * from dba_objects;

已创建50410行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  17240880

SQL> select 17240880-11580920 from dual;

17240880-11580920
-----------------
          5659960
可以看 到 虽然 2个 表 属性不一样 一个nologging(相当于alter table XX NOLOGGING)一个logging但 对于 普通的批量插入实际产生的redo还是一样多

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  17240880


SQL> insert /*+ append*/ into t1 select * from dba_objects;

已创建50410行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  22967780

SQL> select 22967780-17240880 from dual;

22967780-17240880
-----------------
          5726900

SQL> insert /*+ append*/ into t2 select * from dba_objects;

已创建50410行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  22993944

SQL> select 22993944-22967780 from dual;

22993944-22967780
-----------------
            26164

从上面可以看出,当使用直接加载append的时候 表属性为 nologging的 比 logging的 所产生的redo少很多

 

noarchive log mode下 cats ,insert
SQL> drop table t1;

表已删除。

SQL> drop table t2;

表已删除。

SQL> conn / as sysdba
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size              83886784 bytes
Database Buffers          197132288 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
SQL> alter database noarchivelog;

数据库已更改。

SQL> alter database open;

数据库已更改。
SQL> archive log list
数据库日志模式             非存档模式
自动存档             禁用
存档终点            f:\archivelog
最早的联机日志序列     1
当前日志序列           3

SQL> conn xh/a831115
已连接。
SQL> show user;
USER 为 "XH"

 


SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
         0

SQL> create table t1 as select * from dba_objects;

表已创建。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
    113396

SQL> select 113396-0 from dual;

  113396-0
----------
    113396

SQL> create table t2 nologging as select * from dba_objects;

表已创建。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
    192060

SQL> select 192060-113396 from dual;

192060-113396
-------------
        78664


可以看出 ctas时 noarchivelog mode ,不管是否加了nologging ,产生的redo都不 多(ctas加nologging 产生的还是要少些)

SQL> select logging,owner  from dba_tables where table_name='T1';

LOG OWNER
--- ------------------------------
YES XH

SQL> select logging,owner  from dba_tables where table_name='T2';

LOG OWNER
--- ------------------------------
NO  XH
 表属性 还是 t1 logging,t2 nologging


SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
    192060

SQL> insert into t1 select * from dba_objects;

已创建50411行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
   5844120

SQL> select 5844120 - 192060 from dual;

5844120-192060
--------------
       5652060

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
   5844120

SQL> insert into t2 select * from dba_objects;

已创建50411行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  11533352

SQL> select 11533352-5844120 from dual;

11533352-5844120
----------------
         5689232


对于普通的insert 插入noarchived log mode下 ,产生redo与archivelog下基本一样

 

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  11533352

SQL> insert /*+ append*/ into t1 select * from dba_objects;

已创建50410行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  11552720

SQL> select 11552720-11533352 from dual;

11552720-11533352
-----------------
            19368

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  11552720

SQL> insert /*+ append*/ into t2 select * from dba_objects;

已创建50410行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  11572068

SQL> select 11572068-11552720 from dual;

11572068-11552720
-----------------
            19348


insert时 加append在 noarchived log mode下 ,都会有很少的redo产生 包括nologging的  t1表也 产生了 很少的redo

 

 

 

noarchived log mode下update

SQL> select logging,owner  from dba_tables where table_name='T2';

LOG OWNER
--- ------------------------------
NO  XH

SQL> select logging,owner  from dba_tables where table_name='T1';

LOG OWNER
--- ------------------------------
YES XH
SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  11580552

SQL> update t1 set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  86832656

SQL> select 86832656-11580552 from dual;

86832656-11580552
-----------------
         75252104~~

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  86832656~~~

SQL> update t2 set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 158388340

SQL> select 158388340-86832656 from dual;

158388340-86832656
------------------
          71555684~~~~~

产生redo ,t2稍少些(nologging属性)

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 158388340

SQL> update t1 nologging set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 171596512

SQL> select 171596512-158388340 from dual;

171596512-158388340
-------------------
           13208172

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 171596512

SQL> update t2 nologging set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 184853476

SQL> select 184853476-171596512 from dual;

184853476-171596512
-------------------
           13256964


update时 2个表 都加了nologging后 redo会减少很多

 


archive log  mode下 update
SQL> commit;

提交完成。

SQL> conn / as sysdba
已连接。
SQL>

SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size              83886784 bytes
Database Buffers          197132288 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。

 

SQL> alter database archivelog;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            f:\archivelog
最早的联机日志序列     7
下一个存档日志序列   9
当前日志序列           9


SQL> update t1 set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  43819024

SQL> select 43819024- 624 from dual;

43819024-624
------------
    43818400

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  43819024

SQL> update t2 set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  87832752

SQL> select 87832752-43819024 from dual;

87832752-43819024
-----------------
         44013728

archive log mode下  正常 update t1,t2产生 很多redo, 基本一样(update t1,t2 产生redo) 但比 noarchived log mode时候 正常update redo少

 

 

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  87832752

SQL> update t1 nologging set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 104559860

SQL> select 104559860-87832752 from dual;

104559860-87832752
------------------
          16727108

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 104559860

SQL> update t2 nologging set wner='xh';

已更新151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 120014836

SQL> select 120014836-104559860 from dual;

120014836-104559860
-------------------
           15454976

可以看出archive log mode下 加nologging后,redo减少很多 基本 跟  no archivelog mode时加nologging差不多.

表属性nologging (user_tables.logging)对redo产生多少影响不大,nologging属性的 表 要稍微少些,而sql中 使用nologging ,与archive log mode 对redo record 多少影响很大 .


关于delete
archive log mode 下delete
SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            f:\archivelog
最早的联机日志序列     16
下一个存档日志序列   18
当前日志序列           18
SQL>

SQL> conn xh/a831115
已连接。
SQL> show user
USER 为 "XH"
SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
         0


SQL> delete from t1;

已删除151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  54312008

SQL> delete from t2;

已删除151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 108711180

SQL> select 108711180-54312008 from dual;

108711180-54312008
------------------
          54399172


可以看到 普通的 delete 比 insert ,update 产生的redo要多很多

 


SQL> rollback;

回退已完成。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 202260636
rollback相当于insert 又产生了 很多redo

 


SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 202260636

SQL> delete from t1 nologging;

已删除151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 256675740

SQL> select 256675740-202260636 from dual;

256675740-202260636
-------------------
           54415104


SQL> delete from t2 nologging;

已删除151232行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 311027048

SQL> select 311027048-256675740 from dual
  2  ;

311027048-256675740
-------------------
           54351308


可以看到 delete 加nologging 并没有减少redo ,另外 表属性是否nologging也 没有 影响 产生redo多少

 


noarchivelog mode下delete
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORA-32004: obsolete and/or deprecated parameter(s) specified
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248576 bytes
Variable Size              96469696 bytes
Database Buffers          184549376 bytes
Redo Buffers                7139328 bytes
数据库装载完毕。
SQL> alter database noarchivelog;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> archive log list
数据库日志模式             非存档模式
自动存档             禁用
存档终点            f:\archivelog
最早的联机日志序列     25
当前日志序列           27


由于刚改上面实验忘记rollback ,直接shutdown immediate(oracle 会隐式提交 刚才所做修改 所以 下面 重新建立了表)


SQL> select count(*) from t1;

  COUNT(*)
----------
    151342

SQL> select count(*) from t2;

  COUNT(*)
----------
    151342

SQL> alter table t2 nologging;

表已更改。
SQL> select table_name,logging from user_tables where table_name in ('T1','T2');


TABLE_NAME                     LOG
------------------------------ ---
T1                             YES
T2                             NO
以前面archive log mode下 delete的 rows不一样 但也 很接近对结果不会有大的影响


SQL> conn xh/a831115
已连接。
SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
       816


SQL> conn xh/a831115
已连接。
SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
       816

SQL> delete from t1;

已删除151342行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
  54746884

SQL> select 54746884-816 from dual;

54746884-816
------------
    54746068


SQL> delete from t2;

已删除151342行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 109533436

SQL> select 109533436-54746884 from dual;

109533436-54746884
------------------
          54786552


可以看到正常delete ,与 archive log mode没 什么 区别 产生redo基本一样


SQL> delete from t1 nologging;

已删除151342行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 258410840

SQL> select 258410840-203754652 from dual;

258410840-203754652
-------------------
           54656188

SQL> delete from t2 nologging;

已删除151342行。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
 313136444

SQL> select 313136444- 258410840 from dual;

313136444-258410840
-------------------
           54725604

SQL>

可以看到对于delete 操作,不论是否加了nologging ,不论是什么arvhive log mode,是否表属性为nologging 所产生的redo不会有什么变化,减少不 了

 

 

 

关于减少 redo后的恢复问题


C:\>rman target /


以前的备份删掉,重新备份下.
RMAN> list backup of database;

使用目标数据库控制文件替代恢复目录

备份集列表
===================

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
6       Full    769.23M    DISK        00:01:53     09-10月-09
        BP 关键字: 6   状态: AVAILABLE  已压缩: NO  标记: TAG20091009T224340
段名:F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009_10_09\O1
_MF_NNNDF_TAG20091009T224340_5DYM0X7T_.BKP
  备份集 6 中的数据文件列表
  文件 LV 类型 Ckp SCN    Ckp 时间   名称
  ---- -- ---- ---------- ---------- ----
  1       Full 3757255    09-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\SYS
TEM01.DBF
  2       Full 3757255    09-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\UND
OTBS01.DBF
  3       Full 3757255    09-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\SYS
AUX01.DBF
  4       Full 3757255    09-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\USE
RS01.DBF
  5       Full 3757255    09-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\EXA
MPLE01.DBF
  6       Full 3757255    09-10月-09 E:\DATAFILE\TEST.DBF

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
8       Full    778.62M    DISK        00:02:11     20-10月-09
        BP 关键字: 8   状态: AVAILABLE  已压缩: NO  标记: TAG20091020T155203
段名:F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009_10_20\O1
_MF_NNNDF_TAG20091020T155203_5FTV155V_.BKP
  备份集 8 中的数据文件列表
  文件 LV 类型 Ckp SCN    Ckp 时间   名称
  ---- -- ---- ---------- ---------- ----
  1       Full 4475208    20-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\SYS
TEM01.DBF
  2       Full 4475208    20-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\UND
OTBS01.DBF
  3       Full 4475208    20-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\SYS
AUX01.DBF
  4       Full 4475208    20-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\USE
RS01.DBF
  5       Full 4475208    20-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\EXA
MPLE01.DBF
  6       Full 4475208    20-10月-09 E:\DATAFILE\TEST.DBF

RMAN> delete noprompt backup;

分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=157 devtype=DISK

备份段列表
BP 关键字  BS 关键字  Pc# Cp# 状态      设备类型段名称
------- ------- --- --- ----------- ----------- ----------
6       6       1   1   AVAILABLE   DISK        F:\ORACLE\PRODUCT\10.2.0\FLASH_R
ECOVERY_AREA\XHTEST\BACKUPSET\2009_10_09\O1_MF_NNNDF_TAG20091009T224340_5DYM0X7T
_.BKP
7       7       1   1   AVAILABLE   DISK        F:\ORACLE\PRODUCT\10.2.0\FLASH_R
ECOVERY_AREA\XHTEST\BACKUPSET\2009_10_09\O1_MF_NCSNF_TAG20091009T224340_5DYM4L1Y
_.BKP
8       8       1   1   AVAILABLE   DISK        F:\ORACLE\PRODUCT\10.2.0\FLASH_R
ECOVERY_AREA\XHTEST\BACKUPSET\2009_10_20\O1_MF_NNNDF_TAG20091020T155203_5FTV155V
_.BKP
9       9       1   1   AVAILABLE   DISK        F:\ORACLE\PRODUCT\10.2.0\FLASH_R
ECOVERY_AREA\XHTEST\BACKUPSET\2009_10_20\O1_MF_NCSNF_TAG20091020T155203_5FTV5J4W
_.BKP
已删除备份段
备份段 handle=F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009
_10_09\O1_MF_NNNDF_TAG20091009T224340_5DYM0X7T_.BKP recid=6 stamp=699835421
已删除备份段
备份段 handle=F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009
_10_09\O1_MF_NCSNF_TAG20091009T224340_5DYM4L1Y_.BKP recid=7 stamp=699835538
已删除备份段
备份段 handle=F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009
_10_20\O1_MF_NNNDF_TAG20091020T155203_5FTV155V_.BKP recid=8 stamp=700761125
已删除备份段
备份段 handle=F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009
_10_20\O1_MF_NCSNF_TAG20091020T155203_5FTV5J4W_.BKP recid=9 stamp=700761264
4 对象已删除

RMAN> backup database;

RMAN> list backup of database;


备份集列表
===================

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间
------- ---- -- ---------- ----------- ------------ ----------
13      Full    913.84M    DISK        00:02:21     23-10月-09
        BP 关键字: 13   状态: AVAILABLE  已压缩: NO  标记: TAG20091023T101508
段名:F:\ORACLE\PRODUCT\10.2.0\FLASH_RECOVERY_AREA\XHTEST\BACKUPSET\2009_10_23\O1
_MF_NNNDF_TAG20091023T101508_5G24FGM1_.BKP
  备份集 13 中的数据文件列表
  文件 LV 类型 Ckp SCN    Ckp 时间   名称
  ---- -- ---- ---------- ---------- ----
  1       Full 4967974    23-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\SYS
TEM01.DBF
  2       Full 4967974    23-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\UND
OTBS01.DBF
  3       Full 4967974    23-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\SYS
AUX01.DBF
  4       Full 4967974    23-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\USE
RS01.DBF
  5       Full 4967974    23-10月-09 F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\EXA
MPLE01.DBF
  6       Full 4967974    23-10月-09 E:\DATAFILE\TEST.DBF

 

环境好了 开始实验


SQL> conn xh/a831115
已连接。
SQL> drop table t1;

表已删除。

SQL> drop table t2;

表已删除。

SQL> create table t1 as select * from dba_objects;

表已创建。

SQL> create table  t2 nologging as select * from dba_objects;

表已创建。

SQL> create table  t3  as select * from dba_objects where 1=2 ;

表已创建。

SQL> insert into t3 select * from dba_objects;

已创建50449行。

SQL> insert /*+ append*/ into t3 select * from dba_objects;

已创建50449行。

SQL> commit;

提交完成。


SQL> select count(*) from t1;

  COUNT(*)
----------
     50448

SQL> select count(*) from t2;

  COUNT(*)
----------
     50448

SQL> select count(*) from t3;

  COUNT(*)
----------
    100898

SQL> alter system switch logfile;

系统已更改。

 

SQL> alter system checkpoint;

系统已更改。

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    4968719

SQL> alter system switch logfile;

系统已更改。

SQL> alter system checkpoint;

系统已更改。
SQL> drop table t1;

表已删除。

SQL> drop table t2;

表已删除。

SQL> drop table t3;

表已删除。

RMAN> run{startup force mount;
2> set until scn=4968719;
3> restore database;
4> recover database;
5> alter database open resetlogs;}

Oracle 实例已启动
数据库已装载

...................
恢复后查看结果

SQL> conn xh/a831115
已连接。
SQL> select count(*) from t1;

  COUNT(*)
----------
     50448
CTAS 的可以恢复

SQL> select count(*) from t2;
select count(*) from t2
                     *
第 1 行出现错误:
ORA-01578: ORACLE 数据块损坏 (文件号 4, 块号 516)
ORA-01110: 数据文件 4: 'F:\ORACLE\PRODUCT\10.2.0\ORADATA\XHTEST\USERS01.DBF'
ORA-26040: 数据块是使用 NOLOGGING 选项加载的


SQL语句带 nologging的 不能恢复

SQL> select count(*) from t3;

  COUNT(*)
----------
    100898   /*+append*/这种情况是 直接加载 会在HWM上块写,实验看出append可以恢复

 


关于select 会产生 redo
情况很简单 就是 delay block clean 延迟块清除

原因就是 用户的修改还未提交时,修改的快已经写入datafile,而用户提交时候 将不会从datafile中读到buffer cache 记录已经提交,这样太不明智了,所以oracle有了延迟块清除,当用户还未提交时,修改块已经写入datafile,此时oracle会在该块对应的undo block header事务表中记录已提交,等待下次select语句语句读时记录到上次修改的data block中 ,所以select 产生了 redo ,正常select 是不会产生redo的

SQL> create table t1(a int);

表已创建。

SQL> insert into t1 values(1);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
     69312

SQL> select * from t1;

         A
----------
         1

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
     69312~~~~~~~~~~~~select没有产生redo

 


SQL> update  xh.t1 set a=2;另一个session

已更新 1 行。

 

SQL> alter system flush buffer_cache;另一个session,先将dirty block刷新到buffer cache

系统已更改。

SQL> commit;另一个session

提交完成。

 

SQL> select * from t1;

         A
----------
         2

SQL> select value from v$mystat a ,v$statname b where a.statistic#=b.statistic#
and name='redo size';

     VALUE
----------
     69428~~~~~~~~~~~~~~产生redo了

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12020513/viewspace-617290/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-06-26

  • 博文量
    182
  • 访问量
    426787