可以使用传输表空间的特性,传输数据库的表空间到另外一个数据库。被传输的表空间可以是数据字典管理的,也可以是本地管理的。从ORACLE 9i 开始,源库的块大小不需要和目标库的一致。从ORACLE 1Og 开始支持跨平台传输表空间。
使用传输表空间的方式移动数据,要比使用传统的exp/imp要快很多。因为真正包含数据库的数据文件只是通过物理的复制到目标库,再使用exp/imp导出表空间对象的元数据。
关于导入和导出元数据的工具,ORACLE 支持exp/expdp,但是如果你的表空里面包含XMLTypes的对象,那么ORACLE只支持exp的方式,导出。
检查是否包含XMLTypes对象:
select distinct p.tablespace_name from dba_tablespaces p,
dba_xml_tables x, dba_users u, all_all_tables t where
t.table_name=x.table_name and t.tablespace_name=p.tablespace_name
and x.owner=u.username
关于表空间的名称,目标库不能存在与被传输表空间相同名称的表空间。
使用如下的SQL语句查询,如果返回一行数据,则该平台支持传输表空。
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM. tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
PLATFORM_NAME ENDIAN_FORMAT
-------------------------------- --------------
Microsoft Windows IA (32-bit) Little
注:如果查出来目标库和源库的ENDIAN_FORMAT不一致,那么就需要conversion tablespace
select userenv('language') from dual;
如下几种情况,可能导致表空间不是自包含的:
索引在这个表空间集合内,但是索引指向的表在集合之外;
分区表的部分分区在集合之外;
完整性约束的参考对象在集合之外;
表中包含的LOB对象存储在集合之外。
执行存储过程
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK('tbs1,tbs2', TRUE);
SELECT * FROM
TRANSPORT_SET_VIOLATIONS;
查询使用该表空间作为默认表空间的用户及用户的系权限
select * from dba_sys_privs where grantee=(
SELECT u.username
FROM DBA_USERS u
WHERE u.default_tablespace IN ('&tbs_name1','&tbs_name2'));
查询使用该表空间作为默认表空间的用户及用户的对象权限
select 'grant '|| privilege || ' on '||owner||'.'||table_name|| ' to ZHIS;' tab_privs from dba_tab_privs
where grantee=(
SELECT u.username
FROM DBA_USERS u
WHERE u.default_tablespace IN ('&tbs_name1','&tbs_name2'));
产生创建用户脚本
SELECT 'CREATE USER '||username||' IDENTIFIED BY '||username||' DEFAULT TABLESPACES '||default_tablespace
FROM DBA_USERS
WHERE DEFAULT_TABLESPACE='&tbs';
ALTER TABLESPACE tbs READ ONLY;
CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir' ;
GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;
set NLS_LANG=XXXXXXXX;
Expdp system/password DUMPFILE=expdat.dmp DIRECTORY=dpump_dir TRANSPORT_TABLESPACES = TBS1,TBS2 TRANSPORT_FULL_CHECK=Y
Note:如果2.1 查询出来的ENDIAN_FORMAT值是一致的,那么跳过此步骤
RMAN> convert tablespace TBS1 to platform="Linux IA (32-bit)" FORMAT '/tmp/%U';
RMAN> convert tablespace TBS2 to platform="Linux IA (32-bit)" FORMAT '/tmp/%U';
源库表空间的数据文件(若执行了3.2,则复制3.2 convert出来的文件),dump文件
[root@RHEL5 ~]# mount -t cifs -o username=administrator //192.168.56.150/expdp /mnt/
Password:
[root@RHEL5 mnt]# cp * /home/oracle/dpump/
[root@RHEL5 ~]# chown -R oracle:oinstall /home/oracle/dpump/*
oracle@RHEL5.4:/home/oracle/dpump>chmod -R 777 *
在导入的时候需要注意的是,你的目标库时候有相关的用户
最好先建立起相关的用户,赋予源库相应的权限
这里参考2.4 的结果
CREATE OR REPLACE DIRECTORY dpump_dir AS '/tmp/subdir' ;
GRANT READ,WRITE ON DIRECTORY dpump_dir TO system;
set NLS_LANG=XXXXXXXX;
Impdp system/password PARFILE='par.f'
About par.f file:
oracle@RHEL5.4:/home/oracle>cat par.f
DIRECTORY=dpump_dir
DUMPFILE=SZSCTBS.DMP
TRANSPORT_DATAFILES='/home/oracle/dpump/SZSCT01.DBF'
若没有创建相应的用户,则需要使用参数:
REMAP_SCHEMA=(source_sch2:target_schema_sch2)
About REMAP_SCHEMA:
The REMAP_SCHEMA parameter changes the ownership of database objects. If
you do not specify REMAP_SCHEMA, all database objects (such as tables and
indexes) are created in the same user schema as in the source database, and
those users must already exist in the target database. If they do not exist, then
the import utility returns an error. In this example, objects in the tablespace set
owned by dcranney in the source database will be owned by smith in the
target database after the tablespace set is imported. Similarly, objects owned
by jfee in the source database will be owned by williams in the target
database. In this case, the target database is not required to have users
dcranney and jfee, but must have users smith and williams.
alter tablespace tbs offline;
alter database rename file ‘old_path’ to ‘new_path’;
alter tablespace tbs online;
Alter tablespace tbs read write;
BY GuangHuiZhou 2013.06.18
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26169542/viewspace-765913/ ,如需转载,请注明出处,否则将追究法律责任。