37
Session by Shinnosuke Akita 2015.10.17 障障障障障障障障障障障 ! Oracle Database 障障障障障障障障障障障障

障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

Embed Size (px)

Citation preview

Page 1: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

Session by Shinnosuke Akita

2015.10.17

障害とオペミスに備える !~ Oracle Database のバックアップを考えよう~

Page 2: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

Self IntroductionShinnosuke Akita

・ Oracle DBA をやっています。・ 今は Exadata の案件に入っています。・ 入社 3 年目・ 休日はランニングと家族サービス・ たまに勉強会にでかけたり・ 大衆酒場めぐりがマイブーム

Page 3: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

What’s Valtech株式会社バルテック

現在、社員募集中バルテック 採用

アプリケーション開発技術、データベース技術のサービス提供を行っています。

社員数: 130 名資本金: 3000 万円

<研修制度が充実しています>関連企業「 J-SchooL 」での研修制度を受けることができ、現役エンジニアの講師による実践形式の授業を受けることができます。

Page 4: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

Today’s Agendaデータベースのバックアップを考える ・突然の障害・オペレーションミス ・バックアップ計画を考えるどう備えるか? ・ DataPump ・ OS の機能によるバックアップ ・ RMAN の機能によるバックアップリカバリを試してみるリカバリのやり直し?

Page 5: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

データベースには日々多くのデータが挿入・更新・削除されていきます。中には 24 時間 365 日稼働し続けているシステムもあります。これらのデータが障害やトラブルによってデータを欠損させてしまったら、業務へのインパクトはどのようなものが考えられるでしょうか。

Page 6: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

障害やトラブルによって、データの欠損、システムが復旧するまでに売上を上げることができる機会が失われるなどの影響が考えられます。そのため、 24 時間 365 日稼働し続けているシステムなどでは、障害が発生した時はすぐに復旧できるよう、普段から備える必要があります。

データの欠損 機会の損失

Page 7: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

データベースのバックアップ計画を考えましょう何を考えればよいでしょうか。

いつバックアップを取る?

どこにバックアップを取る?

誰がバックアップを取る?

どのようにバックアップを取る?

Page 8: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

1.いつバックアップを取る?

 いつバックアップを取るべきかを検討するためには、リカバリについて考える必要があります。 バックアップの指標として、以下のものがあります。

RPO = Recovery Point Objective  目標復旧時点RTO = Recovery Time Objective 目標復旧時間

 いつ時点までに復旧するかによって、バックアップを取得する頻度が変わってきます。

Page 9: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

1.いつバックアップを取る?

 いつバックアップを取るべきかを検討するためには、リカバリについて考える必要があります。 バックアップの指標として、以下のものがあります。

RPO = Recovery Point Objective  目標復旧時点RTO = Recovery Time Objective 目標復旧時間

 いつ時点までに復旧するかによって、バックアップを取得する頻度が変わってきます。

Page 10: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

RPO を決めてしまえば、いつバックアップを取るべきかがおのずと決まってきます。たとえば、前営業日終了時点まで復旧できれば、それ以降のデータロスは許容できるのであれば、1日1回のバックアップだけで良いでしょう。

10/15 17:00 10/16 17:00

RPO:24H

RPO: 1H

RPO: 5M

10/16 20:00

Lv0+LV1

Lv0+LV1

Lv0+LV1

Lv0+LV1

Arc Arc Arc

ArcArcArcArcArcArcArcArcArcArc

バックアップファイル

+アーカイブログ(1H)

+アーカイブログ(5M)

Page 11: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

2.どのようにバックアップを取るか?

データベースのバックアップを取るのにもいくつかの方法があります。どのように復旧をするかによって選ぶ必要があります。

・ DataPump による論理バックアップ・ OS の機能による物理バックアップ・ Recovery Manager による物理バックアップ

それぞれのバックアップについて見てみましょう。

Page 12: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

DataPump による論理バックアップDataPump を使用して論理バックアップを取得することができます。論理バックアップとは、データベースの中にあるデータの中身(バックアップ取得時点の DDL 文や DML 文)を取得することでバックアップを実現しています。

ただし、 DataPump による復旧はバックアップ取得時点までしか戻すことができず、物理的に同じでないのでアーカイブログを当てるなどの対処もできません。バックアップ取得から障害発生時までのデータが失われることから、それが許容できる状況でしか使用することができません。10/15 17:00 10/16 17:00

RPO:24H

10/16 20:00

Lv0+LV1

Lv0+LV1

バックアップファイル

※オペミス等によるデータ削除には論理バックアップは有効です。

Page 13: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

OS の機能よる物理バックアップOS のコマンド( Linux/Unix なら cp ) コマンドを使用して物理バックアップを取得することができます。ただし、物理バックアップを取得するには、起動しているデータベースをそのままにコピーしたとしても、常にデータを更新し続けているため正しいバックアップが取れません。

バックアップを取る前にバックアップモードに変更してから取得する必要があります。オンラインでバックアップモードにするにはアーカイブログモードにする必要があります。

SQL> alter database begin backup;$ cp –p +DG01/user0001.dbf +DG02/XXXXXXX.bakSQL> alter database end backup;

Page 14: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

RMAN の機能よる物理バックアップRMAN(Recovery Manager) によるバックアップもまた、物理バックアップを取得することができます。RMAN においても、オンラインでバックアップを取得するにはアーカイブログモードにする必要があります。

RMAN では Lv1 バックアップ(差分増分バックアップ/累積増分バックアップ)を取得することもできます。

RMAN> backup as copy incremental level 0 database;RMAN> backup as backupset incremental level 1 database;

Page 15: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

差分増分バックアップと累積増分バックアップLv0 バックアップ(全バックアップ)を毎日取得するとなると、バックアップを保持する容量が多く必要になりますし、バックアップの取得時間も長くなってしまいます。増分バックアップの取得でこれらを抑えることができます。

差分増分バックアップは前回から (Lv0 、 Lv1 のいずれか)の差分を、累積増分バックアップは Lv0 からの差分を取得します。

Lv0

Lv1 Lv1

日曜日 月曜日 火曜日

Lv0

Lv1Lv1

日曜日 月曜日 火曜日

日曜 ~火曜分

差分増分バックアップ 累積増分バックアップ

Page 16: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

3 .どこにバックアップを取るか?

運用中のデータベースと同じサーバにバックアップファイルを置くこともできますが、サーバが物理故障すると復旧ができなくなってしまいます。同じ拠点の別サーバに置く、可能であれば遠隔地の別サーバに置くようにすると、災害時にデータベースを復旧するのに有利になります。

4.誰がバックアップを取るか?

バックアップは毎日のことですので、日々エンジニアが手作業で取得することは現実的ではありません。Cron によるバックアップシェルの自動起動や Oracle Enterprise Manager など Oracle が提供しているサービスの活用など、取得の為の選択肢が複数あります。

Page 17: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

ところで・・・ 取ったバックアップが使えるか心配だ。 手順は正しいだろうか? 実運用中だが、同等の環境で手順検証 できないだろうか? 心配に思ったことはありませんか?

Page 18: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

いざというときのために、チェックしておきたい!

リカバリに必要なデータが足りなかった手順が誤っていた/足りなかった・・・

Page 19: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

そもそも復元に必要な材料に何があるだろう?

データファイル or ベースバックアップ

初期化パラメータファイル

制御ファイル

アーカイブ REDO ログ/ REDO ログ

Page 20: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

それぞれのバックアップについて、リカバリを考えてみましょう。

・ DataPump による論理バックアップ

・ OS の機能による物理バックアップ

・ Recovery Manager による物理バックアップ

Page 21: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

DataPump によるリカバリDataPump を使用して取得した論理バックアップ (expdp) は、別環境のデータベースに対してリカバリ (impdp) をすることができます。

出力したダンプファイルを別 DB にインポートすることでリカバリができますので、比較的簡単に行えます。バージョンが異なるデータベース間もデータを移すことができます。

本番 DB 別 DB

expdp

impdp

Page 22: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

OS の機能によるバックアップからのリカバリOS の機能によるバックアップファイルからリカバリをすることもできます。コピーしたデータファイルを別のデータベースのデータファイルとして使用し、アーカイブログを適用させていきます。別 DB は既に起動しているものではなく、新たに作っていきます。

本番 DB 別 DB

cp cp

Page 23: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

データファイル shutdown

物理バックアップファイルの Lv0相当(ベースバックアップ)は、そのままデータファイルとして使用することができます。通常、バックアップファイル名はデータファイル名とは異なりますので、それっぽい名前につけかえてあげると良いでしょう。RMAN バックアップの Lv0 を copy で作成したものでも OK です。

$ cp –p +BKUPDG/XXXXXXX.bak +DATADG/XXXXXXX.dbf

Page 24: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

初期化パラメータファイルnomount

実運用中のデータベースと同等のもので良いですが、メモリ関連のパラメータを低めにして低スペックなサーバでも再現できるようにすると良いかもしれません。

初期化パラメータファイルを用意して nomount 起動することで、初期化パラメータファイルの読み込み・ SGAメモリ領域確保をしましょう。

Page 25: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

制御ファイル mount

実運用中のデータベースより制御ファイルコピーまたは、制御ファイルトレースにて出力して用意します。ただし、制御ファイルトレースを元に CREATE CONTROLFILE した場合は、実運用中のデータベースのリカバリ情報を消失します。

制御ファイルコピー(バイナリ形式)SQL> ALTER DATABASE BACKUP CONTROLFILE TO ‘XXXX’;制御ファイルトレースSQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACEas ‘XXXX’;

Page 26: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

制御ファイル mount

復元先の制御ファイル作成(例)CREATE CONTROLFILE REUSE DATABASE “BALLOON” RESETLOGS ARCHIVELOG MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 8 MAXLOGHISTORY 292LOGFILE GROUP 1 ‘/u01/app/oracle/oradata/balloons/redo01.log GROUP 2 ‘/u01/app/oracle/oradata/balloons/redo02.log GROUP 3 ‘/u01/app/oracle/oradata/balloons/redo03.logDATAFILE‘/u01/app/oracle/oradata/balloons/system01.dbf’ ‘/u01/app/oracle/oradata/balloons/sysaux01.dbf’ ‘/u01/app/oracle/oradata/balloons/undotbs01.dbf’ ‘/u01/app/oracle/oradata/balloons/users01.dbf’・・・

Page 27: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

リカバリの実施 mount

いよいよリカバリの実施です。まずは、必要なデータファイルが認識できているか見てみましょう。

SQL> SELECT NAME FROM v$datafile;NAME===============================‘/u01/app/oracle/oradata/balloons/system01.dbf’ ‘/u01/app/oracle/oradata/balloons/sysaux01.dbf’ ‘/u01/app/oracle/oradata/balloons/undotbs01.dbf’ ‘/u01/app/oracle/oradata/balloons/users01.dbf’・・・

Page 28: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

リカバリの実施 mount

今存在するデータファイルを過去に戻すことはできません。これ以降にデータを不完全リカバリ/完全リカバリをしてみましょう。

直前まで戻す場合SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL;

時間指定の場合SQL> RECOVER DATABASE UNTIL TIME '2015-10-17 13:00:00' USING BACKUP CONTROLFILE;

Page 29: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

データベースのオープン open

メディアリカバリが完了したら、最後に RESETLOGSモードでデータベースをオープンします。

SQL> ALTER DATABASE OPEN RESETLOGS;

Page 30: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

RMAN によるバックアップからのリカバリRMAN ではもっと簡単にバックアップファイルからリカバリをすることができます。バックアップファイルから別のデータベースのデータファイルとして使用し、アーカイブログを適用させていきます。別 DB は既に起動しているものではなく、新たに作っていきます。

本番 DB 別 DB

RMAN RMAN

Page 31: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

RMAN では、もっと簡単にリカバリを行うことができます

RMAN> SET DBID 886377364

RMAN> startup nomount

DBID を設定します。

nomount 起動します。このとき spfile はありませんが、仮の pfileを使用します。

RMAN> RESTORE SPFILE TO PFILEそれから spfile より pfile をリストアします。

nomount

初期化パラメータファイル

リストアした PFILE を適宜変更して、再度 NOMOUNT します。

Page 32: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

制御ファイル mount

制御ファイルも RMAN でバックアップしたものをリストアすることで作成ができます。ここでは、新しく作成するデータベースのことは考えずにリストアします。

RMAN> RUN{2> RESTORE CONTROLFILE FROM AUTOBACKUP;3> ALTER DATABASE MOUNT;4> }

Page 33: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

リカバリの実施 mount

リカバリを実施しますが、複製 DB のデータファイル/ REDO ログが元の DB と異なる場合は、 SET NEWNAME句で変更してから行います。

RUN{ SET NEWNAME FOR DATAFILE 1 TO ‘ 新しいパス’ SET NEWNAME FOR DATAFILE 2 TO ‘ 新しいパス’ ・・ ( 略 ) SQL ALTER DATABASE RENAME FILE ‘ 新しい REDO ログ’ SET UNTIL TIME 2015/10/16 22:00:00 RESTORE DATABASE; SWITCH DATAFILE ALL; RECOVER DATABASE;}

リストア先の切り替え

制御ファイルへの反映

Page 34: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

データベースのオープン open

メディアリカバリが完了したら、最後に RESETLOGSモードでデータベースをオープンします。

RMAN> ALTER DATABASE OPEN RESETLOGS;

Page 35: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

リカバリのやり直しリカバリポイントを間違えてしまったら・・・

Page 36: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

インカネーションの指定制御ファイルに記録されているインカネーション(世代)をRESET することで、リストアのやり直しをすることが可能です。ただし、リストアに必要なベースバックアップファイル等が残っていることが前提です。

Incarnation 2

Incarnation 116 Incarnation 311

2015/10/15 22:00 2015/10/16 22:00

Page 37: 障害とオペミスに備える! ~Oracle Databaseのバックアップを考えよう~

インカネーションの指定

RMAN> LIST INCARNATION OF DATABASE BALLOONList of Database Incarnations DB Key Inc Key DB Name DB ID STATUS Reset SCN Reset Time ------- ------- -------- ------------- ------- ---------- ---------- 1 2 TRGT 1334358386 PARENT 154381 OCT 30 2007 16:02:12 1 116 TRGT 1334358386 CURRENT 154877 OCT 30 2007 16:37:39

インカネーションを確認します。

RMAN> RESET DATABASE TO INCARNATION 2;それからインカネーションを指定します。

このあと、リストア作業に入っていきます。