轉載-表空間和資料檔案offline的影響分析

浪漫雙魚發表於2011-04-13

簡單的說,offline datafile不做檢查點,online的時候需要恢復
offline tablespace做檢查點(注意這裡指normal),online的時候不需要恢復

表空間offline

將表空間離線的語法中有三個子句可選,如下:

ALTER TABLESPACE tablespace_name OFFLINE [NORMAL,TEMPORARRY,IMMEDIATE]

現在對這三個子句的作用及對資料庫的影響做個比較。

【NORMAL 】

如果用NORMAL子句則會使表空間所屬的資料檔案的塊的內容在系統全域性區裡的資料重新整理到檔案中,因此當你再次將表空間聯機時不需要恢復表空間裡的資料檔案。這也是預設子句。

【IMMEDIATE】

如果你在語句中指定IMMEDIATE,則資料庫不確定會對錶空間所屬資料檔案進行檢查點,這時就會造成離線檔案與資料庫不一致,所以當你需要將其聯機時,就需要進行恢復操作。

【TEMPORARY】

如果在語法中指定TEMPORARY 子句,則資料庫會執行檢查點程式,會對離線表空間中的資料檔案進行同步。但資料庫不能確定會對所有資料檔案進行。所以當你將表空間聯機時,有可能會需要進行恢復。

 

比較以下三種狀態對資料字典的影響
RMAN.DBF
檔案offline
users   
表空間offline
最後一次,users 表空間offline immediate


sys@FOX> alter database datafile 'D:\ORACLE\ORADATA\FOX\RMAN.DBF' offline;

Database altered.

--dump
控制檔案
sys@FOX> ALTER SESSION SET EVENTS 'immediate trace name controlf level 3';

Session altered.
--dump
資料檔案
sys@FOX> ALTER SESSION SET EVENTS 'immediate trace name file_hdrs level 2';

Session altered.

sys@FOX> select substr(name, 1, 40) dname, CHECKPOINT_CHANGE#,LAST_CHANGE# ,OFFLINE_CHANGE#,status from v$datafile;

DNAME                                    CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# STATUS
---------------------------------------- ------------------ ------------ --------------- -------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF               2460183058                   2460066227 SYSTEM
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF              2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\INDX01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\USERS01.DBF                2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\DEMO01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\RMAN.DBF                   2460183058   2460183439      2460066227 RECOVER

6 rows selected.

sys@FOX> select substr(name, 1, 40) dname, CHECKPOINT_CHANGE#,LAST_CHANGE# ,OFFLINE_CHANGE#,creation_change#,status from
 v$datafile;

DNAME                                    CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# CREATION_CHANGE# STATUS
---------------------------------------- ------------------ ------------ --------------- ---------------- -------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF               2460183058                   2460066227             5 SYSTEM
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF              2460183058                   2460066227             5042 ONLINE
D:\ORACLE\ORADATA\FOX\INDX01.DBF                 2460183058                   2460066227             6491 ONLINE
D:\ORACLE\ORADATA\FOX\USERS01.DBF                2460183058                   2460066227             6529 ONLINE
D:\ORACLE\ORADATA\FOX\DEMO01.DBF                 2460183058                   2460066227           483025 ONLINE
D:\ORACLE\ORADATA\FOX\RMAN.DBF                   2460183058   2460183439      2460066227          1899464 RECOVER

6 rows selected.

dumpcf檔案可以看到檔案8 Stop scn: 0x0000.92a36b8f
sys@FOX> select to_number('92a36b8f','xxxxxxxx') from dual;

TO_NUMBER('92A36B8F','XXXXXXXX')
--------------------------------
                      2460183439
就是last_change#

sys@FOX> alter tablespace users offline;

Tablespace altered.
sys@FOX> select name,SCNBAS from ts$;

NAME                                                   SCNBAS
-------------------------------------------------- ----------
SYSTEM                                                      0
UNDOTBS1                                                    0
TEMP                                                        0
INDX                                                        0
TOOLS                                                       0
USERS                                              2460183864
DEMO                                                        0
TEST                                                        0
RMAN                                                        0

sys@FOX> select substr(name, 1, 40) dname, CHECKPOINT_CHANGE#,LAST_CHANGE# ,OFFLINE_CHANGE#,status from v$datafile;

DNAME                                    CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# STATUS
---------------------------------------- ------------------ ------------ --------------- -------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF               2460183058                   2460066227 SYSTEM
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF              2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\INDX01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\USERS01.DBF                2460183864   2460183864      2460066227 OFFLINE
D:\ORACLE\ORADATA\FOX\DEMO01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\RMAN.DBF                   2460183058   2460183439      2460066227 RECOVER

6 rows selected.

sys@FOX> select substr(name,1,40) dname, recover, fuzzy, checkpoint_change#,CHECKPOINT_COUNT from v$datafile_header;

DNAME                                    REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------------------------------------- --- --- ------------------ ----------------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF       NO  YES         2460183058             1708
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF      NO  YES         2460183058             1701
D:\ORACLE\ORADATA\FOX\INDX01.DBF         NO  YES         2460183058             1692
                                                                  0                0
D:\ORACLE\ORADATA\FOX\DEMO01.DBF         NO  YES         2460183058             1661
D:\ORACLE\ORADATA\FOX\RMAN.DBF           YES YES         2460183058             1637

6 rows selected.
tablespace offline normal
時,生成了一個ts$.SCNBAS(離線scn),對應於每個資料檔案的結束SCN,基於ts$.SCNBAS(離線scn)能夠直接online 
同時可以看到users表空間對應的checkpoint_change#=last_change#
會影響CONTROLFILE_CHANGE#

再來看offline immediate
沒有生成離線scn。也會影響CONTROLFILE_CHANGE#
sys@FOX> alter tablespace users offline immediate;

Tablespace altered.

sys@FOX> select name,SCNBAS from ts$;

NAME                                                   SCNBAS
-------------------------------------------------- ----------
SYSTEM                                                      0
UNDOTBS1                                                    0
TEMP                                                        0
INDX                                                        0
TOOLS                                                       0
USERS                                                       0
DEMO                                                        0
TEST                                                        0
RMAN                                                        0
TESTING_LMT_ASSM                                            0
TEST_TBS                                                    0
UNDOTBS2                                                    0
TBS_2K                                                      0
T_S                                                   6455446
T_1                                                         0
TEST1                                                       0
TESTING_LMT_MSSM                                            0
TBS_TEST                                                    0

18 rows selected.
同時可以看到last_change#>checkpoint_change#,這兩個就是檔案恢復的終點和起點
sys@FOX> select substr(name, 1, 40) dname, CHECKPOINT_CHANGE#,LAST_CHANGE# ,OFFLINE_CHANGE#,status from v$datafile;

DNAME                                    CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# STATUS
---------------------------------------- ------------------ ------------ --------------- -------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF               2460183058                   2460066227 SYSTEM
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF              2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\INDX01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\USERS01.DBF                2460184060   2460184084      2460183864 RECOVER
D:\ORACLE\ORADATA\FOX\DEMO01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\RMAN.DBF                   2460183058   2460183439      2460066227 RECOVER

6 rows selected.

sys@FOX> select substr(name,1,40) dname, recover, fuzzy, checkpoint_change#,CHECKPOINT_COUNT from v$datafile_header;

DNAME                                    REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------------------------------------- --- --- ------------------ ----------------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF       NO  YES         2460183058             1708
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF      NO  YES         2460183058             1701
D:\ORACLE\ORADATA\FOX\INDX01.DBF         NO  YES         2460183058             1692
D:\ORACLE\ORADATA\FOX\USERS01.DBF        YES YES         2460184060             1703
D:\ORACLE\ORADATA\FOX\DEMO01.DBF         NO  YES         2460183058             1661
D:\ORACLE\ORADATA\FOX\RMAN.DBF           YES YES         2460183058             1637

6 rows selected.

sys@FOX> recover tablespace users;
Media recovery complete.
sys@FOX> select substr(name, 1, 40) dname, CHECKPOINT_CHANGE#,LAST_CHANGE# ,OFFLINE_CHANGE#,status from v$datafile;

DNAME                                    CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# STATUS
---------------------------------------- ------------------ ------------ --------------- -------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF               2460183058                   2460066227 SYSTEM
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF              2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\INDX01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\USERS01.DBF                2460184084   2460184084      2460183864 OFFLINE
D:\ORACLE\ORADATA\FOX\DEMO01.DBF                 2460183058                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\RMAN.DBF                   2460183058   2460183439      2460066227 RECOVER

6 rows selected.

sys@FOX> select substr(name,1,40) dname, recover, fuzzy, checkpoint_change#,CHECKPOINT_COUNT from v$datafile_header;

DNAME                                    REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------------------------------------- --- --- ------------------ ----------------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF       NO  YES         2460183058             1708
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF      NO  YES         2460183058             1701
D:\ORACLE\ORADATA\FOX\INDX01.DBF         NO  YES         2460183058             1692
D:\ORACLE\ORADATA\FOX\USERS01.DBF        NO  NO          2460184084             1704
D:\ORACLE\ORADATA\FOX\DEMO01.DBF         NO  YES         2460183058             1661
D:\ORACLE\ORADATA\FOX\RMAN.DBF           YES YES         2460183058             1637

6 rows selected.

sys@FOX> alter tablespace users online;

Tablespace altered.

最後再看一下read only狀態
也會生成離線scn,同時users表空間對應的checkpoint_change#=last_change#
會影響CONTROLFILE_CHANGE#
sys@FOX>  alter tablespace USERS read only;

Tablespace altered.

sys@FOX> select name,SCNBAS from ts$;

NAME                                                   SCNBAS
-------------------------------------------------- ----------
SYSTEM                                                      0
UNDOTBS1                                                    0
TEMP                                                        0
INDX                                                        0
TOOLS                                                       0
USERS                                              2460184528
DEMO                                                        0
TEST                                                        0
RMAN                                                        0
TESTING_LMT_ASSM                                            0
TEST_TBS                                                    0
UNDOTBS2                                                    0
TBS_2K                                                      0
T_S                                                   6455446
T_1                                                         0
TEST1                                                       0
TESTING_LMT_MSSM                                            0
TBS_TEST                                                    0

18 rows selected.

sys@FOX> select substr(name,1,40) dname, recover, fuzzy, checkpoint_change#,CHECKPOINT_COUNT from v$datafile_header;

DNAME                                    REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------------------------------------- --- --- ------------------ ----------------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF       NO  YES         2460184522             1710
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF      NO  YES         2460184522             1703
D:\ORACLE\ORADATA\FOX\INDX01.DBF         NO  YES         2460184522             1694
D:\ORACLE\ORADATA\FOX\USERS01.DBF        NO  NO          2460184528             1708
D:\ORACLE\ORADATA\FOX\DEMO01.DBF         NO  YES         2460184522             1663
D:\ORACLE\ORADATA\FOX\RMAN.DBF           YES YES         2460183058             1637

6 rows selected.

sys@FOX> select substr(name, 1, 40) dname, CHECKPOINT_CHANGE#,LAST_CHANGE# ,OFFLINE_CHANGE#,status from v$datafile;

DNAME                                    CHECKPOINT_CHANGE# LAST_CHANGE# OFFLINE_CHANGE# STATUS
---------------------------------------- ------------------ ------------ --------------- -------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF               2460184522                   2460066227 SYSTEM
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF              2460184522                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\INDX01.DBF                 2460184522                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\USERS01.DBF                2460184528   2460184528      2460183864 ONLINE
D:\ORACLE\ORADATA\FOX\DEMO01.DBF                 2460184522                   2460066227 ONLINE
D:\ORACLE\ORADATA\FOX\RMAN.DBF                   2460183058   2460183439      2460066227 RECOVER

6 rows selected.

sys@FOX> select substr(name,1,40) dname, recover, fuzzy, checkpoint_change#,CHECKPOINT_COUNT from v$datafile_header;

DNAME                                    REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------------------------------------- --- --- ------------------ ----------------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF       NO  YES         2460184522             1710
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF      NO  YES         2460184522             1703
D:\ORACLE\ORADATA\FOX\INDX01.DBF         NO  YES         2460184522             1694
D:\ORACLE\ORADATA\FOX\USERS01.DBF        NO  NO          2460184528             1708
D:\ORACLE\ORADATA\FOX\DEMO01.DBF         NO  YES         2460184522             1663
D:\ORACLE\ORADATA\FOX\RMAN.DBF           YES YES         2460183058             1637

6 rows selected.

sys@FOX> select checkpoint_change#,CONTROLFILE_CHANGE#,resetlogs_change# from v$database;

CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# RESETLOGS_CHANGE#
------------------ ------------------- -----------------
        2460184522          2460184528        2460066228

sys@FOX> alter system checkpoint;

System altered.

sys@FOX> select checkpoint_change#,CONTROLFILE_CHANGE#,resetlogs_change# from v$database;

CHECKPOINT_CHANGE# CONTROLFILE_CHANGE# RESETLOGS_CHANGE#
------------------ ------------------- -----------------
        2460184615          2460184615        2460066228

sys@FOX> select substr(name,1,40) dname, recover, fuzzy, checkpoint_change#,CHECKPOINT_COUNT from v$datafile_header;

DNAME                                    REC FUZ CHECKPOINT_CHANGE# CHECKPOINT_COUNT
---------------------------------------- --- --- ------------------ ----------------
D:\ORACLE\ORADATA\FOX\SYSTEM01.DBF       NO  YES         2460184615             1711
D:\ORACLE\ORADATA\FOX\UNDOTBS01.DBF      NO  YES         2460184615             1704
D:\ORACLE\ORADATA\FOX\INDX01.DBF         NO  YES         2460184615             1695
D:\ORACLE\ORADATA\FOX\USERS01.DBF        NO  NO          2460184528             1708
D:\ORACLE\ORADATA\FOX\DEMO01.DBF         NO  YES         2460184615             1664
D:\ORACLE\ORADATA\FOX\RMAN.DBF           YES YES         2460183058             1637

6 rows selected.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11088128/viewspace-692430/,如需轉載,請註明出處,否則將追究法律責任。

相關文章