コーソル DatabaseエンジニアのBlog へようこそ

コーソル DatabaseエンジニアのBlogでは、 コーソル所属のDatabaseエンジニアである 渡部がOracle Databaseを中心としたDatabaseに関わる技術情報を発信しています。

コーソルでは、Oracle Databaseをはじめとするデータベース全般に関わるサービス(コンサルティング、設計、構築など)、オラクル製品のプロダクトサポートサービスを提供しています。 また、不定期で無償の技術セミナーを開催しています。


コーソルでは、Oracle Databaseスペシャリストになりたいエンジニア、 Oracle Database技術を活かして働きたいエンジニアを絶賛募集中です。

hiring.png

コーソルについて知るためには・・・

エンジニアのスキル向上を支援する各種施策については・・・

コーソルのエンジニアの多くが従事する、「Oracle Database サポートエンジニアの仕事」の利点について知るためには・・・。

コーソルで働くことに興味を持たれた方は・・・

2014年07月02日

db tech showcase 大阪 2014にてOSS-DB Silver 試験セミナーの講師を務めさせていただきました!

弊社コーソルは、「CO-Solutions=共に解決する」の理念のもと、Oracle技術に特化した事業を展開しておりますが、現在PostgreSQL、MySQLなどのOSS-DB領域へも事業範囲を広げています。

事業範囲をOSS-DB領域へ広げる取り組みの一環として、2014年6月18日(水)~6月20日(金)に大阪で開催された、インサイトテクノロジー様主催 「db tech showcase 大阪 2014」にて、OSS-DB Silver試験セミナーの講師を務めさせていただきました。

当日の様子がLPI-Japan様のOSS-DBウェブサイトにまとめられています。

できるだけ包括的な資料をお届けしたかったので、資料の総ページ数が217ページ(!) に達してしまいました。 セミナーではすべてのトピックについて説明できませんでしたが、今後の試験勉強の役立てていただければ幸いです。

アンケートにご回答いただいた全員の方に「参考になった」「大変参考になった」と、ありがたい評価をいただきました。 また同様の機会がありましたら、是非セミナーを担当させていただければと思っております。PostgreSQL、OSS-DB技術者認定試験にご興味がある方にお役に立てれば幸いです。

セミナーの資料は、以下よりダウンロードできますので、ご興味があるかたはぜひぜひ。

さらに今年も2名がOracle OpenWorld へ!

コーソルは、2012年からUSのOracle OpenWorldにエンジニアを送り出しています。 2013年に引き続き、2014年も中堅エンジニアと若手エンジニアの2名がOracle OpenWorldへ行くことになりました!

昨年初めてOOWに参加したメンバー曰く「今年も参加したい・・・」だそうですが、残念ながら、別の方に行っていただくことになりました。

そういや今年は OakTable Worldあるのかな・・・

2014年03月18日

Oracle Database 10.2 追加のExtended Support

先のエントリで、Oracle Database 11.2のPremier Support終了と1年間限定の無償Extended Supportの提供について ご紹介しました。これと併せて、Oracle Database 10.2 に対して、若干イレギュラーなサポート提供がされていたことに気付いたのでご紹介します。

For Oracle Database 10.2 a limited service providing Severity 1 fixes will be available after July 2013. For details please refer to the Technical Support Policies. For more-detailed information on bug fix and patch release policies, please refer to the "Error Correction Support Policy" on MyOracle Support.

Oracle Database 10.2 に対しては、9.2, 11.2と同様に1年間 無償でExtended Supportが提供されていました。その後、有償のExtended Supportが提供されていました。

通常であれば、2013年7月までで有償のExtended Supportの提供は終了し、以後、Sustaing Supportが適用され、パッチ提供はNGとなるはずでした。しかし、 2013年8月から2015年7月まで、重要度1限定の限定サポートが提供されており、パッチ提供が可能になっています。

2013年8月からのサービスであり、今更感がありますが、サポートに絡めてご紹介しました。 なお、サポート契約をお持ちの方は以下のKROWNもあわせてごらんください。

修正履歴

  • 2014-3-18 : 表現を一部修正

Oracle Database 11.2のPremier Support終了と1年間限定の無償Extended Support

以下のOracle Technology Network Japan Blog ( および Upgrade your Database - NOW! ブログ) のエントリの通り、2015年1月で Oracle Database 11.2の Premier Support が終了します。

しかし、Premier Support 終了後も1年間限定で無償のExtended Supportが提供されますので、 2016年1月までは 実質的に Premier Supportに準ずるサポートを受けられます。 が、パッチが提供されるのは、原則的に最新のPatchset (すなわち 11.2.0.4 ) に限定されることに注意が必要です。

サポート契約を持ちの方は、以下のKROWNを合わせて御確認いただいた方がよいかと思います。

ただ、(この文章、「逆接」が多いですね・・・複雑なんです)パッチ提供期間については猶予期間などの例外事項もあるので、以下のKROWNおよびMOS Docを合わせて御確認ください。

お約束ですが・・・ やっぱり、計画的なアップグレードをお勧めします!

2014年03月07日

12c新機能 1ステップでの表のオンライン再定義

オンライン再定義はオブジェクトの定義変更をオンラインで実行できる Oracle Database Enterprise Editionで利用可能な機能です。非常に強力な機能ですが、 使用手順が若干面倒なのがちょっとした難点でした。(慣れればそれほどでもないのですが)

従来のバージョンでのオンライン再定義の手順概略は以下の通りです。

  1. DBMS_REDEFINITION.CAN_REDEF_TABLEプロシージャを起動して、表をオンラインで再定義できることを確認
  2. 今回の再定義で変更したい内容を表(仮表)を作成する。
    たとえば、今回のオンライン再定義で表の格納先表領域を移動したい場合は、移動先の表領域に同じ定義の表を作成する。
  3. DBMS_REDEFINITION.START_REDEF_TABLE でオンライン再定義を開始する。
    このタイミングでの元表のデータが仮表にコピーされる。
  4. 索引や制約などの依存オブジェクトと統計を元の表から仮表へコピーする。
  5. DBMS_REDEFINITIONFINISH_REDEF_TABLE でオンライン再定義を終了する。
    DBMS_REDEFINITION.START_REDEF_TABLE 実行後に元表に対して加えられた変更が、仮表に反映される。

12cでは、このような若干面倒な手順が、DBMS_REDEFINITION.REDEF_TABLEを実行するだけに単純化されます。

例:従来のオンライン再定義の手順で格納先表領域を変更する

以下の手順は MOS Doc:1357742.1 を参考にしています。まず、格納先表領域を変更したい表ORIGINALを作成し、データを投入しておきます。

SQL> create table ORIGINAL (
  2    COL1 NUMBER PRIMARY KEY,
  3    COL2 VARCHAR2(1000))
  4    TABLESPACE SYSTEM;

表が作成されました。

SQL> insert into ORIGINAL values(1,'AAA');
1行が作成されました。

SQL> commit;

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

次に仮表を作成します。ここでは、(誤って)SYSTEM表領域に作成した表をUSERS表領域に移動ししたい状況を想定します。ですので、仮表はUSERS表領域に作成します。列定義は同様とします。

SQL> create table INTERIM (
  2    COL1 NUMBER,
  3    COL2 VARCHAR2(1000))
  4    TABLESPACE USERS;

表が作成されました。


SQL> col table_name format a16
SQL> set lines 80
SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES;

TABLE_NAME       TABLESPACE_NAME
---------------- ------------------------------
INTERIM          USERS
ORIGINAL         SYSTEM

DBMS_REDEFINITION.CAN_REDEF_TABLEでオンライン再定義が可能か確認し(エラーがなければOK)、DBMS_REDEFINITION.START_REDEF_TABLEでオンライン再定義を開始します。

SQL> SET SERVEROUTPUT ON

SQL> exec DBMS_REDEFINITION.CAN_REDEF_TABLE('RYWATABE','ORIGINAL', DBMS_REDEFINITION.CONS_USE_PK);
PL/SQLプロシージャが正常に完了しました。

SQL> BEGIN
  2     DBMS_REDEFINITION.START_REDEF_TABLE(
  3                    uname => 'RYWATABE',
  4                    orig_table => 'ORIGINAL',
  5                    int_table => 'INTERIM',
  6                    options_flag => DBMS_REDEFINITION.CONS_USE_PK);
  7  END;
  8  /

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

仮表には、索引や制約が設定されていないので、DBMS_REDEFINITION.COPY_TABLE_DEPENDENTSで、元表からコピーします。


SQL> DECLARE
  2     error_count pls_integer := 0;
  3  BEGIN
  4     DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('RYWATABE', 'ORIGINAL', 'INTERIM',
  5        dbms_redefinition.cons_orig_params, TRUE,TRUE,TRUE,FALSE, error_count);
  6     DBMS_OUTPUT.PUT_LINE('errors := ' || TO_CHAR(error_count));
END;
  8  /
errors := 0

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

現段階では、オンライン再定義は実行中の状態となりますが、この状態で、元表に対してDMLを実行できます。元表に加えた更新は、この時点では仮表に反映されません。

SQL> col col2 format a16
SQL>
SQL> SELECT * FROM ORIGINAL;

      COL1 COL2
---------- ----------------
         1 AAA

SQL> SELECT * FROM INTERIM;

      COL1 COL2
---------- ----------------
         1 AAA

SQL> insert into ORIGINAL values(2,'BBB');

1行が作成されました。

SQL> commit;

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

SQL> SELECT * FROM ORIGINAL;

      COL1 COL2
---------- ----------------
         1 AAA
         2 BBB

SQL> SELECT * FROM INTERIM;

      COL1 COL2
---------- ----------------
         1 AAA

DBMS_REDEFINITION.FINISH_REDEF_TABLEを実行して、オンライン再定義を終了します。この時点で、元表に加えられた変更が仮表に反映されます。

SQL> exec DBMS_REDEFINITION.FINISH_REDEF_TABLE('RYWATABE','ORIGINAL','INTERIM');

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

SQL> SELECT * FROM ORIGINAL;

      COL1 COL2
---------- ----------------
         1 AAA
         2 BBB

SQL> SELECT * FROM INTERIM;

      COL1 COL2
---------- ----------------
         1 AAA
         2 BBB

例:1ステップでの表のオンライン再定義の手順で格納先表領域を変更する(DBMS_REDEFINITION.REDEF_TABLE)

次に、Oracle Database 12c (12.1.0.1)で導入された、1ステップでの表のオンライン再定義で同様のことをやってみます。まず、テーブルとデータを準備します。仮表を準備する必要はありません。

SQL> create table ORIGINAL (
  2    COL1 NUMBER PRIMARY KEY,
  3    COL2 VARCHAR2(1000))
  4  TABLESPACE SYSTEM;

表が作成されました。

SQL> insert into ORIGINAL values(1,'AAA');

1行が作成されました。

SQL> commit;

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

SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES;

TABLE_NAME       TABLESPACE_NAME
---------------- ------------------------------
ORIGINAL         SYSTEM

DBMS_REDEFINITION.REDEF_TABLEを実行します。ここで実行したい定義変更は表領域の移動なので、引数table_part_tablespaceに'USERS'を指定しています。指定する引数は実行したい定義変更により異なります。詳細はマニュアルをご確認ください。

SQL> BEGIN
  2    DBMS_REDEFINITION.REDEF_TABLE(
  3      uname                      => 'RYWATABE',
  4      tname                      => 'ORIGINAL',
  5      table_part_tablespace      => 'USERS'
  6      );
  7  END;
  8  /

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

SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES;

TABLE_NAME       TABLESPACE_NAME
---------------- ------------------------------
ORIGINAL         USERS

注意点

このように便利な1ステップでの表のオンライン再定義ですが、 再定義におけるオブジェクト定義変更の内容にかなり制約があることに注意が必要です。

  • 表、パーティション、索引、LOB列などの表領域の変更
  • 表、パーティション、索引キー、LOB列などの圧縮タイプの変更
  • LOB列の場合、SECUREFILEまたはBASICFILE記憶域の変更

参考

上記以外の列の追加や削除などのオブジェクト定義変更をオンライン再定義で実行したい場合、残念ながら従来の手順で実行する必要があります。

2014年03月06日

12c新機能 同一列に対する複数索引

Oracle Database 12cより 同じ列に対して複数の索引を作成できるようになりました。 例えば、同じ列に対してBツリー索引とビットマップ索引を作成できます。従来は 同じ列に対してBツリー索引とビットマップ索引を作成しようとすると、 ORA-01408: such column list already indexed というエラーが発生していました。

ただし、この機能は、Oracle Database 11g R1 で導入された不可視索引と連携して 使用することを想定した機能です。私は、この機能を、不可視索引がOracle Database 11g において不十分であった点を補う位置づけであるととらえています。

さっそく動作を確認してみましょう。まず、テーブルとデータを準備します。

SQL> create table tab2 (n number, c varchar(80));
Table created.

SQL> insert into tab2 select 1, 'aaa' from dual
  2    connect by level <= 999;

999 rows created.

SQL> insert into tab2 values(999, 'aaa');

1 row created.

SQL> commit;

Commit complete.

テーブルtab2のn列に対して、Bツリー索引idx2tとビットマップ索引idx2bを作成しようとしますが・・・

SQL> create index idx2t on tab2(n);

Index created.

SQL> create bitmap index idx2b on tab2(n);
create bitmap index idx2b on tab2(n)
                                  *
ERROR at line 1:
ORA-01408: such column list already indexed

過去バージョンと同様にORA-01408が発生してビットマップ索引を作成できません。同じ列に複数の索引を作成するためには、索引の作成前に既存の索引をINVISIBLEにする必要があるのです。

さて、一応この状態で、索引が使用されることを確認しておきます。

 
SQL> exec dbms_stats.gather_table_stats(null, 'TAB2');

PL/SQL procedure successfully completed.

SQL> explain plan for SELECT count(*) FROM tab2 WHERE n = 1;

Explained.

SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1847674165

---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |     1 |     4 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |       |     1 |     4 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX2T |   500 |  2000 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("N"=1)

14 rows selected.

Bツリー索引が使われていることがわかります。

このBツリー索引をINVISIBLEにして、同じ列にビットマップ索引を作成します。

SQL> alter index idx2t invisible;

Index altered.

SQL> create bitmap index idx2b on tab2(n);

Index created.

今度はビットマップ索引を正常に作成できます。

不可視索引にアクセスするかどうかを制御するoptimizer_use_invisible_indexesはデフォルトでFALSEです。この状態では、不可視(INVISIBLE)状態の索引は使われません。

SQL> show parameter optimizer_use_invisible_indexes

NAME                                 TYPE
------------------------------------ -----------
VALUE
----------------------------------------------------------------------------------------------------
optimizer_use_invisible_indexes      boolean
FALSE
SQL> explain plan for SELECT count(*) FROM tab2 WHERE n = 1;

Explained.

SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 703723870

---------------------------------------------------------------------------------------
| Id  | Operation                     | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |       |     1 |     4 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE               |       |     1 |     4 |            |          |
|   2 |   BITMAP CONVERSION COUNT     |       |   500 |  2000 |     1   (0)| 00:00:01 |
|*  3 |    BITMAP INDEX FAST FULL SCAN| IDX2B |       |       |            |          |
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("N"=1)

15 rows selected.

不可視索引を使用しようと、明示的にヒントでその索引を指定しても、使用されません。

SQL> explain plan for SELECT /*+ INDEX(tab2 idx2t) */ count(*) FROM tab2 WHERE n = 999;

Explained.

SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1400846200

-------------------------------------------------------------------------------------
| Id  | Operation                   | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |       |     1 |     4 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE             |       |     1 |     4 |            |          |
|   2 |   BITMAP CONVERSION COUNT   |       |   500 |  2000 |     1   (0)| 00:00:01 |
|*  3 |    BITMAP INDEX SINGLE VALUE| IDX2B |       |       |            |          |
-------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - access("N"=999)

15 rows selected.

不可視索引を使用するには、optimizer_use_invisible_indexes を TRUEに設定する必要があります。

SQL> ALTER SESSION SET optimizer_use_invisible_indexes = TRUE;

Session altered.

SQL> explain plan for SELECT /*+ INDEX(tab2 idx2t) */ count(*) FROM tab2 WHERE n = 999;

Explained.

SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1847674165

---------------------------------------------------------------------------
| Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |       |     1 |     4 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |       |     1 |     4 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX2T |   500 |  2000 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("N"=999)

14 rows selected.

SQL> explain plan for SELECT count(*) FROM tab2 WHERE n = 1;

Explained.

SQL> SELECT * FROM table(DBMS_XPLAN.DISPLAY);

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------------
Plan hash value: 703723870

---------------------------------------------------------------------------------------
| Id  | Operation                     | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |       |     1 |     4 |     1   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE               |       |     1 |     4 |            |          |
|   2 |   BITMAP CONVERSION COUNT     |       |   500 |  2000 |     1   (0)| 00:00:01 |
|*  3 |    BITMAP INDEX FAST FULL SCAN| IDX2B |       |       |            |          |
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("N"=1)

15 rows selected.

12c新機能 不可視列 - Invisible column

Oracle Database 12cより 不可視(INVISIBLE)という列の属性が追加され、実体としては存在するけれども、明示的に指定しない限り見えない列を作ることができるようになりました。

動作を確認してみましょう。なお、以下のブログエントリを大いに参考にしています。

SQL> CREATE TABLE t1
  2  (
  3    c1 NUMBER,
  4    c2 NUMBER,
  5    c3 NUMBER INVISIBLE,
  6    c4 NUMBER
  7  );

Table created.

SQL> set lines 80
SQL> desc t1
           Name                            Null?    Type
           ------------------------------- -------- ----------------------------
    1      C1                                       NUMBER
    2      C2                                       NUMBER
    3      C4                                       NUMBER

SQL> col column_name format a16
SQL> SELECT column_name, hidden_column FROM ALL_TAB_COLS WHERE table_name = 'T1';

COLUMN_NAME      HID
---------------- ---
C4               NO
C3               YES
C2               NO
C1               NO

列c3にINVISIBLE属性を指定し、不可視列にしています。SQL*Plusのdescでは列c3は表示されません。 また、ALL_TAB_COLSを確認する列c3はhidden_column='YES'となっていることがわかります。

SQL> INSERT INTO t1 (c1,c2,c3,c4) VALUES (11,12,13,14);

1 row created.

SQL> commit;

Commit complete.

SQL> SELECT c1,c2,c3,c4 FROM t1;

        C1         C2         C3         C4
---------- ---------- ---------- ----------
        11         12         13         14

SQL> UPDATE t1 SET c3=23;

1 row updated.

SQL> commit;

Commit complete.

SQL> SELECT c1,c2,c3,c4 FROM t1;

        C1         C2         C3         C4
---------- ---------- ---------- ----------
        11         12         23         14

しかし、c3列を明示的に指定すれば、更新などは可能です。

なお、SQL*PlusのCOLINVISIBLEをONにすると、 不可視列がdescコマンドで表示されるようになります。

SQL> SET COLINVISIBLE ON
SQL> desc t1
           Name                            Null?    Type
           ------------------------------- -------- ----------------------------
    1      C1                                       NUMBER
    2      C2                                       NUMBER
    3      C4                                       NUMBER
    4      C3 (INVISIBLE)                           NUMBER

SQL> SET COLINVISIBLE OFF

c3列を明示的に指定しない場合は、あたかも列c3がいないかのように振る舞います。

SQL> INSERT INTO t1 VALUES (11,12,13,14);
INSERT INTO t1 VALUES (11,12,13,14)
            *
ERROR at line 1:
ORA-00913: too many values


SQL> SELECT * FROM t1;

        C1         C2         C4
---------- ---------- ----------
        11         12         14

注意点

マニュアルでも触れられていますが、不可視(INVISIBLE)の列を可視(VISIBLE)にすると、 列の順序が変わる点に注意が必要です。
SQL> ALTER TABLE t1 MODIFY c3 VISIBLE;

Table altered.

SQL> desc t1
           Name                            Null?    Type
           ------------------------------- -------- ----------------------------
    1      C1                                       NUMBER
    2      C2                                       NUMBER
    3      C4                                       NUMBER
    4      C3                                       NUMBER

列の順序が変わるということは、列名を明示しないSQL、SELECT * FROM .. や INSERT INTO 表名 VALUES(...)の振る舞いが 期待した動作にならないことを示します。要注意ですね。

Oracle Databaseオプションの構成を各バージョンで比較した

タイトルの通りですが、Oracle Databaseの各バージョンで、オプションの構成を比較しました。

12.1ではかなりオプションが削減されているように見えます。

                                                   12.1    11.2    11.1  10.2 
Oracle Active Data Guard                           ○      ○      ○    -     
Oracle Advanced Analytics(*2)                      ○      -      -    -
Oracle Advanced Compression                        ○      ○      ○    -     
Oracle Advanced Security                           ○      ○      ○    ○     
Oracle Content Database Suite                      -      -      -    ○     
Oracle Data Mining                                 -      ○      ○    ○     
Oracle Data Profiling and Qualityオプション        -      ○      ○    ○     
Oracle Data Watch and Repair Connector             -      ○      ○    ○     
Oracle Database Vault                              ○      ○      ○    ○     
Oracle In-Memory Database Cache                    ○      ○      ○    ○     
Oracle Label Security                              ○      ○      ○    ○     
Oracle Multitenant                                 ○      -      -    -     
Oracle On-Line Analytical Processing(OLAP)       ○      ○      ○    ○     
Oracle Partitioning                                ○      ○      ○    ○     
Oracle RAC One Node                                ○      ○      -    -     
Oracle Real Application Clusters(Oracle RAC)     ○      ○      ○    ○     
Oracle Real Application Testing                    ○      ○      ○    ○     
Oracle Records DB                                  -      -      -    ○     
Oracle Spatial                                     ○(*1)  ○(*1)  ○    ○     
Oracle Total Recall                                -      △(*3)  ○    -     
  (*1) Oracle Spatial and Graphと名称変更    
  (*2) おそらくOracle Data Mining に機能追加して名称変更した
  (*3) Oracle Advanced Compressionに統合? (11.2リリース当初は存在しような記憶がありますが・・)

Oracle Total Recall オプション(=フラッシュバックデータアーカイブ; FDA)のライセンスが、ちょっと複雑なので追記しておきます。

            FDA                         FDA+履歴の最適化
            --------------------------- -----------------------------
12.1        EE                          EE + Advanced Compression
11.2.0.4    EE                          EE + Advanced Compression
11.2(*a)    EE + Advanced Compression   ‐ (*b)
11.1        EE + Total Recall           ‐ (*b)

  (*a) 11.2.0.1-11.2.0.3
  (*b) 履歴の最適化は11.2.0.4より導入

修正履歴

  • 2014/3/7: フラッシュバックデータアーカイブについて追記+11.2のオプション情報が古かったので修正

適用済みパッチをSQLベースで確認する / DBMS_QOPATCH

Oracle DatabaseのパッチはOSコマンド OPatchで適用します。適用済みパッチの確認も同様です。

Oracle Database 12cからは、適用済みパッチをSQLベースで確認できるようになりました。 具体的には、DBMS_QOPATCHが提供するXMLドキュメントを返すファンクションを使用します。

GET_OPATCH_BUGSファンクション
パッチ番号が指定されている場合にXML形式でパッチのバグ・リストを作成します。パッチが指定されていない場合は、すべてのパッチにインストール済のすべてのバグがXML形式でリストされます。
GET_OPATCH_COUNTファンクション
インストール済のパッチの合計数をXML形式で作成します。
GET_OPATCH_DATAファンクション
パッチの最上位レベルのパッチ情報(パッチID、パッチの作成時間など)をXML要素で作成します。
GET_OPATCH_FILESファンクション
特定のパッチ番号で変更されたファイルのリストをXML形式で作成します。
GET_OPATCH_INSTALL_INFOファンクション
パッチやインベントリの場所など、ORACLE_HOMEの詳細を含むXML要素を戻します。
GET_OPATCH_LISTファンクション
XMLインベントリからXML要素としてインストール済のパッチのリストを作成します。
GET_OPATCH_LSINVENTORY
Opatchインベントリ全体をXMLインスタンス文書として戻します。
GET_OPATCH_OLAYSファンクション
特定のパッチのオーバーレイ・パッチをXML要素として作成します。
GET_OPATCH_PREQSファンクション
特定のパッチの前提条件パッチをXML要素として作成します。
GET_OPATCH_XSLT
Opatch XMLインベントリ表示のスタイルシートを戻します。
GET_PENDING_ACTIVITYファンクション
バイナリ・インベントリを問い合せることで、単一インスタンス上で適用されたSQLパッチに関連する情報を戻します。
GET_SQLPATCH_STATUSプロシージャ
完全なパッチ・レベルの情報を作成するために、SQLパッチ・レジストリから問い合せることでSQLパッチの状態を表示します。
IS_PATCH_INSTALLEDファンクション
XMLインベントリを問い合せることで、インストール済のパッチの情報(パッチID、適用日、SQLパッチ情報など)をXMLノードとして作成します。
PATCH_CONFLICT_DETECTIONファンクション
既存のパッチと競合する場合は、特定のファイルの競合するパッチを戻します。
SET_CURRENT_OPINSTプロシージャ
ノード名とインスタンスを設定して、Oracle Real Application Clusters(RAC)環境でその固有のインベントリの詳細を取得します。

12.1.0.1.2 (Jan 2014) Database Patch Set Update

試しに 12.1.0.1.2 (Jan 2014) Database Patch Set Update を適用してから、適用状況を確認してみます。まず、従来通りopatch lsinventoryでパッチの適用状況を確認します。

[oracle@l64rw3 17552800]$ opatch lsinventory
Oracle Interim Patch Installer version 12.1.0.1.0
Copyright (c) 2012, Oracle Corporation.  All rights reserved.


Oracle Home       : /u03/app/oracle/product/12.1.0.1/ee_1
Central Inventory : /u01/app/oraInventory
   from           : /u03/app/oracle/product/12.1.0.1/ee_1/oraInst.loc
OPatch version    : 12.1.0.1.0
OUI version       : 12.1.0.1.0
Log file location : /u03/app/oracle/product/12.1.0.1/ee_1/cfgtoollogs/opatch/opatch2014-03-06_15-18-38PM_1.log

Lsinventory Output file location : /u03/app/oracle/product/12.1.0.1/ee_1/cfgtoollogs/opatch/lsinv/lsinventory2014-03-06_15-18-38PM.txt

--------------------------------------------------------------------------------
Installed Top-level Products (2):

Oracle Database 12c                                                  12.1.0.1.0
Oracle Database 12c Examples                                         12.1.0.1.0
There are 2 products installed in this Oracle Home.


Interim patches (1) :

Patch  17552800     : applied on Thu Mar 06 15:14:53 JST 2014
Unique Patch ID:  16974186
Patch description:  "Database Patch Set Update : 12.1.0.1.2 (17552800)"
   Created on 3 Jan 2014, 03:21:20 hrs PST8PDT
   Bugs fixed:
     17034172, 16694728, 17439871, 16320173, 17082983, 16313881, 16715647
     17362796, 16450169, 16392068, 16977973, 14197853, 16712618, 17552800
     17922172, 17441661, 16524071, 16856570, 16410570, 16372203, 16849982
     16837842, 16459685, 16802693, 16978185, 16845022, 16195633, 14536110
     17579911, 16787973, 16850996, 17311728, 16838328, 16178562, 17244462
     16503473, 16935643, 14355775, 16362358, 16994576, 16928832, 16864359
     17080436, 16679874, 16788832, 16585173, 15986012, 14852021, 16191248
     17174391, 17249820, 16946990, 16589507, 16173738, 16874123, 16784143
     17343514, 17346196, 17324822, 16495802, 16859937, 16590848, 17068536
     16910001, 16527374, 16730813, 16663303, 16186165, 16675739, 16457621
     16170787, 16524968, 17032726, 16543323, 17005047, 17981677, 17442449
     16795944, 16668226, 16070351, 16698577, 17088068, 16621274, 17330580
     16888264, 16448848, 16863422, 16465158, 16634384, 17443671, 16816103
     16910734, 16911800, 16517900, 16825779, 17019974, 16707927, 16347904
     17263661, 17273253, 16902138, 17179261, 16465149, 17184677, 16689109
     16705020, 16864864, 16682595, 16972213, 16946613, 16721594, 16964279
     16855292, 17205719, 17026503, 16964686, 16674842, 16757934, 16864562
     15996344, 16842274, 17000176, 16769019, 17572525, 16485876, 16709437
     17289787, 16919176, 17217040, 16796277, 16462834, 16617325, 17308691
     16921340, 16784167, 16733884, 16483559, 16057129, 16822629, 16286774
     16660558, 17596344, 17570606, 16674666, 16697600, 16993424, 16772060
     16991789, 16790307, 16275522, 16603924, 16427054, 16227068, 16784901
     13521413, 16836849, 16007562, 16663465, 16551086, 17027533, 16675710
     16406802, 17465741, 17171530, 16523150, 16212405, 16741246, 16930325, 16443657



--------------------------------------------------------------------------------

OPatch succeeded.
[oracle@l64rw3 17552800]$

お馴染みの画面ですね。次に、DBMS_QOPATCH.GET_OPATCH_LSINVENTORY で確認してみます。

 SQL> set lines 80
 SQL> SELECT dbms_qopatch.get_opatch_lsInventory from dual;
 
 GET_OPATCH_LSINVENTORY
 --------------------------------------------------------------------------------
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <InventoryInstance> <ora
 cleHome> <UId>OracleHome-ef02b491-3460-4f22-9042-7d2413f4e5bf</UId> <targetTypeI
 d>oracle_home</targetTypeId> <patchingModel>oneoff</patchingModel> <path>/u03/ap
 p/oracle/product/12.1.0.1/ee_1</path> <targetTypeId>oracle_home</targetTypeId> <
 inventoryLocation>/u01/app/oraInventory</inventoryLocation> <isShared>false</isS
 hared> </oracleHome> <patches> <patch xmlns:xsi="http://www.w3.org/2001/XMLSchem
 a-instance" xsi:type="Patch"> <UId>Patch-14b935d2-4a1b-424f-995b-f3e719ff2c10</U
 Id> <patchID>17552800</patchID> <bugs> <bug id="17034172"> <UId>FlexibleDataType
 -b4cb3b19-0662-44e6-b40d-53353dc29156</UId> <description>LX64_MAIN_CDB ORA-7445
 R DUE TO RANDOM SGA CORRUPTION</description> </bug> <bug id="16694728"> <UId>Fle
 xibleDataType-29804b8e-d5d8-4baa-a1b7-68bbb6c01463</UId> <description>MSGQ LSM1
 HITS ORA-600 [KJBLPGORM !ANTILOCK]</description> </bug> <bug id="17439871"> <UId
 >FlexibleDataType-4e7f7da0-ba9d-4cd6-a724-2d9a353b0300</UId> <description>TT12.1
 .0.2SQLFUZZ2 DROP CMN USR THROWS ORA-600 [KQLOBJLOD-NO-RESULT-FROM-PROC$]</descr
 (略)

おっとっと、人間が読めるような形式ではないですね。ということで、 DBMS_QOPATCHが提供するOpatch XMLインベントリ表示のスタイルシートを使って整形します。 スタイルシートは、DBMS_QOPATCH.GET_OPATCH_XSLTから得られますので、

SQL> select xmltransform(DBMS_QOPATCH.GET_OPATCH_LSINVENTORY, DBMS_QOPATCH.GET_OPATCH_XSLT) from dual;

XMLTRANSFORM(DBMS_QOPATCH.GET_OPATCH_LSINVENTORY,DBMS_QOPATCH.GET_OPATCH_XSLT)
--------------------------------------------------------------------------------

Oracle Querayable Patch Interface 1.0
--------------------------------------------------------------------------------

Oracle Home       : /u03/app/oracle/product/12.1.0.1/ee_1
Inventory         : /u01/app/oraInventory
--------------------------------------------------------------------------------
Installed Top-level Products (1):
Oracle Database 12c                                    12.1.0.1.0
Installed Products ( 145)

Oracle Database 12c                                         12.1.0.1.0
Oracle Database 12c Examples                                12.1.0.1.0
Sun JDK                                                     1.6.0.37.0
oracle.swd.oui.core.min                                     12.1.0.1.0
Installer SDK Component                                     12.1.0.1.0
Oracle One-Off Patch Installer                              12.1.0.1.0
  (略)
Oracle Spatial and Graph Demos                              12.1.0.1.0
Oracle JDBC Development Drivers                             12.1.0.1.0


Interim patches:

Patch(sqlpatch) 17552800:   applied on 2014-03-06T15:14:53+09:00
Unique Patch ID: 16974186
  Patch Description: Database Patch Set Update : 12.1.0.1.2 (17552800)
  Created on     : 3 Jan 2014, 03:21:20 hrs PST8PDT
  Bugs fixed:
         17034172  16694728  17439871  16320173  17082983  16313881  16715647  1
7362796  16450169  16392068  16977973  14197853  16712618  17552800  17922172  1
7441661  16524071  16856570  16410570  16372203  16849982  16837842  16459685  1
6802693  16978185  16845022  16195633  14536110  17579911  16787973  16850996  1
7311728  16838328  16178562  17244462  16503473  16935643  14355775  16362358  1
6994576  16928832  16864359  17080436  16679874  16788832  16585173  15986012  1
4852021  16191248  17174391  17249820  16946990  16589507  16173738  16874123  1
6784143  17343514  17346196  17324822  16495802  16859937  16590848  17068536  1
6910001  16527374  16730813  16663303  16186165  16675739  16457621  16170787  1
6524968  17032726  16543323  17005047  17981677  17442449  16795944  16668226  1
6070351  16698577  17088068  16621274  17330580  16888264  16448848  16863422  1
6465158  16634384  17443671  16816103  16910734  16911800  16517900  16825779  1
7019974  16707927  16347904  17263661  17273253  16902138  17179261  16465149  1
7184677  16689109  16705020  16864864  16682595  16972213  16946613  16721594  1
6964279  16855292  17205719  17026503  16964686  16674842  16757934  16864562  1
5996344  16842274  17000176  16769019  17572525  16485876  16709437  17289787  1
6919176  17217040  16796277  16462834  16617325  17308691  16921340  16784167  1
6733884  16483559  16057129  16822629  16286774  16660558  17596344  17570606  1
6674666  16697600  16993424  16772060  16991789  16790307  16275522  16603924  1
6427054  16227068  16784901  13521413  16836849  16007562  16663465  16551086  1
7027533  16675710  16406802  17465741  17171530  16523150  16212405  16741246  1
6930325  16443657
  Files Touched:

    /nae.o
    ins_net_client.mk
    /jox.o
    /kcb.o
    /kcbo.o
    (略)
    ins_rdbms.mk
    ins_rdbms.mk
    catuppst.sql
    cdenv.sql
    spawrio.sql
    prvtlmd.plb
    prvtbstr.plb
    prvtbxstr.plb
    ins_rdbms.mk



SQL>

として、xmltransformファンクションで整形して、見やすい形で確認出来ました。

DBMS_UTILITY.EXPAND_SQL_TEXTでビューへのSELECT文を再帰展開

Oracle Database 12cから、ビューへ発行されたSELECT文を再帰的に展開する機能が追加されました。 (実は昔からあったそうですが・・・後述)

例を用いて説明するのが理解がはやいでしょう。テーブルbase に対してビューv1を、ビューv1に対してビューv2を定義します。

SQL> create table base (i number, c varchar(80));

表が作成されました。

SQL> insert into base values(1, 'AAA');

1行が作成されました。

SQL> insert into base values(1, 'AAC');

1行が作成されました。

SQL> insert into base values(2, 'BBB');

1行が作成されました。

SQL> commit;

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

SQL>
SQL> create view v1 as select i,c from base WHERE i = 1;

ビューが作成されました。

SQL> create view v2 as select i,c from v1 WHERE c = 'AAA';

ビューが作成されました。

SQL> SELECT * FROM v2;

         I C
---------- --------------------------------------------------------------------------------
         1 AAA

テーブルbase ←ビューv1 ← ビューv2の関係になっており、ビューv2に対するSELECTは当然正常に実行できます。このSELECT文をDBMS_UTILITY.EXPAND_SQL_TEXTでベースとなるテーブルのSELECT文に展開してみます。展開処理は再帰的に実行されるので、ビューが多段でもOKです。

SQL> set long 2000000000
SQL> set pagesize 0
SQL> set serveroutput on
SQL> declare
  2     original_sql clob :='SELECT * FROM v2';
  3     expanded_sql clob := empty_clob();
  4  begin
  5      dbms_utility.expand_sql_text(original_sql,expanded_sql);
  6      dbms_output.put_line(expanded_sql);
  7  end;
  8  /
SELECT "A1"."I" "I","A1"."C" "C" FROM  (SELECT "A2"."I" "I","A2"."C" "C" FROM  (SELECT "A3"."I" "I","A3"."C" "C" FROM
RYWATABE."BASE" "A3" WHERE "A3"."I"=1) "A2" WHERE "A2"."C"='AAA') "A1"

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

DBMS_SQL2.EXPAND_SQL_TEXT

では、この機能は実は過去のバージョンより存在していたという指摘があります。

されて、DBMS_SQL2.EXPAND_SQL_TEXTを使って同様の処理を・・・と思いましたが

SQL> declare
  2      m_sql_in    clob :='SELECT * FROM v2';
  3      m_sql_out   clob := empty_clob();
  4  begin
  5      dbms_sql2.expand_sql_text(m_sql_in,m_sql_out);
  6      dbms_output.put_line(m_sql_out);
  7  end;
  8  /
    dbms_sql2.expand_sql_text(m_sql_in,m_sql_out);
    *
行5でエラーが発生しました。:
ORA-06550: 行5、列5:
PLS-00201: 識別子DBMS_SQL2.EXPAND_SQL_TEXTを宣言してください。 ORA-06550:
行5、列5:
PL/SQL: Statement ignored

SQL> desc dbms_sql2
ERROR:
ORA-04043: オブジェクトdbms_sql2は存在しません。


SQL> desc sys.dbms_sql2
ERROR:
ORA-04043: オブジェクトsys.dbms_sql2は存在しません。

12.1.0.1ではすでにDBMS_SQL2パッケージが削除されているようです。

11.2.0.3ではDBMS_SQL2パッケージがあり、DBMS_SQL2.EXPAND_SQL_TEXTで同様の処理が可能でした。 知らなかった・・・

SQL> SELECT * FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE    11.2.0.3.0      Production
TNS for Linux: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production

SQL> set long 2000000000
SQL> set pagesize 0
SQL> set serveroutput on
SQL> declare
  2      m_sql_in    clob :='SELECT * FROM v2';
  3      m_sql_out   clob := empty_clob();
  4  begin
  5      dbms_sql2.expand_sql_text(m_sql_in,m_sql_out);
  6      dbms_output.put_line(m_sql_out);
  7  end;
  8  /
SELECT "A1"."I" "I","A1"."C" "C" FROM  (SELECT "A2"."I" "I","A2"."C" "C" FROM  (SELECT "A3"."I" "I","A3"."C" "C" FROM RYWATABE."BASE" "A3" WHERE "A3"."I"=1) "A2" WHERE "A2"."C"='AAA') "A1"

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

プロフィール

Ryota WATABE / 渡部 亮太

100x100.jpg

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

  • Oracle Database 12c Administrator Certified Professional (ORACLE MASTER Gold Oracle Database 12c)
  • Oracle Database 11g Certified Master (ORACLE MASTER Platinum Oracle Database 11g)
  • Oracle Database 11g Data Warehousing Certified Implementation Specialist
  • Oracle Database 11g Security Certified Implementation Specialist
  • Oracle Certified Expert, Oracle Real Application Clusters 11g and Grid Infrastructure Administrator
  • Oracle Certified Expert, Oracle Exadata X3 Administrator
  • Oracle Exadata 11g Certified Implementation Specialist
  • Oracle Database 10g Certified Master (ORACLE MASTER Platinum Oracle Database 10g)
  • Oracle Database 10g Managing Oracle on Linux Certified Expert
  • Oracle Database 10g: Real Application Clusters Administrator Certified Expert
  • Oracle PL/SQL Developer Certified Associate
  • Oracle Certified Professional, MySQL 5 Database Administrator
  • Cisco Certified Network Associate (CCNA)
  • Cisco Certified Network Associate Security (CCNA Security)
  • OSS-DB Gold (PostgreSQL 9)
  • OSS-DB Silver (PostgreSQL 9)
  • LPIC 301 Core (Linux)
  • Oracle Certified Java Programmer, Silver SE 7

カテゴリー

Powered by
Movable Type 3.34