oracle實驗記錄 (oracle 詳細分析redo(5))
關於減少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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle實驗記錄 (oracle 詳細分析redo(1))Oracle
- oracle實驗記錄 (oracle 詳細分析redo(2))Oracle
- oracle實驗記錄 (oracle 詳細分析redo(3))Oracle
- oracle實驗記錄 (oracle 詳細分析redo(4))Oracle
- oracle實驗記錄 (oracle 10G 詳細分析undo)Oracle
- oracle實驗記錄 (恢復-redo)Oracle
- oracle實驗記錄 (oracle 10G dataguard(4)redo傳輸&程式)Oracle
- oracle實驗記錄 (oracle 分析shared pool(1))Oracle
- oracle實驗記錄 (oracle 分析shared pool(2))Oracle
- oracle實驗記錄 (精細策略dbms_rls)Oracle
- oracle實驗記錄 (buffer_cache分析(1))Oracle
- oracle實驗記錄 (oracle reset parameter)Oracle
- oracle實驗記錄 (oracle 10G dataguard(5)實時應用)Oracle
- oracle實驗記錄 (flashback)Oracle
- oracle實驗記錄 (OMF)Oracle
- oracle實驗記錄 (NET)Oracle
- oracle實驗記錄 (audit)Oracle
- oracle實驗記錄 (分析oracle硬解析&軟解析&fast soft parse)OracleAST
- oracle實驗記錄 (oracle 資料字典)Oracle
- Oracle Data Redaction實驗記錄Oracle
- oracle實驗記錄 (block cleanout)OracleBloC
- oracle實驗記錄 (dump undo)Oracle
- oracle實驗記錄 (inlist card)Oracle
- oracle實驗記錄 (分析oracle硬解析&軟解析&fast soft parse(2))OracleAST
- oracle實驗記錄 (buffer_cache分析(2)cbc latch)Oracle
- Oracle檔案改名實驗記錄Oracle
- oracle實驗記錄 (選擇率)Oracle
- oracle實驗記錄 (dump logfile)Oracle
- oracle實驗記錄 (事務控制)Oracle
- oracle實驗記錄 (函式index)Oracle函式Index
- oracle實驗記錄 (bigfile tablespace)Oracle
- oracle實驗記錄 (expdp/impdp使用)Oracle
- oracle實驗記錄 (transport tablespace(Rman))Oracle
- oracle實驗記錄 (使用exp/imp)Oracle
- oracle實驗記錄 (oracle consistent gets 計算)Oracle
- Oracle Standby Redo Log實驗兩則Oracle
- oracle實驗記錄(buffer_cache分析(4)dbwr,lgwr,ckpt)Oracle
- oracle redo檔案記錄的內容Oracle Redo