发表于: 2008.11.18 23:31
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/474088
---------------------------------------------------------------
这个问题其实是来自论坛上的一个帖子:http://www.itpub.net/showthread.php?s=&threadid=658187。
帖子中的问题和文章的标题十分接近,其实不光是问题解决,答案也十分接近,造成这两种特殊情况成立的原因是同一个——只读表空间。
这篇文章描述通过迁移表空间的方式在两个数据库加载同一个表空间。
同一个表空间能否被多个数据库同时打开:http://yangtingkun.itpub.net/post/468/228632
如果采用迁移表空间的方式,同一个表空间的数据文件甚至可以被不同版本的两个数据库同时打开。
SQL> CONN YANGTK/YANGTK@YTK92已连接。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production
CORE 9.2.0.3.0 Production
TNS for 32-bit Windows: Version 9.2.0.4.0 - Production
NLSRTL Version 9.2.0.4.0 - Production
SQL> SELECT FILE_NAME FROM DBA_DATA_FILES;
FILE_NAME
--------------------------------------------------------------------------------
E:ORACLEORADATAYTK92SYSTEM01.DBF
E:ORACLEORADATAYTK92UNDOTBS01.DBF
E:ORACLEORADATAYTK92CWMLITE01.DBF
E:ORACLEORADATAYTK92DRSYS01.DBF
E:ORACLEORADATAYTK92EXAMPLE01.DBF
E:ORACLEORADATAYTK92INDX01.DBF
E:ORACLEORADATAYTK92ODM01.DBF
E:ORACLEORADATAYTK92TOOLS01.DBF
E:ORACLEORADATAYTK92USERS01.DBF
E:ORACLEORADATAYTK92XDB01.DBF
已选择10行。
SQL> CREATE TABLESPACE TESTTBS DATAFILE 'E:ORACLEORADATAYTK92TESTTBS.DBF' SIZE 10M;
表空间已创建。
SQL> CREATE TABLE T_TESTTBS (ID NUMBER) TABLESPACE TESTTBS;
表已创建。
SQL> INSERT INTO T_TESTTBS SELECT ROWNUM FROM TAB;
已创建20行。
SQL> COMMIT;
提交完成。
SQL> ALTER TABLESPACE TESTTBS READ ONLY;
表空间已更改。
SQL> SHOW PARAMETER DB_BLOCK_SIZE
NAME TYPE VALUE
------------------------------------ ----------- ------------
db_block_size integer 8192
在9i上面的准备工作已经完成,下面执行表空间迁移的导出:
E:>exp """/ as sysdba""" file=testtbs.dmp tablespaces=testtbs tts_full_check=y transport_tablespace=y
Export: Release 9.2.0.4.0 - Production on 星期二 11月 18 22:50:56 2008
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
连接到: Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集注: 将不会导出表数据(行)关于导出可传输的表空间元数据...用于表空间 TESTTBS...
. 正在导出群集定义
. 正在导出表定义
. . 正在导出表 T_TESTTBS
. 正在导出引用完整性约束条件
. 正在导出触发器
. 结束导出可传输的表空间元数据在没有警告的情况下成功终止导出。
导出操作必须由低版本9204的EXP来完成。
下面登陆10g,检查目标表空间是否能顺利导入:
SQL> CONN YANGTK/YANGTK@YTK102已连接。
SQL> SELECT * FROM V$VERSION;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
SQL> SHOW PARAMETER DB_BLOCK_SIZE
NAME TYPE VALUE
------------------------------------ ----------- -------------------------
db_block_size integer 8192
SQL> SELECT FILE_NAME FROM DBA_DATA_FILES;
FILE_NAME
--------------------------------------------------------------------------
E:ORACLEORADATAYTK102USERS01.DBF
E:ORACLEORADATAYTK102SYSAUX01.DBF
E:ORACLEORADATAYTK102UNDOTBS01.DBF
E:ORACLEORADATAYTK102SYSTEM01.DBF
E:ORACLEORADATAYTK102EXAMPLE01.DBF
E:ORACLEORADATAYTK102YANGTK01.DBF
E:ORACLEORADATAYTK102LOB_SPACE01.DBF
E:ORACLEORADATAYTK102YANGTK02.DBF
E:ORACLEORADATAYTK102TEST01.DBF
已选择9行。
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
USERS
EXAMPLE
YANGTK
LOB_SPACE
TEST
已选择9行。
10g环境的DB_BLOCK_SIZE与9i环境一致,不需要额外设置DB_NK_CACHE_SIZE,且目标表空间在10g数据库中不存在,下面就可以执行导入了。注意,这里并没有做任何的COPY操作,直接根据9i表空间数据文件的位置导入目标表空间:
E:>imp """/ as sysdba""" file=e:testtbs.dmp transport_tablespace=y tablespaces=testtbs datafiles=e:oracleoradataytk92testtbs.dbf tts_owners=yangtk
Import: Release 10.2.0.1.0 - Production on 星期二 11月 18 22:58:47 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
经由常规路径由 EXPORT:V09.02.00 创建的导出文件即将导入可传输的表空间元数据...已经完成 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集中的导入
. 正在将 SYS 的对象导入到 SYS
. 正在将 SYS 的对象导入到 SYS
. 正在将 YANGTK 的对象导入到 YANGTK
. . 正在导入表 "T_TESTTBS"成功终止导入, 没有出现警告。
现在目标表空间已经在10g环境下被导入,最后检查表空间中数据是否正确:
SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES;
TABLESPACE_NAME
------------------------------
SYSTEM
UNDOTBS1
SYSAUX
TEMP
USERS
EXAMPLE
YANGTK
LOB_SPACE
TEST
TESTTBS
已选择10行。
SQL> SELECT FILE_NAME FROM DBA_DATA_FILES;
FILE_NAME
---------------------------------------------------------
E:ORACLEORADATAYTK102USERS01.DBF
E:ORACLEORADATAYTK102SYSAUX01.DBF
E:ORACLEORADATAYTK102UNDOTBS01.DBF
E:ORACLEORADATAYTK102SYSTEM01.DBF
E:ORACLEORADATAYTK102EXAMPLE01.DBF
E:ORACLEORADATAYTK102YANGTK01.DBF
E:ORACLEORADATAYTK102LOB_SPACE01.DBF
E:ORACLEORADATAYTK102YANGTK02.DBF
E:ORACLEORADATAYTK102TEST01.DBF
E:ORACLEORADATAYTK92TESTTBS.DBF
已选择10行。
SQL> SELECT COUNT(*) FROM T_TESTTBS;
COUNT(*)
----------
20











