はじめに
Oracleデータベースでは、RMAN(Recovery Manager)を使用して指定した時点にデータベースをリカバリすることが可能です。リカバリには、**SCN(System Change Number)**の他に、**時刻(Time)やログシーケンス(Log Sequence)**を使用して特定の時点を指定することもできます。まずは、SCNが何かについて簡単に説明します。
SCN(System Change Number)とは?
SCN(System Change Number)は、Oracleデータベースがデータベースの変更を管理するために使用する一意の番号です。SCNは、データベースに対する各トランザクションや変更が発生した際にインクリメントされます。これにより、データベースは各時点での状態を正確に追跡でき、特定のSCNに基づいて、ある時点の状態にデータベースをリカバリすることができます。簡単に言えば、SCNはデータベースの「タイムスタンプ」のようなものです。
本記事では、RMANを使用して指定したSCNや時刻、ログシーケンスの時点にデータベースをリストアおよびリカバリする手順を解説します。また、どのような状況でこの操作が必要になるかの例も紹介します。
前提条件
- アーカイブログモードでデータベースが運用されていること
- RMANバックアップが正常に取得されていること
- 指定したSCN、時刻、またはログシーケンスが事前に確認されていること
指定した時点にリカバリを行う例
データベースのリカバリを行う理由は様々ですが、以下は指定した時点にリカバリを行う代表的な状況です。
- 誤操作によるデータの損失
重要なデータを誤って削除した場合、削除前の時点に戻すためにリカバリを行うことがあります。この場合、データが消去された直前のSCNや時刻に戻すことで、データを復旧することが可能です。 - 障害発生時のリカバリ
サーバやストレージの障害によりデータベースが破損した場合、障害が発生する前の時点にデータベースをリカバリして、システムを正常な状態に戻す必要があります。 - トランザクションの失敗
大規模なトランザクションが失敗し、データの整合性が失われた場合、トランザクションが開始される直前のSCNや時刻にリカバリすることで、問題のトランザクションが発生する前の状態に戻すことができます。 - システム変更の誤り
アップグレードや設定変更中に誤った操作が行われ、システムに問題が生じた場合、変更が行われる前の時点にリカバリすることで、問題を回避できます。この場合、特定の時刻やSCNに基づいてシステムを復旧します。 - 不正アクセスによるデータの破損
不正アクセスやウイルスによってデータが改ざんされた場合、被害を受ける前の時点に戻すためにリカバリを行います。ログシーケンスや時刻を使用して、被害発生前に戻すことが可能です。
手順
1. SCN、時刻、ログシーケンスの確認
リカバリしたい時点を特定するために、以下のようにSCN、時刻、またはログシーケンスを確認します。
SCNを確認するSQLコマンド
SELECT CURRENT_SCN FROM V$DATABASE;
特定の時刻を確認する方法
トランザクションやシステム変更が行われた特定の時刻にリカバリする場合、その時刻をメモしておきます。
ログシーケンスを確認する方法
SELECT THREAD#, SEQUENCE# FROM V$LOG_HISTORY;
このコマンドで、特定のログシーケンス番号を取得し、その時点に戻すことができます。
2. RMANに接続
RMANを使用してデータベースに接続します。rman TARGET /
3. データベースのマウント
次に、データベースをマウントモードにします。これはリカバリの準備段階です。SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
4. データベースのリストアおよびリカバリ
指定した時点に戻すために、リストアとリカバリを同じ手順で行います。以下では、SCN、時刻、ログシーケンスをそれぞれ指定して実行する方法を紹介します。
SCNを指定してリストアおよびリカバリ
RUN {
SET UNTIL SCN 1234567; -- 指定するSCN番号
RESTORE DATABASE;
RECOVER DATABASE;
}
時刻を指定してリストアおよびリカバリ
RUN {
SET UNTIL TIME "TO_DATE('2024-10-20 15:00:00', 'YYYY-MM-DD HH24:MI:SS')";
RESTORE DATABASE;
RECOVER DATABASE;
}
ログシーケンスを指定してリストアおよびリカバリ
RUN {
SET UNTIL SEQUENCE 1000 THREAD 1; -- 指定するログシーケンス番号
RESTORE DATABASE;
RECOVER DATABASE;
}
5. データベースのオープン
リカバリが完了したら、データベースをオープンします。この時点で、データベースは指定した時点の状態に戻っています。ALTER DATABASE OPEN RESETLOGS;
以下は誤って削除してしまったemp表を、削除前のSCN時点に戻す手順です。
SQL> SELECT log_mode FROM v$database;
LOG_MODE
------------------------------------
ARCHIVELOG ★アーカイブログモード
SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$ rman target /
Recovery Manager: Release 19.0.0.0.0 - Production on 土 10月 26 09:22:14 2024
Version 19.21.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
ターゲット・データベース: V19 (DBID=2957249400)に接続されました
RMAN> backup database; ★バックアップ
backupを24-10-26で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=111 デバイス・タイプ=DISK
チャネルORA_DISK_1: フル・データファイル・バックアップ・セットを開始しています
チャネルORA_DISK_1: バックアップ・セットにデータファイルを指定しています
入力データファイル ファイル番号=00001 名前=/u01/app/oracle/oradata/V19/system01.dbf
入力データファイル ファイル番号=00004 名前=/u01/app/oracle/oradata/V19/undotbs01.dbf
入力データファイル ファイル番号=00003 名前=/u01/app/oracle/oradata/V19/sysaux01.dbf
入力データファイル ファイル番号=00007 名前=/u01/app/oracle/oradata/V19/users01.dbf
チャネルORA_DISK_1: ピース1 (24-10-26)を起動します
チャネルORA_DISK_1: ピース1 (24-10-26)が完了しました
ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0138hgv3_1_1_1 タグ=TAG20241026T092243 コメント=NONE
チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:15
backupを24-10-26で終了しました
Control File and SPFILE Autobackupを24-10-26で開始しています
ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/c-2957249400-20241026-00 コメント=NONE
Control File and SPFILE Autobackupを24-10-26で終了しました
RMAN> list backup;
バックアップ・セットのリスト
===================
BS Key Type LV Size Device Type Elapsed Time 終了時間
------- ---- -- ---------- ----------- ------------ --------
1 Full 2.25G DISK 00:00:07 24-10-26
BPキー: 1 ステータス: AVAILABLE 圧縮: NO タグ: TAG20241026T092243
ピース名: /u01/app/oracle/product/19.0.0/dbhome_1/dbs/0138hgv3_1_1_1
バックアップ・セット1のデータファイルのリスト
File LV Type Ckp SCN Ckp時間 Abs Fuz SCN Sparse Name
---- -- ---- ---------- -------- ----------- ------ ----
1 Full 2273601 24-10-26 NO /u01/app/oracle/oradata/V19/system01.dbf
3 Full 2273601 24-10-26 NO /u01/app/oracle/oradata/V19/sysaux01.dbf
4 Full 2273601 24-10-26 NO /u01/app/oracle/oradata/V19/undotbs01.dbf
7 Full 2273601 24-10-26 NO /u01/app/oracle/oradata/V19/users01.dbf
BS Key Type LV Size Device Type Elapsed Time 終了時間
------- ---- -- ---------- ----------- ------------ --------
2 Full 10.20M DISK 00:00:00 24-10-26
BPキー: 2 ステータス: AVAILABLE 圧縮: NO タグ: TAG20241026T092258
ピース名: /u01/app/oracle/product/19.0.0/dbhome_1/dbs/c-2957249400-20241026-00
SPFILEも含まれます: 修正時間: 24-10-26
SPFILE db_unique_name: V19
含まれている制御ファイル: Ckp SCN: 2273617 Ckp時間: 24-10-26
RMAN> exit
Recovery Managerが完了しました。
[oracle@v19single ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 土 10月 26 09:23:42 2024
Version 19.21.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
最終正常ログイン時間: 土 10月 26 2024 09:19:57 +09:00
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
2274874 ★SCNを確認
SQL> select empno,ename,job from scott.emp;
EMPNO ENAME JOB
---------- ------------------------------ ---------------------------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
7782 CLARK MANAGER
7839 KING PRESIDENT
7844 TURNER SALESMAN
7900 JAMES CLERK
7902 FORD ANALYST
7934 MILLER CLERK
12行が選択されました。
SQL> drop table scott.emp purge; ★誤ってemp表を削除してしまった
表が削除されました。
SQL> select * from soctt.emp;
select * from soctt.emp
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。
SQL> shutdown immediate ★データベースを停止
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup mount ★マウントで起動
ORACLEインスタンスが起動しました。
Total System Global Area 1543500120 bytes
Fixed Size 8925528 bytes
Variable Size 889192448 bytes
Database Buffers 637534208 bytes
Redo Buffers 7847936 bytes
データベースがマウントされました。
SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$ rman target /
Recovery Manager: Release 19.0.0.0.0 - Production on 土 10月 26 09:38:30 2024
Version 19.21.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
ターゲット・データベース: V19 (DBID=2957249400、未オープン)に接続されました
RMAN> RUN {
2> SET UNTIL SCN 2274874; ★誤って表を削除する前のSCNを指定してリストア、リカバリ
3> RESTORE DATABASE;
4> RECOVER DATABASE;
5> }
実行コマンド: SET until clause
restoreを24-10-26で開始しています
リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=43 デバイス・タイプ=DISK
チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_DISK_1: データファイル00001を/u01/app/oracle/oradata/V19/system01.dbfにリストアしています
チャネルORA_DISK_1: データファイル00003を/u01/app/oracle/oradata/V19/sysaux01.dbfにリストアしています
チャネルORA_DISK_1: データファイル00004を/u01/app/oracle/oradata/V19/undotbs01.dbfにリストアしています
チャネルORA_DISK_1: データファイル00007を/u01/app/oracle/oradata/V19/users01.dbfにリストアしています
チャネルORA_DISK_1: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0138hgv3_1_1_1から読取り中です
チャネルORA_DISK_1: ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0138hgv3_1_1_1 タグ=TAG20241026T092243
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:07
restoreを24-10-26で終了しました
recoverを24-10-26で開始しています
チャネルORA_DISK_1の使用
メディア・リカバリを開始しています
メディア・リカバリが完了しました。経過時間: 00:00:01
recoverを24-10-26で終了しました
RMAN> ALTER DATABASE OPEN RESETLOGS; ★RESETLOGSを指定してオープン
文が処理されました
RMAN> exit
Recovery Managerが完了しました。
[oracle@v19single ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 土 10月 26 09:39:59 2024
Version 19.21.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> select empno,ename,job from scott.emp; ★emp表が元に戻っている
EMPNO ENAME JOB
---------- ------------------------------ ---------------------------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
7782 CLARK MANAGER
7839 KING PRESIDENT
7844 TURNER SALESMAN
7900 JAMES CLERK
7902 FORD ANALYST
7934 MILLER CLERK
12行が選択されました。
SQL>
注意点
- RESETLOGSの重要性: 指定したSCNや時刻、ログシーケンスの時点にリカバリを行った後、必ず
RESETLOGS
オプションを使用してデータベースをオープンします。これにより、アーカイブログが新しくなり、以前のログとは切り離されます。 - バックアップの検証: リカバリを行う前に、RMANでバックアップの整合性を確認することを推奨します。以下のコマンドを使用してバックアップの整合性をチェックできます。bashコードをコピーする
VALIDATE BACKUP;
まとめ
SCN、時刻、またはログシーケンスを使用して特定の時点にデータベースをリカバリする方法は、トランザクションの失敗やシステム障害時に非常に有効です。各方法を使い分けることで、必要に応じた柔軟なリカバリが可能です。データベースのバックアップとリカバリ手順を理解しておくことで、データの損失を最小限に抑え、システムの信頼性を確保できます。
コメント