Oracleで物理ファイルバックアップを試す(一貫性バックアップ)

試してみたのでメモ。
empと言うテーブルをあらかじめ作成後、drop tableしたものを復旧できるか確認。
一貫性バックアップを行ってみます。

自分の環境での検証はしましたが、各環境で状況など違ってくると思うので必ず自身の環境で確認を行ってください。

以下を参考に実施しています。

[OSコマンドによる物理バックアップの全手順 (1/5)](http://www.atmarkit.co.jp/ait/articles/0606/30/news130.html)

# 環境

+ CentOS6.4_x64
+ Oracle11.20
+ すでにOracle自体はインストール済み
+ empテーブル作成済み

# バックアップすべきファイルを確認する

バックアップ対象は必要となっているようです。

+ データファイル(systemや作製した表領域など)
+ テンポラリファイル(任意)->リカバリ時に作成することが可能であるため
+ 制御ファイル
+ オンラインREDOログファイル(任意)
+ オンラインREDOログファイル->リカバリ時に作成することが可能であるため
+ アーカイブREDOログファイル（必要に応じて）->アーカイブモードでの運用の場合には取得

SQLを使って各ファイルの場所をあらかじめ確認します。

```bash
# 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を停止させます。

[データベースの停止（SQL*Plus版）](http://www.atmarkit.co.jp/fdb/ref/ref_oracle/shutdown.html)

```bash
# データベースに接続せずにSQLPlusを起動
$sqlplus /nolog

# システム権限でOracleに接続.パスワードは適宜自分のものに変更
SQL> connect system/password as sysdba

# DB停止
SQL> shutdown normal
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
```

これでバックアップできるようになったので任意の場所にバックアップします。今回はoracleユーザーのホームディレクトリ配下にbackupフォルダを作成してファイルを配置します。なお、データファイルなどはサイズも大きいので予めバックアップ先のディスク容量は確認しておいてください。

```bash
$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を起動させます。

[データベースの起動（SQL*Plus版）](http://www.atmarkit.co.jp/fdb/ref/ref_oracle/startup.html)

```bash
$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を使って接続できるかなど確認しましょう。

また、バックアップしただけなので大丈夫だと思いますが、エラー発生時などは以下のアラートログで状況などを確認します。

```bash
# アラートログの場所を確認

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テーブルを削除する

以下の通り。

```bash
SQL> drop table emp;

表が削除されました。

SQL> desc emp;
ERROR:
ORA-04043: オブジェクトempは存在しません。
```

# 物理ファイルによって復旧させる

では最初に取得したバックアップファイルを使ってDBを復旧してみます。

まずはDBを停止させます。
こちらは先ほど書いた手順と同じなので割愛。
今度はログファイルも見てみましょう。

```bash
$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ログファイル

```bash
# 現在のファイルのバックアップ.バックアップ先は適宜変更
$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/
```

終わったので起動してみます。
こちらも手順は同じなので割愛。
ログを一応確認してみましょう。

```bash
$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`まで表示されてなかったのでログを見て起動がし終わったことをしっかりと確認した方が良さそうです。

データも確認してみます。

```bash
SQL> desc emp
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 EMP_ID 				   NOT NULL CHAR(3)
 JOB_ID 				   NOT NULL CHAR(3)
 EMP_NAME					    VARCHAR2(10)
```

無事復旧できました。