演習: 過去のある時点へのPDBのフラッシュバック

この演習では、特定の時間へのPDB PITR/フラッシュバックを実行した後、PDB時間へのPDB PITR/フラッシュバックを孤立したPDBインカーネーションで実行する方法を示します。

  1. 新しい演習を開始する前に、演習の環境の推奨事項を参照してください。
  2. PDB20のデータのフラッシュバックを開始する前に、CDBでフラッシュバックを有効にする/home/oracle/labs/M104782GC10/setup_Flashback.shシェル・スクリプトを実行し、PDB20を再作成して、HRスキーマをPDB20に作成します。
    $ cd /home/oracle/labs/M104782GC10
    $ /home/oracle/labs/M104782GC10/setup_Flashback.sh
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Jan 13 11:05:13 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> ALTER DATABASE FLASHBACK on;
    
    Database altered.
    
    SQL> exit
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Jan 13 11:15:41 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> ALTER PLUGGABLE DATABASE pdb20 CLOSE;
    
    Pluggable database altered.
    
    SQL> ALTER SESSION SET db_create_file_dest='/home/oracle/labs';
    
    Session altered.
    
    SQL> DROP PLUGGABLE DATABASE pdb20 INCLUDING DATAFILES;
    
    Pluggable database dropped.
    
    SQL> CREATE PLUGGABLE DATABASE pdb20
      2      ADMIN USER pdb_admin IDENTIFIED BY password ROLES=(CONNECT)
      3      CREATE_FILE_DEST='/home/oracle/labs';
    
    Pluggable database created.
    
    SQL>
    SQL> ALTER PLUGGABLE DATABASE pdb20 OPEN;
    
    Pluggable database altered.
    
    SQL> exit
    
    
    Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL*Plus: Release 20.0.0.0.0 - Production on Mon Jan 13 11:05:14 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    
    specify password for HR as parameter 1:
    
    specify default tablespeace for HR as parameter 2:
    
    specify temporary tablespace for HR as parameter 3:
    
    specify log path as parameter 4:
    
    
    PL/SQL procedure successfully completed.
    
    User created.
    
    ALTER USER hr DEFAULT TABLESPACE users
    ...
    Commit complete.
    
    PL/SQL procedure successfully completed.
    
    SQL> Disconnected from Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    $
  3. CDBルートに接続し、CDBがオープンしていてフラッシュバックが有効になっていることを確認します。
    $ sqlplus / AS SYSDBA
    SQL*Plus: Release 20.0.0.0.0 - Production on Fri Mar 13 07:10:40 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2020, Oracle.  All rights reserved.
    
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> SELECT open_mode, flashback_on FROM v$database;
    
    OPEN_MODE            FLASHBACK_ON
    -------------------- ------------------
    READ WRITE           YES
    
    SQL>
  4. PDB20HR.EMPLOYEES表でDDLまたはDMLコマンドを実行する前に、PDBの現在のSCNとそれに関連付けられたタイムスタンプおよびインカーネーションを表示します。
    SQL> CONNECT sys@PDB20 AS SYSDBA
    Enter password: password
    Connected.
    SQL> COL TIMESTAMP FORMAT A40
    SQL> SELECT CURRENT_SCN, SCN_TO_TIMESTAMP(CURRENT_SCN) "TIMESTAMP" from V$DATABASE;
    
    CURRENT_SCN SCN_TO_TIMESTAMP(CURRENT_SCN)
    ----------- --------------------------------------------------------------------
        3880324 13-MAR-20 07.12.24.000000000 AM
    
    SQL> SELECT con_id, status, pdb_incarnation# inc#, begin_resetlogs_scn, end_resetlogs_scn
         FROM   v$pdb_incarnation ORDER BY 3;
    
        CON_ID STATUS        INC# BEGIN_RESETLOGS_SCN END_RESETLOGS_SCN
    ---------- ------- ---------- ------------------- -----------------
             4 PARENT           0                   1                 1
             4 CURRENT          0             2667602           2667602
    
    SQL>

    使用可能なORPHANインカーネーションは、以前のPDBリセットログから取得されます。

  5. HR.EMPLOYEES表内の行数が表示されます。
    SQL> SELECT count(*) FROM hr.employees;
    
      COUNT(*)
    ----------
           107
    
    SQL>
    
  6. ユーザーがPDB20HR.EMPLOYEES表を誤って削除します。
    SQL> DROP TABLE hr.employees CASCADE CONSTRAINTS;
    
    Table dropped.
    
    SQL>
  7. 削除された表をリストアするためにPDBをフラッシュバックします。PDB20が閉じていることを確認します。他のPDBは、オープンで操作可能な状態でもかまいません。
    SQL> ALTER PLUGGABLE DATABASE CLOSE;
    
    Pluggable database altered.
    
    SQL>
  8. 表が削除される前の時点までデータをフラッシュバックします。指定した時点またはリストア・ポイントへのフラッシュバック操作の場合は、孤立したPDBインカーネーションを設定する必要はありません。フラッシュバック・データベース・コマンドのために、必要なSCNまたは特定の時点を決定します。この時点は、現在のCDBインカネーション内または祖先CDBインカネーション内である必要があります。
    SQL> FLASHBACK PLUGGABLE DATABASE TO SCN 3880324;
    
    Flashback complete.
    
    SQL>
  9. RESETLOGSを指定してPDB20をオープンします。
    SQL> ALTER PLUGGABLE DATABASE OPEN RESETLOGS;
    
    Pluggable database altered.
    
    SQL> SELECT count(*) FROM hr.employees;
     
      COUNT(*)
    ----------
           107
    
    SQL>
  10. PDB20のインカーネーションを表示します。
    SQL> SELECT con_id, pdb_incarnation# INC#, status, incarnation_scn, end_resetlogs_scn
                    FROM v$pdb_incarnation ORDER BY 1, 2;
        CON_ID       INC# STATUS  INCARNATION_SCN END_RESETLOGS_SCN
    ---------- ---------- ------- --------------- -----------------
             4          0 PARENT          2667602           2667602
             4          1 CURRENT         3880344           3881083
    
    SQL>
  11. 一部の従業員について、HR.EMPLOYEESの従業員の給与を2倍に増やします。
    SQL> SELECT min(salary), MAX(salary) FROM hr.employees;
    
    MIN(SALARY) MAX(SALARY)
    ----------- -----------
           2100       24000
    	   
    SQL> UPDATE hr.employees SET salary=salary*2 WHERE employee_id<200;
    
    100 rows updated.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL> SELECT CURRENT_SCN, SCN_TO_TIMESTAMP(CURRENT_SCN) "TIMESTAMP" from V$DATABASE;
    
    CURRENT_SCN TIMESTAMP
    ----------- ----------------------------------------
        3881391 13-MAR-20 07.16.33.000000000 AM
    
    SQL>
  12. 2分後に、従業員206を削除します。
    SQL> DELETE FROM hr.employees WHERE employee_id=206;
    
    1 rows deleted.
    
    SQL> COMMIT;
    
    Commit complete.
    
    SQL> SELECT count(*) FROM hr.employees;
    
      COUNT(*)
    ----------
           106
    
    SQL> SELECT CURRENT_SCN, SCN_TO_TIMESTAMP(CURRENT_SCN) "TIMESTAMP" from V$DATABASE;
    
    CURRENT_SCN TIMESTAMP
    ----------- ----------------------------------------
        3882392 13-MAR-20 07.20.27.000000000 AM
    
    SQL> SELECT con_id, pdb_incarnation# INC#, status, incarnation_scn, end_resetlogs_scn
                    FROM v$pdb_incarnation ORDER BY 1, 2;
     
        CON_ID       INC# STATUS  INCARNATION_SCN END_RESETLOGS_SCN
    ---------- ---------- ------- --------------- -----------------
             4          0 PARENT          2667602           2667602
             4          1 CURRENT         3880344           3881083
    
    SQL>
  13. 表が削除される前の時点までデータをフラッシュバックすることにします。
    SQL> ALTER PLUGGABLE DATABASE CLOSE;
    
    Pluggable database altered.
    
    SQL> FLASHBACK PLUGGABLE DATABASE TO SCN 3880324;
    
    Flashback complete.
    
    SQL> ALTER PLUGGABLE DATABASE OPEN RESETLOGS;
    
    Pluggable database altered.
    
    SQL> SELECT count(*) FROM hr.employees;
    
      COUNT(*)
    ----------
           107
    
    SQL> SELECT min(salary), MAX(salary) FROM hr.employees;
    
    MIN(SALARY) MAX(SALARY)
    ----------- -----------
           2100       24000
    
    SQL> SELECT con_id, pdb_incarnation# INC#, status, incarnation_scn, end_resetlogs_scn
         FROM v$pdb_incarnation ORDER BY 1, 2;
      2
        CON_ID       INC# STATUS  INCARNATION_SCN END_RESETLOGS_SCN
    ---------- ---------- ------- --------------- -----------------
             4          0 PARENT          2667602           2667602
             4          1 ORPHAN          3880344           3881083
             4          2 CURRENT         3880325           3882600
    
    SQL>
  14. ユーザーが、給与の更新後で従業員206が削除される前の状態にPDB20をリセットするように要求します。PDB20のこの状態は、PDB20のインカーネーション1に属します。フラッシュバックPDB操作を実行する必要がある孤立したPDBインカネーションを設定します。このステップは、フラッシュバック操作が孤立したPDBインカーネーションのSCNまたは特定の時間へのものであるため、必要です。
    SQL> RESET PLUGGABLE DATABASE TO INCARNATION 1;
    SP2-0734: unknown command beginning "RESET PLUG..." - rest of line ignored.
    SQL> EXIT
    $

    このコマンドは、RMANにのみ存在します。

    $ rman TARGET sys@PDB20
    target database Password: password
    connected to target database: CDB20:PDB20 (DBID=2289122758)
    
    RMAN> LIST INCARNATION OF PLUGGABLE DATABASE pdb20;
    
    using target database control file instead of recovery catalog
    List of Pluggable Database Incarnations
    DB Key  PDB Key PDBInc Key DBInc Key   PDB Name   Status     Inc SCN           Inc Time           Begin Reset SCN   Begin Reset Time
    ------- ------- --------   ---------   -------    --------  ---------------   ------------------  ---------------  ------------------
    2       4        2          2          PDB20      CURRENT    3880325          13-MAR-20            3882600          13-MAR-20
    End Reset SCN:3882600          End Reset Time:13-MAR-20        Guid:A0B8281946B32375E053424C960A082A
    2       4        1          2          PDB20      ORPHAN     3880344          13-MAR-20            3881083          13-MAR-20
    End Reset SCN:3881083          End Reset Time:13-MAR-20        Guid:A0B8281946B32375E053424C960A082A
    2       4        0          2          PDB20      PARENT     2667602          12-MAR-20            2667602          12-MAR-20
    End Reset SCN:2667602          End Reset Time:12-MAR-20        Guid:A0B8281946B32375E053424C960A082A
    
    RMAN> RESET PLUGGABLE DATABASE pdb20 TO INCARNATION 1;
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of reset database command at 03/13/2020 07:28:33
    RMAN-05625: command not allowed when connected to a pluggable database
    
    RMAN> exit
    Recovery Manager complete.
    $
    $ rman TARGET /
    
    Recovery Manager: Release 20.0.0.0.0 - Production on Mon Mar 13 11:50:04 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
    
    connected to target database: CDB20 (DBID=2732805675)
    
    RMAN> ALTER PLUGGABLE DATABASE pdb20 CLOSE;
    
    using target database control file instead of recovery catalog
    Statement processed
    
    RMAN> RESET PLUGGABLE DATABASE pdb20 TO INCARNATION 1;
    
    pluggable database reset to incarnation 1
    
    RMAN> FLASHBACK PLUGGABLE DATABASE pdb20 TO SCN 3880344;
    Starting flashback at 13-JAN-20
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: SID=148 device type=DISK
    
    starting media recovery
    media recovery failed
    RMAN-00571: ===========================================================
    RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
    RMAN-00571: ===========================================================
    RMAN-03002: failure of flashback command at 03/13/2020 07:31:00
    ORA-39889: Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation.
    
    RMAN> exit

    このエラーはどういう意味ですか。

    $ oerr ora 39889
    39889, 00000, "Specified System Change Number (SCN) or timestamp is in the middle of a previous PDB RESETLOGS operation."
    // *Cause:  The specified System Change Number (SCN) or timestamp was in the
    //          middle of a previous PDB RESETLOGS operation. More specifically,
    //          each PDB RESETLOGS operation may create a PDB incarnation as shown
    //          in v$pdb_incarnation. Any SCN between INCARNATION_SCN and
    //          END_RESETLOGS_SCN or any timestamp between INCARNATION_TIME and
    //          END_RESETLOGS_TIME as shown in v$pdb_incarnation is considered in
    //          the middle of the PDB RESETLOGS operation.
    // *Action: Flashback the PDB to an SCN or timestamp that is not in the middle
    //          of a previous PDB RESETLOGS operation. If flashback to a SCN on the
    //          orphan PDB incarnation is required, then use
    //          "RESET PLUGGABLE DATABASE TO INCARNATION" RMAN command to specify
    //          the pluggable database incarnation along which flashback to the
    //          specified SCN must be performed. Also, ensure that the feature is
    //          enabled.
    $

    ステップ11の最後に表示されたSCNを使用します。

    
    $ rman TARGET /
    
    Recovery Manager: Release 20.0.0.0.0 - Production on Mon Mar 13 11:50:04 2020
    Version 20.2.0.0.0
    
    Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
    
    connected to target database: CDB20 (DBID=2732805675)
    
    RMAN> RESET PLUGGABLE DATABASE pdb20 TO INCARNATION 1;
    
    pluggable database reset to incarnation 1
    
    RMAN> FLASHBACK PLUGGABLE DATABASE pdb20 TO SCN 3881391;
    Starting flashback at 13-MAR-20
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: SID=19 device type=DISK
    
    
    starting media recovery
    archived log for thread 1 with sequence 9 is already on disk as file /u03/app/oracle/fast_recovery_area/CDB20_IAD3CV/archivelog/2020_04_07/o1_mf_1_9_h8s80s3f_.arc
    archived log for thread 1 with sequence 10 is already on disk as file /u03/app/oracle/fast_recovery_area/CDB20_IAD3CV/archivelog/2020_04_07/o1_mf_1_10_h8s80t1w_.arc
    archived log for thread 1 with sequence 11 is already on disk as file /u03/app/oracle/fast_recovery_area/CDB20_IAD3CV/archivelog/2020_04_07/o1_mf_1_11_h8s80y54_.arc
    
    media recovery complete, elapsed time: 00:00:25
    
    Finished flashback at 13-MAR-20
    
    RMAN> EXIT
    
    Recovery Manager complete.
    $
  15. PDBをオープンし、従業員の給与が更新され、従業員206もリストアされた状態でデータがリストアされていることを確認します。
    $ sqlplus sys@PDB20 AS SYSDBA
    Enter password: password
    
    Connected to:
    Oracle Database 20c Enterprise Edition Release 20.0.0.0.0 - Production
    Version 20.2.0.0.0
    
    SQL> ALTER PLUGGABLE DATABASE pdb20 OPEN RESETLOGS;
    
    Pluggable database altered.
    
    SQL> CONNECT system@PDB20
    Enter password: password
    Connected.
    SQL> SELECT count(*) FROM hr.employees;
    
      COUNT(*)
    ----------
           107
    
    SQL> SELECT min(salary), MAX(salary) FROM hr.employees;
    
    MIN(SALARY) MAX(SALARY)
    ----------- -----------
           4200       48000
    
    SQL> SELECT con_id, pdb_incarnation# INC#, status, incarnation_scn, end_resetlogs_scn
            FROM v$pdb_incarnation ORDER BY 1, 2;
    
        CON_ID       INC# STATUS  INCARNATION_SCN END_RESETLOGS_SCN
    ---------- ---------- ------- --------------- -----------------
             4          0 PARENT          2667602           2667602
             4          1 PARENT          3880344           3881083
             4          2 ORPHAN          3880325           3882600
             4          3 CURRENT         3881392           3884391
    
    SQL> EXIT
    $