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>