这篇文章主要探讨不可恢复操作是否对后面的操作有影响。
首先看一下不可恢复的操作后的DML在恢复过程中会怎样:
SQL> SELECT DEFAULT_TABLESPACE FROM USER_USERS;
DEFAULT_TABLESPACE
------------------------------
YANGTK
SQL> ALTER TABLESPACE YANGTK BEGIN BACKUP;
表空间已更改。
SQL> HOST COPY F:ORACLEORADATATESTYANGTK01.DBF F:ORACLEBACKUPTEST20060326
SQL> ALTER TABLESPACE YANGTK END BACKUP;
表空间已更改。
SQL> CREATE TABLE TEST_UNRECOVER NOLOGGING AS SELECT * FROM DBA_TABLES;
表已创建。
SQL> CREATE INDEX IND_TEST_UNRECOVER_OWNER ON TEST_UNRECOVER (OWNER) LOGGING;
索引已创建。
SQL> UPDATE TEST_UNRECOVER SET OWNER = 'YANGTK';
已更新503行。
SQL> COMMIT;
提交完成。
SQL> ALTER TABLESPACE YANGTK OFFLINE IMMEDIATE;
表空间已更改。
SQL> HOST COPY F:ORACLEBACKUPTEST20060326* 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 选项加载的
SQL> SELECT COUNT(*) FROM TEST_UNRECOVER WHERE OWNER = 'YANGTK';
COUNT(*)
----------
503
通过测试可以发现,ORACLE并没有简单的在恢复过程中忽略UPDATE操作,通过访问LOGGING的索引就可以发现,但是表上的UPDATE操作应该没有执行,整个表以及被标识为逻辑损坏了。
下面测试一下,执行了不可恢复操作的表在恢复中对其它表的影响:
SQL> DROP TABLE TEST_UNRECOVER;
表已丢弃。
www.ixdba.net
SQL> CREATE TABLE TEST_UNRECOVER NOLOGGING AS SELECT * FROM DBA_TABLES;
表已创建。
SQL> CREATE TABLE TEST_RECOVER1 AS SELECT * FROM TEST_UNRECOVER;
表已创建。
SQL> DELETE TEST_UNRECOVER WHERE ROWNUM < 500;
已删除499行。
SQL> CREATE TABLE TEST_RECOVER2 AS SELECT * FROM TEST_UNRECOVER;
表已创建。
SQL> ALTER TABLESPACE YANGTK OFFLINE IMMEDIATE;
表空间已更改。
SQL> HOST COPY F:ORACLEBACKUPTEST20060326* 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 选项加载的
SQL> SELECT COUNT(*) FROM TEST_RECOVER1;
COUNT(*)
----------
503
SQL> SELECT COUNT(*) FROM TEST_RECOVER2;
COUNT(*)
----------
4
虽然TEST_UNRECOVER表被标识成逻辑损坏,且随后的DELETE操作也没有执行。但是由于Oracle记录日志的方式并不依赖于源数据库表,因此,虽然两位的两张表都是从这张表插入数据,但都可以正常的恢复。
最后看一下对完整性约束是否存在影响:
SQL> DROP TABLE TEST_UNRECOVER;
表已丢弃。
SQL> DROP TABLE TEST_RECOVER1;
表已丢弃。
SQL> DROP TABLE TEST_RECOVER2;
表已丢弃。
SQL> CREATE TABLE TEST_UNRECOVER NOLOGGING AS SELECT ROWNUM ID, A.* FROM DBA_TABLES A;
表已创建。
SQL> CREATE INDEX IND_TEST_UNRECOVER_ID ON TEST_UNRECOVER(ID) NOLOGGING;
索引已创建。
SQL> ALTER TABLE TEST_UNRECOVER ADD PRIMARY KEY (ID) USING INDEX IND_TEST_UNRECOVER_ID;
表已更改。
SQL> CREATE TABLE TEST_RECOVER1 (ID NUMBER, FID NUMBER, OWNER VARCHAR2(30),