NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix CE 上の Oracle を PD スナップショットから復旧してみる。(実行編)

Nutanix の Application Consistent Snapshots を利用して Oracle Database の復旧をしてみます。

今回の環境は下記のような感じです。

それでは自分で DB を破壊してから復旧します。

準備

Nutanix の PD スナップショットの確認

DB 破壊前に、スナップショットは作成済みです。アプリケーション整合性をとった(Application Consistent = True)スナップショットです。

f:id:gowatana:20170930212158p:plain

対象 VM の含まれる Protection Domain(PD)のスナップショットを、CVM の CLI でも確認しておきます。

nutanix@NTNX-2a0a73b3-A-CVM:192.168.1.192:~$ ncli protection-domain list-snapshots name=pd-db02 | grep -e Id -e "Create Time" -e Application
    Id                        : 5521
    Create Time               : 09/30/2017 09:26:51 UTC
        VM Id                     : d03a4331-7370-4cc0-9bbb-b8c70d4e9f28
        Application Consistent... : true

データファイルの破壊

データファイルを破壊します。

[root@db02 ~]# ls -l /u01/app/oracle/oradata/testdb1/users01.dbf
-rw-r-----. 1 oracle oinstall 5251072  9月 30 18:26 /u01/app/oracle/oradata/testdb1/users01.dbf
[root@db02 ~]# > /u01/app/oracle/oradata/testdb1/users01.dbf
[root@db02 ~]# ls -l /u01/app/oracle/oradata/testdb1/users01.dbf
-rw-r-----. 1 oracle oinstall 0  9月 30 18:35 /u01/app/oracle/oradata/testdb1/users01.dbf

Oracle がデータファイルにアクセスしたタイミングでエラーが発生しました。今回は(運よく?)select しただけで当たりました。

SQL> select * from tab01;
select * from tab01
              *
行1でエラーが発生しました。:
ORA-01115: ファイル(ブロック番号)からの読取りI/Oエラーが発生しました。 ORA-01110: データファイル7:
'/u01/app/oracle/oradata/testdb1/users01.dbf'
ORA-27072: ファイルI/Oエラーが発生しました。 Additional
information: 4
Additional information: 147

DB インスタンスは停止しておきます。

SQL> shutdown abort
ORACLEインスタンスがシャットダウンされました。

スナップショットのリストア

下記の要領で、スナップショットから vDisk を取り出します。

今回の手順は、下記のようなイメージです。

f:id:gowatana:20170930000652p:plain

スナップショットから、VM をリストア(新規作成)します。

nutanix@NTNX-2a0a73b3-A-CVM:192.168.1.192:~$ ncli protection-domain restore-snapshot name=pd-db02 snap-id=5521 vm-names=db02 vm-name-prefix=restore-

    Status                    : true

スナップショット に含まれる db02 から、restore-db02 という別の VM が作成されました。 

nutanix@NTNX-2a0a73b3-A-CVM:192.168.1.192:~$ acli vm.list | grep db02
db02          d03a4331-7370-4cc0-9bbb-b8c70d4e9f28
restore-db02  14e7225d-d7c2-4894-b464-42a917132fb4

 db02 と restore-db02 は、どちらも vDisk が2つです。

nutanix@NTNX-2a0a73b3-A-CVM:192.168.1.192:~$ acli vm.disk_list db02
Device bus  Device index
scsi        0
scsi        1
nutanix@NTNX-2a0a73b3-A-CVM:192.168.1.192:~$ acli vm.disk_list restore-db02
Device bus  Device index
scsi        0
scsi        1

ゲストOS では、この時点ではまだ scsi.1 の vDisk に対応する「/dev/sdb」までが認識されています。

[root@db02 ~]# lsblk -l /dev/sdb1 /dev/sdc1
lsblk: /dev/sdc1: not a block device
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb1   8:17   0  16G  0 part /u01

restore-db02 に scsi.1 として接続されている vDisk を複製して、db02 に vDisk を追加します。db02 には、scsi.2 が作成されました。

nutanix@NTNX-2a0a73b3-A-CVM:192.168.1.192:~$ acli vm.disk_create db02 bus=scsi clone_from_vmdisk=vm:restore-db02:scsi.1
DiskCreate: pending
DiskCreate: complete
nutanix@NTNX-2a0a73b3-A-CVM:192.168.1.192:~$ acli vm.disk_list db02
Device bus  Device index
scsi        0
scsi        1
scsi        2

ゲスト OS / Oracle 側での復旧

ファイルのリストア

ゲスト OS では、scsi.2 の vDisk が /dev/sdc として認識されるので、/mnt にマウントしました。

[root@db02 ~]# lsblk -l /dev/sdb1 /dev/sdc1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb1   8:17   0  16G  0 part /u01
sdc1   8:33   0  16G  0 part
[root@db02 ~]# mount /dev/sdc1 /mnt
[root@db02 ~]# lsblk -l /dev/sdb1 /dev/sdc1
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb1   8:17   0  16G  0 part /u01
sdc1   8:33   0  16G  0 part /mnt

/mnt ディレクトリ配下から /u01 ディレクトリ配下に、users01.dbf ファイルをリストアします。

[root@db02 ~]# ls -l /mnt/app/oracle/oradata/testdb1/users01.dbf
-rw-r-----. 1 oracle oinstall 5251072  9月 30 16:23 /mnt/app/oracle/oradata/testdb1/users01.dbf
[root@db02 ~]# cp -p /mnt/app/oracle/oradata/testdb1/users01.dbf /u01/app/oracle/oradata/testdb1/users01.dbf
cp: `/u01/app/oracle/oradata/testdb1/users01.dbf' を上書きしますか? yes

Oracle でのリカバリ

sqlplus で Oracle の DB インスタンスに接続した状態で、DB インスタンスを mount まで起動して、リカバリします。

SQL> startup mount
ORACLEインスタンスが起動しました。

Total System Global Area  473956352 bytes
Fixed Size                  8794120 bytes
Variable Size             297799672 bytes
Database Buffers          163577856 bytes
Redo Buffers                3784704 bytes
データベースがマウントされました。
SQL> recover database;
メディア・リカバリが完了しました。

DB をリカバリして、Open できました。

SQL> alter database open;

データベースが変更されました。

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS
---------------- ------------
testdb1          OPEN

感想

  • アプリケーション整合性をとるスナップショットを利用する場合でも、実際にスナップショットを利用するケース(障害復旧など)を考慮すると Oracle のようなものでは vDisk 構成が重要だと思った。
  • あまりディスク構成を意識していない VM でアプリケーション整合性がからむものについては、3rd ベンダのバックアップ ソフトウェアを利用したほうが楽なのかもしれない。

以上。