本文介绍如何通过使用新的 Oracle 数据库 12c 的完整可传输导出/导入(Full Transportable Export/Import)功能来使用较少的停机时间,将数据库升级/迁移到 Oracle 数据库 12c 中。
传统的方法,如导出/导入,数据泵导出/导入和传输表空间,仍然可以用来升级/迁移数据库到 Oracle Database12c
中。但是,Oracle 数据库 12c 现在提供了另一种方法通过使用新功能,即,所谓的完整可传输导出/导入使得迁移/升级更容易,更快,且更高效。
让我们来看看各种方法的简要比较:
通过使用数据库升级助手(DBUA)进行升级 |
|
常规导出/导入 |
|
数据泵导出/导入(于 Oracle 数据库 10g 版本引入) |
|
可传输表空间 |
|
完整可传输导出/导入 |
|
先决条件
在开始完整可传输导出/导入程序之前,请注意以下先决条件:
- 新的目标库必须是 Oracle 数据库 12c 的数据库(可以是 non-CDB(容器数据库)或 PDB(可插拔数据库))
- 为将要执行迁移的用户授权 DATAPUMP_IMP_FULL_DATABASE 角色
- 执行升级/迁移之前,设置表空间为只读
- 源数据库必须是 11.2.0.3 或更高版本。
步骤
下面是使用完全可传输导出/导入方法时的步骤:
-
创建新的目标Oracle数据库12c的数据库
新创建的数据库中包含了一套管理的表空间,Oracle 提供的组件和包。正如之前提到的,它可以是一个非容器数据库或一个可插拔数据库。 -
检查源和目标平台的 Endian 格式
SELECT d.PLATFORM_NAME, ENDIAN_FORMAT FROM V$TRANSPORTABLE_PLATFORM tp, V$DATABASE d WHERE tp.PLATFORM_ID = d.PLATFORM_ID;
如果 Endian 格式相同,数据文件可以直接拷贝到目标平台。否则,需要使用 RMAN 来为数据文件进行转换。 -
检验被迁移的表空间是自包含的
验证是必需的。可以用来确认准备被迁移的和不被迁移的表空间,在表空间内的对象存储之间,没有逻辑或者物理上的依存关系。
SQL> EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK(‘<User Tablespace names separated by comma operator>‘, TRUE);
其结果可以通过检查
SQL> SELECT * FROM TRANSPORT_SET_VIOLATIONS;
如果查询返回有值,则需要在进行整个迁移操作之前解决掉依存关系。依存对象需要移动到准备迁移的表空间里。缺少该步骤,迁移对象将存在问题。 -
创建目录对象
在源服务器和目标服务器上创建目录对象来存储 dump 文件。
SQL> CREATE DIRECTORY dp_dir AS ‘<Physical location>‘; -
将准备迁移的用户表空间置为只读模式
SQL> ALTER TABLESPACE <tablespace_name> READ ONLY; -
在源数据库上调用完整可传输导出。它将导出元数据和存储在管理表空间中的用户对象。
在目标端数据泵导入(impdp)过程中如果使用 database link,则可以忽略该步骤。完整可传输导入在目标数据库端可以通过 database link 获取源数据库的元数据。
expdp system/<password> full=y transportable=always version=12 \
directory=<database directory> dumpfile=<dump file name> \
metrics=y exclude=statistics \
logfile=<log file name>
为了确保兼容性,如果源数据库是11.2.0.3或11.2.0.4版本,Version 参数是必需的。 -
复制数据库的数据文件到目标端
物理上复制准备迁移的表空间所属数据文件到目标端 -
复制导出 dump 文件到目标端。
复制导出 dump 文件到目标端的目录 -
如果源和目标数据库的 Endian 格式不同,需要对复制的数据文件调用执行 RMAN convert 命令
CONVERT DATAFILE ‘<Datafile name>‘ FROM PLATFORM "<Source platform>" FORMAT=‘<Format of datafile at target site>‘; -
在 Oracle 数据库 12c 目标数据库端,调用完整可传输导入
impdp system/<password>@<db name> directory=<directory name> \
dumpfile=<dump file name> logfile=<log file name> \
metrics=y \
transport_datafiles=‘<datafile names with full path>
Database link 参数可以用来搜集源数据库的元数据。 -
在目标和源数据库上将表空间转换为读写模式
SQL> alter tablespace <tablespace-name> read write;