传输数据(Transporting Data)_使用可传输特性(只导出元数据和直接复制数据文件)传输数据库,表空间,表或子分区

传输数据从一个数据库移动数据到另外一个数据库。

1.关于传输数据

1.1.传输数据目的

传输数据比对相同的数据执行export/import或unload/load操作更快。因为对于用户定义的表空间,数据文件包含所有拷贝到目标位置的实际数据,你使用Data Pump只传输数据库对象的元数据到新数据库

可以在以下级别上传输数据:
1)数据库
可以使用full transportable export/import特性移动整个数据库到不同的数据库实例。
2)表空间
可以使用transportable tablespaces特性在数据库之间移动表空间集。
3)表,分区和子分区
可以使用transportable tables特性在数据库之间移动表,分区和子分区集。

transportable tablespaces和transportable tables只传输驻留在用户定义的表空间中的数据
full transportable export/import传输驻留在用户定义的和管理的表空间比如SYSTEM和SYSAUX中的数据。full transportable export/import传输用户定义的表空间中包含的对象的元数据和管理表空间中包含的用户定义的对象的元数据与数据。具体来说,对于full transportable export/import,导出的dump文件只包括用户定义的表空间中包含的对象的元数据,但它同时包括管理表空间中包含的用户定义的对象的元数据和数据。


1.2.传输数据场景

full transportable export/import的场景:
1)移动非CDB到CDB
多租户架构让Oracle数据库作为一个包括用户创建的PDB(pluggable database)的CDB(multitenant container database)运行。你可以通过传输数据库移动非CDB到CDB。
传输的数据库变为与CDB关联的PDB。完全可传输的export/import可以有效将Oracle数据库11.2.0.3或以后的版本移动到Oracle数据库19c CDB。
2)移动数据库到新系统
可以使用full transportable export/import从一个系统移动数据库到另外一个系统。你可能想移动数据库到新系统来升级硬件或移动数据库到不同的平台。
3)升级Oracle数据库到新版本
可以使用full transportable export/import从Oracle数据库11g Release 2(11.2.0.3)或更高版本升级到19c。
为了实现这个目的,安装Oracle数据库19c和创建空的数据库。下一步,使用完全可传输的export/omport传输Oracle数据库11.2.0.3或以后的版本到Oracle数据库19c。

transportable tablespaces和transportable tables的场景:

场景transportable tablespacestransportable tables
为数据仓库传输和附加分区
在CD上发布结构数据
归档历史数据
使用传输表空间执行TSPITR
拷贝或移动个别表

1.3.跨平台传输数据

可以跨平台传输数据。

跨平台传输数据的功能可以用来:
1)让数据库从一个平台迁移到另外一台平台。
2)为内容提供者提供更容易和更有效的方式来发布结构数据和分发给在不同平台上运行Oracle数据库的客户。
3)简化从数据仓库环境分发数据到在更小平台上运行的数据集市。
4)让在不同操作系统或平台上的Oracle数据库安装之间共享只读表空间,假设存储系统可以从那些平台访问和全部平台都有相同的endian格式。

很多但不是全部平台都支持跨平台数据传输。可以查询视图V$TRANSPORTABLE_PLATFORM来查看支持的平台和确认每个平台的endian格式(字节存储次序)。以下查询显示支持跨平台数据传输的平台:

col platform_name for 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
22 		Linux OS (S64)                           Big

如果源平台和目标平台是相同的endian格式,那么数据从源平台传输到目标平台不需要任何数据转换。

如果源平台和目标平台是不同的endian格式,那么传输的数据必须转换到目标平台格式。可以使用以下一种方法来转换数据:
1)DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程
当使用一个这些存储过程来在源平台和目标平台之间移动数据文件时,每个数据文件中的每个块被转换到目标平台的endian格式。转换在目标平台上发生。
2)RMAN的CONVERT命令。
在源或目标平台上运行RMAN的CONVERT命令。这个命令转换被传输的数据到目标平台格式。

注:不同endian格式之间的数据文件转换不支持具有undo段的数据文件。

在数据文件中的数据可以被传输到不同平台之前,数据文件头部必须表明它属于的平台。为了在不同平台上的Oracle数据库安装之间传输只读表空间,至少一次让数据文件可读写。


1.4.传输数据上的一般限制

在传输数据上存在一般限制。也存在与完全可传输的export/import,可传输的表空间或可传输的表特定限制。

当你计划传输数据时注意以下一般限制:
1)源和目标数据库必须使用兼容的数据库字符集。特别地,以下其中一个条件必须是真的:
a. 源和目标数据库的数据库字符集是相同的。
b. 源数据库字符集是目标数据库字符集严格的(binary)子集和以下3个条件为真。
i)源数据库是Oracle数据库10.1.0.3或之后的版本
ii)要被传输的表空间不包含具有字符长度语义(character length semantics)的表列或源和目标数据库字符集的最大字符长度是相同的。
iii)要传输的数据不包含具有CLOB数据类型的列或源数据库和目标数据库的字符集都是单字节或多字节。
c. 源数据库字符集是目标数据库字符集严格的(binary)子集和以下2个条件为真。
i)源数据库是Oracle数据库10.1.0.3之前的版本
ii)源和目标数据库字符集的最大字符长度是相同的。

2)源和目标数据库使用兼容的国家字符集。特别地,以下其中一个必须为真:
a. 源和目标数据库的国家字符集是相同的。
b.源数据库是Oracle数据库10.1.0.3或之后的版本,要传输的表空间不包含NCHAR,NVARCHAR2,或NCLOB数据类型的列。

3)当运行可传输的export操作时,应用以下限制:
a.执行export的用户的缺省表空间必须不是其中一个被传输的表空间
b.执行export的用户的缺省表空间必须是可写的。
4)在非CDB中,你不能传输一个表空间到包含相同名称的表空间的目标数据库。

在CDB中,你不能传输一个表空间到包含相同名称的表空间的目标container。然而,不同container可以拥有相同名称的表空间。

可以使用REMAP_TABLESPACE导入参数来导入数据库对象到不同的表空间。或者,在传输操作之前,你可以重命名要被传输的表空间或目标表空间。

从Oracle 12.2开始,RMAN的RECOVER命令可以在重新映射表空间时移动表到不同的模式(schema)。

5) 在CDB中,缺省的Data Pump目录对象DATA_PUMP_DIR,不能与PDB一起工作。你必须在PDB中定义Data Pump export/import使用的明确的目录对象。

6)传输具有XMLTypes的数据有以下限制:
a.目标数据库必须已经安装了XML DB。
b.被XMLType表引用的模式不能是XML DB标准模式。
c.如果被传输的XMLType表的模式不在目标数据库存在,那么它被导入和注册。如果模式已经在目标数据库中存在,那么在导入期间会显示一个信息。
d.你必须只使用Data Pump来导出和导入包含XMLTypes的数据的元数据。
以下查询返回包含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;

7)解释是应用专用的和对于数据库是不透明的类型(比如RAW,BFILE和AnyTypes)可以被传输,但它们不能作为跨平台传输操作的一部分被转换。它们的实例结构只被应用程序了解,因此应用程序必须在这些类型被移动到新平台之后处理任何endian问题。类型和使用这些不透明类型的对象,直接或间接地,也受到这些限制。

8)当你在具有不同时区的数据库之间传输一个包含具有TIMESTAMP WITH LOCAL TIME ZONE(TSLTZ)数据的表的表空间时,具有TSLTZ数据的表不被传输。错误信息描述没有传输的表。然而,表空间中不包含TSLTZ数据的表会被传输。

你可以使用以下查询确认数据库的时区:
SELECT DBTIMEZONE FROM DUAL;

可以使用ALTER DATABASE语句更改数据库的时区。

可以在传输操作完成之后使用Data Pump来执行具有TSLTZ数据的表的常规的export/import。

9)分析性的工作区不能是跨平台传输操作的一部分。如果源平台和目标平台不同,那么使用Data Pump export/import来导出和导入分析性工作区。

注:不要作为SYSDBA来调用Data Pump export工具expdp或导入工具impdp,除非在Oracle技术支持的请求下。SYSDBA是内部使用的和有专门的功能;它的行为与一般用户不同。


1.5.传输数据兼容性考虑

当传输数据,Oracle数据库计算目标数据库必须运行的最低的兼容性级别。

你可以使用可传输表空间从源数据库传输表空间或表到具有相同或更高兼容设置的目标数据库,即使目标数据库在相同或不同的平台上。如果源数据库的兼容性级别比目标数据库的兼容性级别更高,数据传输操作失败。

下表显示在各种场景中源和目标数据库最低的兼容性要求。源和目标数据库不需要有相同的兼容性设置。

传输场景源最低数据库兼容性目标最低数据库兼容性
使用完全可传输的export/import传输数据库12.0(Oracle数据库12c或以后的版本的COMPATIBLE初始化参数设置
12(11.2.0.3或以后的版本的数据库的Oracle Data Pump导出参数VERSION设置
12.0(COMPATIBLE初始化参数设置)
在相同平台上的数据库之间使用可传输的表空间传输表空间8.0(COMPATIBLE初始化参数设置)8.0(COMPATIBLE初始化参数设置)
使用可传输的表空间传输具有与目标库块大小不同的表空间9.0(COMPATIBLE初始化参数设置9.0(COMPATIBLE初始化参数设置)
在不同平台上的数据库之间使用可传输的表空间传输表空间10.0(COMPATIBLE初始化参数设置)10.0(COMPATIBLE初始化参数设置)
在数据库之间传输表11.2.0(Oracle 12c或以后版本的数据库的COMPATIBLE初始化参数设置)11.2.0(COMPATIBLE初始化参数设置)

注:
1)当使用完全可传输的export和import时,源数据库必须是Oracle 11.2.0.3或之后的版本,目标数据库必须是Oracle 12c或之后的版本。
2)当从11.2.0.3或以后版本的数据库传输数据库到Oracle 12c或以后版本的数据库时,必须设置Oralce Data Pump export参数VERSION为12或更高。
3)当从Oracle 19c数据库传输数据库到Oracle 19c或以后版本的数据库时,必须设置COMPATIBLE为19.0.0或更高。


2.传输数据库

可以传输数据库到新的数据库实例。

2.1.完全可传输的export/import介绍

可以使用完全可传输的export/import特性来从一个Oracle数据库实例拷贝整个数据库到另外一个实例。

可以使用Data Pump生成export dump文件,如果必要传输dump文件到目标数据库,然后导入export dump文件。或者,可以使用Data Pump通过网络拷贝整个数据库。

数据库中被传输的表空间可以是字典管理或本地管理的。数据库中的表空间不要求是与目标数据库标准块大小相同的块大小。

注:传输数据库的方法要求你将数据库中用户定义的表空间置于只读模式直到完成了导出。如果不行,那么可以使用备份特性里的可传输的表空间。


2.2.完全可传输的export/import限制

完全可传输的export/import上存在限制。

注意完全可传输的export/import上的以下限制:
1)“传输数据上的一般限制”中描述的一般限制应用到完全可传输的export/import。
2)完全可传输的export/import可以使用惯例的Data Pump export/import导出和导入管理表空间中用户定义的数据库对象,比如直接路径和外部表。管理表空间是Oracle数据库提供的非用户表空间,比如SYSTEM和SYSAUX表空间。
3)完全可传输的export/import不能传输同时在管理表空间(比如SYSTEM和SYSAUX)和用户定义的表空间中定义的数据库对象。例如,分区表可能同时存储在用户定义的表空间和管理表空间中。如果有这样的数据库对象在数据库中,那么你可以在传输它们之前重定义它们以便它们整个存储在管理表空间或用户定义的空间中。如果数据库对象不能被重定义,那么可以使用惯例的Data Pump export/import。
4)当使用完全可传输的export/import通过网络传输数据库时,当审计跟踪信息本身存储在用户定义的表空间中时,不能为存储在管理表空间(比如SYSTEM和SYSAUX)中的表启用审计。
5)完全可传输的数据库导入不能在Transaction Guard启用时执行。在完全数据库导入期间禁用Transaction Guard。


2.3.使用Export Dump文件传输数据库

以下任务列表概述了使用export dump文件传输数据库的过程。在接下来的示例中提供了每个任务的详情。
1)在源数据库,配置每个用户定义的表空间到只读模式和导出数据库。

确保以下参数设置为指定的值:
a.TRANSPORTABLE=ALWAYS
b.FULL=Y

如果源数据库是Oracle 11.2.0.3或以后的版本,那么你必须指定VERSION参数为12或更高。

如果源数据库包含任何加密的表空间或包含加密列的表的表空间,那么你指定ENCRYPTION_PWD_PROMPT=YES,或指定 ENCRYPTION_PASWORD参数。

Export dump文件包括包含在用户定义的表空间中的对象的元数据和包含在管理表空间比如SYSTEM和SYSAUX中的用户定义的对象的元数据和数据。

2)传输export dump文件。
拷贝export dump文件到目标数据库可以访问的位置。

3)传输数据库中所有用户定义的表空间的数据文件。
拷贝数据文件到目标数据库可以访问的位置。

如果源平台和目标平台不同,那么通过查询V$TRANSPORTABLE_PLATFORM视图检查每个平台的endian格式。

如果源平台的endian格式与目标平台的endian格式不同,那么使用以下一个方法来转换数据文件:
a.使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程来传输数据文件。这些存储过程自动转换数据文件到目标平台的endian格式。
b.使用RMAN的CONVERT命令来转换数据文件到目标平台的endian格式。
注:具有undo段的数据文件不支持在不同endian格式之间的数据文件转换。
4)[可选]在源数据库上还原用户定义的表空间到读/写模式。

5)在目标数据库上,导入数据库。
当导入完成时,用户定义的表空间是在读/写模式中。


示例
在这个示例中详细地阐述传输数据库的任务。这个示例假设源平台是Solaris和目标平台是Microsoft Windows。

它也假设源平台有以下数据文件和表空间:

表空间类型数据文件
sales用户定义的/u01/app/oracle/oradata/mydb/sales01.dbf
customers用户定义的/u01/app/oracle/oradata/mydb/cust01.dbf
employees用户定义的/u01/app/oracle/oradata/mydb/emp01.dbf
SYSTEM管理的/u01/app/oracle/oradata/mydb/system01.dbf
SYSAUX管理的/u01/app/oracle/oradata/mydb/sysaux01.dbf

示例做以下额外的假设:
a.目标数据库是新的数据库,它正在被来自源数据库的数据填满。源数据库的名称是mydb。
b.源数据库和目标数据库都是Oracle 19c数据库。

完成以下任务来使用export dump文件传输数据库:


任务1:生成export dump文件
完成以下步骤来生成export dump文件
1)启动SQL*Plus,作为管理员或具有ALTER TABLESPACE或MANAGE TABLESPACE系统权限的用户连接到数据库。

2)将数据库中所有用户定义的表空间更改为只读。
ALTER TABLESPACE sales READ ONLY;
ALTER TABLESPACE customers READ ONLY;
ALTER TABLESPACE employees READ ONLY;

3)作为具有DATAPUMP_EXP_FULL_DATABASE角色的用户调用Data Pump export工具,指定完全可传输的export/import选项。
SQL> HOST
$ expdp user_name full=y dumpfile=expdat.dmp directory=data_pump_dir
transportable=always logfile=export.log
Password: password

你必须总是指定TRANSPORTABLE=ALWAYS,它决定是否使用可传输的选项。

示例指定了以下Data Pump参数:
a.FULL参数指定整个数据库被导出。
b.DUMPFILE参数指定要创建的结构信息export dump文件的名称,expdat.dmp。
c.DIRECTORY参数指定指向dump文件的操作系统或Oracle ASM位置的目录对象。你必须在调用Data Pump之前创建DIRECTORY对象和你必须授予目录的READ和WRITE对象权限给运行Export工具的用户。
在非CDB中,目录对象DATA_PUMP_DIR自动被创建。对这个目录的读和写访问被自动授予给DBA角色,因此授予给SYS和SYSTEM。
然而,在PDB中目录对象DATA_PUMP_DIR不会被自动创建。因此,导入到PDB中时,在PDB中创建目录对象和当运行Data Pump时指定目录对象。
d.LOGFILE参数指定export工具写的日志文件的文件名称。在这个示例中,日志文件被写到与dump文件相同的目录,但它可以被写到不同的位置。

为了在Oracle 11.2.0.3或以后的版本上执行完全可传输的导出,使用VERSION参数,如下所示:
expdp user_name full=y dumpfile=expdat.dmp directory=data_pump_dir
transportable=always version=12 logfile=export.log

完全可传输的导入只在Oracle 12c和以后版本的数据库上受支持。

注:在这个示例中,Data Pump工具被用来只导出用户定义的表空间的数据字典结构信息(元数据)。只为管理表空间(SYSTEM和SYSAUX)卸载实际的数据,因此即使对于大的用户定义的表空间,操作进行相对较快。

4)检查日志中的错误,注意必须传输到目标数据库的dump文件和数据文件。Expdp像以下这样在信息中输出这些文件的名称和路径:

****************************************************************************
**
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/u01/app/oracle/admin/mydb/dpdump/expdat.dmp
****************************************************************************
**
Datafiles required for transportable tablespace SALES:
/u01/app/oracle/oradata/mydb/sales01.dbf
Datafiles required for transportable tablespace CUSTOMERS:
/u01/app/oracle/oradata/mydb/cust01.dbf
Datafiles required for transportable tablespace EMPLOYEES:
/u01/app/oracle/oradata/mydb/emp01.dbf

5)当完成时,退出到SQL*Plus:
$ exit


任务2:传输export dump文件
传输dump文件到DATA_PUMP_DIR目录对象指向的目录,或到你选择的任何其它目录。新的位置必须是目标数据库可访问的。
在目标数据库,运行以下查询来确认DATA_PUMP_DIR的位置:
SELECT * FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = ‘DATA_PUMP_DIR’;

OWNER    DIRECTORY_NAME               DIRECTORY_PATH
------ ---------------- -----------------------------------
SYS      DATA_PUMP_DIR     C:\app\orauser\admin\orawin\dpdump\

任务3:传输用户定义的表空间的数据文件
传输数据库中用户定义的表空间的数据文件到目标数据库可以访问的位置。

在这个示例中,从源数据库传输以下数据文件到目标数据库:
sales01.dbf
cust01.dbf
emp01.dbf

如果你在传输数据库到与源平台不同的平台,那么确认源平台和目标平台是否都支持跨平台数据库传输和确认每个平台的endian格式。如果两个平台都具有相同的endian格式,那么不需要转换。否则,你必须在源数据库或目标数据库上转换数据库中的每个表空间。
如果你在传输数据库到不同的平台,你可以在每个平台上执行以下查询。如果查询返回一行,那么平台支持跨平台表空间传输。
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
---------------------------------- --------------
Solaris[tm] OE (32-bit) 				Big

以下是目标平台的查询结果:

PLATFORM_NAME 						ENDIAN_FORMAT
---------------------------------- --------------
Microsoft Windows IA (32-bit)            Little

在这个示例中,你可以看到endian格式是不同的。因此,在这个情况中,对于传输数据库转换是必要的。使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程自动转换数据文件到目标平台的endian格式。传输数据文件到目标数据库现存的数据文件的位置。在UNIX和Linux平台上,这个位置通常是/u01/app/oracle/oradata/dbname/或*+DISKGROUP*/dbname/datafile/。或者可以使用RMAN的CONVERT命令来转换数据文件。

注:如果不需要表空间endian格式转换,那么你可以使用任何文件传输方法来传输文件。


任务4[可选]:还原表空间到读/写模式
在源数据库上让可传输的表空间再次可读/写。
ALTER TABLESPACE sales READ WRITE;
ALTER TABLESPACE customers READ WRITE;
ALTER TABLESPACE employees READ WRITE;

你可以推迟任务到首先确保导入过程成功。


任务5:在目标数据库上,导入数据库
作为具有DATAPUMP_IMP_FULL_DATABASE角色的用户调用Data Pump import工具和指定完全可传输的export/import选项。
impdp user_name full=Y dumpfile=expdat.dmp directory=data_pump_dir
transport_datafiles=
‘/u01/app/oracle/oradata/mydb/sales01.dbf’,
‘/u01/app/oracle/oradata/mydb/cust01.dbf’,
‘/u01/app/oracle/oradata/mydb/emp01.dbf’
logfile=import.log
Password: password

这个示例指定以下Data Pump参数:
1)FULL参数指定整个数据库以FULL模式导入。
2)DUMPFILE参数指定包含要导入的用户定义的表空间的元数据和管理表空间的元数据与数据的导出的文件。
3)DIRECTORY参数指定export dump文件位置的目录对象。你必须在调用Data Pump之前创建DIRECTORY对象和授予目录的READ与WRITE对象权限给运行import工具的用户。

在非CDB中,目录对象DATA_PUMP_DIR被自动创建。对这个目录的读和写访问被自动授予给DBA角色,因此授予给SYS和SYSTEM用户。

然而,在PDB中目录对象DATA_PUMP_DIR不会被自动创建。因此,当导入到PDB中时,在PDB中创建目录对象和当运行Data Pump时指定目录对象。

4)TRANSPORT_DATAFILES参数指定所有要被导入的数据文件。如果存在很多数据文件,你可以使用PARFILE参数在参数文件中指定TRANSPORT_DATAFILES参数多次。

5)LOGFILE参数指定import工具写的日志文件的名称。在这个示例中,日志文件写到dump文件读取的目录,但它可以被写到不同的位置。

在这个语句成功执行之后,检查导入日志文件来确保没有意料之外的错误发生。

当处理大量的数据文件时,在语句中指定数据文件名称列表是个费力的过程。它甚至会超过语句行的限制。在这个情形中,可以使用导入参数文件。例如,可以如下调用Data Pump import工具:
impdp user_name parfile=‘par.f’

文件par.f包含以下行:
FULL=Y
DUMPFILE=expdat.dmp
DIRECTORY=data_pump_dir
TRANSPORT_DATAFILES=
‘/u01/app/oracle/oradata/mydb/sales01.dbf’,
‘/u01/app/oracle/oradata/mydb/cust01.dbf’,
‘/u01/app/oracle/oradata/mydb/emp01.dbf’
LOGFILE=import.log

注:
1)在导入期间,用户定义的表空间可能由于载入元数据被临时设置为读/写。确保在导入期间没有用户对数据进行更改。在导入成功完成时,所有用户定义的表空间被设置为读/写。
2)当执行网络数据库导入时,TRANSPORTABLE参数必须设置为always。
3)当导入到CDB中的PDB时,在用户名称后为PDB指定连接标识符。例如,如果PDB的连接标识符是hrpdb,那么当运行Oracle Data Pump import工具时输入以下:
impdp user_name@hrpdb …


2.4.通过网络传输数据库

为通过网络传输数据库,使用NETWORK_LINK参数执行导入,导入是使用数据库链接执行和不涉及dump文件。

以下任务列表概述了通过网络传输数据库的过程。每个任务的详情在接下来的示例中提供。
1)创建一个从目标数据库到源数据库的数据库链接。
导入操作必须由目标数据库上具有DATAPUMP_IMP_FULL_DATABASE角色的用户来执行,数据库链接必须连接到源数据库上具有DATAPUMP_EXP_FULL_DATABASE角色的用户。源数据库上的用户不能是具有SYSDBA管理特权的用户。如果数据库链接是一个连接的用户数据库链接,那么目标数据库上的用户不能是具有SYSDBA管理特权的用户

2)在源数据库中,让数据库中的用户定义的表空间只读。

3)传输数据库中所有用户定义的表空间的数据文件。
拷贝数据文件到目标数据库可以访问的位置。

如果源平台和目标平台不同,那么通过查询V$TRANSPORTABLE_PLATFORM视图检查每个平台的endian格式。

如果源平台的endian格式与目标平台的endian格式不同,那么使用以下一个方法来转换数据文件:
a.使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程来传输数据文件。这些存储过程自动转换数据文件到目标平台的endian格式。
b.使用RMAN的CONVERT命令来转换数据文件到目标平台的endian格式。
注:具有undo段的数据文件不支持在不同endian格式之间的数据文件转换。

4)在目标数据库上,导入数据库。
调用Data Pump工具来导入用户定义的表空间的元数据和管理表空间的元数据与数据。

确保以下参数设置为指定的值:
a.TRANSPORTABLE=ALWAYS
b.TRANSPORT_DATAFILES=list_of_datafiles
c.FULL=Y
d.NETWORK_LINK=source_database_link
e.VERSION=12
如果源数据库是Oracle 11.2.0.3或以后的版本,那么需要VERSION参数和必须设置为12。如果源数据库是12c或以后的版本,那么VERSION参数是不需要的。

如果源数据库包含任何加密的表空间或包含加密列的表的表空间,那么你指定ENCRYPTION_PWD_PROMPT=YES,或指定 ENCRYPTION_PASWORD参数。

Data Pump网络导入拷贝包含在用户定义的表空间中的对象的元数据和包含在管理表空间比如SYSTEM和SYSAUX中的用户定义的对象的元数据和数据。

当导入完成时,用户定义的表空间在读/写模式中。

5)[可选]在源数据库上还原用户定义的表空间到读/写模式。


示例
传输数据库的这些任务在以下的示例中更全面地阐述,其中假设以下数据文件和表空间存在:

表空间类型数据文件
sales用户定义的/u01/app/oracle/oradata/mydb/sales01.dbf
customers用户定义的/u01/app/oracle/oradata/mydb/cust01.dbf
employees用户定义的/u01/app/oracle/oradata/mydb/emp01.dbf
SYSTEM管理的/u01/app/oracle/oradata/mydb/system01.dbf
SYSAUX管理的/u01/app/oracle/oradata/mydb/sysaux01.dbf

示例做以下额外的假设:
a.目标数据库是新的数据库,它正在被来自源数据库的数据填满。源数据库的名称是sourcedb。
b.源数据库和目标数据库都是运行在具有相同endian格式的相同平台。
运行以下查询检查平台的endian格式:
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V T R A N S P O R T A B L E P L A T F O R M t p , V TRANSPORTABLE_PLATFORM tp, V TRANSPORTABLEPLATFORMtp,VDATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
c.sales表空间是加密的。其它表空间没有加密。
d.源数据库是Oracle 11.2.0.3数据库,目标数据库是Oracle 19c数据库。

注:这个示例阐述传输Oracle 11.2.0.3的数据库到CDB中的新的Oracle 19c PDB。这些任务也阐述如何传输一个非CDB到另外一个非CDB。


完成以下任务来通过网络传输数据库:
任务1:创建从目标数据库到源数据库的数据库链接
完成以下步骤:
1)参考《Oracle Database Net Services Administrator’s Guide》,确保源数据库和目标数据库之间的网络连接已配置。

2)启动SQL*Plus,作为管理员(其会使用Data Pump import传输数据库)连接到目标数据库。这个用户必须具有DATAPUMP_IMP_FULL_DATABASE角色来传输数据库。

3)创建数据库链接:
CREATE PUBLIC DATABASE LINK sourcedb USING ‘sourcedb’;

在USING子语句中指定源数据库的服务名称。

在导入操作期间,数据库链接必须连接到源数据库上具有DATAPUMP_EXP_FULL_DATABASE角色的用户。源数据库上的用户不能是具有SYSDBA管理特权的用户。


任务2:让用户定义的表空间只读
完成以下步骤:
1)启动SQL*Plus,作为管理员或具有ALTER TABLESPACE或MANAGE TABLESPACE系统特权的用户连接到源数据库。

2)将数据库中所有用户定义的表空间更改为只读。
ALTER TABLESPACE sales READ ONLY;
ALTER TABLESPACE customers READ ONLY;
ALTER TABLESPACE employees READ ONLY;


任务3:传输用户定义的表空间的数据文件
传输数据库中用户定义的表空间的数据文件到目标数据库现存数据文件的位置。在UNIX和Linux平台上,这个位置通常是/u01/app/oracle/oradata/dbname/或+DISKGROUP/dbname/datafile/。

在这个示例中,从源数据库传输以下数据文件到目标数据库:
sales01.dbf
cust01.dbf
emp01.dbf


任务4:在目标数据库上,导入数据库
作为具有DATAPUMP_IMP_FULL_DATABASE角色的用户调用Data Pump import工具和指定完全可传输的export/import选项。
impdp user_name full=Y network_link=sourcedb transportable=always
transport_datafiles=
‘/u01/app/oracle/oradata/mydb/sales01.dbf’,
‘/u01/app/oracle/oradata/mydb/cust01.dbf’,
‘/u01/app/oracle/oradata/mydb/emp01.dbf’
encryption_pwd_prompt=YES version=12 logfile=import.log
Password: password

这个示例指定以下Data Pump参数:
1)FULL参数指定整个数据库以FULL模式导入。
2)NETWORK_LINK参数指定用来网络导入的数据库链接。
3)TRANSPORTABLE参数指定import使用的可传输的选项。
4)TRANSPORT_DATAFILES参数指定所有要被导入的数据文件。如果存在很多数据文件,你可以使用PARFILE参数在参数文件中指定TRANSPORT_DATAFILES参数多次。
5)ENCRYPTION_PWD_PROMPT参数让Data Pump提示加密密码,Data Pump加密通过网络连接传输的数据和元数据。当加密的表空间或具有加密列的表是导入操作的一部分时需要ENCRYPTION_PWD_PROMPT参数或ENCRYPTION_PASSWORD参数。
6)VERSION参数设置为12,因为源数据库是11.2.0.3或之后的11g数据库。
7)LOGFILE参数指定import工具写的日志文件的名称。在这个示例中,日志文件写到dump文件读取的目录,但它可以被写到不同的位置。

在这个语句成功执行之后,检查导入日志文件来确保没有意料之外的错误发生。

当处理大量的数据文件时,在语句中指定数据文件名称列表是个费力的过程。它甚至会超过语句行的限制。在这个情形中,可以使用导入参数文件。
当加密表空间或具有加密列的表是导入操作的一部分时,使用import参数文件也是建议的。在这个情况中,在import参数文件中指定ENCRYPTION_PWD_PROMPT=YES。
例如,可以如下调用Data Pump import工具:
impdp user_name parfile=‘par.f’

文件par.f包含以下行:
FULL=Y
NETWORK_LINK=sourcedb
TRANSPORTABLE=always
TRANSPORT_DATAFILES=
‘/u01/app/oracle/oradata/mydb/sales01.dbf’,
‘/u01/app/oracle/oradata/mydb/cust01.dbf’,
‘/u01/app/oracle/oradata/mydb/emp01.dbf’
ENCRYPTION_PWD_PROMPT=YES
VERSION=12
LOGFILE=import.log

注:
1)在导入期间,用户定义的表空间可能由于载入元数据被临时设置为读/写。确保在导入期间没有用户对数据进行更改。在导入成功完成时,所有用户定义的表空间被设置为读/写。
2)当导入到CDB中的PDB时,在用户名称后为PDB指定连接标识符。例如,如果PDB的连接标识符是hrpdb,那么当运行Oracle Data Pump import工具时输入以下:
impdp user_name@hrpdb …


任务5[可选]:还原用户定义的表空间到读/写模式
在源数据库上让用户定义的表空间再次可读/写。
ALTER TABLESPACE sales READ WRITE;
ALTER TABLESPACE customers READ WRITE;
ALTER TABLESPACE employees READ WRITE;

可以推迟任务到首先确保导入过程成功。


3.在数据库之间传输表空间

注:为导入可传输的表空间集到不同平台上的Oracle数据库,两个数据库必须设置兼容性至少为10.0.0。

3.1.可传输的表空间简介

可以使用可传输的表空间特性来从一个数据库拷贝表空间集到另外一个数据库。

被传输的表空间可以是数据字典管理或本地管理的。可传输的表空间不需要是与目标数据库标准块大小相同的块大小

有两种方式传输数据库:
1)手动地,跟随本章节中的步骤。这涉及在SQL*Plus和Data Pump中执行命令。
2)使用OEMCC中的传输表空间向导。

注:
1)传输表空间的方法要求你将表空间置于只读模式直至完成了传输过程。如果不可取,那么可以使用备份特性中的可传输的表空间。
2)你必须使用Data Pump传输表空间。唯一可以使用原始的导入和导出工具IMP与EXP的情况是向后迁移XMLType数据到Oracle 10.2或更早的版本。


3.2.可传输的表空间限制

本章节列出可传输的表空间的限制。

注意以下可传输的表空间的限制 :
1)“传输数据的一般限制”中描述的一般限制应用到可传输的表空间。
2)当传输表空间集时,具有底层对象(比如物化视图)或被包含的对象(比如分区表)的对象是不可传输的直到所有底层或被包含的对象在表空间集中。
3)可传输的表空间不能跨具有不同时区文件版本的平台传输具有TIMESTAMP WITH TIME ZONE(TSTZ)数据的表。 可传输的表空间操作跳过这些表。你可以按惯例地导出和导入这些表。
4)你不能包括管理表空间,比如SYSTEM和SYSAUX在可传输的表空间集中。
5)可传输的表空间不能包括任何含有使用TDE列加密加密的列的表。
6)如果表空间使用TDE加密的,你只可以传输这个表空间到使用相同endian格式的表空间。如果需要跨endian格式,必须解密,传输和重新加密表空间。从Oracle 12.2开始,这些操作可以在线执行。


3.3.在数据库之间传输表空间

可以在数据库之间传输一个表空间或表空间集。

以下任务列表概述了传输表空间的过程。每个任务的详情在接下来的示例中提供。
1)选择一个自包含的表空间集。
2)在源数据库上,配置表空间集到只读模式和生成可传输的表空间集。
可传输的表空间集(或可传输集)包含被传输的表空间集的数据文件和包含表空间集的结构性信息(元数据)的export dump文件。使用Data Pump来执行导出。
3)传输export dump文件。
拷贝export dump文件到目标数据库可以访问的位置。
4)传输表空间集。
拷贝数据文件到目标数据库可以访问的目录。
如果源平台和目标平台不同,那么通过查询V$TRANSPORTABLE_PLATFORM视图检查每个平台的endian格式。

如果源平台的endian格式与目标平台的endian格式不同,那么使用以下一个方法来转换数据文件:
a.使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程来传输数据文件。这些存储过程自动转换数据文件到目标平台的endian格式。
b.使用RMAN的CONVERT命令来转换数据文件到目标平台的endian格式。
注:具有undo段的数据文件不支持在不同endian格式之间的数据文件转换。

5)[可选]在源数据库上还原表空间到读/写模式。

6)在目标数据库上,导入表空间集。
运行Data Pump工具来导入表空间集的元数据。


示例

传输表空间的这些任务在以下的示例中更全面地阐述,其中假设以下数据文件和表空间存在:

表空间数据文件
sales_1/u01/app/oracle/oradata/salesdb/sales_101.dbf
sales_2/u01/app/oracle/oradata/salesdb/sales_201.dbf

任务1:选择一个自包含的表空间集
可能在可传输集中的数据库对象和可传输集之外的数据库对象之间存在逻辑的或物理的依赖。只能传输自包含的表空间集,即没有表空间集中的数据库对象依赖于任何表空间集之外的数据库对象。

某些违反自包含表空间的示例是:
1)表空间集中的索引是用于表空间集之外的表。
2)分区表被部分地包含在表空间集中。
你想拷贝的表空间集必须包含分区表的所有分区或不包含分区表的任何分区。为传输分区表的子集,必须交换分区到表中。
3)参考完整性约束指向一个跨集界限的表。
当传输表空间集时,你可以选择包括参考完整性约束。然而,这样做可能会影响表空间集的自包含性。如果决定不传输约束,那么约束不会被认为是指针。
4)表空间集中的表包含指向表空间集外的LOB的LOB列。
5)用户A注册的XML DB模式(*.xsd)导入一个用户B注册的全局模式和以下条件是真:用户A的缺省表空间是表空间A,用户B的缺省表空间是B,只有表空间A被包括在表空间集中。

为确认表空间集是否是自包含的,运行DBMS_TSS包中的TRANSPORT_SET_CHECK存储过程。你必须授予EXECUTE_CATALOG_ROLE角色(初始分配给SYS)给运行这个存储过程的用户。

当运行DBMS_TTS.TRANSPORT_SET_CHECK存储过程时,在要检查自包含的传输集中指定表空间列表。你可以选择性地指定是否必须包括约束。对于严格或完全包含,必须额外设置TTS_FULL_CHECK参数为TRUE。

严格或完全包含是用于不仅需要捕获表空间集向外的参考,也包括那些指向表空间集的情况。表空间时间点恢复 (TSPITR)是一个这种情况,其中依赖的对象必须完全包含或完全在可传输集之外。

例如,在一个包含表t但不包含它的索引i的表空间上执行TSPITR是违反自包含的,因为索引和数据在传输之后将会是不一致的。完全包含检查确保不存在依赖指向传输集外或向里。

注:可传输的表空间缺省检查自包含而不是完全包含。

以下语句可用用来确认表空间sales_1和sales_2是自包含的,和参考完整性约束考虑在内(由TRUE指示)。
EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK(‘sales_1,sales_2’, TRUE);

在运行DBMS_TTS.TRANSPORT_SET_CHECK存储过程之后,你可以查询TRANSPORT_SET_VIOLATIONS视图来查看所有违例。如果表空间是自包含的,那么视图是空的。以下示例阐述存在2种违反的情况:外键约束,dept_fk,跨表空间集界限;分区表jim.sales,部分包含在表空间集中。
SELECT * FROM TRANSPORT_SET_VIOLATIONS;

VIOLATIONS
---------------------------------------------------------------------------
Constraint DEPT_FK between table JIM.EMP in tablespace SALES_1 and table
JIM.DEPT in tablespace OTHER
Partitioned table JIM.SALES is partially contained in the transportable set

在sales_1和sales_2可被传输之前你必须解决这些违反。如在下一个任务中所注,绕开完整性约束违反的一个选择是不导入完整性约束。


任务2:生成可传输的表空间集
在确保有你想传输的自包含的表空间集之后,生成一个可传输的表空间集。

生成可传输的表空间集:
1)启动SQL*Plus,作为管理员或作为具有ALTER TABLESPACE或MANAGE TABLESPACE系统特权的用户连接到数据库。

2)将传输集中的所有表空间设置为只读。
ALTER TABLESPACE sales_1 READ ONLY;
ALTER TABLESPACE sales_2 READ ONLY;

3)作为具有DATAPUMP_EXP_FULL_DATABASE角色的用户调用Data Pump export工具和指定表空间集中的表空间。
SQL> HOST
$ expdp user_name dumpfile=expdat.dmp directory=data_pump_dir
transport_tablespaces=sales_1,sales_2 logfile=tts_export.log
Password: password

你必须总是指定TRANSPORT_TABLESPACES,它指定使用的可传输的选项。这个示例指定了以下额外的Data Pump参数:
a.DUMPFILE参数指定要创建的结构信息export dump文件的名称,expdat.dmp。
b.DIRECTORY参数指定指向dump文件的操作系统或Oracle ASM位置的目录对象。你必须在调用Data Pump之前创建DIRECTORY对象和你必须授予目录的READ和WRITE对象权限给运行Export工具的用户。
在非CDB中,目录对象DATA_PUMP_DIR自动被创建。对这个目录的读和写访问被自动授予给DBA角色,因此授予给SYS和SYSTEM。
然而,在PDB中的目录对象DATA_PUMP_DIR不会被自动创建。因此,导入到PDB中时,在PDB中创建目录对象和当运行Data Pump时指定目录对象。
c.LOGFILE参数指定export工具写的日志文件的文件名称。在这个示例中,日志文件被创建在与dump文件相同的目录,但它可以指定任何其它目录来存储日志文件。
d.缺省时触发器和索引被包括在导出操作中。

使用严格的包含检查来执行传输表空间操作,使用TRANSPORT_FULL_CHECK参数,如下例所示:
expdp use_name dumpfile=expdat.dmp directory=data_pump_dir
transport_tablespaces=sales_1,sales_2 transport_full_check=y
logfile=tts_export.log

在这个情况中,Data Pump export工具验证可传输集中的对象和可传输集之外的对象之间不存在依赖性。如果被传输的表空间不是自包含的,那么导出失败和指明可传输集不是自包含的。你必须解决这些违反和再次运行任务。

注:在这个示例中,Data Pump工具被用来只导出表空间的数据字典结构信息(元数据)。实际的数据会被卸载,因此即使对于大的表空间,操作进行相对较快。

4)expdp工具在命令行中如下例一样显示dump文件和数据文件的名称和路径。这些是需要传输到目标数据库的文件。因此,也检查日志文件中的任何错误:

****************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TRANSPORTABLE_01 is:
/u01/app/oracle/admin/salesdb/dpdump/expdat.dmp
****************************************************************************
Datafiles required for transportable tablespace SALES_1:
/u01/app/oracle/oradata/salesdb/sales_101.dbf
Datafiles required for transportable tablespace SALES_2:
/u01/app/oracle/oradata/salesdb/sales_201.dbf

5)当Data Pump export操作完成时,退出expdp工具返回到SQL*Plus:
$ exit


任务3:传输export dump文件
传输dump文件到DATA_PUMP_DIR目录对象指向的目录,或到任何你选择的其它目录。新的位置必须是目标数据库可访问的。
在目标数据库,运行以下查询来确认DATA_PUMP_DIR的位置:
SELECT * FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = ‘DATA_PUMP_DIR’;

OWNER   DIRECTORY_NAME               DIRECTORY_PATH
------ ---------------- -----------------------------------
SYS      DATA_PUMP_DIR     C:\app\orauser\admin\orawin\dpdump\

任务4:传输表空间集的数据文件
传输表空间的数据文件到目标数据库可以访问的位置。

在这个示例中,从源数据库传输以下数据文件到目标数据库:
sales_101.dbf
sales_201.dbf

如果传输表空间集到与源平台不同的平台,那么确认源平台和目标平台是否都支持跨平台表空间传输和确认每个平台的endian格式。如果两个平台都具有相同的endian格式,那么不需要转换。否则,你必须在源数据库或目标数据库上做数据转换。

如果你正在传输sales_1和sales_2到不同的平台,你可以在每个平台上执行以下查询。如果查询返回一行,那么平台支持跨平台表空间传输。
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
---------------------------------- --------------
Solaris[tm] OE (32-bit) 				Big

以下是目标平台的查询结果:

PLATFORM_NAME 						ENDIAN_FORMAT
---------------------------------- --------------
Microsoft Windows IA (32-bit)            Little

在这个示例中,你可以看到endian格式是不同的。因此,在这个情况中,对于传输数据库转换是必要的。使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程自动转换数据文件到目标平台的endian格式。传输数据文件到目标数据库现存的数据文件的位置。在UNIX和Linux平台上,这个位置通常是/u01/app/oracle/oradata/dbname/或+DISKGROUP/dbname/datafile/。或者可以使用RMAN的CONVERT命令来转换数据文件。

注:
1)如果你在使用RMAN的CONVERT命令,那么不同endian格式之间的数据文件转换不支持具有undo段的数据文件。
2)如果不需要表空间endian格式转换,那么你可以使用任何文件传输方法来传输文件。

任务5[可选]:还原表空间到读/写模式
在源数据库上让可传输的表空间再次可读/写。
ALTER TABLESPACE sales_1 READ WRITE;
ALTER TABLESPACE sales_2 READ WRITE;

你可以推迟任务到首先确保导入过程成功。


任务6:在目标数据库上,导入表空间

为完成可传输的表空间操作,导入表空间集。

导入表空间集:
1)作为具有DATAPUMP_IMP_FULL_DATABASE角色的用户调用Data Pump import工具和导入表空间元数据。
impdp user_name dumpfile=expdat.dmp directory=data_pump_dir
transport_datafiles=
‘c:\app\orauser\oradata\orawin\sales_101.dbf’,
‘c:\app\orauser\oradata\orawin\sales_201.dbf’
remap_schema=sales1:crm1 remap_schema=sales2:crm2
logfile=tts_import.log
Password: password

这个示例指定以下Data Pump参数:
a.DUMPFILE参数指定包含要导入的表空间的元数据的导出的文件。
b.DIRECTORY参数指定export dump文件位置的目录对象。你必须在运行Data Pump之前创建DIRECTORY对象和授予目录的READ与WRITE对象权限给运行import工具的用户。

在非CDB中,目录对象DATA_PUMP_DIR被自动创建。对这个目录的读和写访问被自动授予给DBA角色,因此授予给SYS和SYSTEM用户。

然而,在PDB中目录对象DATA_PUMP_DIR不会被自动创建。因此,当导入到PDB中时,在PDB中创建目录对象和当运行Data Pump时指定目录对象。

c.TRANSPORT_DATAFILES参数指定要被导入的表空间包含的所有数据文件。如果存在很多数据文件,你可以使用PARFILE参数在参数文件中多次指定TRANSPORT_DATAFILES参数。

d.REMAP_SCHEMA参数更改数据库对象的属主。如果你不指定REMAP_SCHEMA,那么所有数据库对象(比如表和索引)在与源数据库相同的用户模式中创建和那些用户必须已经存在目标数据库中。如果它们不存在,那么导入工具返回错误。在这个示例中,源数据库中由sales1拥有的表空间集中的对象在表空间集被导入之后将由目标数据库中的crm1所拥有。类似地,源数据库中由sales2拥有的对象将由目标数据库中的crm2所拥有。在这个示例中,目标数据库不需要拥有用户sales1和sales2,但必须拥有用户crm1和crm2。

从Oracle 12.2开始,RMAN的RECOVER命令可以在重新映射表时移动表到不同的模式。

e.LOGFILE参数指定import工具写的日志文件的名称。在这个示例中,日志文件写到dump文件读取的目录,但它可以被写到不同的位置。

在这个语句成功执行之后,被拷贝的集中的所有表空间保持在只读模式。检查导入日志文件来确保没有错误发生。

当处理大量的数据文件时,在语句中指定数据文件名称列表是个费力的过程,因为数据文件列表甚至会超过语句行的限制。在这个情形中,可以使用导入参数文件。例如,可以如下调用Data Pump import工具:
impdp user_name parfile=‘par.f’

文件par.f包含以下行:
DUMPFILE=expdat.dmp
DIRECTORY=data_pump_dir
TRANSPORT_DATAFILES=
‘C:\app\orauser\oradata\orawin\sales_101.dbf’,
‘C:\app\orauser\oradata\orawin\sales_201.dbf’
REMAP_SCHEMA=sales1:crm1 REMAP_SCHEMA=sales2:crm2
LOGFILE=tts_import.log

2)如果需要,在目标数据库上将表空间置于读/写模式。


4.在数据库之间传输表,分区或子分区

4.1.可传输表简介

可以使用可传输表特性从一个数据库拷贝一组表,分区或子分区到另一个数据库。可传输的表操作可以移动特定的表,分区,或子分区的元数据到目标数据库。

可传输表操作自动鉴别指定表使用的表空间。为移动数据,你拷贝这些表空间的数据文件到目标数据库。Data Pump import自动释放不是可传输表操作的一部分的表,分区,或子分区占用的数据文件中的块。它也释放不是可传输表操作的一部分的表的依赖对象占用的块。

可以使用以下方式来传输表,分区和子分区:
1)使用export dump文件
在export期间,指定TABLES参数和设置TRANSPORTABLE参数为ALWAYS。在导入期间,不指定TRANSPORTABLE参数。Data Pump import自动识别可传输的表操作。
2)通过网络
在导入期间,指定TABLES参数,设置TRANSPORTABLE参数为ALWAYS,指定NETWORK_LINK参数来鉴别源数据库。


4.2.可传输表限制

注意以下可传输表的限制:
1)“传输数据的一般限制”中描述的一般限制应用到可传输的表。
2)不可以传输表到在相同的模式中包含相同名称的表的目标数据库。然而,你可以使用REMAP_TABLE导入参数来导入数据到不同的表。或者,在传输操作之前,可以重命名要传输的表或目标表。
从Oracle 12.2开始,RMAN的RECOVER命令可以在重新映射表的同时移动表到不同的模式。
3)不可以跨具有不同时区文件版本的平台传输具有TIMESTAMP WITH TIMEZONE(TSTZ)数据的表。


4.3.使用Export Dump文件传输表,分区,或子分区

可以在数据库之间使用export文件传输表,分区或子分区。

以下任务列表概述了传输表的过程。每个任务的详情在接下来的示例中提供。
1)选择一组表,分区,或子分区。
如果正在传输分区,那么在可传输表操作中只可以指定来自一个表的分区,其它表不能在相同的操作中传输。同样,如果只有表的分区的子集在可传输表操作中被导出,那么在导入时每个分区成为一个非分区的表。

2)在源数据库上,将与表,分区,或子分区的数据文件相关的表空间置于只读模式。
为查看表的表空间,查询DBA_TABLES视图。为查看表空间的数据文件,查询DBA_DATA_FILES视图。

3)执行Data Pump导出。

4)传输export dump文件。
拷贝export dump文件到目标数据库可以访问的位置。

5)传输表,分区,或子分区的数据文件。
拷贝数据文件到目标数据库可以访问的位置。
如果源平台和目标平台不同,那么通过查询V$TRANSPORTABLE_PLATFORM视图检查每个平台的endian格式。

如果源平台的endian格式与目标平台的endian格式不同,那么使用以下一个方法来转换数据文件:
a.使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程来传输数据文件。这些存储过程自动转换数据文件到目标平台的endian格式。
b.使用RMAN的CONVERT命令来转换数据文件到目标平台的endian格式。
注:具有undo段的数据文件不支持在不同endian格式之间的数据文件转换。

6)[可选]在源数据库上还原表空间到读/写模式。

7)在目标数据库上,执行导入。
运行Data Pump工具来导入表的元数据。

示例

使用Data Pump dump文件传输表,分区和子分区的这些任务在以下的示例中更全面地阐述,其中假设以下分区在sh.sales_prt表中存在:
sales_q1_2000
sales_q2_2000
sales_q3_2000
sales_q4_2000

这个示例传输这些分区中的2个到目标数据库。

以下SQL语句创建sales_prt表和它的分区在sh模式中以及表的表空间和数据文件。语句也使用sh抽样模式中的数据插入到分区中。

CREATE TABLESPACE sales_prt_tbs
DATAFILE ‘sales_prt.dbf’ SIZE 20M
ONLINE;

CREATE TABLE sh.sales_prt
(prod_id NUMBER(6),
cust_id NUMBER,
time_id DATE,
channel_id CHAR(1),
promo_id NUMBER(6),
quantity_sold NUMBER(3),
amount_sold NUMBER(10,2))
PARTITION BY RANGE (time_id)
(PARTITION SALES_Q1_2000 VALUES LESS THAN
(TO_DATE(‘01-APR-2000’,‘DD-MON-YYYY’,‘NLS_DATE_LANGUAGE = American’)),
PARTITION SALES_Q2_2000 VALUES LESS THAN
(TO_DATE(‘01-JUL-2000’,‘DD-MON-YYYY’,‘NLS_DATE_LANGUAGE = American’)),
PARTITION SALES_Q3_2000 VALUES LESS THAN
(TO_DATE(‘01-OCT-2000’,‘DD-MON-YYYY’,‘NLS_DATE_LANGUAGE = American’)),
PARTITION SALES_Q4_2000 VALUES LESS THAN
(TO_DATE(‘01-JAN-2001’,‘DD-MON-YYYY’,‘NLS_DATE_LANGUAGE = American’)))
TABLESPACE sales_prt_tbs;

INSERT INTO sh.sales_prt PARTITION(sales_q1_2000)
SELECT * FROM sh.sales PARTITION(sales_q1_2000);

INSERT INTO sh.sales_prt PARTITION(sales_q2_2000)
SELECT * FROM sh.sales PARTITION(sales_q2_2000);

INSERT INTO sh.sales_prt PARTITION(sales_q3_2000)
SELECT * FROM sh.sales PARTITION(sales_q3_2000);

INSERT INTO sh.sales_prt PARTITION(sales_q4_2000)
SELECT * FROM sh.sales PARTITION(sales_q4_2000);

COMMIT;

这个示例做以下额外的假设:
1)源数据库的名称是sourcedb。
2)源数据库和目标数据库在具有相同endian格式的相同平台上运行。运行以下查询检查平台的endian格式:
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;
3)只有sales_q1_2000和sales_q2_2000分区被传输到目标数据库。另外两个分区不被传输。

完成以下任务来使用export dump文件传输分区:

任务1:生成export dump文件

完成以下步骤生成export dump文件:
1)启动SQL*Plus,作为管理员或作为具有ALTER TABLESPACE或MANAGE TABLESPACE系统特权的用户连接到源数据库。

2)将包含要传输的表的所有表空间设置为只读。
ALTER TABLESPACE sales_prt_tbs READ ONLY;

3)作为具有DATAPUMP_EXP_FULL_DATABASE角色的用户调用Data Pump export工具和指定可传输的表的选项。
SQL> HOST
expdp user_name dumpfile=sales_prt.dmp directory=data_pump_dir
tables=sh.sales_prt:sales_q1_2000,sh.sales_prt:sales_q2_2000
transportable=always logfile=exp.log
Password: password

你必须总是指定TRANSPORTABLE=ALWAYS,它指定使用的可传输的选项。这个示例指定了以下额外的Data Pump参数:
a.DUMPFILE参数指定要创建的结构信息export dump文件的名称,sales_prt.dmp。
b.DIRECTORY参数指定指向dump文件的操作系统或Oracle ASM位置的目录对象。你必须在调用Data Pump之前创建DIRECTORY对象和必须授予目录的READ和WRITE对象权限给运行Export工具的用户。
在非CDB中,目录对象DATA_PUMP_DIR自动被创建。对这个目录的读和写访问被自动授予给DBA角色,因此授予给SYS和SYSTEM。
然而,在PDB中的目录对象DATA_PUMP_DIR不会被自动创建。因此,导入到PDB中时,在PDB中创建目录对象和当运行Data Pump时指定目录对象。
c.TABLES参数指定要导出的表,分区,或子分区。
d.LOGFILE参数指定export工具写的日志文件的文件名称。在这个示例中,日志文件被创建在与dump文件相同的目录,但它可以写到不同的位置。

4)检查日志文件中的意料之外的错误,注意你必须传输到目标数据库的dump文件和数据文件。Expdp在日志中输出这些文件的名称和路径,像这些:

Processing object type TABLE_EXPORT/TABLE/PLUGTS_BLK
Processing object type TABLE_EXPORT/TABLE/TABLE
Processing object type TABLE_EXPORT/TABLE/END_PLUGTS_BLK
Master table "SYSTEM"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded
****************************************************************************
Dump file set for SYSTEM.SYS_EXPORT_TABLE_01 is:
/u01/app/oracle/rdbms/log/sales_prt.dmp
****************************************************************************
Datafiles required for transportable tablespace SALES_PRT_TBS:
/u01/app/oracle/oradata/sourcedb/sales_prt.dbf
Job "SYSTEM"."SYS_EXPORT_TABLE_01" successfully completed at 11:32:13

5)当Data Pump export操作完成时,退出expdp工具返回到SQL*Plus:
$ exit


任务2:传输export dump文件
传输dump文件到目标数据库上DATA_PUMP_DIR目录对象指向的目录,或到任何你选择的其它目录。新的位置必须是目标数据库可访问的。

在这个示例中,从源数据库传输sales_prt.dmp dump文件到目标数据库。

在目标数据库,运行以下查询来确认DATA_PUMP_DIR的位置:
SELECT * FROM DBA_DIRECTORIES WHERE DIRECTORY_NAME = ‘DATA_PUMP_DIR’;

OWNER   DIRECTORY_NAME               DIRECTORY_PATH
------ ---------------- -----------------------------------
SYS      DATA_PUMP_DIR    /u01/app/oracle/rdbms/log/

任务3:传输表的数据文件
传输包含要传输的表的表空间的数据文件到目标数据库可以访问的位置。

通常,传输数据文件到目标数据库现存的数据文件的位置。在UNIX和Linux平台上,这个位置通常是/u01/app/oracle/oradata/dbname/或+DISKGROUP/dbname/datafile/。
在这个示例中,从源数据库传输数据文件sales_prt.dbf到目标数据库。


任务4[可选]:还原表空间到读/写模式
在源数据库上让包含要传输的表的表空间再次可读/写。
ALTER TABLESPACE sales_prt_tbs READ WRITE;

你可以推迟任务到首先确保导入过程成功。


任务5:在目标数据库上,导入分区

在目标数据库上,作为具有DATAPUMP_IMP_FULL_DATABASE角色的用户调用Data Pump import工具和指定可传输的表的选项。
impdp user_name dumpfile=sales_prt.dmp directory=data_pump_dir
transport_datafiles=‘/u01/app/oracle/oradata/targetdb/sales_prt.dbf’
tables=sh.sales_prt:sales_q1_2000,sh.sales_prt:sales_q2_2000
logfile=imp.log
Password: password

这个示例指定以下Data Pump参数:
a.DUMPFILE参数指定包含要导入的数据的元数据的导出的文件。
b.DIRECTORY参数指定鉴别export dump文件位置的目录对象。你必须在运行Data Pump之前创建DIRECTORY对象和授予目录的READ与WRITE对象权限给运行import工具的用户。

在非CDB中,目录对象DATA_PUMP_DIR被自动创建。对这个目录的读和写访问被自动授予给DBA角色,因此授予给SYS和SYSTEM用户。

然而,在PDB中目录对象DATA_PUMP_DIR不会被自动创建。因此,当导入到PDB中时,在PDB中创建目录对象和当运行Data Pump时指定目录对象。

c.TRANSPORT_DATAFILES参数指定要被导入的所有数据文件。如果存在很多数据文件,你可以使用PARFILE参数在参数文件中多次指定TRANSPORT_DATAFILES参数。

d.TABLES参数指定要导入的表,分区,或子分区。

e.LOGFILE参数指定import工具写的日志文件的文件名称。在这个示例中,日志文件写到dump文件读取的目录,但它可以被写到不同的位置。

在这个语句成功执行之后,检查导入日志文件来确保没有意料之外的错误发生。

当处理大量的数据文件时,在语句中指定数据文件名称列表是个费力的过程,因为数据文件列表甚至会超过语句行的限制。在这个情形中,可以使用导入参数文件。例如,可以如下调用Data Pump import工具:
impdp user_name parfile=‘par.f’

文件par.f包含以下行:
DUMPFILE=sales_prt.dmp
DIRECTORY=data_pump_dir
TRANSPORT_DATAFILES=‘/u01/app/oracle/oradata/targetdb/sales_prt.dbf’
TABLES=sh.sales_prt:sales_q1_2000,sh.sales_prt:sales_q2_2000
LOGFILE=imp.log

注:
1)在目标数据库中分区被作为分开的表导入,因为这个示例传输分区的子集
2)导入期间,表空间可能由于元数据载入被临时设置为读/写。确保在导入期间没有用户对数据进行更改。在导入成功完成时,所有用户定义的表空间被设置为读/写。


4.4.通过网络传输表,分区,或子分区

为通过网络传输表,使用NETWORK_LINK参数执行导入,导入使用数据库链接执行,不涉及dump文件。

以下任务列表概述了通过网络在数据库之间传输表,分区和子分区的过程。每个任务的详情在接下来的示例中提供。
1)选择一组表,分区,或子分区。
如果正在传输分区,那么在可传输表操作中只可以指定来自一个表的分区,其它表不能在相同的操作中传输。同样,如果只有表的分区的子集在可传输表操作中被导出,那么在导入时每个分区成为一个非分区的表

2)在源数据库上,将与表,分区,或子分区的数据文件相关的表空间置于只读模式。
为查看表的表空间,查询DBA_TABLES视图。为查看表空间的数据文件,查询DBA_DATA_FILES视图。
3)传输表,分区,或子分区的数据文件。
拷贝数据文件到目标数据库可以访问的位置。
如果源平台和目标平台不同,那么通过查询V$TRANSPORTABLE_PLATFORM视图检查每个平台的endian格式。

如果源平台的endian格式与目标平台的endian格式不同,那么使用以下一个方法来转换数据文件:
a.使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程来传输数据文件。这些存储过程自动转换数据文件到目标平台的endian格式。
b.使用RMAN的CONVERT命令来转换数据文件到目标平台的endian格式。
注:具有undo段的数据文件不支持在不同endian格式之间的数据文件转换。

4)在目标数据库上,执行导入。
运行Data Pump工具来导入表的元数据。

5)[可选]在源数据库上还原表空间到读/写模式。


示例

通过网络传输表,分区和子分区的这些任务在以下的示例中更全面地阐述,其中假设以下表在源数据库中存在:

表空间数据文件
hr.emp_ttbsemp_tsp/u01/app/oracle/oradata/sourcedb/emp.dbf
oe.orders_ttbsorders_tsp/u01/app/oracle/oradata/sourcedb/orders.dbf

这个示例传输这些表到目标数据库。为完成这个示例,这些表必须在源数据库上存在。

以下SQL语句在sh模式中创建表以及表的表空间和数据文件。语句也使用sh和oe抽样模式中的数据插入到表中。

CREATE TABLESPACE emp_tsp
DATAFILE ‘emp.dbf’ SIZE 1M
ONLINE;

CREATE TABLE hr.emp_ttbs(
employee_id NUMBER(6),
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone_number VARCHAR2(20),
hire_date DATE,
job_id VARCHAR2(10),
salary NUMBER(8,2),
commission_pct NUMBER(2,2),
manager_id NUMBER(6),
department_id NUMBER(4))
TABLESPACE emp_tsp;

INSERT INTO hr.emp_ttbs SELECT * FROM hr.employees;

CREATE TABLESPACE orders_tsp
DATAFILE ‘orders.dbf’ SIZE 1M
ONLINE;

CREATE TABLE oe.orders_ttbs(
order_id NUMBER(12),
order_date TIMESTAMP WITH LOCAL TIME ZONE,
order_mode VARCHAR2(8),
customer_id NUMBER(6),
order_status NUMBER(2),
order_total NUMBER(8,2),
sales_rep_id NUMBER(6),
promotion_id NUMBER(6))
TABLESPACE orders_tsp;

INSERT INTO oe.orders_ttbs SELECT * FROM oe.orders;

COMMIT;

这个示例做以下额外的假设:
1)源数据库的名称是sourcedb。
2)源数据库和目标数据库在具有相同endian格式的相同平台上运行。运行以下查询检查平台的endian格式:
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT
FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d
WHERE tp.PLATFORM_NAME = d.PLATFORM_NAME;


完成以下任务来使用export dump文件传输分区:

任务1:创建从目标数据库到源数据库的数据库链接

完成以下步骤创建从目标数据库到源数据库的数据库链接:
1)确保源数据库和目标数据库之间的网络连接已配置。
2)启动SQL*Plus,作为使用Data Pump import传输数据的管理员连接到目标数据库。用户必须具有DATAPUMP_IMP_FULL_DATABASE角色来传输数据。
3)创建数据库链接:
CREATE PUBLIC DATABASE LINK sourcedb USING ‘sourcedb’;

在USING子语句中指定源数据库的服务名称。

在导入操作期间,数据库链接必须连接到源数据库上具有DATAPUMP_EXP_FULL_DATABASE角色的用户。源数据库上的用户不能是具有SYSDBA管理特权的用户。


任务2:设置包含表的表空间只读

在源数据库上,完成以下步骤:
1)启动SQL*Plus,作为管理员或作为具有ALTER TABLESPACE或MANAGE TABLESPACE系统特权的用户连接到源数据库。

2)将包含要传输的表的所有表空间设置为只读。
ALTER TABLESPACE emp_tsp READ ONLY;
ALTER TABLESPACE orders_tsp READ ONLY;


任务3:传输表的数据文件
传输包含要传输的表的表空间的数据文件到目标数据库可以访问的位置。

通常,传输数据文件到目标数据库现存的数据文件的位置。在UNIX和Linux平台上,这个位置通常是/u01/app/oracle/oradata/dbname/或+DISKGROUP/dbname/datafile/。
在这个示例中,从源数据库传输数据文件emp.dbf和orders.dbf到目标数据库。


任务4:在目标数据库上,导入表

在目标数据库上,作为具有DATAPUMP_IMP_FULL_DATABASE角色的用户调用Data Pump import工具和指定可传输的表的选项。
impdp user_name network_link=sourcedb transportable=always
transport_datafiles=
‘/u01/app/oracle/oradata/targetdb/emp.dbf’
‘/u01/app/oracle/oradata/targetdb/orders.dbf’
tables=hr.emp_ttbs,oe.orders_ttbs
logfile=import.log
Password: password

这个示例指定以下Data Pump参数:
a.NETWORK_LINK参数指定用来网络导入的到源数据库的数据库链接。
b.TRANSPORTABLE参数指定import使用的可传输的选项。
c.TRANSPORT_DATAFILES参数指定要被导入的所有数据文件。如果存在很多数据文件,你可以使用PARFILE参数在参数文件中多次指定TRANSPORT_DATAFILES参数。
d.TABLES参数指定要导入的表。
e.LOGFILE参数指定import工具写的日志文件的文件名称。

在这个语句成功执行之后,检查导入日志文件来确保没有意料之外的错误发生。

当处理大量的数据文件时,在语句中指定数据文件名称列表是个费力的过程,因为数据文件列表甚至会超过语句行的限制。在这个情形中,可以使用导入参数文件。例如,可以如下调用Data Pump import工具:
impdp user_name parfile=‘par.f’

文件par.f包含以下行:
NETWORK_LINK=sourcedb
TRANSPORTABLE=always
TRANSPORT_DATAFILES=
‘/u01/app/oracle/oradata/targetdb/emp.dbf’
‘/u01/app/oracle/oradata/targetdb/orders.dbf’
TABLES=hr.emp_ttbs,oe.orders_ttbs
LOGFILE=import.log

注:
在导入期间,表空间可能由于元数据载入被临时设置为读/写。确保在导入期间没有用户对数据进行更改。在导入成功完成时,所有用户定义的表空间被设置为读/写。


任务5[可选]:还原表空间到读/写模式
在源数据库上让包含要传输的表的表空间再次可读/写。
ALTER TABLESPACE emp_tsp READ WRITE;
ALTER TABLESPACE orders_tsp READ WRITE;


5.在平台之间转换数据

当执行可传输的操作时,如果源平台和目标平台是不同的endian格式,那么必须转换要传输的数据到目标平台的endian格式。如果源平台和目标平台是相同的endian格式,那么不需要数据转换。可以使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程或RMAN的CONVERT命令来转换数据。

5.1.使用DBMS_FILE_TRANSFER包在平台之间转换数据

在数据文件迁移期间,可以使用DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程在平台之间转换数据。

当使用一个这些存储过程在源平台和目标平台之间移动数据文件时,每个数据文件中的每个块被转换成目标平台的endian格式。

本章节使用示例来描述如何使用DBMS_FILE_TRANSFER包来转换数据文件到不同的平台。示例做以下假设:
1)将使用GET_FILE存储过程迁移数据文件。
2)数据文件mytable.342.123456789被传输到不同的平台。
3)源平台的endian格式与目标平台的endian格式不同。
4)源数据库的全局名称是dbsa.example.com。
5)源数据库和目标数据库同时使用ASM。

注:你也可以使用DBMS_FILE_TRANSFER包来在具有相同endian格式的平台之间迁移数据文件。

完成以下步骤通过使用GET_FILE存储过程迁移它来转换数据文件:
1)使用SQL*Plus作为可以创建目录对象的管理员连接到源数据库。

2)创建目录对象来存储你想迁移到目标数据库的数据文件。
例如,为目录+data/dbsa/datafile创建一个名称为sales_dir_source的目录对象。
CREATE OR REPLACE DIRECTORY sales_dir_source
AS ‘+data/dbsa/datafile’;
当创建目录对象时,指定的文件系统目录必须存在。

3)使用SQL*Plus作为可以创建数据库链接,创建目录对象和运行DBMS_FILE_TRANSFER包中的存储过程的管理员连接到目标数据库。

4)创建从目标数据库到源数据库的数据库链接。
在源数据库上的连接用户必须对步骤2中创建的目录对象具有读权限。

5)创建目录对象来存储你想从源数据库迁移的数据文件。
在本地数据库将运行DBMS_FILE_TRANSFER包中的存储过程的用户必须对目录对象具有写权限。
例如,为目录+data/dbsb/datafile创建一个名称为sales_dir_target的目录对象。
CREATE OR REPLACE DIRECTORY sales_dir_target
AS ‘+data/dbsb/datafile’;

6)运行DBMS_FILE_TRANSFER包中的GET_FILE存储过程来迁移数据文件。
例如,运行以下存储过程来使用步骤4中创建的数据库链接从源数据迁移mytable.342.123456789数据文件到目标数据库。
BEGIN
DBMS_FILE_TRANSFER.GET_FILE(
source_directory_object => ‘sales_dir_source’,
source_file_name => ‘mytable.342.123456789’,
source_database => ‘dbsa.example.com’,
destination_directory_object => ‘sales_dir_target’,
destination_file_name => ‘mytable’);
END;
/

在这个示例中,目的地数据文件名称是mytable。Oracle ASM不允许在GET_FILE存储过程的参数destination_file_name中指定完全合格(fully qualified)的文件名称格式。


5.2.使用RMAN在平台之间转换数据

当使用RMAN的CONVERT命令来转换数据,可以在运行Data Pump export之后在源平台上转换数据,或者在运行Data Pump import之前在目标平台上转换数据。

可以使用以下RMAN的CONVERT命令来转换数据:
CONVERT DATAFILE
CONVERT TABLESPACE
CONVERT DATABASE
注:
1)数据类型限制应用到RMAN的CONVERT命令
2)RMAN的CONVERT命令不支持具有undo段的数据文件在不同endian格式之间进行数据文件转换。


5.2.1.导出之后在源平台上转换表空间

以下示例阐述如何使用RMAN的CONVERT TABLESPACE命令来转换表空间到不同的平台。

示例做以下假设:
1)表空间sales_1和sales_2被传输到不同的平台。
2)源平台的endian格式与目标平台的endian格式不同。
3)你想在源平台上转换数据,在传输表空间集到目标系统之前。
4)你已经在源数据库上完成Data Pump export。

完成以下步骤在源系统上转换表空间:
1)在命令提示符,启动RMAN和连接到源数据库:
$ RMAN TARGET /

2)使用RMAN的CONVERT TABLESPACE命令来转换数据文件到源系统上的临时位置。

在这个示例中,假设临时位置是目录/tmp,它已经被创建。转换的数据文件由系统来分配名称。
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

3)退出RMAN。
RMAN> exit

4)迁移数据文件到目标系统上。


5.2.2.导入之前在目标平台上转换数据文件

以下示例阐述如何使用RMAN的CONVERT DATAFILE命令来转换数据文件到不同的平台。

在转换期间,通过文件名称而不是表空间名来鉴别数据文件。目标实例不知道期望的表空间名直到表空间的元数据被导入。

示例做以下假设:
1)还没有转换要传输的表空间的数据文件。
如果使用DBMS_FILE_TRANSFER包来传输数据文件到目标系统,那么数据文件在文件迁移期间自动被转换。
2)以下数据文件被传输到不同的平台:
C:\Temp\sales_101.dbf
C:\Temp\sales_201.dbf
3)源平台的endian格式与目标平台的endian格式不同。
4)你想在目标系统上转换数据,在执行Data Pump import之前。
5)转换的数据文件被放置在C:\app\orauser\oradata\orawin\,它是目标系统现存数据文件的位置。

完成以下步骤在目标系统上转换表空间:
1)如果在SQL*Plus中,那么返回到主机系统:
SQL> HOST

2)使用RMAN的CONVERT DATAFILE命令在目标平台上转换数据文件。
C:>RMAN TARGET /
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;

如果源位置,目标位置,或两者都不使用Oracle ASM,那么源和目标平台是可选的。RMAN通过检查数据文件来确认源平台,目标平台缺省是运行转换的主机的平台。

如果源和目标位置都使用Oracle ASM,那么你必须在DB_FILE_NAME_CONVERT子语句中指定源和目标平台。

3)退出RMAN。
RMAN> exit


6.迁移数据文件准则

当迁移数据文件时,你应该遵循一组准则。

如果源和目标位置都是文件系统,那么可以使用以下方法来传输:
1)任何拷贝平面文件(flat file)的工具(比如,操作系统copy工具或ftp)
2)DBMS_FILE_TRANSFER包
3)RMAN
4)任何在CD上发布的工具

如果源或目标位置是Oracle ASM磁盘组,那么可以使用以下方式来传输:
1)ftp到或来自XML DB仓库中的/sys/asm虚拟文件夹
2)DBMS_FILE_TRANSFER包
3)RMAN

不要传输管理表空间(比如SYSTEM和SYSAUX)或任何undo或临时表空间的数据文件。

如果你在传输与接收数据的数据库的标准块大小不同的块大小的数据,那么你必须首先在接收数据库参数文件中有一条DB_nK_CACHE_SIZE初始化参数条目。

例如,如果你在传输具有8k块大小的数据到具有4k标准块大小的数据库,那么你必须包含DB_8K_CAHCE_SIZE初始化参数条目在参数文件中。如果它不是已经包括在参数文件中,那么这个参数可以使用ALTER SYSTEM SET语句设置。

从Oracle 12c开始,DBMS_FILE_TRANSFER包中的GET_FILE或PUT_FILE存储过程可以在数据文件迁移期间自动在平台之间转换数据。

从Oracle 12c开始,RMAN可以使用启用网络的还原。RMAN通过使用RESTORE命令的FROM SERVICE子语句经由网络从远程的数据库实例还原数据文件。启用网络的还原的主要优势是它消除还原备份到磁盘上的中间位置和迁移副本的需要。因此,启用网络的还原节省了磁盘空间和时间。这个技术也在文件迁移期间提供了以下优势:压缩,加密和只迁移使用的数据块。

注:当使用UNIX dd工具在数据库之间拷贝裸设备文件时要小心和注意Oracle 12c和之后的版本不支持使用裸设备作为数据库文件。dd工具可以用来拷贝整个源裸设备文件,或者它可以与选项一起被调用来指示它只拷贝源裸设备文件特定范围的块。

因为隐藏的控制信息作为数据文件的一部分来存储,很难确定裸设备文件的实际数据文件大小。如果你必须使用dd工具在裸设备上操作,那么指定整个源裸设备文件内容。如果为了符合Oracle 12c和以后的版本不支持裸设备的要求,从裸设备移动数据库文件内容到ASM或文件系统,请使用Oracle提供的工具比如RMAN。




来源:《Oracle Database Database Administrator’s Guide, 19c》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值