关于减少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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12020513/viewspace-617290/