ORACLE 数据泵传输表空间
参考官方文档链接:https://docs.oracle.com/database/121/ADMIN/transport.htm#ADMIN01101
一、传输表空间介绍
1.1、使用范围
数据库表空间无论是字典管理还是手动管理,亦或者是目标端跟源端数据库大小不一致,都可以使用传输表空间,而且,相对来说,传输表空间要比使用数据泵导入导出迁移数据要快,这是因为传输表空间,是只把实际物理数据文件复制到指定的目标端位置,再灌入元数据,而数据泵导入导出则是需要把数据库对象按要求导出,然后目标端导入....
1.2、传输表空间方法
1.2.1、手工调用SQLPLUS和Data Pump传输
1.2.2、Oracle EM Cloud Control 传输表空间向导传输
1、登录EM Cloud Control ,用户需要具有DataPump_exp_full_database角色
2、访问数据库首页
3、从Schema菜单,选择Database Export/Import,然后传输表空间
二、跨平台传输表空间
从oracle 10g开始,oracle实现了跨平台的表空间传输,跨平台的意味着数据库可以从一种类型的平台迁移到另一中类型的平台上,大多数(但不是全部)的平台都支持传输表空间。首先必须通过查看v$transportable_platform视图查看oracle支持的平台,并确定每种平台的字节存储次序,注意:这一点非常重要。以下查询为oracle支持的各种平台及字节存储次序,在跨平台表空间传输时,需要通过查询该视图进行平台和字节存储次序的比对。
COLUMN PLATFORM_NAME FORMAT A40
COLUMN ENDIAN_FORMAT A14
SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT
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
三、传输表空间限制
1、源端以及目标端字符集需一致(当然,传输表空间到ORACLE 12C CDB,CDB字符集最好是超集设置AL32UTF8)
select userenv('language') from dual;
2、源端数据库版本必须是ORACLE 10.1.0.3及以上
3、Compatible参数一致或目标端高于源端
4、跨平台传输表空间不能传输带有TIMESTAMP WITH TIMEZONE (TSTZ)的数据表,他们将会自动跳过
查看数据库时区.
SELECT DBTIMEZONE FROM DUAL;
可以使用ALTER DATABASE SQL statement 修改数据库时区.
5、传输表空间,物化视图以及分区表不能被传输,除非所有的对象都属于同一个表空间,才可以传输
6、不能传输加密表空间
7、传输表空间中不能传输含有加密字段的数据表
8、不能传输system以及sysaux表空间
9、传输表空间中不能含有带有NCHAR, NVARCHAR2, or NCLOB数据类型的字段.
参考链接:https://docs.oracle.com/database/121/ADMIN/transport.htm#ADMIN11396
四、传输表空间检查及步骤
1、如果是跨平台的表空间传输,需要检查两个平台支持的字节存储顺序,检查方法见如上文所述,如果可以确定源数据库和目标数据库属于同一平台,可以省略此步骤;
2、检查数据库版本,字符集以及Compatible参数,选择自包含的(self-contained)表空间
3、将源数据库上的选定表空间修改为read-only状态,使用expde工具生成传输表空间元数据(集)。 //在这一步,如果两个平台间的字节存储次序不同,还需完成字节存储次序的转换
参考链接:https://docs.oracle.com/database/121/ADMIN/transport.htm#ADMIN14066
示例一:在源数据库端完成字节存储次序转换
RMAN> CONVERT TABLESPACE sales_1,sales_2
2> TO PLATFORM 'Microsoft Windows IA (32-bit)'
3> FORMAT '/tmp/%U';
Starting conversion at source at 30-SEP-08
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
input datafile file number=00007 name=/u01/app/oracle/oradata/salesdb/sales_101.dbf converted datafile=/tmp/data_D-SALESDB_I-1192614013_TS-SALES_1_FNO-7_03jru08s channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:45
channel ORA_DISK_1: starting datafile conversion
input datafile file number=00008 name=/u01/app/oracle/oradata/salesdb/sales_201.dbf converted datafile=/tmp/data_D-SALESDB_I-1192614013_TS-SALES_2_FNO-8_04jru0aa channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:25
Finished conversion at source at 30-SEP-08
4、传输表空间及与表空间对应数据文件 (使用操作系统命令、ftp命令等方式)到目标数据库。 //字节存储次序的转换也可以在这一步完成(一般采用到目标端完成,尽可能减少源端生产端操作)
参考链接:https://docs.oracle.com/database/121/ADMIN/transport.htm#ADMIN14066
示例二:在目标数据库端完成字节存储次序转换
C:/>RMAN TARGET /
Recovery Manager: Release 11.2.0.0.1
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: ORAWIN (DBID=3462152886)
RMAN> CONVERT DATAFILE
2>'C:/Temp/sales_101.dbf',
3>'C:/Temp/sales_201.dbf'
4>TO PLATFORM="Microsoft Windows IA (32-bit)"
5>FROM PLATFORM="Solaris[tm] OE (32-bit)"
6>DB_FILE_NAME_CONVERT=
7>'C:/Temp/', 'C:/app/orauser/oradata/orawin/'
8> PARALLELISM=4;
5、将源数据库的表空间恢复为read-write状态(可选)
6、在目标数据库,使用impdp工具导入表空间元数据(集)
五、实验记录
条件有限,并未使用到反转字节序操作…
实验环境:源端、目标端属于CENTOS系统
源端数据库版本:11.2.0.4
目标端数据库版本:12.2.0.1
1、前期准备:
1、检查字节序
COLUMN PLATFORM_NAME FORMAT A40
COLUMN ENDIAN_FORMAT A14
SELECT PLATFORM_ID, PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM
ORDER BY PLATFORM_ID;
2、检查字符集
源端:
14:07:23 SYS@orcl1>select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
AMERICAN_AMERICA.US7ASCII
目标端:
14:07:21 > select userenv('language') from dual;
USERENV('LANGUAGE')
--------------------------------------------------------------------------------
AMERICAN_AMERICA.AL32UTF8
Elapsed: 00:00:00.00
3、检查Compatible 参数
源端:
14:09:04 SYS@orcl1>show parameter compatible
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
compatible string 11.2.0.4.0
目标端:
14:10:05 SYS@orcl>show parameter compatible
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
compatible string
12.2.0
noncdb_compatible boolean
FALSE
4、创建表空间(用户、表以及测试数据) --源端
14:09:41 SYS@orcl1>create tablespace marvin datafile '+data/orcl/datafile/marvin.dbf' size 10m autoextend on;
Tablespace created.
Elapsed: 00:00:10.23
14:12:31 SYS@orcl1>create user marvinn identified by marvinn default tablespace marvin account unlock;
User created.
Elapsed: 00:00:00.99
14:15:23 SYS@orcl1>grant resource,connect to marvinn;
Grant succeeded.
Elapsed: 00:00:00.25
14:15:37 SYS@orcl1>conn marvinn/marvinn;
Connected.
14:18:01 MARVINN@orcl1>insert into yunqu values(1,'ss','F',18,'ene');
1 row created.
Elapsed: 00:00:00.02
14:18:05 MARVINN@orcl1>insert into yunqu values(2,'ss','F',18,'ene');
1 row created.
Elapsed: 00:00:00.01
14:18:10 MARVINN@orcl1>insert into yunqu values(3,'ss','F',18,'ene');
1 row created.
Elapsed: 00:00:00.01
14:18:13 MARVINN@orcl1>commit;
Commit complete.
14:18:15 MARVINN@orcl1>select count(*) from yunqu;
COUNT(*)
----------
3
Elapsed: 00:00:00.01
2、表空间自包含(独立性)检查 —-源端
2.1 表空间的自包含有2种标准
A.非严格方式:检查要传输表空间的对象是否有引用其他表空间的对象
B.严格方式:(1)检查要传输表空间的对象是否有引用其他表空间的对象
(2)检查要传输表空间的对象是否被其他表空间引用
2.2 使用DBMS_TTS.TRANSPORT_SET_CHECK检查表空间自包含性
语法:DBMS_TTS.TRANSPORT_SET_CHECK(
Ts_list IN CLOB,
Incl_constraints IN BOOLEAN DEFAULT FALSE,
Full_check IN BOOLEAN DEFAULT FALSE);
其中:
ts_list是要检查的表空间列表,有多个的话,中间用逗号隔开。如 tbs1,tbs2,tbs3
incl_constraints:是否检查约束,默认为否
full_check:是否执行严格自包含方式的检查,默认为否
例如:
DBMS_TTS.TRANSPORT_SET_CHECK(‘MYTEST’,TRUE);--进行非严格方式的检查
DBMS_TTS.TRANSPORT_SET_CHECK(‘MYTEST’,TRUE,TRUE); ---进行严格方式的检查
2.3 使用视图TRANSPORT_SET_VIOLATIONS检查结果
如果检查的结果是有违反规则的话,在视图中会查询到相关信息,如果没有违反则视图返回为空
源端:
14:26:06 SYS@orcl1>conn / as sysdba
14:26:06 SYS@orcl1>EXEC DBMS_TTS.TRANSPORT_SET_CHECK('MARVIN',TRUE,TRUE);
PL/SQL procedure successfully completed.
Elapsed: 00:00:52.59
14:27:01 SYS@orcl1>select * from transport_set_violations;
no rows selected
Elapsed: 00:00:00.71
//查询无返回结果说明检查通过,否则需要根据violation字段的说明解决各类参照完整性问题,比如说主键、外键约束、分区等问题,一般这些问题是指对象不在同一表空间...
自包含检查部分项:
An index inside the set of tablespaces is for a table outside of the set of tablespaces.
A partitioned table is partially contained in the set of tablespaces.
A referential integrity constraint points to a table across a set boundary.
A table inside the set of tablespaces contains a LOB column that points to LOBs outside the set of tablespaces.
解决方法:
要么数据重放于同一表空间,要么关于依赖的表空间一起传输至目标前,以防止部分数据不可用或无效问题
3、源端表空间设置为只读
oracle@rac1:/home/oracle>mkdir -p /u01/bakcup/
创建导出目录(源端以及目标端操作) 注意:如果目标端是12C,则该操作需要对应到导入的PDB中操作创建目录并授权,否则导入会报错误
14:34:26 SYS@orcl1>create directory datapump_dir as '/u01/backup';
Directory created.
Elapsed: 00:00:00.54
授权用户访问目录(源端以及目标端操作) 注意:如果目标端是12C,则该操作需要对应到导入的PDB中操作创建目录并授权,否则导入会报错误
14:39:45 SYS@orcl1>grant write,read on directory datapump_dir to system;
Grant succeeded.
Elapsed: 00:00:00.9
设置表空间只读(源端操作)
14:27:40 SYS@orcl1>alter tablespace marvin read only;
Tablespace altered.
Elapsed: 00:00:01.20
4、数据泵导出表空间元数据 —源端
这里,可以给当前用户授权DATAPUMP_EXP_FULL_DATABASE角色,使用当前用户导出,也可直接system用户,使用其他用户需要具有导出目录datapump_dir访问权限
源端:
$oracle@rac1:/home/oracle>expdp system/yunq111 dumpfile=expdat.dmp directory=datapump_dir transport_tablespaces=marvin logfile=tts_export.log
Export: Release 11.2.0.4.0 - Production on Tue May 29 14:46:40 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
FLASHBACK automatically enabled to preserve database integrity.
Starting "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01": system/******** dumpfile=expdat.dmp directory=datapump_dir transport_tablespaces=marvin logfile=tts_export.log
Processing object type TRANSPORTABLE_EXPORT/PLUGTS_BLK
Processing object type TRANSPORTABLE_EXPORT/TABLE
Processing object type TRANSPORTABLE_EXPORT/POST_INSTANCE/PLUGTS_BLK
Master table "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/u01/backup/expdat.dmp
******************************************************************************
Datafiles required for transportable tablespace MARVIN:
+DATA/orcl/datafile/marvin.dbf
Job "SYSTEM"."SYS_EXPORT_TRANSPORTABLE_01" successfully completed at Tue May 29 14:48:33 2018 elapsed 0 00:01:26
5、源端表空间设置为read write…取决于需要迁移后数据是否一致,需要则放到迁移完成最后一步…两个数据库都READ WRITE
SQL>alter tablespace marvin read write; --当前环境是未执行该步骤,跳过,到最后一步执行
6、使用ftp工具分别拷贝表空间(集)和与表空间对应数据文件到相应的目录。
1、ASM文件转换到本地(可以直接GRID用户ASMCMD内用CP命令)
oracle@rac1:/home/oracle>rman target /
RMAN>convert datafile '+data/orcl/datafile/marvin.dbf' db_file_name_convert '+data/orcl/datafile/marvin.dbf','/u01/backup/marvin.dbf';
Starting conversion at target at 2018-05-29 15:24:26
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile conversion
input file name=+DATA/orcl/datafile/marvin.dbf
converted datafile=/u01/backup/marvin.dbf
channel ORA_DISK_1: datafile conversion complete, elapsed time: 00:00:01
Finished conversion at target at 2018-05-29 15:24:27
传输dmp文件以及表空间文件到目标端所创建目录/u01/backup下
oracle@rac1:/u01/backup>scp * 172.41.176.117:/u01/backup/
oracle@172.41.176.117's password:
expdat.dmp 100% 88KB 88.0KB/s 00:00
marvin.dbf 100% 10MB 10.0MB/s 00:00
tts_export.log 100% 1306 1.3KB/s 00:00
oracle@rac1:/u01/backup>
7、目标数据库使用impdp工具将表空间数据导入目标数据库,根据需要决定是否需要创建与源数据库相同的用户,或者在使用impdp是可以使用remap_schema参数 (由于没有涉及储存字节转换,本次跳过,转换示例步骤参考 第四大节中 传输表空间检查及步骤 第四小点 目标端转换数据文件存储字节序)
手动调整数据文件存放位置
oracle@12cDG:/data>mv /u01/oradata/marvin.dbf /data/oradata/
提前创建好对应的用户以及表空间名
目标端:注意:使用需导入的PDB环境
提前创建好需要remap的用户或者(就算不remap用户,也是需要手动创建原隶属于表空间的用户,否则可能导入报错,还得另外创建)
15:58:00 > alter session set container=orclpdb;
Session altered.
Elapsed: 00:00:00.04
16:01:27 SYS@orcl>CREATE USER yunqu IDENTIFIED BY yunqu;
User created.
16:14:33 SYS@orcl>grant connect ,resource to yunqu;
Grant succeeded.
Elapsed: 00:00:00.09
执行导入:
oracle@12cDG:/home/oracle>impdp system/yunq111@orclpdb dumpfile=expdat.dmp directory=datapump_dir transport_datafiles=/data/oradata/marvin.dbf remap_schema=marvinn:yunqu logfile=import.log
Import: Release 12.2.0.1.0 - Production on Tue May 29 15:34:19 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-39087: directory name DATAPUMP_DIR is invalid
这是因为我只在CDB中创建授权了SYSTEM访问该目录,ORCLPDB中并没有创建授权
15:35:45 SYS@orcl>alter session set container=orclpdb;
Session altered.
Elapsed: 00:00:00.11
15:37:59 SYS@orcl>create directory datapump_dir as '/u01/backup';
Directory created.
Elapsed: 00:00:00.04
15:38:14 SYS@orcl>grant write,read on directory datapump_dir to system;
Grant succeeded.
Elapsed: 00:00:00.02
可以看到,及时CDB中存在该目录名,在PDB中仍然可以创建同等目录名并授权
重新导入:
oracle@12cDG:/home/oracle>impdp system/yunq111@orclpdb dumpfile=expdat.dmp directory=datapump_dir transport_datafiles=/data/oradata/marvin.dbf remap_schema=marvinn:yunqu logfile=import.log
Import: Release 12.2.0.1.0 - Production on Tue May 29 16:09:39 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
Master table "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01" successfully loaded/unloaded
import done in AL32UTF8 character set and AL16UTF16 NCHAR character set
export done in US7ASCII character set and AL16UTF16 NCHAR character set
Starting "SYSTEM"."SYS_IMPORT_TRANSPORTABLE_01": system/********@orclpdb dumpfile=expdat.dmp directory=datapump_dir transport_datafiles=/data/oradata/marvin.dbf remap_schema=marvinn:yunqu logfile=import.log
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 Tue May 29 16:09:52 2018 elapsed 0 00:00:11
8、验证数据(目标端)
16:14:26 > alter session set container=orclpdb;
Session altered.
Elapsed: 00:00:00.00
16:14:50 SYS@orcl>conn yunqu/yunqu@orclpdb
Connected.
16:15:09 > select count(*) from yunqu;
COUNT(*)
----------
3
Elapsed: 00:00:00.01
16:15:27 YUNQU@orclpdb>select * from yunqu;
ID NAME SE AGE CLASS
---------- -------------------- -- ---------- ------
1 ss F 18 ene
2 ss F 18 ene
3 ss F 18 ene
Elapsed: 00:00:00.03
数据正常.....
验证用户默认表空间
16:18:11 SYS@orclpdb>select username,default_tablespace from dba_users where username='YUNQU';
USERNAME
--------------------------------------------------------------------------------
DEFAULT_TABLESPACE
------------------------------------------------------------
YUNQU
USERS
创建用户,当时由于没有指定表空间,并且表空间MARVIN也不存在,而原始环境用户默认表空间是marvin,所以在此也更正一下,保证一致性
16:26:30 SYS@orclpdb>alter user yunqu default tablespace marvin;
User altered.
Elapsed: 00:00:00.08
16:30:45 SYS@orclpdb>select username,default_tablespace from dba_users where username='YUNQU';
USERNAME
--------------------------------------------------------------------------------
DEFAULT_TABLESPACE
------------------------------------------------------------
YUNQU
MARVIN
Elapsed: 00:00:00.00
9、表空间置为READ WRITE(源端,以及目标端)
源端:
16:31:52 SYS@orcl1>alter tablespace marvin read write;
Tablespace altered.
Elapsed: 00:00:00.93
16:32:34 SYS@orcl1>select tablespace_name,status from dba_tablespaces where tablespace_name='MARVIN';
TABLESPACE_NAME STATUS
------------------------------ ---------
MARVIN ONLINE
Elapsed: 00:00:00.01
目标端:
16:31:55 SYS@orclpdb>alter tablespace marvin read write;
Tablespace altered.
Elapsed: 00:00:00.93
16:31:08 SYS@orclpdb>select tablespace_name,status from dba_tablespaces where tablespace_name='MARVIN';
TABLESPACE_NAME STATUS
------------------------------------------------------------ ------------------
MARVIN ONLINE
Elapsed: 00:00:00.00
至此….ORACLE 数据泵传输表空间完成…
版权声明:本文为博主原创文章,未经博主允许不得转载。



