使用传输表空间迁移数据
一、检查是否满足传输表空间的条件
1、检查源库与目标库的平台支持
源库: SQL> select d.name,i.version,d.platform_name,endian_format from v$transportable_platform tp,v$database d,v$instance i 2 where tp.PLATFORM_NAME=d.platform_name; NAME VERSION PLATFORM_NAME ENDIAN_FORMAT --------- ----------------- -------------------------------------------------------------------------------- -------------- ORCL 11.2.0.1.0 Microsoft Windows x86 64-bit Little 目标库: SQL> select d.name,i.version,d.platform_name,endian_format from v$transportable_platform tp,v$database d,v$instance i 2 where tp.PLATFORM_NAME=d.platform_name; NAME VERSION PLATFORM_NAME ENDIAN_FORMAT --------- ----------------- -------------------------------------------------------------------------------- -------------- ORCL 11.2.0.1.0 Linux x86 64-bit Little
查看哪些平台支持跨平台的传输表空间特性:
SQL> select * from v$transportable_platform order by platform_id; PLATFORM_ID PLATFORM_NAME ENDIAN_FORMAT ----------- -------------------------------------------------------------------------------- -------------- 1 Solaris[tm] OE (32-bit) Big 2 Solaris[tm] OE (64-bit) Big 3 HP-UX (64-bit) Big 4 HP-UX IA (64-bit) Big 5 HP Tru64 UNIX Little 6 AIX-Based Systems (64-bit) Big 7 Microsoft Windows IA (32-bit) Little 8 Microsoft Windows IA (64-bit) Little 9 IBM zSeries Based Linux Big 10 Linux IA (32-bit) Little 11 Linux IA (64-bit) Little 12 Microsoft Windows x86 64-bit Little 13 Linux x86 64-bit Little 15 HP Open VMS Little 16 Apple Mac OS Big 17 Solaris Operating System (x86) Little 18 IBM Power Based Linux Big 19 HP IA Open VMS Little 20 Solaris Operating System (x86-64) Little 21 Apple Mac OS (x86-64) Little 20 rows selected
结论:虽然操作系统平台不同,但是数据库版本相同,字节顺序也相同(不需要转换字节),并且支持跨平台传输。
2、检查自包含的表空间集
SQL> exec dbms_tts.transport_set_check('tts',true);
PL/SQL procedure successfully completed
SQL> select * from transport_set_violations;
VIOLATIONS
----------------------------------------------
结果返回0行记录,说明满足自包含条件。即tts表空间中的对象未引用其它未传输表空间中的对象(非严格方式)
SQL> exec dbms_tts.transport_set_check('tts',true,true); --严格方式
PL/SQL 过程已成功完成。
SQL> select * from transport_set_violations;
未选定行
结果返回0行记录,说明待默认的tts表空间中的对象未引用其它未传输表空间中的对象,而且tts表空间中的对象也未被其它未传输的表空间中的对象引用。
二、执行表空间的传输
1、源数据库将要传输的表空间生成可传输表空间集
1.1 将待传输的表空间置为read only状态
SQL> alter tablespace tts read only;
表空间已更改。
1.2 执行data pump export 命令导出表空间集元数据
C:\Users\Administrator>expdp system/RUSKY@orcl dumpfile=tbs_tts.dmp directory=test_tts_dump transport_tablespaces=tts nologfile=y; Export: Release 11.2.0.1.0 - Production on 星期二 4月 28 00:02:40 2015 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options 启动 "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/********@orcl dumpfile=tbs_tts.dmp directory=test_tts_dump transport_tablespaces=tts nologfile=y; 处理对象类型 TRANSPORTABLE_EXPORT/PLUGTS_BLK 处理对象类型 TRANSPORTABLE_EXPORT/TABLE 处理对象类型 TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK 已成功加载/卸载了主表 "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" ****************************************************************************** SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 的转储文件集为: E:\DUMPDIRECORY\TBS_TTS.DMP ****************************************************************************** 可传输表空间 TTS 所需的数据文件: G:\TESTDATA\TTS.DBF 作业 "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" 已于 00:03:38 成功完成
1.3 转换字节顺序
两个平台字节顺序一致,不需要转换
1.4 复制传输集到目标数据库
源数据库tts表空间对应的数据文件和expdp生成的该表空间的元数据文件TBS_TTS.DMP
可传输表空间 TTS 所需的数据文件:
G:\TESTDATA\TTS.DBF
转储文件集为:
E:\DUMPDIRECORY\TBS_TTS.DMP
此处将这TBS_TTS.DMP文件上传到目标数据库的/home/oracle/dump_dir/目录
SQL> select * from dba_directories; --目标数据库的dump_dir如下:
OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ------------------------------ -----------------------
SYS DUMP_DIR /home/oracle/dump_dir
将源数据文件G:\TESTDATA\TTS.DBF上传到目标数据库的/u01/app/oracle/oradata/orcl/目录
1.5 将源数据库中的表空间tts状态设置为read,write
SQL> alter tablespace tts read write;
表空间已更改。
2、在目标数据库导入表空间集
2.1 检查源数据库和目标数据库的blocksize
SQL> select block_size from dba_tablespaces where tablespace_name='TTS'; --源数据库
BLOCK_SIZE
----------
8192
SQL> show parameter block_size; --目标数据库
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
SQL>
两都相同,不需要设置。如果两者不同,则必须设置相关的DB_nK_CACHE_SIZE初始化参数,否则导入时会报错。
如:ALTER SYSTEM SET DB_8K_CACHE_SIZE=20M;
2.2 目标数据库上导入源数据
[oracle@rhel201 VH-share]$ impdp system/rusky dumpfile=TBS_TTS.DMP directory=dump_dir nologfile=y transport_datafiles=/u01/app/oracle/oradata/orcl/TTS.DBF REMAP_SCHEMA=RUSKY2:RUSKY Import: Release 11.2.0.1.0 - Production on Mon Apr 27 09:37:38 2015 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/******** dumpfile=TBS_TTS.DMP directory=dump_dir nologfile=y transport_datafiles=/u01/app/oracle/oradata/orcl/TTS.DBF REMAP_SCHEMA=RUSKY2:RUSKY Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK Processing object type TRANSPORTABLE_EXPORT/TABLE Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK Job "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully completed at 09:37:46
导入命令中的remap_schema=rusky2:rusky是指在源数据库中的用户rusky2,导入到目标数据库中变为rusky。
因为目标数据库中没有rusky2及rusky用户,所以使用remap_schema来转换。导入完成后新创建的用户rusky需要修改密码,否则无法使用。
transport_datafiles:被传输表空间对应的数据文件新路径,如果需要指定多个数据文件,相互之间以逗号做分隔。
2.3 将刚导入的表空间状态置为read write
alter tablespace tts read write; --在11g,导入的表空间会自动置为read write,10g需要手动修改。
2.4 修改rusky用户的密码及测试
SQL> alter user rusky identified by rusky;
User altered.
SQL> conn rusky/rusky;
Connected.