Oracle中表空間offline的三種引數對比案例

迷倪小魏發表於2017-09-26


Oracle資料庫管理中,對錶空間操作是基礎中的基礎。其中,表空間Offline是我們經常接觸的。同資料檔案Offline一起,構成了Oracle維護資料一致性的重要體系結構。

 

一般我們比較常接觸到的,就是直接的alter tablespace xxx offline操作。但是在實際中,針對表空間對應資料檔案的不同情況,Oracle提供了三種offline的引數。同資料庫關閉shutdown對應的若干種引數一樣,不同的offline引數對應Oracle不同的行為,更引出後續不同的處理方法。

 

下面是Oracle11g官方文件關於表空間offline的相關解釋說明:

*************************************************************************************************************

You may want to take a tablespace offline for any of the following reasons:

  • To make a portion of the database unavailable while allowing normal access to the remainder of the database
  • To perform an offline tablespace backup (even though a tablespace can be backed up while online and in use)
  • To make an application and its group of tables temporarily unavailable while updating or maintaining the application
  • To rename or relocate tablespace datafiles

希望使表空間offline的原因如下:

?使資料庫的一部分不訪問,同時允許正常訪問資料庫的其餘部分

?要執行離線表空間備份(即使可以線上並在使用中備份表空間)

?在更新或維護應用程式時,使應用程式及其一組表暫時不可用

?重新命名或重新定位表空間資料檔案

When a tablespace is taken offline, the database takes all the associated files offline.

當表空間離線時,資料庫會將所有關聯的檔案離線。

You cannot take the following tablespaces offline:

  • SYSTEM
  • The undo tablespace
  • Temporary tablespaces

SYSTEMundo表空間、臨時表空間不可以offline

Before taking a tablespace offline, consider altering the tablespace allocation of any users who have been assigned the tablespace as a default tablespace. Doing so is advisable because those users will not be able to access objects in the tablespace while it is offline.

在使表空間離線之前,請考慮將已分配表空間的任何使用者的表空間分配更改為預設表空間。 這樣做是可取的,因為這些使用者在離線時將無法訪問表空間中的物件。

You can specify any of the following parameters as part of the ALTER TABLESPACE...OFFLINE statement:

Clause

Description

NORMAL

A tablespace can be taken offline normally if no error conditions exist for any of the datafiles of the tablespace. No datafile in the tablespace can be currently offline as the result of a write error. When you specify OFFLINE NORMAL, the database takes a checkpoint for all datafiles of the tablespace as it takes them offline. NORMAL is the default.

1normal offline的預設方式
2
normal 對錶空間的所有資料檔案執行檢查點操作,online表空間時不需要介質恢復。
3
normal 方式離線表空間時,不應該有寫錯誤,表空間所有檔案應該online狀態。

TEMPORARY

A tablespace can be taken offline temporarily, even if there are error conditions for one or more files of the tablespace. When you specify OFFLINE TEMPORARY, the database takes offline the datafiles that are not already offline, checkpointing them as it does so.

If no files are offline, but you use the temporary clause, media recovery is not required to bring the tablespace back online. However, if one or more files of the tablespace are offline because of write errors, and you take the tablespace offline temporarily, the tablespace requires recovery before you can bring it back online.

1offline temporary 表空間時,如果表空間中沒有offline的資料檔案,則online該表空間時不需要介質恢復。
2
offline temporary 表空間時,不會對已經offline的資料檔案執行檢查點操作,僅僅對online的資料檔案執行檢查點操作
3
offline temporary 表空間時,對於離線表空間之前已經offline的資料檔案,則online該表空間時,offline資料檔案需要介質恢復。

IMMEDIATE

A tablespace can be taken offline immediately, without the database taking a checkpoint on any of the datafiles. When you specify OFFLINE IMMEDIATE, media recovery for the tablespace is required before the tablespace can be brought online. You cannot take a tablespace offline immediately if the database is running in NOARCHIVELOGmode.

1offline immediate  不會對錶空間的任何檔案執行檢查點操作。
2
online表空間時需要對所有資料檔案進行media recovery
3
offline immediate 需要資料庫日誌模式為歸檔模式

 

Caution:

If you must take a tablespace offline, use the NORMAL clause (the default) if possible. This setting guarantees that the tablespace will not require recovery to come back online, even if after incomplete recovery you reset the redo log sequence using an ALTER DATABASE OPEN RESETLOGS statement.

如果必須使表空間離線,請儘可能使用NORMAL子句(預設值)。 此設定保證表空間不需要恢復線上恢復,即使在不完全恢復後,使用ALTER DATABASE OPEN RESETLOGS語句重置重做日誌序列。

Speify TEMPORARY only when you cannot take the tablespace offline normally. In this case, only the files taken offline because of errors need to be recovered before the tablespace can be brought online. Specify IMMEDIATE only after trying both the normal and temporary settings.

僅在不能使表空間正常離線時指定TEMPORARY 在這種情況下,只有在出現錯誤的情況下離線的檔案需要在表空間上線之前恢復。 僅在嘗試正常和臨時設定之後才指定IMMEDIATE

The following example takes the users tablespace offline normally:

ALTER TABLESPACE users OFFLINE NORMAL;

*************************************************************************************************************

 

透過以上官方文件的說明,將表空間進行Offline的命令很簡單,就是alter tablespace xxx offline;根據不同的情況,可以使用三種引數進行命令修飾,分別為normal、temporary和immediate。三個命令分別對應了Offline過程的不同行為。

 

下面的實驗中,我們透過具體的案例來區別三種命令引數的不同之處:

 

實驗環境:

(注意:是否歸檔模式對於資料表空間和檔案Offline行為至關重要!)

SYS@seiang11g>select * from v$version;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0      Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

SYS@seiang11g>archive log list;

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            /u01/app/oracle/arch

Oldest online log sequence     50

Next log sequence to archive   52

Current log sequence           52

 

示例一:歸檔模式下offline normal

 

建立表空間wjqtest,為了更加明顯進行試驗,該表空間由兩個資料檔案構成。

SYS@seiang11g>create tablespace wjqtest datafile '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf' size 5M

  2  extent management local uniform size 1M

  3  segment space management auto;

 

Tablespace created.

 

SYS@seiang11g>

SYS@seiang11g>alter tablespace wjqtest add datafile '/u01/app/oracle/oradata/OraDB11g/wjqtest02.dbf' size 5M;

 

Tablespace altered.

 

SYS@seiang11g>select tablespace_name,status from dba_tablespaces where tablespace_name='WJQTEST';

 

TABLESPACE_NAME                STATUS

------------------------------ ---------

WJQTEST                        ONLINE

 

SYS@seiang11g>select file_name,status,online_status from dba_data_files where tablespace_name='WJQTEST';

 

FILE_NAME                                          STATUS    ONLINE_

-------------------------------------------------- --------- -------

/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf     AVAILABLE ONLINE

/u01/app/oracle/oradata/OraDB11g/wjqtest02.dbf     AVAILABLE ONLINE

 

 

SCOTT@seiang11g>create table wjqtest tablespace wjqtest as select * from dba_objects where rownum<1000;

 

Table created.

 

SCOTT@seiang11g>select count(*) from wjqtest;

 

  COUNT(*)

----------

       999

 

SYS@seiang11g>alter tablespace wjqtest offline normal;

 

Tablespace altered.

 

SYS@seiang11g>select tablespace_name ,status from dba_tablespaces where tablespace_name='WJQTEST';

 

TABLESPACE_NAME                STATUS

------------------------------ ---------

WJQTEST                        OFFLINE

 

SYS@seiang11g>select file_name,status,online_status from dba_data_files where tablespace_name='WJQTEST';

 

FILE_NAME                                          STATUS    ONLINE_

-------------------------------------------------- --------- -------

/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf     AVAILABLE OFFLINE

/u01/app/oracle/oradata/OraDB11g/wjqtest02.dbf     AVAILABLE OFFLINE

 

[oracle@seiang11g trace]$ tail -f alert_seiang11g.log

Tue Sep 26 13:19:22 2017

alter tablespace wjqtest offline normal

Completed: alter tablespace wjqtest offline normal

Tue Sep 26 13:19:22 2017

Starting background process SMCO

Tue Sep 26 13:19:22 2017

SMCO started with pid=31, OS id=6497

Tue Sep 26 13:19:30 2017

Checker run found 3 new persistent data failures

 

資料檔案一個很重要的內容就是資料檔案頭的SCN號。我們知道,如果完全關閉資料庫或者check point的時候,Oracle是要保證控制檔案和資料檔案頭的SCN一致。

SYS@seiang11g>select file#, status, recover, fuzzy, checkpoint_change# from v$datafile_header;

 

     FILE# STATUS  REC FUZ CHECKPOINT_CHANGE#

---------- ------- --- --- ------------------

         1 ONLINE  NO  YES            1860869

         2 ONLINE  NO  YES            1860869

         3 ONLINE  NO  YES            1860869

         4 ONLINE  NO  YES            1860869

         5 ONLINE  NO  YES            1860869

         6 ONLINE  NO  YES            1860869

         7 ONLINE  NO  YES            1860869

         8 OFFLINE                          0

         9 OFFLINE                          0

 

9 rows selected.

 

SYS@seiang11g>

SYS@seiang11g>select file#,checkpoint_change#,online_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# ONLINE_CHANGE#

---------- ------------------ --------------

         1            1860869         925702

         2            1860869         925702

         3            1860869         925702

         4            1860869         925702

         5            1860869         951158

         6            1860869              0

         7            1860869              0

         8            1862009              0

         9            1862009              0

 

9 rows selected.

 

RMAN> list failure all;

 

using target database control file instead of recovery catalog

List of Database Failures

=========================

 

Failure ID Priority Status    Time Detected Summary

---------- -------- --------- ------------- -------

254        HIGH     OPEN      26-SEP-17     Tablespace 9: 'WJQTEST' is offline

222        HIGH     OPEN      26-SEP-17     One or more non-system datafiles are offline

 

如果是正常的offline normal,是可以直接online回正常的表空間。

SYS@seiang11g>alter tablespace wjqtest online;

 

Tablespace altered.

 

SYS@seiang11g>select file#, status, recover, fuzzy, checkpoint_change# from v$datafile_header;

 

     FILE# STATUS  REC FUZ CHECKPOINT_CHANGE#

---------- ------- --- --- ------------------

         1 ONLINE  NO  YES            1860869

         2 ONLINE  NO  YES            1860869

         3 ONLINE  NO  YES            1860869

         4 ONLINE  NO  YES            1860869

         5 ONLINE  NO  YES            1860869

         6 ONLINE  NO  YES            1860869

         7 ONLINE  NO  YES            1860869

         8 ONLINE  NO  YES            1862119

         9 ONLINE  NO  YES            1862119

 

9 rows selected.

 

SYS@seiang11g>

SYS@seiang11g>select file#,checkpoint_change#,online_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# ONLINE_CHANGE#

---------- ------------------ --------------

         1            1860869         925702

         2            1860869         925702

         3            1860869         925702

         4            1860869         925702

         5            1860869         951158

         6            1860869              0

         7            1860869              0

         8            1862119        1862119

         9            1862119        1862119

 

9 rows selected.

 

[oracle@seiang11g trace]$ tail -f alert_seiang11g.log

Tue Sep 26 13:21:47 2017

alter tablespace wjqtest online

Completed: alter tablespace wjqtest online

 

RMAN>  list failure all;

no failures found that match specification

 

 

在資料庫正常情況下,出於對效能考慮資料檔案頭SCN號是不能維持一致的。我們使用offline normal之後,各個資料檔案頭SCN相同。所以,offline normal特性是在offline的時候,要在表空間所有檔案上打check point,只要能夠打上SCN號,offline normal是可以正常完成的。也就是說,offline normal是表空間各個檔案一致性的關閉。

 

 

示例二:歸檔模式下offline temporary

 

Offline Normal是一種比較理想的情況。在很多時候,Offline一個Tablespace的時候,並不能執行成功。比如,在offline操作的時候,如果此時有正在進行的對錶空間物件的DDL和DML操作,offline可能會受到影響。此外,如果一個表空間中有資料檔案已經被Offline過了,我們正常是不能夠進行offline normal的。此時,我們就需要使用temporary。

 

我們首先將表空間的其中一個資料檔案offline。

 

SYS@seiang11g>alter database datafile '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf' offline;

 

Database altered.

 

 

注意:這個操作是在Archivelog模式下才能進行。如果是在非歸檔模式下,直接offline表空間中的一個資料檔案會出現ORA-01145的錯誤如下所示:
SYS@seiang11g>alter database datafile '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf' offline;
alter database datafile '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf' offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled

SYS@seiang11g>!oerr ora 01145
01145, 00000, "offline immediate disallowed unless media recovery enabled"
// *Cause: ALTER TABLESPACE ... OFFLINE IMMEDIATE or ALTER DATABASE DATAFILE
//         ... OFFLINE is only allowed if database is in ARCHIVELOG mode.
// *Action:Take tablespace offline normally or shutdown abort. Reconsider your
//         backup strategy. You could do this if you were archiving your logs.

要想對資料檔案離線,必須在歸檔模式下,這是Oracle自動保護的一種措施,防止在非歸檔模式下對資料檔案離線,造成資料丟失。

解決辦法:
可以在非歸檔模式下,
使用alter database datafile '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf ' offline for drop;語句將資料檔案離線,drop並不會刪除物理檔案。如果沒有使用alter system switch logfile;切換日誌檔案組,那麼可以採用recover datafile XXX;來恢復,並聯機。如果已切換日誌檔案組並清空了裡面的內容,這個資料檔案就不能再恢復聯機,永遠處於recover狀態(可以透過v$datafile檢視檢視)。所以如果在實際的生產環境中,儘量在歸檔模式下做離線資料檔案操作。

 

 

SYS@seiang11g>

SYS@seiang11g>select tablespace_name,status from dba_tablespaces where tablespace_name='WJQTEST';

 

TABLESPACE_NAME                STATUS

------------------------------ ---------

WJQTEST                        ONLINE

 

觀察表空間和資料檔案狀態,發現被offline的資料檔案狀態為Recover。

SYS@seiang11g>select file_name,status,online_status from dba_data_files where tablespace_name='WJQTEST';

 

FILE_NAME                                          STATUS    ONLINE_

-------------------------------------------------- --------- -------

/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf     AVAILABLE RECOVER

/u01/app/oracle/oradata/OraDB11g/wjqtest02.dbf     AVAILABLE ONLINE

看到的檔案recover狀態,就表明如果需要這個檔案回到Online狀態,需要進行Recover。此時,Online狀態表空間下的幾個檔案狀態是不一致的。

 

 

注意,Oracle維持資料檔案一致性,是一個動態一致性的過程。如果某一個檔案或者物件臨時性的退出了這個一致性機制,就表示這個檔案或者物件已經不一致。如果該物件希望迴歸到原有的一致性體系裡面,就需要進行RecoverOracle進行Recover手段就需要藉助於連續的redo log檔案。

 

嘗試使用offline normal表空間

SYS@seiang11g>alter tablespace wjqtest offline normal;

alter tablespace wjqtest offline normal

*

ERROR at line 1:

ORA-01191: file 8 is already offline - cannot do a normal offline

ORA-01110: data file 8: '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf'

 

SCOTT@seiang11g>create table tb_test tablespace wjqtest as select * from dba_objects where 1=0;

 

Table created.

 

[oracle@seiang11g trace]$ tail -f alert_seiang11g.log

Tue Sep 26 13:26:53 2017

alter tablespace wjqtest offline normal

ORA-1191 signalled during: alter tablespace wjqtest offline normal...

Tue Sep 26 13:26:53 2017

Checker run found 1 new persistent data failures

 

 

正常normal offline已經不能成功了。此時可以使用temporary引數。

SYS@seiang11g>alter tablespace wjqtest offline temporary;

 

Tablespace altered.

 

SYS@seiang11g>

SYS@seiang11g>select tablespace_name,status from dba_tablespaces where tablespace_name='WJQTEST';

 

TABLESPACE_NAME                STATUS

------------------------------ ---------

WJQTEST                        OFFLINE

 

SYS@seiang11g>

SYS@seiang11g>select file_name,status,online_status from dba_data_files where tablespace_name='WJQTEST';

 

FILE_NAME                                          STATUS    ONLINE_

-------------------------------------------------- --------- -------

/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf     AVAILABLE RECOVER

/u01/app/oracle/oradata/OraDB11g/wjqtest02.dbf     AVAILABLE OFFLINE

 

[oracle@seiang11g trace]$ tail -f alert_seiang11g.log

Tue Sep 26 13:30:01 2017

alter tablespace wjqtest offline temporary

Completed: alter tablespace wjqtest offline temporary

Tue Sep 26 13:30:15 2017

Checker run found 2 new persistent data failures

 

使用temporary引數實現了Offline。但是對於那個提前進行offline的資料檔案,狀態依然是recover。猜想,Temporary Offline的過程是一種不一致的關閉。

 

檢視檢視v$datafile和v$datafile_header反映了控制檔案和資料檔案頭中檔案SCN號的記錄。在offline normal的時候,我們看到了各個檔案的一致性。在進行offline normal的時候,Oracle是打入了一個check point(內部),來同步各個檔案的檔案頭SCN。

 

在使用Temporary的時候,檢視狀態如何呢?

 

SYS@seiang11g>select file#, status, recover, fuzzy, checkpoint_change# from v$datafile_header;

 

     FILE# STATUS  REC FUZ CHECKPOINT_CHANGE#

---------- ------- --- --- ------------------

         1 ONLINE  NO  YES            1860869

         2 ONLINE  NO  YES            1860869

         3 ONLINE  NO  YES            1860869

         4 ONLINE  NO  YES            1860869

         5 ONLINE  NO  YES            1860869

         6 ONLINE  NO  YES            1860869

         7 ONLINE  NO  YES            1860869

         8 OFFLINE YES YES            1862119

         9 OFFLINE NO  NO             1862456

 

9 rows selected.

 

SYS@seiang11g>

SYS@seiang11g>select file#,checkpoint_change#,online_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# ONLINE_CHANGE#

---------- ------------------ --------------

         1            1860869         925702

         2            1860869         925702

         3            1860869         925702

         4            1860869         925702

         5            1860869         951158

         6            1860869              0

         7            1860869              0

         8            1862119        1862119

         9            1862456        1862119

 

9 rows selected.

 

控制檔案和資料檔案頭上面兩個檔案的SCN編號不相同,說明在一個表空間內部檔案的SCN號是不一致的。

 

說明:在Temporary Offline的時候,一些“有問題”的資料檔案和“沒問題”的資料檔案狀態是可以不一樣。“沒問題”的資料檔案之間SCN號是一致。

 

如果此時直接Online表空間的話會報錯ORA-01113和ORA-01110。

 

SYS@seiang11g>alter tablespace wjqtest online;

alter tablespace wjqtest online

*

ERROR at line 1:

ORA-01113: file 8 needs media recovery

ORA-01110: data file 8: '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf'

 

在online的時候,Oracle一定會去online一個“一致”的表空間。此時,它會發現表空間內部SCN的不一致。根據提示,我們需要手工進行檔案恢復。

SYS@seiang11g>recover datafile 8;

Media recovery complete.

 

SYS@seiang11g>alter tablespace wjqtest online;

 

Tablespace altered.

 

online成功了,在alert 日誌中看到了進行media recovery中使用的redo log apply乃至archived redo log apply過程。注意:此時我們只恢復了datafile 6

[oracle@seiang11g trace]$ tail -f alert_seiang11g.log

Tue Sep 26 13:34:05 2017

ALTER DATABASE RECOVER  datafile 8 

Media Recovery Start

Serial Media Recovery started

Recovery of Online Redo Log: Thread 1 Group 1 Seq 52 Reading mem 0

  Mem# 0: /u01/app/oracle/oradata/OraDB11g/redo01.log

Media Recovery Complete (seiang11g)

Completed: ALTER DATABASE RECOVER  datafile 8 

 

SYS@seiang11g>select file#, status, recover, fuzzy, checkpoint_change# from v$datafile_header;

 

     FILE# STATUS  REC FUZ CHECKPOINT_CHANGE#

---------- ------- --- --- ------------------

         1 ONLINE  NO  YES            1860869

         2 ONLINE  NO  YES            1860869

         3 ONLINE  NO  YES            1860869

         4 ONLINE  NO  YES            1860869

         5 ONLINE  NO  YES            1860869

         6 ONLINE  NO  YES            1860869

         7 ONLINE  NO  YES            1860869

         8 ONLINE  NO  YES            1863020

         9 ONLINE  NO  YES            1863020

 

9 rows selected.

 

SYS@seiang11g>

SYS@seiang11g>select file#,checkpoint_change#,online_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# ONLINE_CHANGE#

---------- ------------------ --------------

         1            1860869         925702

         2            1860869         925702

         3            1860869         925702

         4            1860869         925702

         5            1860869         951158

         6            1860869              0

         7            1860869              0

         8            1863020        1862119

         9            1863020        1862119

 

 

示例三:歸檔模式下offline immediate

 

首先對錶空間中的一個資料檔案進行offline,然後再對相應的表空間進行offline,就會出現報錯ORA-01191和ORA-01110

SYS@seiang11g>alter database datafile '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf' offline;

 

Database altered.

 

SYS@seiang11g>

SYS@seiang11g>alter tablespace wjqtest offline;

alter tablespace wjqtest offline

*

ERROR at line 1:

ORA-01191: file 8 is already offline - cannot do a normal offline

ORA-01110: data file 8: '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf'

 

此處使用offline immediate操作。

SYS@seiang11g>alter tablespace wjqtest offline immediate;

 

Tablespace altered.

 

SYS@seiang11g>

SYS@seiang11g>select file#, status, recover, fuzzy, checkpoint_change# from v$datafile_header;

 

     FILE# STATUS  REC FUZ CHECKPOINT_CHANGE#

---------- ------- --- --- ------------------

         1 ONLINE  NO  YES            1863090

         2 ONLINE  NO  YES            1863090

         3 ONLINE  NO  YES            1863090

         4 ONLINE  NO  YES            1863090

         5 ONLINE  NO  YES            1863090

         6 ONLINE  NO  YES            1863090

         7 ONLINE  NO  YES            1863090

         8 OFFLINE YES YES            1863090

         9 OFFLINE YES YES            1863090

 

9 rows selected.

 

SYS@seiang11g>

SYS@seiang11g>select file#,checkpoint_change#,online_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# ONLINE_CHANGE#

---------- ------------------ --------------

         1            1863090         925702

         2            1863090         925702

         3            1863090         925702

         4            1863090         925702

         5            1863090         951158

         6            1863090              0

         7            1863090              0

         8            1863090        1862119

         9            1863090        1862119

 

 

[oracle@seiang11g trace]$ tail -f alert_seiang11g.log

Tue Sep 26 13:40:52 2017

alter tablespace wjqtest offline immediate

Completed: alter tablespace wjqtest offline immediate

 

immediate和temporary相似地方是:在“有問題”資料檔案存在的情況下,表空間依然可以進行Offline操作。但是區別是,Oracle在immediate引數情況下,就不會給任何資料檔案進行check point統一SCN動作了。這種方法類似於shutdown abort。無論檔案是不是有問題,Oracle都不進行檢查和統一動作。

 

有一個細節需要注意,就是v$datafile_header中的recover列。在normal引數的時候,這個列是不顯示的,也就是表示這個問題不需要關注和理睬。在tempory模式下,只有那些“有問題”檔案才會被標註為YES,也就是需要進行Recover。其他沒問題的檔案狀態為NO,也就是不需要進行recover。上面的案例證明了這點。

 

在immediate引數情況下,所有檔案狀態都是YES,表示無論好壞,都要進行recover。

 

下面嘗試online動作。

 

SYS@seiang11g>alter tablespace wjqtest online;

alter tablespace wjqtest online

*

ERROR at line 1:

ORA-01113: file 8 needs media recovery

ORA-01110: data file 8: '/u01/app/oracle/oradata/OraDB11g/wjqtest01.dbf'

 

SYS@seiang11g>

SYS@seiang11g>recover datafile 8;

Media recovery complete.

 

依然不行,需要將所有的檔案都recover一遍,索性直接recover表空間

SYS@seiang11g>alter tablespace wjqtest online;

alter tablespace wjqtest online

*

ERROR at line 1:

ORA-01113: file 9 needs media recovery

ORA-01110: data file 9: '/u01/app/oracle/oradata/OraDB11g/wjqtest02.dbf'

 

SYS@seiang11g>recover tablespace wjqtest;

Media recovery complete.

 

[oracle@seiang11g trace]$ tail -f alert_seiang11g.log

Tue Sep 26 13:42:44 2017

Checker run found 1 new persistent data failures

Tue Sep 26 13:43:04 2017

ALTER DATABASE RECOVER  datafile 8 

Media Recovery Start

Serial Media Recovery started

Recovery of Online Redo Log: Thread 1 Group 1 Seq 52 Reading mem 0

  Mem# 0: /u01/app/oracle/oradata/OraDB11g/redo01.log

Media Recovery Complete (seiang11g)

Completed: ALTER DATABASE RECOVER  datafile 8 

alter tablespace wjqtest online

ORA-1113 signalled during: alter tablespace wjqtest online...

Tue Sep 26 13:44:43 2017

ALTER DATABASE RECOVER  tablespace wjqtest 

Media Recovery Start

Serial Media Recovery started

Recovery of Online Redo Log: Thread 1 Group 1 Seq 52 Reading mem 0

  Mem# 0: /u01/app/oracle/oradata/OraDB11g/redo01.log

Media Recovery Complete (seiang11g)

Completed: ALTER DATABASE RECOVER  tablespace wjqtest 

 

 

總結

 我們來總結一下Offline三種引數的情況。
(1)offline normal:是最常用的引數,也最不容易出問題。Offline Normal的時候,Oracle會在表空間內部進行Check Point動作,保證表空間內部各個檔案頭上面的SCN一致,也就是資料一致。如果存在資料檔案不能前推SCN,如已經Offline,的情況,offline normal失效報錯。

(2)offline temporary:比Normal要求略松的一種關閉模式。Temporary模式下,Oracle依然會去“嘗試”統一表空間內部檔案頭的SCN號。如果資料檔案可以統一,就進行Check Point動作,如果檔案不能統一,操作也不會報錯,只是將其狀態標記為不一致。Temporary模式下Offline的表空間Online的時候,那些“有問題”的不一致檔案,是需要進行media recovey的。沒有問題,打入check point的資料檔案,就不需要進行恢復動作。

(3)offline immediate:最松的一種offline模式。Immediate模式下,Oracle不會進行check point動作,無論有無問題的Datafile,都會被設定為需要Recover過程。在重新online的時候,表空間就需要進行重新的全表空media recover。




作者:SEian.G(苦練七十二變,笑對八十一難)


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

相關文章