SQL>> SQL> select file#,name,enabled from v$datafile where file#=6;
FILE# NAME ENABLED
---------- --------------------------------------------- ----------
6 /u01/app/oracle/oradata/orcl/tbs01.dbf READ ONLY
SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf
SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');
SQL> update scott.tb1 set sal=sal*1.2 where ename='SCOTT';
SQL> delete from scott.tb1 where ename='SCOTT';
--执行上述三条命令,收到下列同样的错误提示
ORA-00372: file 6 cannot be modified at this time
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
从上面的演示可以看出对只读表空间内的数据作任何DML操作均不可用
在 Oracle 表空间与数据文件 一文中,可以对只读表空间作delete操作(版本是10.2.0.1.0),应该是数
据库补丁的问题, 此版本为10.2.0.4.0。
--使用vim 打开?/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该只读表空间的数据文件
--重启数据库后收到下面的错误提示
ORA-01157: cannot> ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf
SQL>> SQL> insert into scott.tb1(empno,ename) values(3333,'Thomas');
SQL> commit;
--使用vim 打开/u01/app/oracle/oradata/orcl/tbs01.dbf文件做任意操作来模拟破坏该读写表空间的数据文件
--重启数据库后未收到错误提示
SQL> insert into scott.tb1(empno,ename) values(4444,'Jackson');
insert into scott.tb1(empno,ename) values(4444,'Jackson')
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/u01/app/oracle/oradata/orcl/tbs01.dbf'
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ---------------- ---------- ---------
6 OFFLINE OFFLINE FILE NOT FOUND 0
SQL> ho cp /tmp/tbs01.dbf /u01/app/oracle/oradata/orcl/tbs01.dbf
SQL> recover datafile 6;
Media recovery complete.
SQL>>
Tablespace> SQL> select * from scott.tb1 where ename='Thomas';
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
3333 Thomas
3. 演示由读写表空间变为只读表空间,且仅有读写表空间备份的恢复(对应前面描述的case 3)
SQL> select file#,name,enabled from v$datafile where file#=6;
FILE# NAME ENABLED
---------- --------------------------------------------- ----------
6 /u01/app/oracle/oradata/orcl/tbs01.dbf READ WRITE
SQL>> SQL> ho cp /u01/app/oracle/oradata/orcl/tbs01.dbf /tmp/tbs01.dbf
SQL>> SQL> delete from scott.tb1 where empno=3333;
SQL> commit;