对于采用NOLOGGING方式创建的表,由于系统不产生重做日志,因此即使Oracle处于归档模式下也无法恢复表中的数据。
下面看个对比的例子:
SQL> SELECT DEFAULT_TABLESPACE FROM USER_USERS;
DEFAULT_TABLESPACE
------------------------------
YANGTK
SQL> ALTER TABLESPACE YANGTK BEGIN BACKUP;
表空间已更改。
SQL> HOST COPY F:ORACLEORADATATESTYANGTK01.DBF F:ORACLEBACKUPTEST20060324
SQL> ALTER TABLESPACE YANGTK END BACKUP;
表空间已更改。
SQL> CREATE TABLE TEST_RECOVER AS SELECT * FROM DBA_TABLES;
表已创建。
SQL> ALTER TABLESPACE YANGTK OFFLINE IMMEDIATE;
表空间已更改。
SQL> HOST COPY F:ORACLEBACKUPTEST20060324* F:ORACLEORADATATEST
SQL> RECOVER TABLESPACE YANGTK;
完成介质恢复。
SQL> ALTER TABLESPACE YANGTK ONLINE;
表空间已更改。
SQL> SELECT COUNT(*) FROM TEST_RECOVER;
COUNT(*)
----------
502
对于普通的CTAS操作建立的表,数据是可以进行恢复的。
SQL> CREATE TABLE TEST_UNRECOVER NOLOGGING AS SELECT * FROM DBA_TABLES;
表已创建。
SQL> ALTER TABLESPACE YANGTK OFFLINE IMMEDIATE;
表空间已更改。
SQL> HOST COPY F:ORACLEBACKUPTEST20060324* F:ORACLEORADATATEST
SQL> RECOVER TABLESPACE YANGTK;
完成介质恢复。
SQL> ALTER TABLESPACE YANGTK ONLINE;
表空间已更改。
SQL> SELECT COUNT(*) FROM TEST_UNRECOVER;
SELECT COUNT(*) FROM TEST_UNRECOVER
*
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号6,块号274)
ORA-01110: 数据文件 6: 'F:ORACLEORADATATESTYANGTK01.DBF'
ORA-26040: 数据块是使用 NOLOGGING 选项加载的
通过CREATE AS SELECT NOLOGGING方式建立的数据表不会产生日志,因此恢复操作不会恢复表中的数据,而且,恢复操作也不会报错。
www.ixdba.net
这种无法恢复的表别标识为逻辑损坏,只能删除重建。如果以这种方式建立的表中的数据也是必须进行恢复的,则需要在不可恢复的操作完成后,马上进行备份。