可传输表空间:
使用一组自包含、只读的表空间,只导出元数据,在操作系统层将这些表空间的数据文件拷贝至目标平台,并将元数据导入数据字典。在Oracle9i 数据库和更低版本中,可传输表空间仅限于在目标数据库和源数据库都运行在同一操作系统平台上的少数情况下才有用 — 例如,您不能在 Solaris 和 HP-UX 平台之间传输表空间。在 Oracle 数据库 10g 中,这个局限消失了:只要操作系统字节顺序相同,您就可以在平台之间传输表空间。
对于可传输表空间有一个重要概念:自包含(Self-Contained)。
在表空间传输的中,要求表空间集为自包含的,自包含表示用于传输的内部表空间集没有引用指向外部表空间集。自包含分为两种:一般自包含表空间集和完全(严格)自包含表空间集。
常见的以下情况是违反自包含原则的:
A. 索引在内部表空间集,而表在外部表空间集(相反地,如果表在内部表空间集,而索引在外部表空间集,则不违反自包含原则)。
B. 分区表一部分区在内部表空间集,一部分在外部表空间集(对于分区表,要么全部包含在内部表空间集中,要么全不包含)。
C. 如果在传输表空间时同时传输约束,则对于引用完整性约束,约束指向的表在外部表空间集,则违反自包含约束;如果不传输约束,则与约束指向无关。
D. 表在内部表空间集,而lob列在外部表空间集,则违反自包含约束。
通常可以通过系统包DBMS_TTS来检查表空间是否自包含,验证可以以两种方式执行:非严格方式和严格方式。
以下是一个简单的验证过程:
以SYS用户执行非严格自包含检查(full_check=false):
telnet 172.19.111.38
SQL> connect / as sysdba
SQL> desc dbms_tts;
PROCEDURE DOWNGRADE
FUNCTION ISSELFCONTAINED RETURNS BOOLEAN
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TS_LIST CLOB IN
INCL_CONSTRAINTS BOOLEAN IN
FULL_CHECK BOOLEAN IN
PROCEDURE KFP_CKCMP
PROCEDURE TRANSPORT_SET_CHECK
Argument Name Type In/Out Default?
------------------------------ ----------------------- ------ --------
TS_LIST CLOB IN
INCL_CONSTRAINTS BOOLEAN IN DEFAULT
FULL_CHECK BOOLEAN IN DEFAULT
SQL> exec dbms_tts.transport_set_check('IPAS_ACCT_DATA', TRUE);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected
执行严格自包含检查(full_check=true):
SQL> exec dbms_tts.transport_set_check('IPAS_ACCT_DATA', TRUE, True);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
----------------------------------------------------------------------------------------
Index IPAS_ACCT_DATA.IND_ID in tablespace IPAS_ACCT_DATA points to table UTCORE.IPAS_ACCT_DATA in tablespace UTSERS
反过来对于USERS表空间来说,非严格检查也是无法通过的:
SQL> exec dbms_tts.transport_set_check('USERS', TRUE);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
VIOLATIONS
----------------------------------------------------------------------------------------
Index IPAS_ACCT_DATA.IND_ID in tablespace USERS points to table UTCORE.IPAS_ACCT_DATA in tablespace IPAS_ACCT_DATA
但是可以对多个表空间同时传输,则一些自包含问题就可以得到解决:
SQL> exec dbms_tts.transport_set_check('USERS,IPAS_ACCT_DATA', TRUE, True);
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
no rows selected
表空间自包含确认之后,进行表空间传输就很方便了,注意必须以sys as sysdba身份进行导出导入操作,一般包含如下几个步骤。
1、在源库使表空间为只读。
telnet 172.19.111.38
$ sqlplus '/as sysdba'
SQL> set lines 1000
SQL> col file_name format a50
SQL> select tablespace_name,FILE_NAME from dba_data_files where tablespace_name='IPAS_ACCT_DATA';
TABLESPACE_NAME FILE_NAME
------------------------------ --------------------------------------------------
IPAS_ACCT_DATA /opt/oracle/wacosdata/ipas_acct_data001.dbf
源库和目标要求compatible参数兼容:
SQL> show parameter compatible
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 9.2.0
SQL> alter tablespace IPAS_ACCT_DATA read only;
2、从源库导出表空间。
$ exp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp
Username: sys as sysdba
Password: change_on_install
$ ls -otr
...
-rw-r--r-- 1 oracle 51200 Aug 20 19:03 exp_ts_IPAS_ACCT_DATA.dmp
dmp 文件只包含元数据(不是表空间的内容)因此它将非常小。
3、将文件 exp_ts_IPAS_ACCT_DATA.dmp 和 /opt/oracle/wacosdata/ipas_acct_data001.dbf 拷贝至目标主机。如果您使用 FTP,那么您
将需要指定二进制选项。
$ ftp 172.19.111.34
ftp> bi
ftp> ha
ftp> prompt off
ftp> put exp_ts_IPAS_ACCT_DATA.dmp
ftp> put /opt/oracle/wacosdata/ipas_acct_data001.dbf
226 Transfer complete.
local: /opt/oracle/wacosdata/ipas_acct_data001.dbf remote: /opt/oracle/wacosdata/ipas_acct_data001.dbf
ftp> by
传输完后可以把源库表空间置为可读:
$ sqlplus '/as sysdba'
SQL> alter tablespace IPAS_ACCT_DATA read write;
4、在目标主机将表空间插入到数据库中。
telnet 172.19.111.34
$pwd
/opt/oracle
$ls -otr
-rw-r--r-- 1 oracle 51200 Aug 21 11:10 exp_ts_IPAS_ACCT_DATA.dmp
$ls -l /opt/oracle/wacosdata/ipas_acct_data001.dbf
-rw-r----- 1 oracle dba 1073750016 Aug 20 19:05 /opt/oracle/wacosdata/ipas_acct_data001.dbf
$imp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp
datafiles='/opt/oracle/wacosdata/ipas_acct_data001.dbf'
Username: sys as sysdba
Password: change_on_install
. importing SYS's objects into SYS
IMP-00017: following statement failed with ORACLE error 19726:
"BEGIN sys.dbms_plugts.checkCompType('LOB_RET','9.2.0.0.0'); END;"
IMP-00003: ORACLE error 19726 encountered
ORA-19726: cannot plug data [LOB_RET] at level 9.2.0.0.0 into database running at compatibility level 8.1.0.0.0
ORA-06512: at "SYS.DBMS_PLUGTS", line 1669
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully
上面的错误是由于compatible参数不兼容,修改之:
SQL> show parameter compatible
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 8.1.0
SQL> alter system set compatible='9.2.0' scope=spfile;
SQL> shutdown immediate
SQL> startup
SQL> show parameter compatible
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 9.2.0
$imp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp
datafiles='/opt/oracle/wacosdata/ipas_acct_data001.dbf'
Username: sys as sysdba
Password: change_on_install
. importing SYS's objects into SYS
IMP-00017: following statement failed with ORACLE error 29342:
"BEGIN sys.dbms_plugts.checkUser('UTCN'); END;"
IMP-00003: ORACLE error 29342 encountered
ORA-29342: user UTCN does not exist in the database
ORA-06512: at "SYS.DBMS_PLUGTS", line 1594
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully
上面的错误是由于没有把对应用户建立上,应提前把可能用到这个表空间的用户或角色建立好:
SQL> create user utcn identified by oss;
SQL> create user wacos identified by oss;
SQL> create user IPAS_ACCT_DATA identified by oss;
SQL> create user FOYAORCL identified by oss;
$imp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp
datafiles='/opt/oracle/wacosdata/ipas_acct_data001.dbf'
Username: sys as sysdba
Password: change_on_install
. importing SYS's objects into SYS
IMP-00017: following statement failed with ORACLE error 29349:
"BEGIN sys.dbms_plugts.beginImpTablespace('IPAS_ACCT_DATA',12,'SYS',1,0,81"
"92,3,90898031,1,2147483645,128,128,128,0,1,0,128,1013601774,1,2,6252629,NUL"
"L,0,0,NULL,NULL); END;"
IMP-00003: ORACLE error 29349 encountered
ORA-29349: tablespace 'IPAS_ACCT_DATA' already exists
ORA-06512: at "SYS.DBMS_PLUGTS", line 1500
ORA-06512: at line 1
IMP-00000: Import terminated unsuccessfully
上面的错误是由于表空间'IPAS_ACCT_DATA'已经存在,应提前删除:
SQL> drop tablespace IPAS_ACCT_DATA including contents;
$imp tablespaces=IPAS_ACCT_DATA transport_tablespace=y file=exp_ts_IPAS_ACCT_DATA.dmp
datafiles='/opt/oracle/wacosdata/ipas_acct_data001.dbf'
Username: sys as sysdba
Password: change_on_install
. importing SYS's objects into SYS
. importing WACOS's objects into WACOS
. . importing table "PIMBALANCELOGDETAIL"
...
Import terminated successfully with warnings.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/35489/viewspace-666123/ ,如需转载,请注明出处,否则将追究法律责任。