阴影丢失写保护提供快速检测和对丢失写入的即时响应。
当I / O子系统确认块写入完成时发生数据块丢失写入,即使没有发生写入或者块的前一个图像覆盖当前图像。
未检测到的丢失写入可能导致数据损坏,因为不正确的数据可用于其他DML事务。例如,事务可以从一个表读取旧的和不正确的数据,然后根据此数据更新数百个其他表。通过这种方式,数据损坏可以在整个数据库中传播。
阴影丢失写保护提供以下好处:

  • 它在标准DML,SQL * Loader常规路径加载,直接路径加载和RMAN备份使用之前检测到丢失的写入。
  • 不需要备用数据库,如Oracle Database 11g中引入的丢失写保护。
  • 您可以为特定表空间和数据文件启用阴影丢失写保护。您无需跟踪所有数据。
  • 您可以将一个影子表空间替换为另一个影子表空间以更改其配置或位置。
  • 您可以暂停和恢复表空间或数据文件的阴影丢失写保护。
  • 您可以使用单个ALTER DATABASE ... LOST WRITE TRACKING语句为整个非CDB或PDB启用或禁用它。请注意,该PROP$表指示是否为PDB启用了跟踪。
    影子表空间的工作原理
    丢失写保护需要两个表空间:一个影子表空间和一个非影子表空间,其影子表由影子表空间跟踪。
    下图提供了一个示例场景。在表空间中的数据文件TBS1,并TBS2通过影子表跟踪。阴影表DBF6空间TBS3仅跟踪表空间中的数据文件。

oracle  影子表空间 - 图1
一个跟踪数据文件映射到阴影表空间中的一个阴影范围。跟踪数据文件中的每个数据块在阴影块中都有对应的条目。此条目包含跟踪数据块的SCN。当从磁盘读取跟踪数据块时,阴影丢失写保护会将影子表空间中的块的SCN与跟踪数据块中最近写入的SCN进行比较。如果影子条目的SCN大于正在读取的数据块,则会发生丢失写入,从而提示错误。
阴影范围的大小具有显着的额外空间,以防止数据文件的自动调整大小导致阴影范围变得过大。如果手动或自动调整跟踪数据文件的大小,并且阴影范围需要增长,则数据库会尝试调整跟踪数据的大小。如果影子表空间中没有足够的空间,则数据库会向警报日志写入警告,并跟踪尽可能多的数据块。
以下数据字典视图监视影子表空间:

  • DBA_TABLESPACES
    通过查询显示哪些表空间是影子表空间。
  • DBA_DATA_FILES.LOST_WRITE_PROTECT
    显示是否为数据文件启用了丢失的写保护
  • USER_TABLESPACES.LOST_WRITE_PROTECT
    显示是否为特定表空间打开了丢失的写保护。DBA_DATA_FILES不表示是否为表空间打开了丢失的写入:您必须USER_TABLESPACES改为查看

,你的目标是保护salestbshrtbs表空间非CDB内。您还希望保护表空间oetbs01.dbf内的数据文件,并且只保护此数据文件oetbs。您执行以下操作:

  1. 以数据库登录数据库SYSTEM
  2. 创建单个影子表空间,如下所示:

    1. CREATE BIGFILE TABLESPACE shadow_lwp1
    2. DATAFILE 'shadow_lwp1_df' SIZE 10M LOST WRITE PROTECTION;
  3. 为整个数据库启用丢失的写保护,如下所示:

    1. ALTER DATABASE ENABLE LOST WRITE PROTECTION;
  4. salestbs和和hrtbs表空间启用阴影丢失写保护,如下所示:

    1. ALTER TABLESPACE salestbs ENABLE LOST WRITE PROTECTION;
    2. ALTER TABLESPACE hrtbs ENABLE LOST WRITE PROTECTION;
  5. oetbs01.dbf数据文件启用阴影丢失写保护,如下所示:

    1. ALTER DATABASE DATAFILE 'oetbs01.dbf' ENABLE LOST WRITE PROTECTION;