oracle實驗記錄 (oracle 詳細分析redo(5))

fufuh2o發表於2009-10-23

關於減少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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章