Oracle10g フラッシュバック アゲインの巻 その8

投稿日: 2005年4月06日

<Oracle10g フラッシュバック アゲイン の巻 その8 最終回>
ペンネーム:びー・うぃりー

フラッシュバック アゲイン と題しOracle9i~Oracle10gをまたがって、
フラッシュバック関連機能の基本的な動作確認をしてきました。この内容を確
実に理解していれば、後は応用するだけです。実運用業務ではなかなか利用す
る機会がなく試せない事も事実ですが是非TRYしてみてください。
(まずテスト系で・・・!!)

最終回の今週は、ちょっとしたTipsを紹介した後、いままでの内容を「フラッ
シュバック」します。そしてまとめます。

■環境
Microsoft Windows XP Pro
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 – Production
With the Partitioning, OLAP and Data Mining options

■Tips
また下位バージョンの SQL*Plusから上位バージョンのデータベースよりサポ
ートされたコマンドが実行できない場合がある!

10g から追加されている FLASHBACK関連のコマンドを Oracle9i Database の
SQL*Plusから接続し実行した場合は正常なコマンドとして認識されずに実行す
ることができません。(SQL*Plus 自身にも構文チェックの機能があります。)

SQL*Plus: Release 9.2.0.5.0 から Oracle Database 10g Enterprise Edition
Release 10.1.0.2.0 へ接続して10gからの機能を実行してみます。

$ sqlplus /nolog
SQL*Plus: Release 9.2.0.5.0 - Production on 金 Mar 4 15:40:36 2005
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

SQL> conn oraora/oraora@xxxxx
接続されました。

SQL> select * from V$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.1.0.2.0 - Prod
PL/SQL Release 10.1.0.2.0 - Production
CORE    10.1.0.2.0      Production
TNS for 32-bit Windows: Version 10.1.0.2.0 - Production
NLSRTL Version 10.1.0.2.0 - Production

SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
FLASHBACK_TEST

1行が選択されました。

SQL> select * from flashback_test;

      COL1 COL2       TIME_STMP
---------- ---------- ------------------------------------------------
         1 QWERTY     05-03-04 14:57:08.000000
         2 ASDFGH     05-03-04 14:57:16.000000
         3 ZXCVBN     05-03-04 14:57:23.000000
         4 POIUYT     05-03-04 14:57:30.000000
         5 LKJHGF     05-03-04 14:57:38.000000
         6 MNBVCX     05-03-04 14:57:47.000000
         7 123456     05-03-04 14:57:54.000000
         8 098767     05-03-04 14:58:02.000000
         9 QPWOEI     05-03-04 14:58:09.000000
        10 ALSKDJ     05-03-04 14:58:16.000000
10行が選択されました。

SQL> drop table FLASHBACK_TEST;
表が削除されました。

SQL> select object_name,object_type from user_objects;

OBJECT_NAME                                                OBJECT_TYPE
---------------------------------------------------------- --------------
BIN$8XgHoZYI9gngMKjAgwADJg==$0                             TABLE
1行が選択されました。

ここから「flashback table」を実行します。

SQL> flashback table FLASHBACK_TEST to before drop;
SP2-0734: "flashbac..."で開始するコマンドが不明です - 残りの行は無視さ
れました。

「コマンドが不明」のエラーとなりました。
どうしても実行する必要がある場合は回避策としては、動的SQLを使用しSQLコ
マンドに対するSQL*Plus の構文チェックを行わせないこと、となります。

SQL> declare
  2  cur integer;
  3  ret integer;
  4  begin
  5  cur := dbms_sql.open_cursor;
  6  dbms_sql.parse(cur,'flashback table "BIN$8XgHoZYI9gngMKjAgwADJg==$0"
to before drop',dbms_sql.native);
  7  ret :=dbms_sql.execute(cur);
  8  end;
  9  /
PL/SQLプロシージャが正常に完了しました。

SQL> select table_name from user_tables;

TABLE_NAME
------------------------------
FLASHBACK_TEST
1行が選択されました。

SQL> select * from FLASHBACK_TEST;
      COL1 COL2       TIME_STMP
---------- ---------- ------------------------------------------------
         1 QWERTY     05-03-04 14:57:08.000000
         2 ASDFGH     05-03-04 14:57:16.000000
         3 ZXCVBN     05-03-04 14:57:23.000000
         4 POIUYT     05-03-04 14:57:30.000000
         5 LKJHGF     05-03-04 14:57:38.000000
         6 MNBVCX     05-03-04 14:57:47.000000
         7 123456     05-03-04 14:57:54.000000
         8 098767     05-03-04 14:58:02.000000
         9 QPWOEI     05-03-04 14:58:09.000000
        10 ALSKDJ     05-03-04 14:58:16.000000
10行が選択されました。

以上の様に、flashback table が可能となりました。
下位バージョンのSQL*Plus から上位バージョンのデータベースにコマンドを
発行する必要がある場合は有効です。

■まとめ
参照系、更新系のフラッシュバックは、非常に使い勝手が良くしかも簡単に使
えるこが理解できたと思います。ただ、フラッシュバックはあくまでもリカバ
リ機能である事を忘れないでください。またリカバリが必要な場合であっても、
それを適用するかどうかは十分な検証が必要です。従来に比べ高速にデータ復
旧する方法のひとつとして認識する事が、大事だと思います。

フラッシュバック機能は、基本的にヒューマンエラー発生時の対処に使われま
す。昨今超多忙なDBA担当者は、夜中の緊急対応で寝ぼけていた・・・、新人
に任せたら・・・、テスト系用スクリプトを本番系で実行してしまった・・・、
などなど、想像しただけで「ブルーな気分になる」日々を送っている方が多い
のでは。

ヒューマンエラーを起こさない工夫も大事です。

(1)運用作業用Oracleユーザーを作成し権限を作業に必要な最低限のものだけを
付与しておく。SELECT検索するだけなのにCONNECT/ AS SYSDBA をする方を
たくさん見かけます。 (きっと指が覚えているのでしょう・・・油断大敵!!)
(2)DBA権限USERのPASSWORDを定期的に変更する。
デフォルト値のままのサイトが非常に多いです。
セキュリティの面でも有効です。
(3)drop/truncate抑止トリガーを作成しておく
これは超便利です。機会があれば別途紹介します。

今週はここまで。

夜風が気持ちいい、茅ヶ崎より