オラクる。

oracle専門ブログにしてみようかな~っと

2015年05月

私の生まれ故郷、東長崎
そこにある非常に評判の高いお蕎麦屋さん
食べログでは東京で一番の評価
その実力を確かめたくてやって参りました

その名は「じゆうさん」
東長崎駅南口から歩いて10分ほど
目白通り沿いにあるお店です

やっぱり、その評判からか7、8名ほどの行列が出来ています。
暑いので辛いけれど、取り敢えず並びます
そばはすぐに食べられるからすぐにお店に入れるだろう
そう思いながら待ちます
しかしながら、お店から人は出てくるけど、中々列が進まない・・・進まない・・・
30分ほどでよくやく入店です
どうも人手不足で回転が悪くなっているようです
ホールの女性店員も何かあたふた動き回っている
注文→食器の片付け→会計→∞
この一連の流れを一人でやっているから、さらに回転を悪くするという悪循環
もっと人を雇うしか無いんでしょうね~

さて、店内ですが、外にいるときは窓が一切なかったので様子はわかりませんでしたが、とても落ち着いた雰囲気です
少々暗めの店内がいい味を出しています
今回は、まずはオーソドックスに、ということで「せいろそば」を頼みます
ちなみに「せいろそば」と「ざるそば」の違いは盛り付けるうつわの違いらしいですね

そばが来るのはすぐでした
薬味→つゆ→麺の順で来ます
早速、麺をつゆに漬けて口の中へ・・・
そば粉の風味がダイレクトに口の中に広がっていきます
さらにのど越しもよく、とても食べやすい
つゆもカツオの風味豊かで麺との相性もぴったりです
一言で言えば、このそばは心優しく上品な味
人気が出るのもうなずけます
食後のそばつゆも中々のものでした
どことなく優しく、しかし、しっかりとそばの風味が生きている
大満足です
量が少ないのもあるけれど、あっという間に完食しました

ここまで食べたそばの中で一番に入るそばです
がんばれば、もう2枚でも食べれそう

20150517_040723250_iOS

20150517_041330602_iOS

--
それにしても、この生まれ故郷の東長崎
とても閑散としていたのが残念でした・・・
駅前の商店街もほとんどがシャッターで閉まっていて
みんなが池袋にでも行ってしまうのかな



手打ち蕎麦 じゆうさん
昼総合点★★★★ 4.0

関連ランキング:そば(蕎麦) | 東長崎駅新江古田駅江古田駅

フラッシュバックバージョン問い合わせは、ある時点からある時点までに変更された行の変更履歴を表示する機能です。
どのような経緯で現在のデータになったのかを確認することが出来ます。
また、この機能はUNDOデータを利用する機能です。

今回はテスト表に対してトランザクションを実行してみます。

SQL> INSERT INTO test_table VALUES (1,'tadashi');

1行が作成されました。

SQL> COMMIT;

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

SQL> DELETE FROM test_table WHERE no = 1;

1行が削除されました。

SQL> COMMIT;

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

SQL> INSERT INTO test_table VALUES (2,'suzuki');

1行が作成されました。

SQL> COMMIT;

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

SQL> UPDATE test_table SET name='satou'
  2  WHERE no = 2;

1行が更新されました。

SQL> COMMIT;

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

では、フラッシュバックバージョン問い合わせを実行してみます。
通常のSELECT文の後に以下の句を加えます。

VERSIONS BETWEEN SCN (開始時点のSCN番号) AND (終了時点のSCN番号)

また、以下のようにするとUNDOに残っている全ての履歴を参照することが出来ます。

VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE

さらにSELECT文に以下の列を指定することが出来ます。

versions_xid:トランザクションID 「フラッシュバックトランザクション問い合わせ」で利用できます。
versions_starttime:行バージョンが作成された時刻
versions_endtime:行バージョンが変更された時刻
versions_operation:行なわれた操作(I:挿入、U:更新、D:削除)

SELECT versions_xid, versions_starttime, versions_endtime,
  2         versions_operation AS operation, no, name
  3  FROM test_table
  4  VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE;

VERSIONS_XID     VERSIONS_STARTTIME             VERSIONS_ENDTIME               OPE         NO NAME
---------------- ------------------------------ ------------------------------ --- ---------- ----------
02001F0042060000 15-05-19 00:39:02                                             D            1 tadashi
06000A00FC060000 15-05-19 00:38:44              15-05-19 00:39:02              I            1 tadashi
06000C00FB060000 15-05-19 00:09:50                                             U            2 satou
                                                15-05-19 00:09:50                           2 suzuki

一行はトランザクションがcommitされる度に作成されます。
versions_starttimeからversions_endtimeまで存在していたデータというのがわかります。
versions_starttimeが入っていて、versions_endtimeには何も入っていないのは、そのデータが最新だからです。
versions_endtimeが入っていて、versions_starttimeには何も入っていないのは、UNDOに残っていないデータだからです。

フラッシュバック問い合わせ機能を利用すると、表のある時点のデータを取得することが出来ます。
この機能ではUNDOデータを利用して、過去のデータを参照しています。
そのため、UNDOデータが存在していなデータは参照することが出来ません。

SQL> SELECT systimestamp FROM dual;

SYSTIMESTAMP
---------------------------------------------------------------------------
15-05-16 00:09:03.664854 +09:00

SQL> SELECT 最終学位 FROM TM01_最終学位
  2  WHERE 学位コード = 7;

最終学位
------------------------------------------------------------
大卒


現在の時刻を確認してから、表を参照します。

SQL> UPDATE TM01_最終学位 SET 最終学位= '高卒'
  2  WHERE 学位コード = 7;

1行が更新されました。

SQL> COMMIT;

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

SQL> SELECT 最終学位 FROM TM01_最終学位
  2  WHERE 学位コード = 7;

最終学位
------------------------------------------------------------
高卒


一行を更新してから、コミットします。
これで表は1行変更されました。
フラッシュバック問い合わせ機能を利用して、変更される前のデータを参照してみます。

SQL> SELECT 最終学位 FROM TM01_最終学位
  2  AS OF TIMESTAMP TO_TIMESTAMP('15-05-16 00:09:03','RR-MM-DD HH24:MI:SS')
  3  WHERE 学位コード = 7;

最終学位
------------------------------------------------------------
大卒

過去の時間を指定して変更前のデータを確認しています。

SQL> SELECT 最終学位 FROM TM01_最終学位
  2  AS OF TIMESTAMP (SYSTIMESTAMP-INTERVAL '60' MINUTE)
  3  WHERE 学位コード = 7;

最終学位
------------------------------------------------------------
大卒


「現在の時間」から60分前という指定で、変更前のデータを確認しています。

SQL> SELECT TIMESTAMP_TO_SCN('15-05-16 00:09:03.664854') AS SCN
  2  FROM dual;

       SCN
----------
   1757059

SQL> SELECT 最終学位 FROM TM01_最終学位
  2  AS OF SCN 1757059
  3  WHERE 学位コード = 7;

最終学位
------------------------------------------------------------
大卒


システム時間(SCN)を利用して過去のデータを参照しています。

SQL> UPDATE TM01_最終学位
SET 最終学位= (SELECT 最終学位
  3                 FROM TM01_最終学位 AS OF SCN 1757059
  4                 WHERE 学位コード = 7)
  5  WHERE 学位コード = 7;

SQL> COMMIT;

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

SQL> SELECT 最終学位 FROM TM01_最終学位
  2  WHERE 学位コード = 7;

最終学位
------------------------------------------------------------
大卒


過去データを利用して、現在の表を更新することも出来ます。

フラッシュバックドロップ機能を利用することによって、誤って削除した表を復元することが出来ます。
OSのゴミ箱機能に似ています。
なお、削除した表は同じ表領域に退避されますが、表領域の空き領域が不足する場合、表は完全に削除されるので復元することが出来なくなります。

SQL> SHOW PARAMETER RECYCLEBIN

NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
recyclebin                           string                            on


recyclebinパラメーターがon(デフォルト)になっていればフラッシュバックドロップ機能が利用できます。

SQL> DROP TABLE test_table;

表が削除されました。

SQL> SELECT * FROM test_table;
SELECT * FROM test_table
              *
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。


実際にテーブルを削除してみます。

SQL> SELECT original_name,object_name,type,droptime
  2  FROM user_recyclebin;

ORIGINAL_NAME        OBJECT_NAME                              TYPE                 DROPTIME
-------------------- ---------------------------------------- -------------------- ------------------------------
PK_TT02              BIN$FeSy26boGSbgU2QJEazg7A==$0           INDEX                2015-05-12:23:56:26
TEST_TABLE           BIN$FeSy26bpGSbgU2QJEazg7A==$0           TABLE                2015-05-12:23:56:27

削除した表で「ゴミ箱」に残っているものはuser_recyclebin表で確認できます。
ゴミ箱の内容が表示されます。

SQL> SELECT count(*) FROM "BIN$FeSy26bpGSbgU2QJEazg7A==$0";

  COUNT(*)
----------
      1250


ゴミ箱に存在する表は参照することが出来ます。
その場合、表名はuser_recyclebinに記載されているOBJECT_NAME列の表名を指定します。
ただし、DMLで更新、挿入の操作を行なうことは出来ません。

SQL> FLASHBACK TABLE test_table TO BEFORE DROP;

フラッシュバックが完了しました。

SQL> SELECT count(*) FROM test_table;

  COUNT(*)
----------
      1250

SQL> SELECT original_name,object_name,type,droptime
  2  FROM user_recyclebin;

レコードが選択されませんでした。


実際にゴミ箱内の表を復元するにはFLASHBACKコマンドを実行します。
復元後、ゴミ箱内に存在していた表が無くなりました。

SQL> DROP TABLE test_table;

表が削除されました。

SQL> SELECT original_name,object_name,type,droptime
  2  FROM user_recyclebin;

ORIGINAL_NAME        OBJECT_NAME                              TYPE                 DROPTIME
-------------------- ---------------------------------------- -------------------- ------------------------------
PK_TT02              BIN$FeSy26bzGSbgU2QJEazg7A==$0           INDEX                2015-05-13:00:14:18
TEST_TABLE           BIN$FeSy26b0GSbgU2QJEazg7A==$0           TABLE                2015-05-13:00:14:18

SQL> PURGE TABLE test_table;

表がパージされました。


SQL> SELECT original_name,object_name,type,droptime
  2  FROM user_recyclebin;

レコードが選択されませんでした。


復元せずにゴミ箱内の表を削除するには、PURGE コマンドを実行します。

SQL> DROP TABLE test_table PURGE;

表が削除されました。

SQL> SELECT original_name,object_name,type,droptime
  2  FROM user_recyclebin;

レコードが選択されませんでした。


ゴミ箱を介さずに表を削除するにはDROPコマンドにPURGE句を付与します。

rmanのカタログは複数のデータベースを扱うことが出来ます。
カタログデータベースの管理者ユーザがそれぞれのターゲットデータベースの管理を行なうことが出来ます。
しかし、カタログデータベースの管理者ユーザをターゲットデータベースごとに分けたい場合はVPC(仮想プライベートカタログ)という機能を利用することが出来ます。
カタログのVPCは11gから追加された新機能です。

今回の検証ではorclとorcl2というデータベースを作成し、それぞれrcadmin_orcl、rcadmin_orcl2というユーザーを作成し、それぞれのカタログを管理できるように設定します。
なお、VPCを利用する場合でも従来からのカタログ管理者ユーザーは存在し、そのユーザーは両方のターゲットデータベースを管理することが出来ます。

・VPCユーザーの作成

カタログデータベースに接続し、VPCユーザーを作成します。

SQL> CREATE USER rcadmin_orcl IDENTIFIED BY password
  2  DEFAULT TABLESPACE rcat_tbs QUOTA UNLIMITED ON rcat_tbs;

ユーザーが作成されました。

SQL> GRANT recovery_catalog_owner TO rcadmin_orcl;

権限付与が成功しました。


通常の管理者ユーザと同じようにrecovery_catalog_owner権限をVPCユーザーに付与します。

[oracle@node01 ~]$ rman CATALOG rcadmin/password

Recovery Manager: Release 11.2.0.3.0 - Production on 日 5月 10 23:11:59 2015

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

リカバリ・カタログ・データベースに接続されました。

RMAN> GRANT REGISTER DATABASE TO rcadmin_orcl;

権限付与が成功しました。

RMAN> GRANT CATALOG FOR DATABASE orcl TO rcadmin_orcl;

権限付与が成功しました。

rmanでカタログをデータベースに接続し、REGISTER DATABASE権限、VPCユーザーが管理したいデータベースをカタログする権限であるCATALOG FOR DATABASE権限を付与します。

・VPCカタログの作成

[oracle@node01 ~]$ rman CATALOG rcadmin_orcl/password

Recovery Manager: Release 11.2.0.3.0 - Production on 日 5月 10 23:14:01 2015

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

リカバリ・カタログ・データベースに接続されました。

RMAN> CREATE VIRTUAL CATALOG;

RCADMINが所有する適格なベース・カタログが見つかりました
RCADMINが所有するベース・カタログに対して仮想カタログが作成されました


VPCユーザーでカタログデータベースに接続し、VPCカタログを作成します。
このVPCカタログは例ではorclデータベースの情報しかカタログすることが出来ません。

・VPCカタログにDB登録

[oracle@node01 ~]$ rman TARGET /  CATALOG rcadmin_orcl/password@rcat

Recovery Manager: Release 11.2.0.3.0 - Production on 日 5月 10 23:15:39 2015

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: ORCL (データベースID=1405522151)に接続されました
リカバリ・カタログ・データベースに接続されました。

RMAN> REGISTER DATABASE;

データベースがリカバリ・カタログに登録されました。
リカバリ・カタログの完全再同期を開始しています
完全再同期が完了しました

RMAN> quit


Recovery Managerが完了しました。


rmanでターゲットデータベース(例ではorcl)とカタログデータベースに接続します。
カタログデータベースにはVPCユーザーで接続します。
REGISTER DATABASEでカタログデータベースにターゲットデータベースを登録します。
これで、VPCの設定は完了です。

・確認 
同様にorcl2用のVPCユーザーも作成しました。
orcl用のVPCユーザーでorc2に接続できるでしょうか。

[oracle@node01 ~]$ export ORACLE_SID=orcl2
[oracle@node01 ~]$ rman TARGET /  CATALOG rcadmin_orcl/password@rcat

Recovery Manager: Release 11.2.0.3.0 - Production on 日 5月 10 23:19:08 2015

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: ORCL2 (データベースID=860124897)に接続されました
リカバリ・カタログ・データベースに接続されました。

RMAN> RESYNC CATALOG;

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: resyncコマンドが05/10/2015 23:19:26で失敗しました
RMAN-06004: リカバリ・カタログ・データベースでのOracleエラー: RMAN-20001: target database not found in recovery catalog

RESYNC CATALOGでカタログデータベースの状態を登録することが出来ません。

[oracle@node01 ~]$ rman TARGET /  CATALOG rcadmin/password@rcat

Recovery Manager: Release 11.2.0.3.0 - Production on 日 5月 10 23:19:36 2015

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: ORCL2 (データベースID=860124897)に接続されました
リカバリ・カタログ・データベースに接続されました。

RMAN> RESYNC CATALOG;

リカバリ・カタログの完全再同期を開始しています
完全再同期が完了しました

[oracle@node01 ~]$ rman TARGET /  CATALOG rcadmin_orcl2/password@rcat

Recovery Manager: Release 11.2.0.3.0 - Production on 日 5月 10 23:24:59 2015

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

ターゲット・データベース: ORCL2 (データベースID=860124897)に接続されました
リカバリ・カタログ・データベースに接続されました。

RMAN> RESYNC CATALOG;

リカバリ・カタログの完全再同期を開始しています
完全再同期が完了しました


従来の管理者ユーザ、orcl2用のVPCユーザでは、カタログに接続することが出来ました。

VPCカタログはあくまでリカバリカタログ上に作成する仮想のカタログなので概念を理解するのは難しいかもしれません。
でも、セキュリティを高めるには有用な機能なのかも知れません。

このページのトップヘ