发表于: 2008.11.19 21:23
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/474139
---------------------------------------------------------------
这个问题其实是来自论坛上的一个帖子:http://www.itpub.net/showthread.php?s=&threadid=658187。
帖子中的问题和文章的标题十分接近,其实不光是问题解决,答案也十分接近,造成这两种特殊情况成立的原因是同一个——只读表空间。
两个数据库加载同一个数据文件后,能否被一个或两个数据库只读打开。
同一个表空间能否被多个数据库同时打开:http://yangtingkun.itpub.net/post/468/228632
同一个表空间能否被多个数据库同时打开(二):http://yangtingkun.itpub.net/post/468/474088
继续上一篇文章的测试,第一个数据库采用只读方式打开TESTTBS表空间,然后在目标数据库通过迁移表空间的方式加载这个表空间。
加载成功后,下面尝试在源数据库中将表空间以读写方式打开:
SQL> CONN YANGTK/YANGTK@YTK92已连接。
SQL> ALTER TABLESPACE TESTTBS READ WRITE;
ALTER TABLESPACE TESTTBS READ WRITE
*第 1 行出现错误:
ORA-01256: 在锁定数据库文件 11 时出错
ORA-01110: 数据文件 11: 'E:ORACLEORADATAYTK92TESTTBS.DBF'
可以看到,源数据库修改读写状态报错,下面在目标数据库将表空间置为读写状态:
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> ALTER TABLESPACE TESTTBS READ WRITE;
表空间已更改。
SQL> INSERT INTO T_TESTTBS SELECT * FROM T_TESTTBS;
已创建20行。
SQL> COMMIT;
提交完成。
SQL> SELECT COUNT(*) FROM T_TESTTBS;
COUNT(*)
----------
40
在目标数据库可以将表空间置为读写状态,而且可以顺利的写入数据。
下面在源数据库检查可能看到修改,为了操作方便,新建一个会话进行查询:
SQL> SET SQLP 'SQL2> '
SQL2> SELECT COUNT(*) FROM T_TESTTBS;
COUNT(*)
----------
20
在源数据库中看不到修改,不过这个也不难理解,对于只读的表空间,Oracle肯定认为数据没有发生改变,现在得到的结果应该是从内存的CACHE返回的。尝试将表空间置为OFFLINE,在置于ONLINE状态,使得内存中的CACHE过期,但是操作发现报错:
SQL2> ALTER TABLESPACE TESTTBS OFFLINE;
表空间已更改。
SQL2> ALTER TABLESPACE TESTTBS ONLINE;
ALTER TABLESPACE TESTTBS ONLINE
*第 1 行出现错误:
ORA-01157: 无法标识/锁定数据文件 11 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 11: 'E:ORACLEORADATAYTK92TESTTBS.DBF'
看来目标数据库的独占锁导致了这个问题,那么先在目标数据库中将表空间置回只读状态:
SQL> ALTER TABLESPACE TESTTBS READ ONLY;
表空间已更改。
下面在源数据库再次将表空间ONLINE:
SQL2> ALTER TABLESPACE TESTTBS ONLINE;
ALTER TABLESPACE TESTTBS ONLINE
*第 1 行出现错误:
ORA-01122: 数据库文件 11 验证失败
ORA-01110: 数据文件 11: 'E:ORACLEORADATAYTK92TESTTBS.DBF'
ORA-01204: 文件号是10而不是 11 - 文件错误
这次错误信息发生了变化,根据错误信息的描述可以确定,Oracle在加载表空间到目标数据库的时候,会根据目标数据库数据文件的序号修改加载的数据文件,因此源数据库读取数据文件报错。
从这里也可以看到,虽然表空间只读加载到目标数据库,但是数据文件的头信息是会被目标数据库所修改的。
这个表空间可以被两个数据库同时打开,而且目标数据库可以使用读写方式打开,但是这个数据文件对于源数据库来说已经发生了改变,大部分情况下,一旦数据库重新加载这个文件就会出现异常。











