DBエンジニアの備忘ブログ

Oracleを扱っています。自身の備忘として記事を書いていこうかなと思っています。

【Oracle】本当にあった怖い話②【DataPump】

はじめに

Oracle のサポートをしていると、障害が発生して初めてバックアップを使用するということがよくあります。バックアップに関して、あまり知識をもって運用していなかったがために発生した怖い話を紹介します(実際にあった話です)。これを機に、バックアップの重要性を理解してくれる人が一人でも増えたらうれしいです。

エピソード② バックアップデータが...

間違って update を実行し、表の全件を誤更新してしまい復旧したいとお問い合わせいただきました。ちょっと時間がたってしまったため、フラッシュバックテーブルは使えず、日次で取得しているというダンプファイルからの復旧となりました。
大まかなインポートの手順を案内したところ、エラーが発生したので、対処方法を教えてほしいとご連絡いただきました。
ログをご提供いただき、エラーとなったコマンドを確認したところ、以下となっていました。

impdp system/<PW> dumpfile=dump_YYYYMMDD.dmp logfile=dump_YYYYMMDD.dmp

オチ

logfile には、インポート実行時の出力ログを指定する必要がありますが、インポート対象のダンプファイルと同じファイルを指定してしまっています。
この場合、ダンプファイルがログに上書きされてしまい、インポートに失敗しつつ、バックアップであるダンプのデータも消えてしまうことになります。
※上書きされてしまうのは 12.1 までの動作のようです。

【Oracle】本当にあった怖い話①【DataPump】

はじめに

Oracle のサポートをしていると、障害が発生して初めてバックアップを使用するということがよくあります。バックアップに関して、あまり知識をもって運用していなかったがために発生した怖い話を紹介します(実際にあった話です)。これを機に、バックアップの重要性を理解してくれる人が一人でも増えたらうれしいです。

エピソード① それ本当?

ある日、本番環境のテーブル(ユーザデータ)を間違って 削除(drop)してしまい、復旧したいとご連絡いただきました。いろいろな手段を試みたものの、うまくいかず最終的に日次で取得しているバックアップからの復旧ということになりました。

別会社にバックアップは任せているとのことで、お客様自身はバックアップの方法を認識しておらず、バックアップログからどういったものか確認の上で、復旧方法を案内してほしいとご要望いただきました。

ログからバックアップに使用しているコマンドを確認したところ、以下のエクスポートコマンドとなっておりました。

expdp system/<PW> directory=<ダンプdir> dumpfile=<ダンプlog>

オチ

何が怖いかお分かりでしたでしょうか。expdp ではデータベースのテーブル単位(tables)やスキーマ単位(schemas)、表領域単位(tablespaces)等でのエクスポートが可能です。
では、今回のお客様では何の単位のエクスポートが行われていたでしょうか。正解はスキーマ単位のエクスポートです。
エクスポート単位のパラメータの指定を省略した場合、デフォルトでは expdp 実行ユーザ(今回は systemユーザ)のスキーマ内のオブジェクト(データ)をエクスポートする動作となります。
Oracle DB において、system ユーザは管理データであり、ユーザデータのエクスポート(バックアップ)は全くできていなかった状態となります。
さようならユーザデータ。

【Oracle】マテリアライズドビューの作成方法【超簡単サンプル】

はじめに

マテリアライズドビュー(以下マテビュー)の作成方法について、一連の流れがまとまってる記事が少ないなと思ったのでまとめておきます。

作成手順

  1. テーブル作成(マスタ表)
  2. マテビューログ作成
  3. マテビュー作成

※マスタ表とは、マテビューの元表のことです。

テーブル作成(マスタ表)

マテビューを作成するには、マスタ表との紐づけを行うために主キーが必要なので、ここで主キーも作って設定しておきます。
※POWIDで紐づけすることもできますが、ここでは割愛します。

SQL> create table test1 (col number(20));  

表が作成されました。  

SQL> insert into test1 values (1);  

1行が作成されました。  

SQL> commit;  

コミットが完了しました。  

SQL> select * from test1;  

       COL  
----------  
         1  

主キーをつけます。

SQL> alter table test1 add constraint pk_test1 primary key(col);

表が変更されました。

マテビューログ作成

マテビューログは、マスタ表の更新履歴を残していくものなので、マテビューを作成する前に、作成しておく必要があります。

SQL> create materialized view log on test1;

マテリアライズド・ビュー・ログが作成されました。

マテビュー作成

後は、マテビューを作成するだけです。今回はマスタ表(test1)をすべてselectするものとしています。

SQL> create materialized view mview1 as select * from test1;

マテリアライズド・ビューが作成されました。

SQL> select * from mview1;

       COL
----------
         1

おまけ①

マスタ表を更新後、リフレッシュしてマテビューも更新してみました。

SQL> insert into test1 values(2);

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> select * from test1;

       COL
----------
         1
         2

SQL> select * from mview1;

       COL
----------
         1

マスタ表だけ更新された状態なので、リフレッシュすることで、マテビューも更新します。

SQL> exec dbms_mview.refresh('MVIEW1','C');

PL/SQLプロシージャが正常に完了しました。

SQL> select * from mview1;

       COL
----------
         1
         2

マスタ表とマテビューの更新もOK!

おまけ②

マスタ表に主キーがないと、マテビューログの作成でエラーになります。

SQL> create table test2 (col number(20));

表が作成されました。

SQL> create materialized view log on test2;
create materialized view log on test2
*
行1でエラーが発生しました。:
ORA-12014: 表'TEST2'に主キー制約がありません

最後までお付き合いいただきありがとうございました!