データベースを元の状態に戻す②

オラクルデータベースの基本

データベースを元の状態に戻す方法

実機操作を行う前に、データベースを元の状態に戻す方法を把握しておくことは非常に重要です。
設定変更や誤操作によってデータベースに問題が発生することがあるため、復旧手順を事前に知っておくことで、迅速かつ確実に対処できます。

  • スナップショット機能で元に戻す(使用できる場合)
  • バックアップを行った時点に戻す
  • データベースを再作成する
  • 手動で元に戻す


今回はバックアップを事前に行っておき、バックアップを行った時点の状態に戻す方法を紹介していきます。
スナップショット機能で元に戻す方法については以下で紹介していますのでご確認ください。


バックアップを行う

RMAN(Recovery Manager)について

今回はRMAN(Recovery Manager)と呼ばれる、オラクルが用意している専用のバックアップツールです。
RMANを使用せずにバックアップを行う方法もありますが、RMANを使用するメリットは大きいため、
基本的にはRMANを使用していただくのが良いと思います

当然データベースをバックアップ時の状態に戻す際にもRMANが使用できます。
RMANを使用するメリットは以下です。

  • RMANが必要なものを自動で判断してバックアップしてくれる
  • シンプルなコマンドでバックアップおよび復元ができる
  • 削除ポリシーに基づき、必要なバックアップ、不要なバックアップを判断してくれる
  • システム障害時に迅速かつ正確にデータベースを復旧することができる
  • バックアップファイルの最適化や圧縮をサポートし、バックアップやリストア時のパフォーマンスを向上させる


上記のような様々なメリットがあるため、RMANのバックアップ方法をマスターしておくと良いでしょう。
また、RMANはそれ以外にも取得したバックアップの管理や、データベースの複製、バックアップを2重で取得する等の機能がありますが、今回は最もシンプルなバックアップと復元の方法を紹介します。

バックアップ

まずはバックアップを行います。
スナップショット機能を使用する場合と同様にインストール直後にバックアップを行っておくことをお勧めします。
基本的なバックアップ手順は以下です。
※バックアップ手順はLinuxやWindowsの環境で特に変わりません。

①環境変数を設定
②RMANに接続
③データベースを停止(データベースが起動している場合)
④データベースをマウントで起動
⑤バックアップ

①環境変数を設定

[oracle@v19single ~]$ export ORACLE_SID=v19
[oracle@v19single ~]$ export ORACLE_BASE=/u01/app/oracle
[oracle@v19single ~]$ export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
[oracle@v19single ~]$ export PATH=$PATH:$ORACLE_HOME/bin

※Windowsの場合は以下のようなコマンド
set ORACLE_BASE=C:\oracle\app\oracle
set ORACLE_HOME=C:\oracle\app\oracle\product\19.0.0\dbhome_1
set ORACLE_SID=v19
set PATH=%ORACLE_HOME%\bin;%PATH%

②RMANに接続

[oracle@v19single ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 – Production on 火 9月 17 21:06:36 2024
Version 19.21.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
ターゲット・データベース: V19 (DBID=2957249400)に接続されました

③データベースを停止(データベースが起動している場合)

RMAN> shutdown immediate

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
データベースがクローズしました
データベースがディスマウントされました。
Oracleインスタンスがシャットダウンしました

④データベースをマウントで起動

RMAN> startup mount

ターゲット・データベースに接続しました(起動していません)。
Oracleインスタンスが起動しました
データベースがマウントされました。

システム・グローバル領域の合計は、 1543500120バイトです。

Fixed Size 8925528バイト
Variable Size 889192448バイト
Database Buffers 637534208バイト
Redo Buffers 7847936バイト

⑤バックアップ

RMAN> backup database;

backupを24-09-17で開始しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=37 デバイス・タイプ=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-09-17)を起動します
チャネルORA_DISK_1: ピース1 (24-09-17)が完了しました
ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/01359b8f_1_1_1 タグ=TAG20240917T210727 コメント=NONE
チャネルORA_DISK_1: バックアップ・セットが完了しました。経過時間: 00:00:25
backupを24-09-17で終了しました

Control File and SPFILE Autobackupを24-09-17で開始しています
ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/c-2957249400-20240917-00 コメント=NONE
Control File and SPFILE Autobackupを24-09-17で終了しました

RMAN> exit

Recovery Managerが完了しました。
[oracle@v19single ~]$


上記のようなメッセージが出力すれば完了です。

バックアップ時点に戻す(リストア)

データベースで検証を行った後には、バックアップ時点に戻すようにしましょう。
以前の状態に戻さない場合、検証のために変更した内容を記録等しておかなければ、何を変更したか分からなくなってしまうからです
例えばOracle Database 19cでは、データベースの状態を設定しておける初期化パラメータが350種類以上あり、あるパラメータを設定しておくことで別のパラメータに影響を与えてしまう、といったことがあるからです。
データベース作成直後にバックアップを行い、その時点に戻せばパラメータはデフォルトの状態に戻します。
そのため、検証を行った後は以前の状態に戻すようにしましょう。

また、以下で紹介するバックアップ時点に戻す(リストア)方法は、データベースに障害が発生した場合でも使用できます。
障害が発生した時の為に障害発生直前の状態に戻す方法もありますが、今回は割愛します。

以後バックアップ時点に戻すことを「リストア」と呼びます。

DBIDを確認する

リストアを行う前にDBIDを確認しておきましょう。
DBID(Database Identifier)は、Oracleデータベースの一意の識別子で、データベースを識別するために使用される内部的な番号です。DBIDは、データベースが作成される際に自動的に割り当てられ、各データベースに対して一意です。
DBIDはデータベースをリストアする際に必要になる場合があります。
DBIDは主に以下の方法で確認できます。

1.SQL*Plusで確認

SQL*Plusはオラクルデータベースに対してSQLコマンドやPL/SQLブロックを実行するためのコマンドラインツールです。
データベースに接続して操作をする際に利用します。
以下の手順でDBIDを確認します。

[oracle@v19single ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 – Production on 火 9月 17 23:24:36 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 dbid from v$database;

DBID
—————–
2957249400 ★

SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$


2.RMANに接続して確認

RMANに接続した際にも以下のように確認が可能です。

[oracle@v19single ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 – Production on 火 9月 17 23:28:40 2024
Version 19.21.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

ターゲット・データベース: V19 (DBID=2957249400 ★)に接続されました

RMAN> exit

Recovery Managerが完了しました。
[oracle@v19single ~]$


データベースをリストアする手順の際にDBIDを設定するメッセージが出力された場合は、以下のコマンドでDBIDを設定します。

RMAN> set dbid <確認したDBID>

spfileからpfileを作成

spfile およびpfileはいずれも設定されている初期化パラメータが格納されているファイルです。
詳細は別の記事で解説しますが、spfileはバイナリファイル、pfileはテキストファイルで通常データベースはspfileを使用して起動しています。
リストアを行う際に一時的にpfileを使用する必要があるため、pfileを作成しておきます。

[oracle@v19single ~]$ sqlplus / as sysdba

SQL*Plus: Release 19.0.0.0.0 – Production on 水 9月 18 00:10:52 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> create pfile from spfile;

ファイルが作成されました。

SQL> exit
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 – Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$


リストア

次にリストアを行っていきます。
リストアは主に以下の手順で行えます。

①RMANに接続する
②データベースを停止する(起動している場合)
③pfileを使用しNOMOUNTで起動する
④spfileと制御ファイルをリストアする
⑤MOUNTへ移行する
⑥データファイルをリストアする
⑦データベースをOPENする
⑧再起動を行う

※OPENはデータベースが起動している状態、NOMOUNTおよびMOUNTは管理作業を行う状態です。
 詳細は別の記事で紹介します。

①RMANに接続する

[oracle@v19single ~]$ rman target /

Recovery Manager: Release 19.0.0.0.0 – Production on 水 9月 18 00:46:53 2024
Version 19.21.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.

ターゲット・データベース: V19 (DBID=2957249400)に接続されました

②データベースを停止する(起動している場合)

RMAN> shutdown immediate

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
データベースがクローズしました
データベースがディスマウントされました。
Oracleインスタンスがシャットダウンしました

③pfileを使用しNOMOUNTで起動する

RMAN> startup nomount pfile=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initv19.ora

ターゲット・データベースに接続しました(起動していません)。
Oracleインスタンスが起動しました

システム・グローバル領域の合計は、 1543500120バイトです。

Fixed Size 8925528バイト
Variable Size 889192448バイト
Database Buffers 637534208バイト
Redo Buffers 7847936バイト


※上記のように “startup nomount pfile=<pfileのパス>” のようにコマンドを実行します。
 pfileは “$ORACLE_HOME/dbs” (Windows は “%ORACLE_HOME%\database”) 配下に存在し、
 ファイル名は “init.ora” か “init<SID>.ora” となっているのでそれを指定します。

④spfileと制御ファイルをリストアする

RMAN> restore spfile from autobackup; ★spfileをリストア

restoreを24-09-18で開始しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=37 デバイス・タイプ=DISK

チャネルORA_DISK_1: 曜日の自動バックアップを探しています: 20240918
チャネルORA_DISK_1: 曜日の自動バックアップを探しています: 20240917
チャネルORA_DISK_1: 自動バックアップが見つかりました: c-2957249400-20240917-00
チャネルORA_DISK_1: 自動バックアップc-2957249400-20240917-00からSPFILEをリストアしています
チャネルORA_DISK_1: 自動バックアップからのSPFILEのリストアが完了しました
restoreを24-09-18で終了しました

RMAN> restore controlfile from autobackup; ★制御ファイルをリストア

restoreを24-09-18で開始しています
チャネルORA_DISK_1の使用

チャネルORA_DISK_1: 曜日の自動バックアップを探しています: 20240918
チャネルORA_DISK_1: 曜日の自動バックアップを探しています: 20240917
チャネルORA_DISK_1: 自動バックアップが見つかりました: c-2957249400-20240917-00
チャネルORA_DISK_1: 自動バックアップc-2957249400-20240917-00から制御ファイルをリストアしています
チャネルORA_DISK_1: 自動バックアップからの制御ファイルのリストアが完了しました
出力ファイル名=/u01/app/oracle/oradata/V19/control01.ctl
出力ファイル名=/u01/app/oracle/oradata/V19/control02.ctl
restoreを24-09-18で終了しました

⑤MOUNTへ移行する

RMAN> alter database mount;

チャネル: ORA_DISK_1がリリースされました
文が処理されました

⑥データファイルをリストアする

RMAN> restore database;

restoreを24-09-18で開始しています
チャネル: ORA_DISK_1が割り当てられました
チャネルORA_DISK_1: SID=37 デバイス・タイプ=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/01359js7_1_1_1から読取り中です
チャネルORA_DISK_1: ピース・ハンドル=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/01359js7_1_1_1 タグ=TAG20240917T233431
チャネルORA_DISK_1: バックアップ・ピース1がリストアされました
チャネルORA_DISK_1: リストアが完了しました。経過時間: 00:00:35
restoreを24-09-18で終了しました

⑦データベースをOPENする

RMAN> alter database open resetlogs;

文が処理されました

RMAN> select status from v$instance;

STATUS
—————
OPEN

⑧再起動を行う

RMAN> shutdown immediate ★データベースを停止

リカバリ・カタログのかわりにターゲット・データベース制御ファイルを使用しています
データベースがクローズしました
データベースがディスマウントされました。
Oracleインスタンスがシャットダウンしました

RMAN> startup ★起動

ターゲット・データベースに接続しました(起動していません)。
Oracleインスタンスが起動しました
データベースがマウントされました。
データベースがオープンしました。

システム・グローバル領域の合計は、 1543500120バイトです。

Fixed Size 8925528バイト
Variable Size 889192448バイト
Database Buffers 637534208バイト
Redo Buffers 7847936バイト

RMAN> select status from v$instance;

STATUS
—————
OPEN

RMAN> exit

Recovery Managerが完了しました。
[oracle@v19single ~]$


上記のように “select status from v$instance;” を実行し、 “OPEN” と出力すれば完了です。
※pfileを使用して起動している状態のため再起動を行います。
 上記のようにstartup時にpfile等を指定しなければ、自動でspfileを使用して起動します。

[参考]
バックアップおよびリカバリ・リファレンス

エラーが発生した場合

リストア中に例えば以下のようなエラーが出力される場合があります。
RMANを使用している場合に発生するエラーは主に以下です。

・RMAN-<エラー番号>
・ORA-<エラー番号>

以下のように赤字部分がエラーです。

RMAN> restore database;

restoreを24-09-19で開始しています
チャネルORA_DISK_1の使用

データファイル1をスキップしています。すでにファイル/u01/app/oracle/oradata/V19/system01.dbfにリストアされています
データファイル3をスキップしています。すでにファイル/u01/app/oracle/oradata/V19/sysaux01.dbfにリストアされています
データファイル4をスキップしています。すでにファイル/u01/app/oracle/oradata/V19/undotbs01.dbfにリストアされています
チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_DISK_1: データファイル00007を/u01/app/oracle/oradata/V19/users01.dbfにリストアしています
チャネルORA_DISK_1: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0335dhpj_3_1_1から読取り中です
チャネルORA_DISK_1: ORA-19870: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0335dhpj_3_1_1のリストア中にエラーが発生しました
ORA-19505: ファイル”/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0335dhpj_3_1_1″ の識別に失敗しました。
ORA-27037: ファイル・ステータスを取得できません。
Linux-x86_64 Error: 2: No such file or directory
以前のバックアップへのフェイルオーバー

チャネルORA_DISK_1: データファイル・バックアップ・セットのリストアを開始しています
チャネルORA_DISK_1: バックアップ・セットからリストアするデータファイルを指定しています
チャネルORA_DISK_1: データファイル00007を/u01/app/oracle/oradata/V19/users01.dbfにリストアしています
チャネルORA_DISK_1: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0135dhln_1_1_1から読取り中です
チャネルORA_DISK_1: ORA-19870: バックアップ・ピース/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0135dhln_1_1_1のリストア中にエラーが発生しました
ORA-19505: ファイル”/u01/app/oracle/product/19.0.0/dbhome_1/dbs/0135dhln_1_1_1″ の識別に失敗しました。
ORA-27037: ファイル・ステータスを取得できません。
Linux-x86_64 Error: 2: No such file or directory
以前のバックアップへのフェイルオーバー


RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: restoreコマンドが09/19/2024 11:24:41で失敗しました
RMAN-06026: 見つからないターゲットがあります – リストアを中止します
RMAN-06023: データファイル7をリストアするためのバックアップまたはコピーが見つか りません


エラーが発生した場合はマニュアルでエラー番号を元にエラーが発生している原因を確認します。
以下のページでエラー番号の詳細を確認できます。

データベース・エラー・メッセージ

ORA-19870,ORA-19505,ORA-27037,RMAN-00571,RMAN-00569,RMAN-03302,RMAN-06026,RMAN-06023と、6種類のエラーメッセージが出ていますが、エラーが発生した原因が6つあるとは限りません。
1つの原因で複数のエラーが出力する場合もあります。
今回のエラーの根本原因はORA-19505です。
以下のようにファイルが存在しているかどうか確認してくださいと記載されています。


ORA-19505: ファイル”string“の識別に失敗しました。
原因: ファイルを識別するためのコールからエラーが戻されました。
処置: 追加メッセージを確認し、さらにファイルが存在しているかどうかを確認してください。


リストアした際にバックアップファイルが存在しないことでエラーが発生していました。
対象方法が存在する場合は、マニュアルに対処方法が記載されている場合があります。
対処方法が記載されている場合はマニュアルの指示に従って対処を行ってください。

今回の場合はリストアするためのバックアップファイルが存在しないものによるエラーのため、別の名前にファイル名を変えた、別の場所に移動したといった場合は、ファイルを元の名前に戻す、もしくは元の場所に戻すことで解消するはずです。
ただし間違えてファイルを削除してしまった、ファイルが破損しているといった場合はリストアすることは不可能になると考えられます。

もしリストアが不可能になってしまった場合、データベースを再作成する等の方法で元に戻すことができます。
ただし、データベースを再作成する場合は作成していた表等のデータはすべて削除されてしまいます。
データベースを作成された直後の表も一切作成されておらず設定変更もしていない状態へ戻す場合は問題ありませんが、作成した表や変更した設定を保存しておきたいという場合は問題です。
そのため、バックアップを2重、3重に行っておく、必要に応じて別のサーバーに退避させておく等の対処をしておくことが重要です。
RMANのバックアップの管理方法等については別の記事で紹介します。

データベースを再作成する必要がある場合は、手順を以下のページで紹介しています。

コメント

タイトルとURLをコピーしました