All steps in this procedure are run as the oracle user that is a member of the OSDBA group. OS authentication is used to connect to both the source and destination databases.

  1. Initial Setup

    1.1 创建 xtts 目录,解压 rman_xttconvert_v3.zip 软件包

    mkdir -p /home/oracle/xtts/backup
    mkdir -p /home/oracle/xtts/backup_incr
    mkdir -p /home/oracle/xtts/scripts
    cd /home/oracle/xtts
    unzip rman_xttconvert_v3.zip

    1.2 配置 xtt.properties 参数

    cat > xtt.properties << 'EOF'
    tablespaces=TBS_COCO,ITPUX01,ITPUX02,ITPUX03
    platformid=13
    srcdir=SOURCEDIR
    dstdir=DESTDIR
    srclink=ttslink
    # dfcopydir=/home/oracle/xtts/backup
    backupformat=/home/oracle/xtts/backup_incr
    stageondest=/home/oracle/xtts/backup
    storageondest=+DATA/coco/pdb
    backupondest=/home/oracle/xtts/backup_incr
    asm_home=/u01/app/19.0.0/grid
    asm_sid=+ASM
    parallel=3
    rollparallel=2
    getfileparallel=4
    EOF

    1.3 (可选)目标端配置临时实例用于增量备份恢复,目标端 11.2.0.4 及以上跳过此步骤

    export ORACLE_SID=xtts
    cat << EOF > $ORACLE_HOME/dbs/init$ORACLE_SID.ora
    db_name=xtts
    compatible=19.0.0
    EOF

    sqlplus / as sysdba
    SQL> startup nomount

    1.4 目标端创建连接源端的 dblink

    create public database link ttslink connect to system identified by oracle
    using '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.184.145 )(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = coco) ) )';

    1.5 创建数据库目录

    -- 源端创建SOURCEDIR
    create directory SOURCEDIR as '+DATA/coco';
    grant all on directory SOURCEDIR to public;

    -- 目标端创建DESTDIR
    create directory DESTDIR as '+DATA/coco/pdb';
    grant all on directory DESTDIR to public;

    1.6 源端和目标端设置临时目录

    [oracle@source]$ export TMPDIR=/home/oracle/xtts/scripts
    [oracle@dest]$ export TMPDIR=/home/oracle/xtts/scripts
  2. Prepare Phase for dbms_file_transfer Method

    2.1 源端执行以下命令,创建 getfile.sql 和 xttnewdatafiles.txt 文件

    $ORACLE_HOME/perl/bin/perl xttdriver.pl -S

    2.2 拷贝 getfile.sql 和 xttnewdatafiles.txt 文件文件至目标端

    scp $TMPDIR/getfile.sql oracle@dest:$TMPDIR
    scp $TMPDIR/xttnewdatafiles.txt oracle@dest:$TMPDIR

    2.3 目标端进行数据文件拷贝

    $ORACLE_HOME/perl/bin/perl xttdriver.pl -G
  3. Roll Forward Phase

    3.1 源端生成增量备份文件至 backupformat

    $ORACLE_HOME/perl/bin/perl xttdriver.pl -i

    3.2 拷贝增量备份文件、xttplan、tsbkupmap 至目标端 stageondest

    scp `cat $TMPDIR/incrbackups.txt` oracle@dest:/home/oracle/xtts/backup
    scp $TMPDIR/xttplan.txt oracle@des:$TMPDIR
    scp $TMPDIR/tsbkupmap.txt oracle@dest:$TMPDIR

    3.3 目标端做增量前滚

    $ORACLE_HOME/perl/bin/perl xttdriver.pl -r

    3.4 源端确定下一个增量备份的 FROM_SCN

    $ORACLE_HOME/perl/bin/perl xttdriver.pl -s

    3.5 Repeat the Roll Forward Phase (Phase 3)

  4. Transport Phase

    4.1 源端将表空间置为只读模式

    select 'ALTER TABLESPACE '||name||' READ ONLY;' exec_sql
    from v$tablespace where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','USERS');

    select tablespace_name,status from dba_tablespaces;

    4.2 重复步骤 3.1 - 3.3,做最后一次增量前滚

    [oracle@source]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -i

    [oracle@source]$ scp `cat $TMPDIR/incrbackups.txt` oracle@dest:/home/oracle/xtts/backup

    [oracle@source]$ scp $TMPDIR/xttplan.txt oracle@dest:$TMPDIR
    [oracle@source]$ scp $TMPDIR/tsbkupmap.txt oracle@dest:$TMPDIR

    [oracle@dest]$ $ORACLE_HOME/perl/bin/perl xttdriver.pl -r
  5. Import Object Metadata into Destination Database

    5.1 目标端创建业务用户

    CREATE USER "ITPUX01" IDENTIFIED BY VALUES 'S:98BB089CD1A16CBD4803C404C3279A570D607F667DD6E5EB7A19735B7FA6;358208C73FF2939C';
    CREATE USER "COCO" IDENTIFIED BY VALUES 'S:37AB55E527FC21D62DEA2949499DD9D9F7EC2A5C97C9140A23ADEBB365BD;96B138098030A3C8';
    CREATE USER "ITPUX02" IDENTIFIED BY VALUES 'S:21BC086145990A7CC133F01E0D80B7548EA49DB694F44E972CEC33685168;499779BC208401AE';
    CREATE USER "ITPUX03" IDENTIFIED BY VALUES 'S:4C2C70077865FBFE627E08288E24FC9307DAF72DAC9C36EA9D31AE332263;CE4FDA4704D50F9C';

    GRANT "DBA" TO "ITPUX01";
    GRANT "DBA" TO "COCO";
    GRANT "DBA" TO "ITPUX02";
    GRANT "DBA" TO "ITPUX03";

    5.2 目标端生成 Data Pump TTS 命令

    $ORACLE_HOME/perl/bin/perl xttdriver.pl -e
    cat $TMPDIR/xttplugin.txt

    5.3 迁移表空间元数据

    impdp system/oracle@pdb directory=DATA_PUMP_DIR logfile=tts_imp.log \
    network_link=ttslink transport_full_check=no \
    exclude=statistics \
    transport_tablespaces=TBS_COCO,ITPUX01,ITPUX02,ITPUX03 \
    transport_datafiles='+DATA/coco/pdb/tbs_coco01.dbf','+DATA/coco/pdb/itpux01.dbf','+DATA/coco/pdb/itpux02.dbf','+DATA/coco/pdb/itpux03.dbf'

    5.4 迁移存储过程、触发器、函数、包、视图、序列

    impdp system/oracle@pdb directory=DATA_PUMP_DIR \
    network_link=ttslink schemas=COCO,ITPUX01,ITPUX02,ITPUX03 content=metadata_only exclude=index,table parallel=8

    5.5 导入同义词、dblink 和其他对象

    -- 导入公共同义词
    set long 9999
    select dbms_metadata.get_ddl('SYNONYM',SYNONYM_NAME,OWNER)
    FROM dba_synonyms where owner='PUBLIC' and table_owner in ('COCO','ITPUX01','ITPUX02','ITPUX03');

    -- 导入dblink
    set long 9999
    select dbms_metadata.get_ddl('DB_LINK',DB_LINK,OWNER) FROM DBA_DB_LINKS;
  6. Post-migration

    6.1 检查数据库一致性

    select owner, object_type, count(*)
    from dba_objects
    where object_name not like 'BIN%'
    and owner in ('COCO','ITPUX01','ITPUX02','ITPUX03')
    group by owner, object_type
    order by 1,2 desc;

    6.2 业务用户修改权限和默认表空间

    ALTER USER "ITPUX01" DEFAULT TABLESPACE "ITPUX01" TEMPORARY TABLESPACE "TEMP";
    ALTER USER "ITPUX02" DEFAULT TABLESPACE "ITPUX02" TEMPORARY TABLESPACE "TEMP";
    ALTER USER "ITPUX03" EFAULT TABLESPACE "ITPUX03";
    ALTER USER "COCO" DEFAULT TABLESPACE "TBS_COCO" TEMPORARY TABLESPACE "TEMP";
    GRANT UNLIMITED TABLESPACE TO "ITPUX01";
    GRANT UNLIMITED TABLESPACE TO "COCO";
    GRANT UNLIMITED TABLESPACE TO "ITPUX02";
    GRANT CREATE JOB TO "COCO";
    GRANT UPDATE ON "COCO"."TESTTABLE" TO "ITPUX01";
    GRANT SELECT ON "SYS"."DBA_USERS" TO "COCO";

    6.3 表空间置为读写模式

    select 'ALTER TABLESPACE '||name||' READ WRITE;' exec_sql from v$tablespace
    where NAME not in ('SYSTEM','SYSAUX','UNDOTBS1','TEMP','USERS');

    6.4 校验数据文件完整性

    RMAN> validate tablespace COCO,ITPUX01,ITPUX02,ITPUX03 check logical;

    6.5 收集统计信息

    exec dbms_stats.gather_database_stats(degree => 8);
    exec dbms_stats.gather_dictionary_stats(degree => 8);
    exec dbms_stats.gather_fixed_objects_stats();