注意:

使用 V4 跨平台可传输表空间将 Oracle Database 迁移到 OCI 并从 12c 升级到 19c

简介

本教程介绍了将 V4 跨平台可传输表空间 (XTTS) 与 Oracle Recovery Manager (RMAN) 增量备份结合使用所需的步骤,以在具有不同 endian 格式的系统之间迁移数据,同时尽可能减少应用程序停机时间。

第一步是将完整备份从源复制到目标。然后,通过使用一系列增量备份(每个备份都比上一个备份小),可以在需要停机之前,使目标系统中的数据与源系统几乎保持最新。此过程仅在最终增量备份以及元数据导出或导入期间需要停机。

本教程介绍了可以与 11.2.0.3 及更高版本一起使用的跨平台增量备份的 V4 过程。

环境详细信息

目标

先决条件

任务 1:准备源数据库

  1. 运行以下查询以检查源数据库上的 endian 格式。

    col PLATFORM_NAME for a50
    select platform_name,platform_id, endian_format from v$transportable_platform;
    
  2. 标识要传输的源数据库中的表空间。如果要迁移所有表空间,请运行以下查询。

    select tablespace_name from dba_tablespaces where contents='PERMANENT' and tablespace_name not in ('SYSTEM','SYSAUX');
    
  3. 基于源数据库创建 transport_set_violations 视图。

    exec dbms_tts.transport_set_check('<list of tablespaces with comma saperated>');
    SELECT * FROM SYS.TRANSPORT_SET_VIOLATIONS;
    
  4. 可选)在源数据库上启用块更改跟踪,以提高增量备份的性能。

  5. 验证源数据库上的所有表空间都处于联机状态。

  6. 删除重建索引参数空间索引并修改不可用空间索引。

    • 此步骤进行检查以确保空间索引中没有重建索引参数。对于多租户环境,请先运行以下命令,将数据库 SID 字段设置为 Oracle 数据库 (PDB NAME) 的可插入数据库名称。

      export ORACLE_PDB_SID=[PDB NAME]
      
    • 要查看是否有任何重构索引参数,请在源数据库服务器节点上作为源数据库服务器文件系统和数据库实例的所有者,使用 SQL*Plus 以 sysdba 身份连接到源数据库并运行以下查询。

      select owner,index_name from dba_indexes where index_type='DOMAIN' and upper(parameters) like '%REBUILD%';
      
    • 要删除重建索引参数,请使用 SQL*Plus 以索引的所有者身份连接到源数据库,然后运行以下查询。

      alter index [index name] rebuild parameters [parameters]
      
  7. 同步文本索引。使用 SQL*Plus 以 SYSDBA 身份连接到源数据库,然后运行以下查询来查找所有待同步的索引。

    select pnd_index_owner,pnd_index_name,count(*) from ctxsys.ctx_pending group by pnd_index_owner,pnd_index_name;
    

    要同步索引,请运行以下查询。

    exec ctx_ddl.sync_index('[index owner].[index name]');
    

任务 2:准备目标数据库

  1. 创建临时新用户表空间。如果目标数据库是多租户环境,则连接到 PDB。

    alter session set container=[PDB NAME]
    select TABLESPACE_NAME from dba_tablespaces where TABLESPACE_NAME='USERS_OCI';
    select TABLESPACE_NAME from dba_tablespaces order by 1;
    set long 99999
    SELECT DBMS_METADATA.GET_DDL ('TABLESPACE','USERS') from dual;
    

    使用上述数据定义语言 (Data Definition Language,DDL) 输出,替换如下所示的磁盘组名称并创建新用户表空间。

    CREATE BIGFILE TABLESPACE USERS_OCI DATAFILE '+DATAC2'
    SIZE 1073741824
    AUTOEXTEND ON NEXT 17179869184 MAXSIZE 33554431M
    LOGGING ONLINE PERMANENT BLOCKSIZE 8192
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE
    ENCRYPTION USING 'AES256' ENCRYPT DEFAULT
    NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO;
    

    使用以下查询将新用户表空间 USERS_OCI 分配给具有默认表空间 USERS 的所有数据库用户。

    select 'alter user '||username||' default tablespace users_OCI;' from dba_users where default_tablespace='USERS';
    

    查询的输出必须返回 0

    select count(*) from dba_users where default_tablespace='USERS';
    ALTER DATABASE DEFAULT TABLESPACE USERS_OCI;
    drop tablespace users including contents and datafiles;
    select TABLESPACE_NAME from dba_tablespaces where TABLESPACE_NAME='USERS';
    
  2. 在目标数据库上创建临时表空间。对源运行以下查询并收集表空间详细信息。

    select TABLESPACE_NAME from dba_tablespaces where CONTENTS='TEMPORARY';
    Create temp tablespaces on target database like below example.
    create bigfile temporary tablespace USER_TEMP tempfile size 672m autoextend on next 672m extent management local;
    
  3. 为 Oracle E-Business Suite 应用程序创建 nls/data/9idata 目录。

    srvctl getenv database -d $ORACLE_UNQNAME
    perl $ORACLE_HOME/nls/data/old/cr9idata.pl  --> on all the nodes of the cluster
    srvctl setenv database -d $ORACLE_UNQNAME -t ORA_NLS10=$ORACLE_HOME/nls/data/9idata
    srvctl getenv database -d $ORACLE_UNQNAME
    
  4. 为 Oracle E-Business Suite 应用程序创建 $ORACLE_HOME/appsutil/jre。将 appsutil 文件夹从路径 $ORACLE_HOME 下的源数据库复制到路径 $ORACLE_HOME 下的目标数据库服务器。复制文件夹后,在目标数据库服务器的所有节点上运行以下命令。

    cd $ORACLE_HOME/appsutil
    ln -s $ORACLE_HOME/jdk/jre
    cd $ORACLE_HOME/jdk/jre/lib/ext
    cp $ORACLE_HOME/jlib/orai18n.jar .
    
  5. 为 Oracle E-Business Suite 应用程序设置系统方案。

    export ORACLE_PDB_SID=[PDB_NAME]
    sqlplus / as sysdba
    show con_name
    @audb19c.sql
    
  6. 为 Oracle E-Business Suite 应用程序设置系统方案。

    export ORACLE_PDB_SID=[PDB_NAME]
    sqlplus / as sysdba
    show con_name
    @ausy19c.sql
    
  7. 设置 Oracle E-Business Suite 应用程序的 CTXSYS 参数。

    export ORACLE_PDB_SID=[PDB_NAME]
    sqlplus / as sysdba
    show con_name
    exec ctxsys.ctx_adm.set_parameter('file_access_role', 'public');
    
  8. 自动收集 Oracle E-Business Suite 应用程序的统计信息。

    export ORACLE_PDB_SID=[PDB_NAME]
    sqlplus / as sysdba
    show con_name
    alter system enable restricted session;
    @adstats.sql
    alter system disable restricted session;
    

任务 3:增量 V4 XTTS 步骤

任务 3.1:初始阶段

  1. 从此处下载最新的 v4 perl 脚本并解压缩:V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1) 。创建目录以解压缩脚本和临时目录。

    例如:

    mkdir -p <Backup_location>/XTTS_Migration
    mkdir -p <Backup_location>/XTTS_Migration/XTTS_TEMP
    
  2. 使用特定于站点的配置编辑源系统上的 xtt.properties 文件。有关 xtt.properties 文件中参数的更多信息,请参见此处配置文件 xtt.properties 部分中参数的说明:V4 Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 2471245.1) 。对于此过程,只有以下参数是必需的。其他选项为可选和/或可供使用。

    tablespaces=<list of tablespaces that are migrated with comma saperated>
    platformid= <obtained from the query select platform_name,platform_id, endian_format from v$transportable_platform>
    src_scratch_location= <Backup location on source database server>
    dest_scratch_location= <Backup location on target database server>
    dest_datafile_location= <path for the datafile location of PDB >
    destconnstr=sys/<password>>@<Target PDB Connect String>
    usermantransport=1 - It is recommended this be set if the source database is running 12c or higher. This causes new 12c (and higher)
    parallel=1
    

任务 3.2:准备阶段

  1. 在源系统上运行备份。在源系统上,以 Oracle 用户身份登录,其中环境(ORACLE_HOMEORACLE_SID 环境变量)指向源数据库,按如下方式运行备份。

    export TMPDIR=<Backup_location>/XTTS_Migration/XTTS_TEMP
    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3 &
    
  2. 将以下文件传输到目标数据库服务器。

    • 从源 src_scratch_location 创建到目标 dest_scratch_location 的备份。

    • 从源 $TMPDIR 到目标 $TMPDIRres.txt 文件。

    在以下示例中,scp 用于将上一步创建的 level=0 备份从源系统传输到目标系统。

    [oracle@source]$ scp /src_scratch_location/* oracle@dest:/dest_scratch
    [oracle@source]$ scp res.txt oracle@dest:/home/oracle/xtt
    
  3. 恢复目标系统上的数据文件。

    export TMPDIR=<Backup_location>/XTTS_Migration/XTTS_TEMP
    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    cp nohup.out nohup.out_L0
    nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore --debug 3 &
    

任务 3.3:向前滚动阶段

在此阶段,将从源数据库创建增量备份,传输到目标系统,转换为目标系统 endian 格式,然后应用于转换后的目标数据文件副本以向前滚动。此阶段可以多次运行。每个连续增量备份所用的时间应该比以前的增量备份少,并且会使目标数据文件副本在源数据库上更加最新。在此阶段,传输的数据(源)完全可访问。

注:可以针对源执行多个备份,而无需将其应用于目标。在目标上执行 “– restore”命令之前,必须复制备份文件和 res.txt

  1. 为源系统上要传输的表空间创建增量备份。

    export TMPDIR=<Backup_location>/XTTS_Migration/XTTS_TEMP
    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    cp nohup.out nohup.out_1
    nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3 &
    

    此步骤将为 xtt.properties 文件中列出的所有表空间创建增量备份。

  2. 将增量备份和 res.txt 传输到目标系统。将增量备份(在 src_scratch_locationdest_scratch_location 之间)和 res.txt(在 $TMPDIRs 之间)从源传输到目标。当前备份中的增量备份文件列表可在源系统的 incrbackups.txt 文件中找到。

    例如:

    [oracle@source]$ scp `cat incrbackups.txt` oracle@dest:/dest_scratch_location
    [oracle@source]$ scp res.txt oracle@dest:/home/oracle/xtt
    
  3. 将增量备份应用于目标系统上的数据文件副本。在目标系统上,以 Oracle 用户身份登录,其中环境(ORACLE_HOMEORACLE_SID 环境变量)指向目标数据库,按如下方式运行向前滚动数据文件步骤。

    export TMPDIR=<Backup_location>/XTTS_Migration/XTTS_TEMP
    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    cp nohup.out nohup.out_3
    $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore --debug 3
    

    向前滚动步骤连接到目标数据库,并对要传输的每个表空间的数据文件应用增量备份。

    注:虽然可以针对源执行多个备份而不会在目标上应用,但必须在上次备份之后以及在目标上执行 --restore 之前复制 res.txt 文件。

    重复前滚阶段,直到数据库切换窗口。

任务 3.4:最终增量备份阶段

  1. 在源数据库中将源表空间更改为 READ ONLY。如果所有表空间都传输到目标数据库,请运行以下查询。

    set lines 300
    select 'alter tablespace "'||tablespace_name||'" read only;' from dba_tablespaces where contents='PERMANENT' and tablespace_name not in ('SYSTEM','SYSAUX');
    
  2. 为源系统上要传输的表空间创建最终增量备份。

    export TMPDIR=<Backup_location>/XTTS_Migration/XTTS_TEMP
    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    cp nohup.out nohup.out_4
    nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3 &
    
  3. 将增量备份和 res.txt 传输到目标系统。

    例如:

    [oracle@source]$ scp 'cat incrbackups.txt' oracle@dest:/dest_scratch_location
    [oracle@source]$ scp res.txt oracle@dest:/home/oracle/xtt
    
  4. 将上次增量备份应用于目标数据文件。

    export TMPDIR=<Backup_location>/XTTS_Migration/XTTS_TEMP
    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    cp nohup.out nohup.out_5
    nohup $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore --debug 3 &
    

任务 3.5:传输阶段 - 将元数据和插件表空间导出到目标数据库

  1. 创建目录以存储导出备份文件。

    例如:

    mkdir -p <Backup_location>/XTTS_DPUMP
    

    运行以下查询以在源数据库中创建目录。

    create or replace directory XTTS_DUMP as '<Backup_location>/XTTS_DUMP';
    grant read,write on directory XTTS_DUMP to system;
    
  2. 准备导出语法分析文件。

    vi xtts_expdp.par
    
    directory=XTTS*DUMP
    metrics=y
    dumpfile=xttsfulltts*%U.dmp
    filesize=1048576000
    full=y
    exclude=STATISTICS
    logfile=expfulltts.log
    parallel=4
    transportable=always
    EXCLUDE=NORMAL_OPTIONS
    
  3. 在源数据库上运行数据泵导出。

    nohup expdp system/<password>@<source_db_name> parfile= xtts_expdp.par &
    
  4. 在生成要导入的样例语法分析文件的目标数据库服务器上运行以下命令。

    export TMPDIR=<Backup_location>/XTTS_Migration/XTTS_TEMP
    export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
    $ORACLE_HOME/perl/bin/perl xttdriver.pl -e
    

    更新在上一步中生成的以下语法分析文件行。

    impdp directory=<DATA_PUMP_DIR> logfile=<tts_imp.log> \
    network_link=<ttslink> transport_full_check=no \ replace these parameters
    transport_tablespaces=<tablespace list> \ delete this line from parfile
    

    最终导入配置文件应如下所示:

    directory=XTTS*DUMP logfile=impdpfulltts.log \
    metrics=y dumpfile=xttsfulltts*%U.dmp parallel=6 full=y logtime=all exclude=STATISTICS \
    transport_datafiles=<list of datafile path generated from above parfile>
    
  5. 禁用以下审计相关参数,直到如上所述完成导入。导入完成后重新启用它们。

    show parameter audit_sys_operations
    show parameter audit_trail
    alter system set audit_trail=none scope=spfile sid='_';
    alter system set audit_sys_operations=FALSE scope=spfile sid='_';
    srvctl stop database -d ${ORACLE_UNQNAME}
    srvctl start database -d ${ORACLE_UNQNAME}
    show parameter audit_sys_operations
    show parameter audit_trail
    
  6. 在目标数据库上运行数据泵导入。

    1. 创建目录以复制导出备份文件。

      例如:

      mkdir -p <Backup_location>/XTTS_DPUMP
      
    2. 运行以下命令以在源数据库中创建目录。

      create or replace directory XTTS_DUMP as '<Backup_location>/XTTS_DUMP';
      grant read,write on directory XTTS_DUMP to system;
      
      nohup impdp system/<password>@<>target_db_name> parfile=<parfile_name> &
      
  7. 在导入完成后启用以下审计相关参数。

    show parameter audit_sys_operations
    show parameter audit_trail
    alter system set audit_trail=DB scope=spfile sid='_';
    alter system set audit_sys_operations=TRUE scope=spfile sid='_';
    srvctl stop database -d ${ORACLE_UNQNAME}
    srvctl start database -d ${ORACLE_UNQNAME}
    show parameter audit_sys_operations
    show parameter audit_trail
    
  8. 验证传输的数据。

    rman target sys/<password>@<>target_db_name> trace=rman_trace.trc log=<backup_location>/tablespace_validate.log
    
    validate tablespace <list of tablespaces transported with comma saperated> check logical;
    
  9. 分配用户表空间以还原在目标数据库准备过程中所做的更改。

    select 'alter user '||username||' default tablespace users;' from dba_users where default_tablespace='USERS_OCI';
    

    验证源数据库和目标数据库上的数据。

确认

更多学习资源

浏览 docs.oracle.com/learn 上的其他实验室,或者访问 Oracle Learning YouTube 渠道上的更多免费学习内容。此外,请访问 education.oracle.com/learning-explorer 成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心