使用 Oracle 可传输表空间进行迁移 - Amazon Relational Database Service

使用 Oracle 可传输表空间进行迁移

您可以使用 Oracle 可传输表空间功能,将一组表空间从本地 Oracle 数据库复制到 RDS for Oracle 数据库实例。在物理层,您可以使用 Amazon EFS 或 Amazon S3 将源数据文件和元数据文件传输到目标数据库实例。可传输表空间功能使用 rdsadmin.rdsadmin_transport_util 软件包。有关此软件包的语法和语义,请参阅传输表空间

有关阐述如何传输表空间的博客文章,请参阅 Migrate Oracle Databases to AWS using transportable tablespace,以及 Amazon RDS for Oracle Transportable Tablespaces using RMAN

Oracle 可传输表空间概述

可传输的表空间集由正在传输的表空间集的数据文件和包含表空间元数据的导出转储文件组成。在诸如可传输表空间之类的物理迁移解决方案中,您可以传输物理文件:数据文件、配置文件和 Data Pump 转储文件。

可传输表空间的优缺点

当您需要以最少的停机时间将一个或多个大型表空间迁移到 RDS 时,我们建议您使用可传输的表空间。与逻辑迁移相比,可传输的表空间具有以下优势:

  • 停机时间低于大多数其他 Oracle 迁移解决方案。

  • 由于可传输表空间功能仅复制物理文件,因此,它避免了在逻辑迁移中可能发生的数据完整性错误和逻辑损坏。

  • 不需要额外的许可证。

  • 您可以跨不同的平台和字节顺序类型迁移一组表空间,例如,从 Oracle Solaris 平台迁移到 Linux。但是,不支持在 Windows 服务器之间传输表空间。

    注意

    Linux 经过充分测试并得到支持。并非所有 UNIX 版本都经过测试。

如果您使用可传输的表空间,则可以使用 Amazon S3 或 Amazon EFS 传输数据:

  • 使用 EFS 时,您的备份在导入期间将保留在 EFS 文件系统中。之后,您可以删除这些文件。在此技术中,您无需为数据库实例预调配 EBS 存储。出于这个原因,我们建议使用 Amazon EFS 而不是 S3。有关更多信息,请参阅 Amazon EFS 集成

  • 使用 S3 时,您可以将 RMAN 备份下载到附加到数据库实例的 EBS 存储。在导入期间,文件将保留在您的 EBS 存储中。导入后,您可以释放此空间,该空间仍保持分配给您的数据库实例。

可传输表空间的主要缺点是您需要相对较高级的 Oracle 数据库知识。有关更多信息,请参见《Oracle 数据库管理员指南》中的在数据库之间传输表空间

可传输表空间的限制

当您在 RDS for Oracle 中使用可传输表空间时,将适用 Oracle 数据库对此功能的限制。有关更多信息,请参见《Oracle 数据库管理员指南》中的可传输表空间的限制传输数据的一般限制。请注意 RDS for Oracle 中可传输表空间的以下其他限制:

  • 源数据库或目标数据库都不能使用标准版 2(SE2)。仅支持企业版。

  • 您不能使用 Oracle Database 11g 数据库作为源。RMAN 跨平台可传输表空间功能依赖于 RMAN 传输机制,而 Oracle Database 11g 不支持该机制。

  • 您无法使用可传输的表空间从 RDS for Oracle 数据库实例迁移数据。您只能使用可传输的表空间将数据迁移到 RDS for Oracle 数据库实例。

  • 不支持 Windows 操作系统。

  • 您无法将表空间传输到较低版本级别的数据库中。目标数据库的版本级别必须与源数据库相同或更高。例如,您无法将表空间从 Oracle Database 21c 传输到 Oracle Database 19c。

  • 您无法传输诸如 SYSTEMSYSAUX 之类的管理表空间。

  • 您无法传输非数据对象,例如 PL/SQL 软件包、Java 类、视图、触发器、序列、用户、角色和临时表。要传输非数据对象,请手动创建它们或使用 Data Pump 元数据导出和导入。有关更多信息,请参阅 My Oracle Support Note 1454872.1

  • 您无法传输已加密或使用加密列的表空间。

  • 如果您使用 Amazon S3 传输文件,则支持的最大文件大小为 5TiB。

  • 如果源数据库使用诸如 Spatial 等 Oracle 选项,则除非在目标数据库上配置了相同的选项,否则无法传输表空间。

  • 在 Oracle 副本配置中,您无法将表空间传输到 RDS for Oracle 数据库实例。解决方法是,您可以删除所有副本,传输表空间,然后重新创建副本。

可传输表空间的先决条件

开始之前,完成以下任务:

第 1 阶段:设置源主机

在此步骤中,您将复制 My Oracle Support 提供的传输表空间脚本,并设置必要的配置文件。在以下步骤中,源主机正在运行包含要传输到目标实例的表空间的数据库。

设置您的源主机
  1. 以 Oracle 主目录的所有者身份登录到您的源主机。

  2. 确保 ORACLE_HOMEORACLE_SID 环境变量指向您的源数据库。

  3. 以管理员身份登录数据库,并验证时区版本、数据库字符集和国家/地区字符集是否与目标数据库中相同。

    SELECT * FROM V$TIMEZONE_FILE; SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
  4. 按照 Oracle 支持说明 2471245.1 中所述,设置可传输表空间实用程序。

    安装包括在源主机上编辑 xtt.properties 文件。以下示例 xtt.properties 文件指定 /dsk1/backups 目录中三个表空间的备份。这些是您打算传输到目标数据库实例的表空间。它还指定源平台 ID 以自动转换字节顺序。

    #linux system platformid=13 #list of tablespaces to transport tablespaces=TBS1,TBS2,TBS3 #location where backup will be generated src_scratch_location=/dsk1/backups #RMAN command for performing backup usermantransport=1

第 2 阶段:准备完整的表空间备份

在此阶段中,您将首次备份表空间,将备份传输到目标主机,然后使用过程 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces 将其还原。此阶段完成后,初始表空间备份将驻留在您的目标数据库实例上,并且可以使用增量备份进行更新。

步骤 1:备份源主机上的表空间

在此步骤中,您将使用 xttdriver.pl 脚本对表空间进行完整备份。xttdriver.pl 的输出存储在 TMPDIR 环境变量中。

备份您的表空间
  1. 如果您的表空间处于只读模式,请以具有 ALTER TABLESPACE 权限的用户身份登录到源数据库,并将表空间置于读/写模式。否则,请跳到下一步。

    以下示例将 tbs1tbs2tbs3 置于读/写模式。

    ALTER TABLESPACE tbs1 READ WRITE; ALTER TABLESPACE tbs2 READ WRITE; ALTER TABLESPACE tbs3 READ WRITE;
  2. 使用 xttdriver.pl 脚本备份您的表空间。或者,您可以指定 --debug 以在调试模式下运行脚本。

    export TMPDIR=location_of_log_files cd location_of_xttdriver.pl $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup

步骤 2:将备份文件传输到您的目标数据库实例

在此步骤中,将备份和配置文件从临时位置复制到目标数据库实例。请选择以下选项之一:

  • 如果源主机和目标主机共享 Amazon EFS 文件系统,请使用操作系统实用程序(例如 cp)将您的备份文件和 res.txt 文件从临时位置复制到共享目录。然后跳至 步骤 3:在目标数据库实例上导入表空间

  • 如果您需要将备份暂存到 Amazon S3 桶,请完成以下步骤。

使用 Amazon S3 或 Amazon EFS 传输文件。

步骤 2.2:将备份上传到 Amazon S3 桶

将您的备份和 res.txt 文件从临时目录上传到您的 Amazon S3 桶。有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的上传对象

步骤 2.3:将备份从 Amazon S3 桶下载到目标数据库实例

在此步骤中,您将使用过程 rdsadmin.rdsadmin_s3_tasks.download_from_s3 将备份下载到您的 RDS for Oracle 数据库实例。

从您的 Amazon S3 桶下载备份
  1. 启动 SQL*Plus 或 Oracle SQL Developer,并登录到 RDS for Oracle 数据库实例。

  2. 使用 Amazon RDS 过程 rdsadmin.rdsadmin_s3_tasks.download_from_s3 将备份从 Amazon S3 桶下载到您的目标数据库实例。以下示例将所有文件从名为 amzn-s3-demo-bucket 的 Amazon S3 存储桶下载到 DATA_PUMP_DIR 目录中。

    EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'res.txt'); SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'amzn-s3-demo-bucket', p_directory_name => 'DATA_PUMP_DIR') AS TASK_ID FROM DUAL;

    SELECT 语句返回 VARCHAR2 数据类型的任务 ID。有关更多信息,请参阅 将文件从 Amazon S3 存储桶下载到 Oracle 数据库实例

步骤 3:在目标数据库实例上导入表空间

使用过程 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces 将表空间还原到目标数据库实例。此过程会自动将数据文件转换为正确的字节顺序格式。

如果您从 Linux 以外的平台导入,请在调用 p_platform_id 时使用参数 import_xtts_tablespaces 指定源平台。确保您指定的平台 ID 与 步骤 2:在源主机上导出表空间元数据xtt.properties 文件中指定的平台 ID 匹配。

在目标数据库实例上导入表空间
  1. 启动 Oracle SQL 客户端,并以主用户身份登录到目标 RDS for Oracle 数据库实例。

  2. 运行过程 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces,同时指定要导入的表空间和包含备份的目录。

    以下示例从 DATA_PUMP_DIR 目录中导入表空间 TBS1TBS2TBS3。源平台是基于 AIX 的系统(64 位),其平台 ID 为 6。您可以通过查询 V$TRANSPORTABLE_PLATFORM 查找平台 ID。

    VAR task_id CLOB BEGIN :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces( 'TBS1,TBS2,TBS3', 'DATA_PUMP_DIR', p_platform_id => 6); END; / PRINT task_id
  3. (可选)通过查询表 rdsadmin.rds_xtts_operation_info 来监控进度。xtts_operation_state 列显示值 EXECUTINGCOMPLETEDFAILED

    SELECT * FROM rdsadmin.rds_xtts_operation_info;
    注意

    对于长时间运行的操作,也可以查询 V$SESSION_LONGOPSV$RMAN_STATUSV$RMAN_OUTPUT

  4. 使用上一步中的任务 ID 查看已完成的导入的日志。

    SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));

    在继续下一步之前,请确保导入成功。

第 3 阶段:制作和传输增量备份

在此阶段,您需要在源数据库处于活动状态时定期制作和传输增量备份。此技术减小了最终表空间备份的大小。如果您进行多个增量备份,则必须先在最后一个增量备份之后复制 res.txt 文件,然后才能将其应用到目标实例。

步骤与第 2 阶段:准备完整的表空间备份中的步骤相同,不同之处为导入步骤是可选的。

阶段 4:传输表空间

在此阶段,您将备份只读表空间并导出 Data Pump 元数据,将这些文件传输到目标主机,然后导入表空间和元数据。

步骤 1:备份只读表空间

此步骤与步骤 1:备份源主机上的表空间相同,但有一个关键区别:在最后一次备份表空间之前,您将表空间置于只读模式。

以下示例将 tbs1tbs2、和 tbs3 置于只读模式。

ALTER TABLESPACE tbs1 READ ONLY; ALTER TABLESPACE tbs2 READ ONLY; ALTER TABLESPACE tbs3 READ ONLY;

步骤 2:在源主机上导出表空间元数据

通过在源主机上运行 expdb 实用程序来导出表空间元数据。以下示例将表空间 TBS1TBS2TBS3 导出到目录 DATA_PUMP_DIR 中的转储文件 xttdump.dmp

expdp username/pwd \ dumpfile=xttdump.dmp \ directory=DATA_PUMP_DIR \ statistics=NONE \ transport_tablespaces=TBS1,TBS2,TBS3 \ transport_full_check=y \ logfile=tts_export.log

如果 DATA_PUMP_DIR 是 Amazon EFS 中的共享目录,请跳至步骤 4:在目标数据库实例上导入表空间

步骤 3:(仅限 Amazon S3)将备份和导出文件传输到您的目标数据库实例

如果您使用 Amazon S3 暂存表空间备份和 Data Pump 导出文件,请完成以下步骤。

步骤 3.1:将备份和转储文件从源主机上传到您的 Amazon S3 桶

将您的备份和转储文件从源主机上传到 Amazon S3 桶。有关更多信息,请参阅《Amazon Simple Storage Service 开发人员指南》中的上传对象

步骤 3.2:将备份和转储文件从 Amazon S3 桶下载到目标数据库实例

在此步骤中,您将使用过程 rdsadmin.rdsadmin_s3_tasks.download_from_s3 将备份和转储文件下载到您的 RDS for Oracle 数据库实例。按照 步骤 2.3:将备份从 Amazon S3 桶下载到目标数据库实例 中的步骤操作。

步骤 4:在目标数据库实例上导入表空间

使用过程 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces 还原表空间。有关此过程的语法和语义,请参阅将传输的表空间导入到您的数据库实例

重要

完成最终表空间导入后,下一步是导入 Oracle Data Pump 元数据。如果导入失败,请务必将数据库实例恢复到失败前的状态。因此,我们建议您按照为 Amazon RDS 的单可用区数据库实例创建数据库快照中的说明创建数据库实例的数据库快照。快照将包含所有导入的表空间,因此,如果导入失败,则无需重复备份和导入过程。

如果您的目标数据库实例已开启自动备份,并且 Amazon RDS 在您导入元数据之前未检测到已启动有效的快照,则 RDS 会尝试创建快照。根据您的实例活动,此快照可能会成功,也可能不成功。如果未检测到有效的快照或无法启动快照,则元数据导入将退出并显示错误。

在目标数据库实例上导入表空间
  1. 启动 Oracle SQL 客户端,并以主用户身份登录到目标 RDS for Oracle 数据库实例。

  2. 运行过程 rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces,同时指定要导入的表空间和包含备份的目录。

    以下示例从 DATA_PUMP_DIR 目录中导入表空间 TBS1TBS2TBS3

    BEGIN :task_id:=rdsadmin.rdsadmin_transport_util.import_xtts_tablespaces('TBS1,TBS2,TBS3','DATA_PUMP_DIR'); END; / PRINT task_id
  3. (可选)通过查询表 rdsadmin.rds_xtts_operation_info 来监控进度。xtts_operation_state 列显示值 EXECUTINGCOMPLETEDFAILED

    SELECT * FROM rdsadmin.rds_xtts_operation_info;
    注意

    对于长时间运行的操作,也可以查询 V$SESSION_LONGOPSV$RMAN_STATUSV$RMAN_OUTPUT

  4. 使用上一步中的任务 ID 查看已完成的导入的日志。

    SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||'&task_id'||'.log'));

    在继续下一步之前,请确保导入成功。

  5. 按照为 Amazon RDS 的单可用区数据库实例创建数据库快照中的说明制作手动数据库快照。

步骤 5:在目标数据库实例上导入表空间元数据

在此步骤中,使用过程 rdsadmin.rdsadmin_transport_util.import_xtts_metadata 将可传输的表空间元数据导入您的 RDS for Oracle 数据库实例。有关此过程的语法和语义,请参阅将可传输的表空间元数据导入到数据库实例中。在操作期间,导入的状态显示在表 rdsadmin.rds_xtts_operation_info 中。

重要

在导入元数据之前,我们强烈建议您确认在导入表空间后已成功创建数据库快照。如果导入步骤失败,请还原数据库实例,解决导入错误,然后再次尝试导入。

将 Data Pump 元数据导入您的 RDS for Oracle 数据库实例
  1. 启动 Oracle SQL 客户端,并以主用户身份登录到目标数据库实例。

  2. 在传输的表空间中创建拥有模式的用户(如果这些用户尚不存在)。

    CREATE USER tbs_owner IDENTIFIED BY password;
  3. 导入元数据,同时指定转储文件的名称及其目录位置。

    BEGIN rdsadmin.rdsadmin_transport_util.import_xtts_metadata('xttdump.dmp','DATA_PUMP_DIR'); END; /
  4. (可选)查询可传输的表空间历史记录表以查看元数据导入的状态。

    SELECT * FROM rdsadmin.rds_xtts_operation_info;

    操作完成后,您的表空间将处于只读模式。

  5. (可选)查看日志文件。

    以下示例列出了 BDUMP 目录的内容,然后查询导入日志。

    SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'BDUMP')); SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file( p_directory => 'BDUMP', p_filename => 'rds-xtts-import_xtts_metadata-2023-05-22.01-52-35.560858000.log'));

第 5 阶段:验证传输的表空间

在此可选步骤中,使用过程 rdsadmin.rdsadmin_rman_util.validate_tablespace 验证传输的表空间,然后将表空间置于读/写模式。

验证传输的数据
  1. 启动 SQL*Plus 或 SQL Developer,并以主用户身份登录到目标数据库实例。

  2. 使用过程 rdsadmin.rdsadmin_rman_util.validate_tablespace 验证表空间。

    SET SERVEROUTPUT ON BEGIN rdsadmin.rdsadmin_rman_util.validate_tablespace( p_tablespace_name => 'TBS1', p_validation_type => 'PHYSICAL+LOGICAL', p_rman_to_dbms_output => TRUE); rdsadmin.rdsadmin_rman_util.validate_tablespace( p_tablespace_name => 'TBS2', p_validation_type => 'PHYSICAL+LOGICAL', p_rman_to_dbms_output => TRUE); rdsadmin.rdsadmin_rman_util.validate_tablespace( p_tablespace_name => 'TBS3', p_validation_type => 'PHYSICAL+LOGICAL', p_rman_to_dbms_output => TRUE); END; /
  3. 将表空间置于读/写模式。

    ALTER TABLESPACE TBS1 READ WRITE; ALTER TABLESPACE TBS2 READ WRITE; ALTER TABLESPACE TBS3 READ WRITE;

第 6 阶段:清理剩余文件

在此可选步骤中,您将删除所有不需要的文件。使用 rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files 过程列出表空间导入后孤立的数据文件,然后使用 rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files 过程删除它们。有关这些过程的语法和语义,请参阅列出表空间导入后的孤立文件表空间导入后的孤立数据文件

清理剩余文件
  1. 按如下方式删除 DATA_PUMP_DIR 中的旧备份:

    1. 通过运行 rdsadmin.rdsadmin_file_util.listdir 列出备份文件。

      SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'DATA_PUMP_DIR'));
    2. 通过调用 UTL_FILE.FREMOVE 逐一删除备份。

      EXEC UTL_FILE.FREMOVE ('DATA_PUMP_DIR', 'backup_filename');
  2. 如果您导入了表空间,但没有为这些表空间导入元数据,则可以按如下方式删除孤立的数据文件:

    1. 列出需要删除的孤立数据文件。以下示例运行过程 rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files

      SQL> SELECT * FROM TABLE(rdsadmin.rdsadmin_transport_util.list_xtts_orphan_files); FILENAME FILESIZE -------------- --------- datafile_7.dbf 104865792 datafile_8.dbf 104865792
    2. 通过运行过程 rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import 删除孤立文件。

      BEGIN rdsadmin.rdsadmin_transport_util.cleanup_incomplete_xtts_import('DATA_PUMP_DIR'); END; /

      清理操作会在 BDUMP 目录中生成一个使用名称格式 rds-xtts-delete_xtts_orphaned_files-YYYY-MM-DD.HH24-MI-SS.FF.log 的日志文件。

    3. 读取上一步中生成的日志文件。以下示例读取日志 rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log

      SELECT * FROM TABLE(rdsadmin.rds_file_util.read_text_file( p_directory => 'BDUMP', p_filename => 'rds-xtts-delete_xtts_orphaned_files-2023-06-01.09-33-11.868894000.log')); TEXT -------------------------------------------------------------------------------- orphan transported datafile datafile_7.dbf deleted. orphan transported datafile datafile_8.dbf deleted.
  3. 如果您导入了表空间并为这些表空间导入了元数据,但遇到了兼容性错误或其他 Oracle Data Pump 问题,请按如下方式清理部分传输的数据文件:

    1. 通过查询 DBA_TABLESPACES 列出包含部分传输的数据文件的表空间。

      SQL> SELECT TABLESPACE_NAME FROM DBA_TABLESPACES WHERE PLUGGED_IN='YES'; TABLESPACE_NAME -------------------------------------------------------------------------------- TBS_3
    2. 删除表空间和部分传输的数据文件。

      DROP TABLESPACE TBS_3 INCLUDING CONTENTS AND DATAFILES;