試してみたのでメモ。
empと言うテーブルをあらかじめ作成後、drop tableしたものを復旧できるか確認。
一貫性バックアップを行ってみます。
自分の環境での検証はしましたが、各環境で状況など違ってくると思うので必ず自身の環境で確認を行ってください。
以下を参考に実施しています。
環境
- CentOS6.4_x64
- Oracle11.20
- すでにOracle自体はインストール済み
- empテーブル作成済み
バックアップすべきファイルを確認する
バックアップ対象は必要となっているようです。
- データファイル(systemや作製した表領域など)
- テンポラリファイル(任意)->リカバリ時に作成することが可能であるため
- 制御ファイル
- オンラインREDOログファイル(任意)
- オンラインREDOログファイル->リカバリ時に作成することが可能であるため
- アーカイブREDOログファイル(必要に応じて)->アーカイブモードでの運用の場合には取得
SQLを使って各ファイルの場所をあらかじめ確認します。
# systemでログイン
$sqlplus /nolog
$conn system/password
# データファイルの確認
SQL>select dt.tablespace_name,ddf.file_name,dt.status
from dba_tablespaces dt, dba_data_files ddf
where dt.tablespace_name = ddf.tablespace_name;
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
STATUS
---------
USERS
/u01/app/oracle/oradata/XE/users.dbf
ONLINE
SYSAUX
/u01/app/oracle/oradata/XE/sysaux.dbf
ONLINE
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
STATUS
---------
UNDOTBS1
/u01/app/oracle/oradata/XE/undotbs1.dbf
ONLINE
SYSTEM
/u01/app/oracle/oradata/XE/system.dbf
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
STATUS
---------
ONLINE
MY_DATA
/u01/data/MY_DATA.dbf
ONLINE
# テンポラリファイルの確認
SQL>select dt.tablespace_name,dtf.file_name,dt.status
from dba_tablespaces dt, dba_temp_files dtf
where dt.tablespace_name = dtf.tablespace_name;
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
STATUS
---------
TEMP
/u01/app/oracle/oradata/XE/temp.dbf
ONLINE
# オンラインREDOログファイルの確認
SQL> select * from v$logfile;
GROUP# STATUS TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_
---
2 ONLINE
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_2_cghys4wd_.log
YES
1 ONLINE
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_1_cghys49o_.log
YES
GROUP# STATUS TYPE
---------- ------- -------
MEMBER
--------------------------------------------------------------------------------
IS_
---
# 制御ファイルの確認
SQL> select * from v$controlfile;
STATUS
-------
NAME
--------------------------------------------------------------------------------
IS_ BLOCK_SIZE FILE_SIZE_BLKS
--- ---------- --------------
/u01/app/oracle/oradata/XE/control.dbf
NO 16384 594
今回は上記結果より、以下のファイル群をバックアップします。
- /u01/app/oracle/oradata/XE->システムや制御ファイルのデータファイル
- /u01/data/MY_DATA.dbf->ユーザーが自分で定義した表領域MYDATAのデータファイル
- /u01/app/oracle/fast_recovery_area->オンラインREDOログファイル
バックアップする
まずはDBを停止させます。
# データベースに接続せずにSQLPlusを起動
$sqlplus /nolog
# システム権限でOracleに接続.パスワードは適宜自分のものに変更
SQL> connect system/password as sysdba
# DB停止
SQL> shutdown normal
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
これでバックアップできるようになったので任意の場所にバックアップします。今回はoracleユーザーのホームディレクトリ配下にbackupフォルダを作成してファイルを配置します。なお、データファイルなどはサイズも大きいので予めバックアップ先のディスク容量は確認しておいてください。
$cd
$mkdir backup
# データファイル
$cp -rp /u01/app/oracle/oradata backup/
# 表領域のデータファイル
$cp -rp /u01/data backup/
# オンラインREDOログファイル
$cp -rp /u01/app/oracle/fast_recovery_area backup/
# 確認
$tree backup/
backup/
├── data
│ └── MY_DATA.dbf
├── fast_recovery_area
│ └── XE
│ └── onlinelog
│ ├── o1_mf_1_cghys49o_.log
│ └── o1_mf_2_cghys4wd_.log
└── oradata
└── XE
├── control.dbf
├── sysaux.dbf
├── system.dbf
├── temp.dbf
├── undotbs1.dbf
└── users.dbf
6 directories, 9 files
バックアップが終わったのでDBを起動させます。
$sqlplus /nolog
SQL> conn system/password as sysdba
アイドル・インスタンスに接続しました。
SQL> startup
ORACLEインスタンスが起動しました。
Total System Global Area 417546240 bytes
Fixed Size 2227080 bytes
Variable Size 276825208 bytes
Database Buffers 134217728 bytes
Redo Buffers 4276224 bytes
データベースがマウントされました。
データベースがオープンされました。
念のため、sqlplusを使って接続できるかなど確認しましょう。
また、バックアップしただけなので大丈夫だと思いますが、エラー発生時などは以下のアラートログで状況などを確認します。
# アラートログの場所を確認
SQL> conn system/password as sysdba
接続されました。
SQL> show parameter background_dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
background_dump_dest string /u01/app/oracle/diag/rdbms/xe/
XE/trace
# 見てみる
$less /u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log
empテーブルを削除する
以下の通り。
SQL> drop table emp;
表が削除されました。
SQL> desc emp;
ERROR:
ORA-04043: オブジェクトempは存在しません。
物理ファイルによって復旧させる
では最初に取得したバックアップファイルを使ってDBを復旧してみます。
まずはDBを停止させます。
こちらは先ほど書いた手順と同じなので割愛。
今度はログファイルも見てみましょう。
$tail -n 10 /u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log
ARCH: Archival disabled due to shutdown: 1090
Shutting down archive processes
Archiving is disabled
Fri Mar 18 22:24:58 2016
Stopping background process VKTM
ARCH: Archival disabled due to shutdown: 1090
Shutting down archive processes
Archiving is disabled
Fri Mar 18 22:25:00 2016
Instance shutdown complete
shutdown complete
ということで問題なくシャットダウンができてそうです。
次にファイルの入れ替えをしましょう。
対象ファイルを再掲。
- /u01/app/oracle/oradata/XE->システムや制御ファイルのデータファイル
- /u01/data/MY_DATA.dbf->ユーザーが自分で定義した表領域MYDATAのデータファイル
- /u01/app/oracle/fast_recovery_area->オンラインREDOログファイル
# 現在のファイルのバックアップ.バックアップ先は適宜変更
$mv /u01/app/oracle/oradata/XE /u01/app/oracle/oradata/XE_20160319
$mv /u01/data/ /u01/data_20160319
$mv /u01/app/oracle/fast_recovery_area /u01/app/oracle/fast_recovery_area_20160319
# 最初に取得したファイルをコピー
$cp -rp ~/backup/oradata/XE /u01/app/oracle/oradata/
$cp -rp ~/backup/data /u01/
$cp -rp ~/backup/fast_recovery_area /u01/app/oracle/
終わったので起動してみます。
こちらも手順は同じなので割愛。
ログを一応確認してみましょう。
$tail -n 10 /u01/app/oracle/diag/rdbms/xe/XE/trace/alert_XE.log
user-specified limit on the amount of space that will be used by this
database for recovery-related files, and does not reflect the amount of
space available in the underlying filesystem or ASM diskgroup.
Starting background process CJQ0
Fri Mar 18 22:37:40 2016
CJQ0 started with pid=27, OS id=3116
Setting Resource Manager plan SCHEDULER[0x30FB]:DEFAULT_MAINTENANCE_PLAN via scheduler window
Fri Mar 18 22:37:55 2016
XDB installed.
XDB initialized.
大丈夫そうですね。
起動直後はXDB initialized
まで表示されてなかったのでログを見て起動がし終わったことをしっかりと確認した方が良さそうです。
データも確認してみます。
SQL> desc emp
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMP_ID NOT NULL CHAR(3)
JOB_ID NOT NULL CHAR(3)
EMP_NAME VARCHAR2(10)
無事復旧できました。