ksaitoの日記

日々試したことの覚え書き

Oracleのフルバックアップ

Ubuntu 11.10でOSコマンドを使ったOracleの物理バックアップと不完全リカバリを試してみました。
データベースは、ノーアーカイブログモードです。

バックアップ

ノーアーカイブログモードでは、データベースを停止した状態で必要なファイルをすべてアーカイブします。

バックアップ対象のファイル情報を集める

バックアップの対象となるファイルは、データディクショナリから調べます。
データファイル、テンポラリファイル、オンラインREDOログファイル、制御ファイルの場所を調べます。

$ cat files.sql 
set head on
set linesize 150
column FILE_NAME format a80
column TABLESPACE_NAME format a10
column MEMBER format a100
column NAME format a80
select ddf.file_name,dt.tablespace_name,dt.status
from dba_tablespaces dt, dba_data_files ddf
where dt.tablespace_name = ddf.tablespace_name
/
select dtf.file_name,dt.tablespace_name,dt.status
from dba_tablespaces dt, dba_temp_files dtf
where dt.tablespace_name = dtf.tablespace_name
/
select MEMBER,GROUP#,STATUS,TYPE from v$logfile
/
select name,is_recovery_dest_file,block_size,file_size_blks from v$controlfile
/
quit
$ sqlplus system/manager@XE @files
SQL*Plus: Release 11.2.0.2.0 Production on 土 2月 18 19:24:16 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。

FILE_NAME                                                                        TABLESPACE STATUS
-------------------------------------------------------------------------------- ---------- ---------
/u01/app/oracle/oradata/XE/users.dbf                                             USERS      ONLINE
/u01/app/oracle/oradata/XE/sysaux.dbf                                            SYSAUX     ONLINE
/u01/app/oracle/oradata/XE/undotbs1.dbf                                          UNDOTBS1   ONLINE
/u01/app/oracle/oradata/XE/system.dbf                                            SYSTEM     ONLINE

FILE_NAME                                                                        TABLESPACE STATUS
-------------------------------------------------------------------------------- ---------- ---------
/u01/app/oracle/oradata/XE/temp.dbf                                              TEMP       ONLINE

MEMBER                                                                                                   GROUP# STATUS       TYPE
---------------------------------------------------------------------------------------------------- ---------- ------- -------
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_2_7fkv15rr_.log                                         2     ONLINE
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_1_7fkv14wb_.log                                         1     ONLINE

NAME                                                                             IS_ BLOCK_SIZE FILE_SIZE_BLKS
-------------------------------------------------------------------------------- --- ---------- --------------
/u01/app/oracle/oradata/XE/control.dbf  

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionとの接続が切断されました。
$
データベースを停止

データベースの停止は、dbaグループのoracleユーザで実行します。
sudoを使った場合、オラクルに必要な環境変数が設定されないためiオプションで必要な環境変数を引き継ぐ必要があります。

$ sudo -u oracle -i `env | egrep "ORA|PATH"` sqlplus /nolog @$ORACLE_HOME/config/scripts/stopdb.sql
[sudo] password for ksaito: 

SQL*Plus: Release 11.2.0.2.0 Production on Sat Feb 18 19:31:53 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected.
Database closed.
Database dismounted.
ORACLE instance shut down.
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
$ 
ファイルをバックアップ

files.sqlの結果を使って必要なファイルをtarでアーカイブします。
GNU tar 1.25は、/で始まるパスの場合、先頭の/を取り除いてくれるみたいです。

$ sudo tar cvfz fullbackup.tar.gz `grep \^/ fullbackup.log | awk '{print $1}'`
tar: メンバ名から先頭の `/' を取り除きます
/u01/app/oracle/oradata/XE/users.dbf
/u01/app/oracle/oradata/XE/sysaux.dbf
/u01/app/oracle/oradata/XE/undotbs1.dbf
/u01/app/oracle/oradata/XE/system.dbf
/u01/app/oracle/oradata/XE/temp.dbf
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_2_7fkv15rr_.log
/u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_1_7fkv14wb_.log
/u01/app/oracle/oradata/XE/control.dbf
$ 
バックアップファイルの整合性確認

念のためバックアップしたファイルが壊れていないか確認します。

$ tar xfz fullbackup.tar.gz 
$ for i in `find . -name *.dbf`; do dbv file=$i 2>&1 | grep 破損; done
破損とマークされたページ合計   : 0
破損とマークされたページ合計   : 0
破損とマークされたページ合計   : 0
破損とマークされたページ合計   : 0
$ 
データベースを起動

バックアップが完了したらデータベースを起動します。

$ sudo -u oracle -i `env | egrep "ORA|PATH"` sqlplus /nolog @$ORACLE_HOME/config/scripts/startdb.sql

SQL*Plus: Release 11.2.0.2.0 Production on Sat Feb 18 19:37:57 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.
ORACLE instance started.

Total System Global Area  417546240 bytes
Fixed Size                  2227080 bytes
Variable Size             281019512 bytes
Database Buffers          130023424 bytes
Redo Buffers                4276224 bytes
Database mounted.
Database opened.
Disconnected from Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
$ 

これでバックアップは完了です。

データベースを壊す

バックアップ後のデータ更新

最初に検証用にデータを変更します。
パッケージに付属するサンプルスキーマのscottを作成してみます。
リストアは、バックアップ時点に戻るので、このデータにはアクセスできなくなるはずです。

$ sqlplus system/manager@/u01/app/oracle/product/11.2.0/xe/rdbms/admin/utlsampl.sql 

SQL*Plus: Release 11.2.0.2.0 Production on 土 2月 18 21:54:34 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Productionとの接続が切断されました。
$ 
$ sqlplus scott/tiger

SQL*Plus: Release 11.2.0.2.0 Production on 土 2月 18 21:56:15 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production
に接続されました。
SQL> 
障害発生

データベースのファイルをいくつか削除してみます。
システム表領域とテンポラリ表領域を両方削除します。

root@ubuntu:/u01/app/oracle/oradata/XE# ls
control.dbf  sysaux.dbf  system.dbf  temp.dbf  undotbs1.dbf  users.dbf
root@ubuntu:/u01/app/oracle/oradata/XE# rm system.dbf temp.dbf 
root@ubuntu:/u01/app/oracle/oradata/XE# ls
control.dbf  sysaux.dbf  undotbs1.dbf  users.dbf
root@ubuntu:/u01/app/oracle/oradata/XE# 

データディクショナリにアクセスするとエラーになりました。

SQL> select table_name from user_tables;
select table_name from user_tables
                       *
行1でエラーが発生しました。:
ORA-00604: 再帰SQLレベル1でエラーが発生しました。 ORA-01116:
データベース・ファイル1のオープンでエラーが発生しました。 ORA-01110: データファイル1:
'/u01/app/oracle/oradata/XE/system.dbf'
ORA-27041: ファイルをオープンできません。 Linux-x86_64
Error: 2: No such file or directory
Additional information: 3

SQL>

リストア

データベースを止めます。

$ sudo -u oracle -i `env | egrep "ORA|PATH"` sqlplus /nolog 

SQL*Plus: Release 11.2.0.2.0 Production on Sat Feb 18 08:35:43 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected.
SQL> shutdown abort
ORACLE instance shut down.
SQL>

バックアップしたファイルを復元します。

$ tar tfz test.tar.gz 
u01/app/oracle/oradata/XE/users.dbf
u01/app/oracle/oradata/XE/sysaux.dbf
u01/app/oracle/oradata/XE/undotbs1.dbf
u01/app/oracle/oradata/XE/system.dbf
u01/app/oracle/oradata/XE/temp.dbf
u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_2_7fkv15rr_.log
u01/app/oracle/fast_recovery_area/XE/onlinelog/o1_mf_1_7fkv14wb_.log
u01/app/oracle/oradata/XE/control.dbf
$ tar xfz test.tar.gz
$ sudo
root@ubuntu:/tmp# cd /u01/app/oracle/oradata/XE
root@ubuntu:/u01/app/oracle/oradata/XE# ls
control.dbf  sysaux.dbf  system.dbf.backup  temp.dbf  undotbs1.dbf  users.dbf.backup
root@ubuntu:/u01/app/oracle/oradata/XE# rm *
root@ubuntu:/u01/app/oracle/oradata/XE# cp /tmp/u01/app/oracle/oradata/XE/
control.dbf   sysaux.dbf    system.dbf    temp.dbf      undotbs1.dbf  users.dbf     
root@ubuntu:/u01/app/oracle/oradata/XE# cp -p /tmp/u01/app/oracle/oradata/XE/* .
root@ubuntu:/u01/app/oracle/oradata/XE# ls
control.dbf  sysaux.dbf  system.dbf  temp.dbf  undotbs1.dbf  users.dbf
root@ubuntu:/u01/app/oracle/oradata/XE# cd /u01/app/oracle/fast_recovery_area/XE/onlinelog
root@ubuntu:/u01/app/oracle/fast_recovery_area/XE/onlinelog# ls
o1_mf_1_7fkv14wb_.log  o1_mf_2_7fkv15rr_.log
root@ubuntu:/u01/app/oracle/fast_recovery_area/XE/onlinelog# rm *
root@ubuntu:/u01/app/oracle/fast_recovery_area/XE/onlinelog# cp /home/ksaito/sql/u01/app/oracle/
fast_recovery_area/ oradata/            
root@ubuntu:/u01/app/oracle/fast_recovery_area/XE/onlinelog# cp /home/ksaito/sql/u01/app/oracle/fast_recovery_area/XE/onlinelog/* .
root@ubuntu:/u01/app/oracle/fast_recovery_area/XE/onlinelog# ls
o1_mf_1_7fkv14wb_.log  o1_mf_2_7fkv15rr_.log
root@ubuntu:/u01/app/oracle/fast_recovery_area/XE/onlinelog# 

ファイルをリストアしたらデータベースを起動します。

$ sudo -u oracle -i `env | egrep "ORA|PATH"` sqlplus /nolog

SQL*Plus: Release 11.2.0.2.0 Production on Sat Feb 18 22:22:29 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

SQL> connect / as sysdba
Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area  417546240 bytes
Fixed Size                  2227080 bytes
Variable Size             281019512 bytes
Database Buffers          130023424 bytes
Redo Buffers                4276224 bytes
Database mounted.
Database opened.
SQL> 

これでリカバリ完了です。
バックアップ時点にはなかったscottはありません。

SQL> connect scott/tiger
ERROR:
ORA-01017: invalid username/password; logon denied


Warning: You are no longer connected to ORACLE.
SQL>