

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 第 2 阶段 — 向前滚动阶段（源数据库保持在线）
<a name="phase2"></a>

您可以根据需要多次重复前滚阶段，以将目标数据文件捕获到源数据库。

向前滚动阶段包括以下步骤。

1. 从源数据库创建增量备份。

1. 将备份传输到目标系统。

1. 将备份转换为目标系统字节序格式。

1. 将备份应用于转换后的目标数据文件副本以将其向前滚动。

每次连续的增量备份都应花费更少的时间，并且会使目标数据文件副本与源数据库保持一致。

## 步骤 1：并行进行增量备份
<a name="phase2-step1"></a>

并行备份源系统上正在传输的表空间组的增量备份。

此步骤将为文件中列出的所有 tablespaces= 创建增量备份。`xtt.properties`

如果可以在源系统上激活 “**块更改跟踪**” 功能，则可以大大缩短增量备份的时间。

以下命令会自动识别完全备份后的下一个 SCN。

```
cd /u01/oracle/expimp/xtt<nn>
export TMPDIR=/u01/oracle/expimp/out/out<nn>
$ORACLE_HOME/perl/bin/perl xttdriver.pl --backup --debug 3
```

## 步骤 2：将增量备份和 res.txt 文件传输到目标系统
<a name="phase2-step2"></a>

如果您有足够的带宽，则可以通过使用来缩短传输持续时间 Direct Connect。

在`src_scratch_location`和之间传输增量备份`dest_scratch_location`。在源系统和`$TMPDIR`目标系统之间`$TMPDIR`传输`res.txt`文件。

如果您进行多个增量备份，则必须在最后一次增量备份之后复制该`res.txt`文件，然后才能将其应用于目标系统。

```
[source]$ scp $TMPDIR/res.txt oracle@[dest]:/u01/oracle/expimp/out/out<nn>
[source]$ scp <src_scratch_location>/* oracle@[dest]:<dest_scratch_location>
```

## 步骤 3：转换并应用增量备份
<a name="phase2-step3"></a>

将增量备份转换为目标系统字节序格式，并将增量备份应用于目标系统上的目标数据文件副本。

在本指南中，假设表空间组是四个。使用每个表空间组的`--restore`选项运行每条`xttdriver.pl`命令。

在此步骤中，Oracle XTTS 实用程序会启动要重新启动的目标数据库。要并行运行该命令，必须在 Perl 脚本中使用以下自定义设置。`xttdriver.pl`

****

1. 注释掉以下几行：
   + 4867 行：` my $outputstart = `sqlplus -L -s \"/ as sysdba\" \@xttstartupnomount.sql`;`
   + 4868 行：` checkError ("Error in executing xttstartupnomount.sql", $outputstart);`
   + 第 4992 行：` my $outputstart = `sqlplus -L -s \"/ as sysdba\" \@xttdbopen.sql`;\`

1. 使目标数据库处于`NOMOUNT`状态。

   ```
   sqlplus / as sysdba @xttstartupnomount.sql
   ```

1. 并行执行增量备份的前滚操作。

   ```
   cd /u01/oracle/expimp/xtt<nn>
   export TMPDIR=/u01/oracle/expimp/out/out<nn>
   $ORACLE_HOME/perl/bin/perl xttdriver.pl --restore --debug 3
   ```

1. 向前滚动所有增量备份后，将目标数据库设置为`OPEN`状态。

   ```
   sqlplus / as sysdba @xttdbopen.sql
   ```

此时，您可以重复第 2 阶段， SCNs 直到源数据库和目标数据库足够接近。您必须根据给定的目标停机时间决定是进入第 3 阶段还是重复第 2 阶段。

为了缩短第 3 阶段（传输阶段）的停机时间，可以在将源数据库设置为`USER`之前导出和导入非分段对象的元数据，例如`FUNCTION`、、和。`PACKAGE` `PROCEDURE` `READ ONLY`

如果源数据库中的数据库对象数量非常大（数十万），则导出和导入元数据将需要几个小时。在这种情况下，可以考虑导出元数据。

导出基于非分段的对象是在源系统中 read/write 运行的。然后，必须先将对象导入目标系统，然后才能将源系统设置为`READ ONLY`。此时，必须保持`PACKAGE``PROCEDURE`、和等数据库源对象`FUNCTION`不变。

这是转储参数文件的一个示例，该文件用于导出非基于分段的对象的元数据，包括、`USER`、`PACKAGE_SPEC``PACKAGE_BODY`、`PROCEDURE`和。`FUNCTION`

```
directory=dmpdir
dumpfile=xttsmsc%U.dmp
full=y
filesize=1048576000
logfile=expmsc.log
metrics=y
exclude=TABLE,INDEX,CONSTRAINT,COMMENT,
MATERIALIZED_VIEW,MATERIALIZED_VIEW_LOG,SCHEMA_CALLOUT
```

使用以下命令导出元数据。

```
SQL> create directory dmpdir as <location>;
expdp system/<system password> parfile=<parameter file>
```

这是用于导入非分段对象元数据的转储参数文件的示例。

```
directory=dmpdir
dumpfile=xttsmsc%U.dmp
full=y
logfile=impmsc1.log
EXCLUDE=TABLESPACE, PROCOBJ, RLS_CONTEXT, RLS_GROUP, RLS_POLICY, TABLESPACE_QUOTA
metrics=y
remap_tablespace=
APPS_TS_ARCHIVE:SYSTEM,
APPS_TS_INTERFACE:SYSTEM,
APPS_TS_SEED:SYSTEM,
APPS_TS_SUMMARY:SYSTEM,
…..
```

目前，目标系统`TEMP`上除了`SYSTEM`、`SYSAUX``UNDO`、和之外没有其他表空间。因此，必须重新映射所有要导入到`SYSTEM`表空间的对象。

使用以下命令导入元数据。

```
SQL> create directory dmpdir as <location>;
impdp system/<system password> parfile=<parameter file>
```

现在，您可以在目标数据库上看到创建的对象。

```
SQL> select object_type, count(*) from dba_objects group by object_type order by count(*) desc;
OBJECT_TYPE                  COUNT(*)
------------------------------- ----------
SYNONYM                          89327
PACKAGE                           55670
PACKAGE BODY                  54447
VIEW                                 41378
JAVA CLASS                        31978
SEQUENCE                         12766
…..
```

除了`SYSTEM`、、`SYSAUX`和之外没有其他表空间。`UNDO` `TEMP`创建`USER`对象时使用默认表空间`USERS`作为默认表空间。在第 3 阶段，将创建可传输表空间，然后使用原始默认表空间更改 USER 对象。