希望能找到能与我共同进步的知心朋友!

发布新日志

  • 表空间的ONLINE和OFFLINE状态

    2018-05-14 15:45:41

     
    1. 只要数据库处于OPEN状态,除了SYSTEM表空间外的其他表空间,都可以将其置为online或offline状态。SYSTEM表空间之所以不能置为offline,是因为其中保存的数据字典需要一直使用。将表空间置为offline,可能的原因包括维护、备份以及恢复等目的。
     
    3. 如果表空间处于offline状态,那么Oracle不会允许任何对该表空间中对象的SQL执行。表空间置为offline时仍处于活动状态的语句在交易级别并不会受影响。Oracle会保存这些尚未完成语句相关的回滚数据到SYSTEM表空间。当表空间置为online时,如果有必要,那么Oracle会应用这些回滚数据。
     
    3. 除了Oracle外,没有任何应用能够读取或编辑offline的表空间。因此,offline的表空间更不能导到其他数据库。
     
    4. Oracle在一些场景下会自动切换表空间状态从online到offline。例如,当数据库写进程DBWn,尝试几次仍不能写入表空间的数据文件中。用户访问offline表空间时会收到一个报错。如果造成这种磁盘IO失败的问题是介质错误,解决这问题之后需要恢复表空间。
     
    5. 将表空间置为offline可能包含如下原因:
     
    (1) 需要禁止访问一部分数据库的场景。
     
    (2) 执行一次offline表空间备份(尽管表空间可以在online和使用情况下备份)。
     
    (3) 当更新或维护应用时,需要让应用和对应的表临时不能访问。
     
    (4) 重命名或重分配表空间中的数据文件。
     
    当表空间置为offline,数据库会将关联的所有数据文件都置为offline状态。但是如下表空间不能置为offline:
     
    > SYSTEM
     
    > UNDO表空间
     
    > 临时表空间
     
    6. 将表空间置为offline之前,若有用户设置该表空间为其默认表空间,需要考虑是否需要改变其默认表空间。之所以这样做,是因为这些用户将不能访问offline表空间中的对象。
     
    7. 使用ALTER TABLESPACE ... OFFLINE语句可以添加如下参数:
     
    NORMAL:如果表空间的任何数据文件没有出现错误,表空间能够正常地置为offline。如果出现写错误,那么表空间中的数据文件不会被置为offline。当明确使用OFFLINE NORMAL,数据库会对所有数据文件进行一次checkpoint检查点事件,NORMAL是默认设置。
     
    TEMPORARY:表空间能够临时置为offline状态,即使一个或多个文件出现错误。当使用OFFLINE TEMPORARY,数据库会将还没有置为offline的数据文件进行置位操作,并执行检查点事件。
     
    如果没有文件是offline,但使用了temporary语句,那么当将表空间置为online时不需要介质恢复。然而,如果表空间的一个或多个文件由于写入错误因此导致offline状态,能够临时将表空间置为offline状态,恢复online之前需要对表空间进行恢复操作。
     
    IMMEDIATE:表空间能够立即设置为offline状态,数据库不会进行任何数据文件的检查点事件。当使用OFFLINE IMMEDIATE,那表空间置为online之前需要对表空间进行介质恢复操作。但是如果数据库处于NOARCHIVELOG模式,表空间就不能立即置为offline状态。
     
    8. 如果必须设置表空间为offline状态,建议首先使用默认的NORMAL语句。他会确保当表空间置为online前不需要执行恢复操作,尽管在不完全恢复之后,使用LATER DATABASE OPEN RESTLOGS语句重置了redo日志sequence。
     
    仅仅当不能使用NORMAL方式将表空间置为offline时,可以使用TEMPORARY。使用TEMPORARY后,在表空间置为online前,仅需要恢复那些出错的offline文件。
     
    如果NORMAL和TEMPORARY都失败时,才可以选择使用IMMEDIATE选项。
     
    9. 如果表空间没有“干净地”置为offline(也就是没有使用NORMAL语句执行的offline操作),那么置为online前需要首先对该表空间执行介质恢复操作。否则数据库会报错,表空间仍处于offline状态。
     

    实验:
     
    1. 设置表空间DCSOPEN_TBS为offline:
     SQL> alter tablespace dcsopen_tbs offline;
     
    Tablespace altered.
     

     

    2. 查询数据文件状态:
     
    select file#, name, status from v$datafile;
     file  #name 
     status
     ---  ------------------------------------------------------ ----------
     
    11  /oracle/oradata_petest/petest/dcsopen_tbs02.dbf OFFLINE
     
    DCSOPEN_TBS使用的数据文件状态已经置为OFFLINE。
     

     

    3. 尝试查询已OFFLINE表空间:
     SQL> select * from test;
     select * from test
                  *
     ERROR at line 1:
     ORA-00376: file 7 cannot be read at this time
     ORA-01110: data file 7: '/oracle/oradata_petest/petest/dcsopen_tbs01.dbf'
     
    报错,提示此时数据文件不能读。
     

     

    4. 将表空间置为online:
     SQL> alter tablespace dcsopen_tbs online;
     
    Tablespace altered.
     


    file  #name 
     status
     ---  ------------------------------------------------------ ----------
     
    11  /oracle/oradata_petest/petest/dcsopen_tbs02.dbf ONLINE

Open Toolbar