Oracle Rdb for OpenVMS

Oracle® Rdb for OpenVMS

リリース・ノート

リリース7.2.2.0


2008年5月

Oracle Rdbリリース・ノート, リリース7.2.2.0 for OpenVMS

部品番号: E06180-01

原本名: Oracle Rdb Release Notes, Release 7.2.2.0 for OpenVMS

Copyright © 1984, 2007 Oracle Corporation. All rights reserved.

制限付権利の説明

このプログラム(ソフトウェアおよびドキュメントを含む)には、オラクル社およびその関連会社に所有権のある情報が含まれています。このプログラムの使用または開示は、オラクル社およびその関連会社との契約に記された制約条件に従うものとします。著作権、特許権およびその他の知的財産権と工業所有権に関する法律により保護されています。

独立して作成された他のソフトウェアとの互換性を得るために必要な場合、もしくは法律によって規定される場合を除き、このプログラムのリバース・エンジニアリング、逆アセンブル、逆コンパイル等は禁止されています。

このドキュメントの情報は、予告なしに変更される場合があります。オラクル社およびその関連会社は、このドキュメントに誤りが無いことの保証は致し兼ねます。これらのプログラムのライセンス契約で許諾されている場合を除き、プログラムを形式、手段(電子的または機械的)、目的に関係なく、複製または転用することはできません。

このプログラムが米国政府機関、もしくは米国政府機関に代わってこのプログラムをライセンスまたは使用する者に提供される場合は、次の注意が適用されます。

U.S. GOVERNMENT RIGHTS

Programs, software, databases, and related documentation and technical data delivered to U.S. Government customers are "commercial computer software" or "commercial technical data" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the Programs, including documentation and technical data, shall be subject to the licensing restrictions set forth in the applicable Oracle license agreement, and, to the extent applicable, the additional rights set forth in FAR 52.227-19, Commercial Computer Software--Restricted Rights (June 1987). Oracle Corporation, 500 Oracle Parkway, Redwood City, CA 94065.

このプログラムは、核、航空、大量輸送、医療あるいはその他の本質的に危険を伴うアプリケーションで使用されることを意図しておりません。このプログラムをかかる目的で使用する際、上述のアプリケーションを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。万一かかるプログラムの使用に起因して損害が発生いたしましても、オラクル社およびその関連会社は一切責任を負いかねます。

Oracleは米国Oracle Corporationの登録商標です。Hot Standby、LogMiner for Rdb、Oracle CDD/Repository、Oracle CODASYL DBMS、Oracle Expert、Oracle Rdb、Oracle RMU、Oracle RMUwin、Oracle SQL/Services、Oracle Trace、Rdb7は米国Oracle Corporationの商標または登録商標です。その他の名称は、他社の商標の可能性があります。


目次


はじめに

このマニュアルの目的

このマニュアルは、Oracle Rdbリリース7.2.2.0のリリース・ノートです。このリリース・ノートでは、変更された機能と拡張機能、アップグレードと互換性に関する情報、新規および既存のソフトウェアの問題点と制限事項、ソフトウェアとドキュメントの修正事項について説明します。

対象読者

このマニュアルは、すべてのOracle Rdbユーザーによって使用されることを目的としています。Oracle Rdbリリース7.2.2.0をインストール、アップグレードまたは使用する前にこのマニュアルに目を通してください。

ドキュメントの構造

このマニュアルの内容は次のとおりです。
第1章 Oracle Rdbリリース7.2.2.0のインストール方法について説明します。
第2章 Oracle Rdbリリース7.2.2.0で修正される問題について説明します。
第3章 Oracle Rdbリリース7.2.1.4で修正される問題について説明します。
第4章 Oracle Rdbリリース7.2.1.3で修正される問題について説明します。
第5章 Oracle Rdbリリース7.2.1.2で修正される問題について説明します。
第6章 Oracle Rdbリリース7.2.1.1で修正される問題について説明します。
第7章 Oracle Rdbリリース7.2.1.0で修正される問題について説明します。
第8章 Oracle Rdbリリース7.2.2.0で導入される拡張機能について説明します。
第9章 Oracle Rdbリリース7.2.1.4で導入される拡張機能について説明します。
第10章 Oracle Rdbドキュメント・セットで現在入手できない情報を示します。
第11章 Oracle Rdbリリース7.2.2.0に存在する既知の問題、制限事項および回避策について説明します。


第1章
Oracle Rdbリリース7.2.2.0のインストール

このソフトウェアの更新は、OpenVMSのVMSINSTALユーティリティを使用してインストールします。


注意

Oracle Rdbリリース7.2キットは完全なキットです。新しいRdbリリース7.2キットのインストール時に以前のリリースのOracle Rdbをインストールする必要はありません。

1.1 HP OpenVMS Industry Standard 64のOracle Rdb

Oracle Rdb製品ファミリは、HP OpenVMS Industry Standard 64プラットフォームとOpenVMS AlphaServerプラットフォームで利用できます。通常、OpenVMS Alpha上のOracle Rdbの機能は、OpenVMS Industry Standard 64上のOracle Rdbで使用できます。ただし、プラットフォーム間の一部の違いによって、性能や機能にわずかな相違が生じる場合があります。

Oracle Rdbリリース7.2のデータベースの形式は、I64プラットフォームとAlphaプラットフォームで同じです。クラスタ環境では、どちらのアーキテクチャからも同時にデータベースにアクセスできます。(AlphaまたはVAXプラットフォーム上の)以前のRdbバージョンまたはネットワーク上の他のシステムからOracle Rdbリリース7.2データベースにアクセスするには、Oracle Rdbのリモート・データベース・サーバーを使用できます。

1.2 要件

このソフトウェアをインストールするには、次の条件を満たす必要があります。

1.3 Intel Itaniumプロセッサ9100 Montvaleのサポート

HP Integrityサーバー上のこのリリースのOracle Rdbでは、サポートされている最新のプロセッサはIntelデュアルコアItanium 2プロセッサ9100シリーズ(コード・ネームMontvale)です。

1.4 OpenVMSの最大バージョンの確認

このリリースのOracle Rdbに対してサポートされる最大バージョンのOpenVMSはOpenVMSバージョン8.3-xです。

OpenVMSオペレーティング・システムのバージョンとサポートされるハードウェア・プラットフォームは、インストール時と実行時に確認されます。保証されていないバージョンのOpenVMSまたはハードウェア・プラットフォームがインストール時に検出されると、インストールは中断します。保証されていないバージョンのOpenVMSまたはハードウェア・プラットフォームが実行時に検出されると、Oracle Rdbは起動しません。

1.5 データベース形式の変更

Oracle Rdbのディスク上のデータベース形式が721になりました。Oracle Rdbリリース7.0または7.1で作成またはアクセスされたデータベースにRdbリリース7.2でアクセスするには、RMU/CONVERT操作が必要です。

Oracle Rdbリリース7.2にアップグレードする前、および既存のデータベースをOracle Rdbリリース7.2の形式に変換する前に、データベースの全体検証(RMU /VERIFY /ALLコマンドを使用)とデータベースの全体バックアップ(RMU /BACKUPコマンドを使用)を実行して、有効で保護されたデータベースのコピーを確保しておくことを強くお薦めします。

1.6 リリース7.0より前のデータベースの使用

Oracle Rdbリリース7.0の形式よりも前のデータベースは、Oracle Rdbリリース7.2の形式に直接変換またはリストアすることはできません。Oracle Rdbリリース7.2のRMU Convertコマンドは、Oracle Rdbリリース7.0およびリリース7.1の形式のデータベースからの変換のみをサポートします。Oracle Rdbリリース3.0からリリース6.1までの形式のデータベースまたはデータベース・バックアップを使用している場合、最低でもOracle Rdbリリース7.0の形式に変換してから、Oracle Rdbリリース7.2の形式に変換する必要があります。たとえば、Oracle Rdbリリース4.2の形式のデータベースを使用している場合、まず最低でもOracle Rdbリリース7.0の形式に変換してから、Oracle Rdbリリース7.2の形式に変換する必要があります。

Oracle Rdbリリース7.0の形式よりも前のデータベースをOracle Rdbリリース7.2の形式に直接変換またはリストアしようとすると、Oracle RMUでエラーが生成されます。

1.7 VMSINSTALプロシージャの起動

Oracle Rdbのインストール・プロシージャは、Oracle Rdbの以前のメジャー・リリースと比較すると簡素化されています。Oracle Rdbのすべてのコンポーネントが常にインストールされ、インストール時のプロンプトの数が少なくなりました。インストール・プロシージャは、Oracle Rdb for OpenVMS Alphaの場合もOracle Rdb for OpenVMS I64の場合も同じです。

インストール・プロシージャを開始するには、次の例のようにVMSINSTALコマンド・プロシージャを起動します。

device-name

メディアがマウントされるデバイスの名前を使用します。デバイスがディスクタイプのドライブの場合、ディレクトリも指定する必要があります。たとえば、DKA400:[RDB.KIT]のようになります。

1.8 インストールの停止

インストール・プロシージャを停止するには、常に[Ctrl] + [Y]を押します。[Ctrl] + [Y]を押すと、インストール・プロシージャは、その時点までに作成したファイルをすべて削除して終了します。これで、インストールを再度開始できます。

VMSINSTALでインストール時になんらかの問題が検出された場合、ユーザーに通知され、続行するかどうかを尋ねるプロンプトが表示されます。インストールを続行して、他にも問題があるかどうかを確認できます。ただし、インストールされたOracle Rdbのコピーは使用できない可能性があります。

1.9 Oracle Rdbのインストール後

この更新では、Oracle Rdbの新しいOracle TRACE機能定義が提供されます。更新されたOracle Rdb機能定義の新機能リリース番号RDBVMSV7.2を反映するために、Oracle Rdbを参照するOracle TRACEの選択内容を再定義する必要があります。

システムにOracle TRACEをインストールして、Oracle Rdbのために収集する場合、この更新キットに付属の新しいOracle Rdb機能定義を挿入する必要があります。

インストール・プロシージャでは、EPC$FACILITY.TLBと呼ばれるライブラリ・ファイルにOracle Rdb機能定義を挿入します。Oracle TRACEを使用してOracle Rdbのイベント・データを収集できるようにするには、Oracle TRACEの管理データベースにこの機能定義を移動する必要があります。次の手順を実行します。

  1. 定義を機能ライブラリからファイル(この場合はRDBVMS.EPC$DEF)に抽出します。
    $ LIBRARY /TEXT /EXTRACT=RDBVMSV7.2 -
    _$ /OUT=RDBVMS.EPC$DEF SYS$SHARE:EPC$FACILITY.TLB
    
  2. Oracle TRACEの管理データベースに機能定義を挿入します。
    $ COLLECT INSERT DEFINITION RDBVMS.EPC$DEF /REPLACE
    

INSERT DEFINITIONコマンドを実行するプロセスでは、Oracle TRACEの管理データベースの作成に使用するバージョンと一致するバージョンのOracle Rdbを使用する必要があります。バージョンが一致していない場合、INSERT DEFINITIONコマンドは失敗します。

1.10 VMS$MEM_RESIDENT_USER権限の修飾子が必要

Oracle Rdbリリース7.1では、データベースまたは行キャッシュの属性RESIDENT、SHARED MEMORY IS SYSTEMおよびLARGE MEMORY IS ENABLEDに対する追加の権限の実行が導入されました。データベースでこのような機能を使用する場合、データベースを開くユーザー・アカウントには、VMS$MEM_RESIDENT_USER権限の修飾子が付与される必要があります。

これらの機能を使用する場合、RMU/OPENコマンドを使用することをお薦めします。

1.11 インストール、構成、移行、アップグレードの推奨事項

Oracle Rdbリリース7.2は、AlphaServerシステムおよびHP Integrityサーバーの混合アーキテクチャ・クラスタを完全にサポートしています。

特定の開発環境では、AlphaServerシステムとHP IntegrityサーバーのクラスタにVAXシステムを組み込むと便利な場合があります。HP社とオラクル社では、ほとんどの場合、この組込みが原因でコンピューティング環境に問題が生じることはないと考えていますが、十分なサポートを提供できるほどの広範囲なテストは行っていません。クラスタ内のVAXシステムが原因でクラスタのパフォーマンスや安定性に問題が生じる可能性はあります。万が一問題が発生した場合は、問題の原因となっているクラスタ内のVAXシステムを削除してください。

オラクル社では、Rdbリリース7.0を使用して直接データベースにアクセスする、VAXシステムとAlphaServerシステムによる混合アーキテクチャ・クラスタを引き続きサポートします。Oracle Rdbリリース7.1は、Alphaシステムとクラスタでネイティブに実行されます。Rdbのすべてのバージョンには、組込みのリモート・ネットワーク・データベース・サーバーが付属しています。これにより、アーキテクチャ間およびバージョン間におけるアプリケーションやデータベースのアクセスが可能になります。

既存のAlphaまたはVAX構成から、Integrityサーバー・システムを含む新しい環境にアプリケーションを移動する場合、可能なパスが数多くあります。これは各サイトの要件に応じて異なります。通常、ノードがHP Integrityサーバーであることを除けば、この移動は既存のAlphaServerシステムのクラスタまたはスタンドアロンのシステムに新しいノードを追加するのと同じくらい簡単です。表1-1「移行の提案」で、考えられる状況と推奨手順について考えます。

表1-1 移行の提案
ケース 希望する動作 推奨手順
1 Alphaサーバーの既存のクラスタにIntegrityサーバーを追加します。
  1. RMU/VERIFY/ALLを使用してデータベースを検証します。
  2. RMU/BACKUPを使用してデータベースをバックアップします。
  3. IntegrityノードおよびAlphaノードにRdb 7.2をインストールします。
  4. RMU/CONVERTを使用して、データベースをRdb 7.2構造レベルに変換します。
  5. RMU/VERIFY/ALLを使用してデータベースを再検証します。
  6. RMU/BACKUPを使用してデータベースをバックアップします。
  7. SQL ATTACH文にデータベースのルート・ファイルの仕様を指定して、AlphaおよびIntegrityから直接データベースにアクセスします。
2 VAXノードとAlphaノードによる既存の混合クラスタにIntegrityサーバーを追加し、すべてのノードからRdbデータベースにアクセスします。データベースに使用するディスクは、すべてのノードからアクセスできます。
  1. RMU/VERIFY/ALLを使用してデータベースを検証します。
  2. RMU/BACKUPを使用してデータベースをバックアップします。
  3. IntegrityノードおよびAlphaノードにRdb 7.2をインストールします。
  4. RMU/CONVERTを使用して、データベースをRdb 7.2構造レベルに変換します。
  5. RMU/VERIFY/ALLを使用してデータベースを再検証します。
  6. RMU/BACKUPを使用してデータベースをバックアップします。
  7. SQL ATTACH文にデータベースのルート・ファイルの仕様を指定して、AlphaノードおよびIntegrityノードから直接データベースにアクセスします。
  8. SQL ATTACH文にAlphaノード名またはIntegrityノード名のいずれかを指定することにより、Rdbの組込みネットワーク・サーバー(リモート・データベース)を使用してVAXノードからデータベースにアクセスします。
  9. テストが完全に終了したら、クラスタからVAXノードを削除します。
3 新しいディスクにデータベースを移動し、既存のクラスタにIntegrityサーバーを追加します。
  1. RMU/COPYをオプション・ファイルと一緒に使用して、新しいディスクにデータベース・ファイルを移動します。
  2. ケース1またはケース2の手順を実行します。
4 以前のリリースを使用して、主にVAXノードまたはAlphaノードから引き続きRdbを使用します。アプリケーションのテストを行う目的で、Integrityサーバーを追加します。
  1. IntegrityノードにRdb 7.2をインストールします。
  2. SQL ATTACH文にAlphaノード名またはVAXノード名のいずれかを指定して、Integrityノードから既存のデータベースにアクセスします。
  3. テストが完了したら、ケース1またはケース2の手順を実行します。
5 Alphaサーバーの既存のクラスタにIntegrityサーバーを追加するか、または1つ以上の新しいIntegrityサーバーを追加することで既存のスタンドアロンのAlphaサーバーから新しいクラスタを作成します。
  1. RMU/VERIFY/ALLを使用してデータベースを検証します。
  2. RMU/BACKUPを使用してデータベースをバックアップします。
  3. IntegrityノードおよびAlphaノードにRdb 7.2をインストールします。
  4. RMU/CONVERTを使用して、データベースをRdb 7.2構造レベルに変換します。
  5. RMU/VERIFY/ALLを使用してデータベースを再検証します。
  6. RMU/BACKUPを使用してデータベースをバックアップします。
  7. SQL ATTACH文にデータベースのルート・ファイルの仕様を指定して、AlphaおよびIntegrityから直接データベースにアクセスします。
6 新しいスタンドアロンのIntegrityサーバー・システムまたはIntegrityサーバーのクラスタを作成し、新しい環境にデータベースを移動します。
  1. RMU/VERIFY/ALLを使用してデータベースを検証します。
  2. 新しいシステムにRdb 7.2をインストールします。
  3. RMU/BACKUPを使用して既存のクラスタでデータベースをバックアップします。
  4. 新しいシステムにバックアップ・ファイルをコピーします(またはテープ・メディアを使用している場合、テープを新しいシステムで使用できるようにします)。
  5. オプション・ファイルに各データベース・ファイルの場所を指定するRMU/RESTOREを使用して、新しいシステムでデータベースをリストアします。
  6. RMU/VERIFY/ALLを使用して新しいデータベースを検証します。

RMUとリモート・データベースの使用に関する追加情報と詳細は、Oracle Rdbのドキュメント・セットを参照してください。

クラスタの多くのシステムからデータベースにアクセスする場合、データベース・パラメータを変更する必要があることに注意してください。


第2章
Oracle Rdbリリース7.2.2.0で修正されるソフトウェアの誤り

この章では、Oracle Rdbリリース7.2.2.0で修正されるソフトウェアの誤りについて説明します。

2.1 すべてのインタフェースに適用されるソフトウェアの誤りの修正

2.1.1 VLMグローバル・バッファを使用する場合のシステム・クラッシュ

きわめて稀な状況ですが、グローバル・バッファVLM(大容量メモリー)機能を使用する場合、Oracle RdbでOpenVMSシステムがクラッシュし、バグチェックMACHINECHK, Machine check while in kernel modeが発生することがありました。MACHINECHKは、無効なPFN(ページ・フレーム番号)の値がPTE(ページ表エントリ)にロードされることでトリガーされます。

この問題を回避するには、ALTER DATABASE ... GLOBAL BUFFERS ...LARGE MEMORY IS DISABLEDを指定して、Oracle Rdbのグローバル・バッファVLM(大容量メモリー)機能の使用を中止します。

この問題はOracle Rdbリリース7.2.2で修正されました。Oracle RdbのVLM機能では、割り当てられたPFNマップの限度を超えてアクセスすることはできなくなりました。

2.1.2 リリース7.1.1からリリース7.1.5.1へのアップグレード後の問合せでバグチェックが発生する

Oracle Bug#6448202

リリース7.1.1からリリース7.1.5.1にアップグレードした後、問合せでバグチェックが発生します。この問合せは、3つの複雑なビューで複数の表を結合します。

次のSQLフラグを定義することで動的オプティマイザを無効にする場合、問合せは成功します。

set flags 'max_stability';

この問題は、Oracle Bug#4597186の修正によってOracle Rdbリリース7.1.4.2に導入されましたが、最新のユーザー・レポートでは何も報告されていません。多重にネストされたクロス・ストラテジでの検索ブロックの1つが、最上部の親問合せに到達することにより、動的オプティマイザLEAFノードを適用しました。

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.1.3 Rdbリリース7.0からリリース7.2のアップグレード後、問合せがループしてハングする

Oracle Bug#6459494

Rdbリリース7.0.6からRdb 7.2リリースへのアップグレード後、問合せがループしてハングします。次の問合せは簡略化されたものですが、同じ動作を示しています(パフォーマンスはきわめて遅い)。

set flags 'strategy';
SELECT count(*)
     FROM PM P, KOSE K
     WHERE
         P.PROD = 'RSS' AND
         EXISTS(SELECT *
                 FROM KSU_V KV
                 WHERE
                     P.PROD = KV.PROD AND
                     P.PROD = K.PROD );
Aggregate
Cross block of 2 entries
  Cross block entry 1
    Match
      Outer loop      (zig-zag)
        Index only retrieval of relation KOSE
          Index name  IDX_KOSE [1:1]
      Inner loop      (zig-zag)
        Index only retrieval of relation PM
          Index name  IDX_PM [1:1]
  Cross block entry 2
    Conjunct        Aggregate-F1    Conjunct
    Merge of 2 entries
      Merge block entry 1
      Conjunct        Index only retrieval of relation KSU
        Index name  KSU_IDX [0:0]
      Merge block entry 2
      Cross block of 3 entries
        Cross block entry 1
          Conjunct
          Merge of 1 entries
            Merge block entry 1
            Reduce  Conjunct
            Index only retrieval of relation KSU
              Index name  KSU_IDX [1:1]
        Cross block entry 2
          Conjunct
          Merge of 1 entries
            Merge block entry 1
            Index only retrieval of relation KOSEIUNIT_PSIYO
              Index name  KSU_IDX_1 [4:4]
        Cross block entry 3
          Conjunct        Aggregate-F1
          Index only retrieval of relation KSU
            Index name  KSU_IDX [6:6]

ビューKSU_Vには、UNION All句が含まれています。

create view KSU_V
    (PROD, ATTCD, UGRP, UBLK, USEQ, PSIYO) AS
    select C2.PROD, C2.ATTCD, C2.UGRP, C2.UBLK, C2.USEQ, C2.PSIYO
        from KSU C2
    union all
    select C3.F1, C3.F2, C3.F3, C3.F4, C3.F5, C6.PSIYO
        from
            (select C5.PROD, C5.ATTCD, C5.UGRP, C5.UBLK, C5.USEQ
                from KSU C5
                group by C5.PROD, C5.ATTCD, C5.UGRP, C5.UBLK, C5.USEQ)
            as C3 (F1, F2, F3, F4, F5),
            (select C7.PROD, C7.UGRP, C7.UBLK, C7.USEQ, C7.PSIYO
                from KOSEIUNIT_PSIYO C7
                where ((((C7.PROD = C3.F1)
                    and (C7.UGRP = C3.F3))
                    and (C7.UBLK = C3.F4))
                    and (C7.USEQ = C3.F5)))
            as C6 (PROD, UGRP, UBLK, USEQ, PSIYO)
        where (not exists (select * from KSU C8
            where ((((((C8.PROD = C3.F1)
                and (C8.ATTCD = C3.F2))
                and (C8.UGRP = C3.F3))
                and (C8.UBLK = C3.F4))
                and (C8.USEQ = C3.F5))
                and (C8.PSIYO = C6.PSIYO))));

この問題もRdbリリース7.1.5.1とRdbリリース7.2.1.3の両方に存在します。ただし、Rdbリリース7.0.9では、問合せは実際に素早く実行されます。

この問題の回避策はありません。これは、Rdbリリース7.1.5.1のOracle Bug#5567495および4747999の修正によって生じたリグレッションであるためです。

ビューにUNIONの最初の区間があるため、ストラテジでは、次の問題となっている索引の全索引スキャンが使用されます。

  Cross block entry 2
    Conjunct        Aggregate-F1    Conjunct
    Merge of 2 entries
      Merge block entry 1
      Conjunct        Index only retrieval of relation KSU
        Index name  KSU_IDX [0:0]                <==
      Merge block entry 2

索引KSU_IDXは次のように定義されます。

create index KSU_IDX on KSYU
        (PROD, ATTCD, UGRP, UBLK, USEQ, PSIYO);

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.1.4 RDMS$$INTERP_COMPILEでのバグチェック

Oracle Bug#6505717

I64システムでランタイム・ネイティブ・コンパイラを使用する稀なケースでは、MOV_x命令がRDMS$$INTERP_COMPILE内で次のような内容のバグチェックをトリガーすることがありました。

***** Exception at FFFFFFFF8603B040 :
    RDMSHRP72\RDMS$$INTERP_COMPILE + 0004CC71
%COSI-F-BUGCHECK, internal consistency failure
Saved PC = FFFFFFFF85EFAE90 : RDMSHRP72\RDMS$$GEVX_RET_FINISH + 00000DD0
Saved PC = FFFFFFFF85E5A520 : RDMSHRP72\RDMS$$CREATE_EMOD + 00003CD0
Saved PC = FFFFFFFF85EDB9A0 : RDMSHRP72\RDMS$$SETUP_ACTION + 000000F0
Saved PC = FFFFFFFF85EBA850 : RDMSHRP72\RDMS$$PRE_EXECUTION + 00002020
Saved PC = FFFFFFFF85E874B0 : RDMSHRP72\RDMS$$COMPILE_FOR_IF + 00004340
Saved PC = FFFFFFFF85E79D00 : RDMSHRP72\RDMS$$COMPILE_STMT + 00001420
Saved PC = FFFFFFFF85E78D20 : RDMSHRP72\RDMS$$COMPILE_STMT + 00000440
Saved PC = FFFFFFFF85E7CC30 : RDMSHRP72\RDMS$$COMPILE_STMT + 00004350
Saved PC = FFFFFFFF85E78D20 : RDMSHRP72\RDMS$$COMPILE_STMT + 00000440
Saved PC = FFFFFFFF85E78D20 : RDMSHRP72\RDMS$$COMPILE_STMT + 00000440
Saved PC = FFFFFFFF85E767F0 : RDMSHRP72\RDMS$$DSDI_COMPILE + 00001F10
Saved PC = FFFFFFFF85FD3CC0 : RDMSHRP72\RDMS$TOP_COMPILE_REQUEST + 00002350
Saved PC = FFFFFFFF867261A0 : RDMSHRP72\AMAC$EMUL_CMPC5 + 00002040
Saved PC = FFFFFFFF86381C60 : RDMSHRP72\KODSTREAM$JACKET + 00000130

この問題はOracle Rdbリリース7.2.2で修正されました。コードは、考えられるソースと宛先のすべての組合せのアドレッシング・モードを正しく処理するようになりました。

2.1.5 マップ済の共有メモリーが常駐するデータベースを開こうとすると、Duplicate NOGDBL name、またはRDMS-F-CANTCREGBLおよびCOSI-F-BADPARAMが発生する

Oracle Bug#6495572

データベース属性SHARED MEMORY IS PROCESS RESIDENTを使用する場合、(かなり大きなグローバル・セクションを含む高負荷システムでのみ)Rdbモニター・プロセスでグローバル・セクションの予期しない再マッピングを検出することがありました。モニター・プロセスはデータベースのグローバル・セクションを一意の名前で作成しようとしますが、以前のグローバル・セクションが誤ってマップされたままになっていました。

ユーザー・プロセスでデータベースを再度開くか、またはデータベースにアクセスしようとすると、次のような致命的なエラーが発生していました。

%RDMS-F-CANTOPENDB, database could not be opened as requested
-RDMS-F-CANTCREGBL, error creating and mapping database global section
-COSI-F-BADPARAM, bad parameter value

モニターのログ・ファイルには、次のようなDuplicate NOGDBL nameメッセージが含まれます。

6-OCT-2007 23:01:03.24 - Received open database request from 203589E8:0
  - process name _FTA170:, user RDB_ADMIN
  - database name "DSA58:[RDB.DATA]RESDB.RDB;1" [_DSA58] (13,1,0)
  - Duplicate NOGDBL name "RDM72NDSA58000D0001000000000000" detected ...
    retrying
  - opening as monitor ID 1
  - cluster watcher is active
  - sending normal open database reply to 203589E8:0

回避策として、RESIDENT共有メモリーを使用しないようにデータベースを設定します。

この問題はOracle Rdbリリース7.2.2で修正されました。Oracle Rdbのモニター・プロセスは、グローバル・セクションの予期しない再マッピングを検出すると、共有メモリーのマッピングを解除します。

2.1.6 クラスタでの論理領域のドロップおよび再作成後にPIOFETCH$WITHIN_DBでBADPAGNUMのバグチェックが発生する

Oracle Bug#6603641

複数ノードのクラスタ環境では、論理領域をドロップして再作成する場合、PIOFETCH$WITHIN_DBで次のようなバグチェックが発生することがあります。

RDMS-F-CANTREADDBS, error reading pages 148:10881-10881
RDMS-F-BADPAGNUM, page 10881 is out of valid range (1:2637)
for physical area 148
Exception occurred at RDMSHRP72\PIOFETCH$WITHIN_DB + 000005B8
Called from RDMSHRP72\PIOFETCH$FETCH + 000002E4
Called from RDMSHRP72\PIO$FETCH + 00000914
Called from RDMSHRP72\DIOLAREA$FIND_GOOD_PAGE + 00000214
Called from RDMSHRP72\DIO$RECORD_LOCATION + 0000021C
Called from RDMSHRP72\DIOSTORE$STORE_SEG + 000000E4
Called from RDMSHRP72\DIO$STORE + 000002A4

この問題は、論理領域を1つのノードでドロップしてから、別の論理領域を同じ論理領域番号(ただし別の物理領域)を使用して追加した場合に発生することがあります。クラスタ内の別のノードは、新しい物理領域に対して無効な古い次のページのポインタを論理領域に使用していました。

この問題はOracle Rdbリリース7.2.2で修正されました。Oracle Rdbは論理領域の次のページのポインタが物理記憶域内で有効と思われるページであるかどうかを正しく検証するようになりました。

2.1.7 Rdb 7.2へのアップグレード後の全索引スキャンによる問合せの速度の低下

Oracle Bug#6617515

Rdbリリース7.0からRdbリリース7.2へのアップグレード後、全索引スキャンによって問合せの速度が低下します。次の問合せは簡略化されたものですが、同じ動作を示しています。

set flags 'strategy';
select abc.GCD
from T0 t0,
      (select GCD
       from T1
       where GCD = (select GCD
                           from T2
                           where HBAN = t0.HBAN
                           and YSEQ = (select min(YSEQ)
                                         from T2
                                         where HBAN = t0.HBAN))) abc
  where YMD = '20070619';
Cross block of 2 entries
  Cross block entry 1
    Index only retrieval of relation T0
      Index name  IDX_T0 [1:1]
  Cross block entry 2
    Merge of 1 entries
      Merge block entry 1
      Cross block of 2 entries
        Cross block entry 1
          Aggregate
          Cross block of 2 entries
            Cross block entry 1
              Aggregate       Conjunct
              Index only retrieval of relation T2
                Index name  IDX_T2 [0:0]
            Cross block entry 2
              Index only retrieval of relation T2
                Index name  IDX_T2 [2:2]
        Cross block entry 2
          Index only retrieval of relation T1
            Index name  IDX_T1 [1:1]

索引は次のように定義されます。

create index IDX_T0 on T0 (YMD, HBAN);
create index IDX_T1 on T1 (GCD)
create index IDX_T2 on T2 (HBAN, YSEQ, GCD);

次に、Rdbリリース7.0からのストラテジ出力を示します。

Cross block of 2 entries
  Cross block entry 1
    Index only retrieval of relation T0
      Index name  IDX_T0 [1:1]
  Cross block entry 2
    Merge of 1 entries
      Merge block entry 1
      Cross block of 2 entries
        Cross block entry 1
          Aggregate
          Cross block of 2 entries
            Cross block entry 1
              Aggregate       Index only retrieval of relation T2
                Index name  IDX_T2 [1:1]      Min key lookup
            Cross block entry 2
              Index only retrieval of relation T2
                Index name  IDX_T2 [2:2]
        Cross block entry 2
          Index only retrieval of relation T1
            Index name  IDX_T1 [1:1]

違いは次の行のみです。

From 7.2 output:
              Aggregate       Conjunct
              Index only retrieval of relation T2
                Index name  IDX_T2 [0:0]

From 7.0 output:
              Aggregate       Index only retrieval of relation T2
                Index name  IDX_T2 [1:1]      Min key lookup

この問題はRdbリリース7.1とRdbリリース7.2に存在しますが、Rdbリリース7.0.9では、問合せは素早く実行されます。

この問題の回避策はありません。これは、Rdbリリース7.2.1.0のOracle Bug#5567495および4747999の修正によって生じたリグレッションであるためです。

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.1.8 CONCATの最適化による問合せの速度の低下

Oracle Bug#6618080および6617696

Oracle Rdbリリース7.2.1では、より多くの引数と連結パフォーマンスの向上をサポートするためにCONCAT演算子が再実装されました。同時にオプティマイザが拡張され、CONCAT演算子を一連のAND式として書き換えることにより、索引の使用状況が向上するようにしました。ただし、この変更によって一致結合ストラテジからクロス結合ストラテジへの切替えが発生し、問合せに関連する遅れが生じる可能性があります。

この問題はOracle Rdbリリース7.2.2で修正されました。CONCATの最適化は、オプティマイザがこの最適化を使用して一致結合ストラテジを実装できるように修正されました。

2.1.9 Alphaで常駐イメージがある場合、バグチェックのダンプ・ファイルでコール・スタックが記号化されない

Oracle Bug#6634194

Rdbイメージの/RESIDENTがインストールされているAlphaシステムでは、バグチェックのダンプ・ファイルのコール・スタックでルーチンが正しく記号化されないことがあります。次の例は、ルーチンが記号化されない一例を示しています。それ以外の場合もあります(システム領域の仮想アドレスが常駐イメージを示すことに注意してください)。

    ***** Exception at FFFFFFFF81653234 : Image RDMSHRP72 + 004DD234
    %COSI-F-BUGCHECK, internal consistency failure
    Saved PC = FFFFFFFF81640E88 : Image RDMSHRP72 + 004CAE88
    Saved PC = FFFFFFFF816415D4 : Image RDMSHRP72 + 004CB5D4
    Saved PC = FFFFFFFF81461464 : Image RDMSHRP72 + 002EB464
    Saved PC = FFFFFFFF814401C4 : Image RDMSHRP72 + 002CA1C4
    Saved PC = FFFFFFFF8143FB70 : Image RDMSHRP72 + 002C9B70
    Saved PC = FFFFFFFF8143FB70 : Image RDMSHRP72 + 002C9B70
    Saved PC = FFFFFFFF8144401C : Image RDMSHRP72 + 002CE01C
    Saved PC = FFFFFFFF814440DC : Image RDMSHRP72 + 002CE0DC
    Saved PC = FFFFFFFF8143FC78 : Image RDMSHRP72 + 002C9C78
    Saved PC = FFFFFFFF8144401C : Image RDMSHRP72 + 002CE01C
    Saved PC = FFFFFFFF814440DC : Image RDMSHRP72 + 002CE0DC
    Saved PC = FFFFFFFF8143FC78 : Image RDMSHRP72 + 002C9C78
    Saved PC = FFFFFFFF81443574 : Image RDMSHRP72 + 002CD574
    Saved PC = FFFFFFFF81443750 : Image RDMSHRP72 + 002CD750
    Saved PC = 00000000014B9DCC : symbol not found
    Saved PC = FFFFFFFF8145A5F4 : Image RDMSHRP72 + 002E45F4
    Saved PC = FFFFFFFF8122849C : Image RDMSHRP72 + 000B249C
    Saved PC = FFFFFFFF81688294 : Image RDMSHRP72 + 00512294

回避するには、イメージ/RESIDENTをインストールしないでください。

この問題は、Oracle Rdbリリース7.2.2で修正されました。コール・スタックは正しく記号化されるようになりました。

2.1.10 RDMS__CS_TRANS_Dでのバグチェック

Oracle Bug#6633348

WIN_LATIN1キャラクタ・セットを使用するデータベースの例を次に示します。

SQL> show character set;
Default character set is DEC_MCS
National character set is DEC_MCS
Identifier character set is DEC_MCS
Literal character set is DEC_MCS
Display character set is UNSPECIFIED

Alias RDB$DBHANDLE:
        Identifier character set is WIN_LATIN1
        Default character set is WIN_LATIN1
        National character set is UNICODE
SQL>

ここでは、次のようなバグチェックが発生する場合があります。

%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=
0000000000000188, PC=FFFFFFFF80002D40, PS=0000000B
Saved PC = 00000000803981C0 : RDMSHRP721\RDMS__CS_TRANS_D + 00000210

これはItaniumシステムのみの問題です。

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.1.11 Oracle Bug#5192800の修正による問合せの速度の低下

Oracle Bug#6619860

Oracle Bug#5192800の修正はRdbリリース7.2.1.0で行われました。この修正が原因で、現在のユーザーの問合せの速度が大幅に低下します。

Oracle Bug#5192800の問合せには、等式条件を含むON句を使用した内部結合操作と左側外部結合操作、およびMAX aggregateのsubselect問合せがあります。

SELECT SM.ACCT_NUM, H.ACCT_NUM
  FROM
    SM SM INNER JOIN SC SC
    ON (SC.ACCT_NUM = SM.ACCT_NUM  AND
        EXISTS (SELECT * FROM EX EX
                WHERE EX.ACCT_NUM = SC.ACCT_NUM))
    LEFT OUTER JOIN
    H H
    OH H.ACCT_NUM = SM.ACCT_NUM
    AND H.TIM_STMP =
            (SELECT MAC(H2.TIM_STMP)
              FROM H H2
              WHERE H2.ACCT_NUM = SM.ACCT_NUM );

現在のユーザーの問合せには、外部結合操作はありませんが、2つのEXISTのsubselect問合せが含まれています。

SELECT  * FROM
     ( SELECT  HB FROM T1 WHERE  KBN = '1') TT1,
     ( SELECT  T2.HB
         FROM  T2,
               (SELECT  KBN FROM T3 WHERE   ZK_KBN ='1') TT3
         WHERE T2.KBN = TT3.KBN
           AND NOT EXISTS( SELECT *  FROM T2
                            WHERE KBN  =   '101'
                              AND ORDER_NO  <> ORD_NO )
           AND NOT EXISTS( SELECT *
                             FROM ( SELECT * FROM T2
                                     WHERE KBN =  '101'
                                       AND ORDER_NO  <> ORD_NO ) N1,
                                  ( SELECT * FROM T2
                                     WHERE KBN = '201' ) N2
                            WHERE N1.ORD_NO = N2.ORD_NO
                              AND N1.HB     = N2.HB
                              AND N1.YMD    = N2.YMD )
         GROUP BY T2.HB
         HAVING T2.HB = TT1.HB
     )   T4;

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.1.12 DIOCCH$FETCH_SNAP_SEGのバグチェック

Oracle Bug#5240329

行キャッシュ機能を使用する場合、内部データ構造へのアクセスが誤って同期化されることがありました。この問題が原因で、読取り専用トランザクションが失敗し、次の例のようなバグチェックが発生していました(ただし、その他の現象も考えられます)。

***** Exception at 010BA554 : DIOCCH$FETCH_SNAP_SEG + 000009E4
%COSI-F-BUGCHECK, internal consistency failure
Saved PC = 010A8F14 : DIOFETCH$FETCH_ONE_LINE + 00000994
Saved PC = 010A95C8 : DIO$FETCH_DBKEY + 000002F8

この問題は、Oracle Rdbリリース7.2.2で修正されました。データ構造へのアクセスは、読取り専用トランザクションと読み書きトランザクションの間で正しく同期化されるようになりました。行キャッシュ機能を使用するすべてのユーザーに、アップグレードすることをお薦めします。

2.2 SQLエラーの修正

2.2.1 NOT NULL制約が列に指定されている場合の%SQL-W-LOOK_FOR_STT

Oracle Bug#6157999

NOT NULL制約が2番目または後続の制約として列に指定された場合、CREATE/ALTER TABLEは失敗し、%SQL-W-LOOK_FOR_STTが発生していました。

たとえば、次のSQL文で問題を示します。

SQL>create table tab1 (col1 char(10) unique not null);
create table tab1 (col1 char(10) unique not null);
                                            ^
%SQL-W-LOOK_FOR_STT, Syntax error, looking for:
%SQL-W-LOOK_FOR_CON,            DEFERRABLE,
%SQL-F-LOOK_FOR_FIN,    found NULL instead

この問題を防ぐには、NOT NULL制約を他のどの制約よりも先に指定します。たとえば、前述のSQL文は次のように記述すると成功します。

create table tab1 (col1 char(10) not null unique);

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.2.2 WAITフラグとNOWAITフラグがシーケンスで使用されない

Oracle Bug#6487720

以前のバージョンのOracle Rdbでは、シーケンスに定義されたWAITフラグおよびNOWAITフラグを無視していました。そのため、すべての待機操作は、現在のトランザクションの設定によって制御されていました。トランザクションでNOWAIT句を指定した場合、NEXTVALの参照は失敗し、LOCK_CONFLICTエラーが表示されます。

%RDB-E-LOCK_CONFLICT, request failed due to locked resource
-RDMS-F-LCKCNFLCT, lock conflict on client '........SEQ_....'
000000015F5145530000000100000019000000

この問題はOracle Rdbリリース7.2.2で修正されました。ALTER SEQUENCEとCREATE SEQUENCEコマンドのWAIT句およびNOWAIT句は、『Oracle Rdb SQLリファレンス・マニュアル』で説明されているように機能するようになりました。

2.2.3 予期しないデッドロックがCREATE TABLEで返される

Oracle Bug#6629124および5060366

稀なケースですが、以前のバージョンのOracle Rdbでは、CREATE TABLE文に現在の表定義の列を参照するCOMPUTED BY句、AUTOMATIC AS句またはDEFAULT句が含まれている場合、CREATE TABLEがデッドロック・エラーをレポートすることがありました。

次の例は、この予期しないエラーを示しています。

SQL> create table sample
cont>    (c_key char(16)
cont>    ,ckey_a automatic as upper (c_key)
cont>    );
%RDB-E-DEADLOCK, request failed due to resource deadlock
-RDB-E-NO_META_UPDATE, metadata update failed
-RDMS-F-DEADLOCK, deadlock on client
'Table id 32 (SAMP)' 504D4153000000200000000400000055

この問題は、割り当てられたRDB$RELATION_IDが最大許容値(8192)を超える場合にのみ発生します。この場合、Rdbは以前に割り当てられた古い値を表に再利用しようとします。これはDROP TABLEによって後から解放されたものです。

この問題はOracle Rdbリリース7.2.2で修正されました。Rdbは未使用のリレーションIDの値を正しく見つけるようになりました。デッドロック・エラーはレポートされません。

2.2.4 DECODE関数に対して予期しないNOTGROFLDエラーがレポートされる

Oracle Rdbを使用すると、GROUP BY句で式を使用できます。これらの式は、SELECT句の式と正確に一致する必要があります。以前のバージョンでは、次の例に示すように、SQLはDECODEの組込みに対してNOTGROFLDエラーを予期せずレポートしていました。

SQL> select ace_ord_type,
cont>       decode(ace_ord_status, 'CO', 1, 0),
cont>       count(*)
cont> from ace_orders
cont> group by ace_ord_type,
cont>          decode(ace_ord_status, 'CO', 1, 0);
%SQL-F-NOTGROFLD, Column ACE_ORD_STATUS cannot be referred to in the select
list, ORDER BY, or HAVING clause because it is not in the GROUP BY clause

回避するには、DECODE組込み関数ではなく単純なCASE式を使用します。たとえば、前述のDECODEは次のように変換できます。

case ace_ord_status
    when 'CO' then 1
    else 0
end

この問題はOracle Rdbリリース7.2.2で修正されました。DECODEは、GROUP BY式のセマンティック・チェックを実行する際にSQLで正しく処理されるようになりました。

2.2.5 LIKE演算子に関するメモリー・リークの修正

Oracle Bug#6405763

以前のバージョンのOracle Rdbでは、LIKE演算子に関連するメモリー・リークがわずかにありました。LIKEを使用する問合せの対話が何度も行われると、そのプロセスのPGFLQUOTAを超えることがありました。

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.3 RMUエラーの修正

2.3.1 RMU/CONVERTが論理領域エントリのAIPページ番号フィールドを設定しない

Oracle Rdb RMUリリース7.2では、Rdbデータベースの領域インベントリ・ページの論理領域エントリに新しいフィールドが追加されました。このフィールドには、論理領域エントリを位置付けるAIPページ番号が含まれていました。リリース7.2より前のバージョンのRdbデータベースを、/COMMIT修飾子(デフォルト)または/NOCOMMIT修飾子を使用してリリース7.2に変換した場合、このAIPページ番号を含む新しいフィールドが初期化されませんでした。ただし、値0が含まれていました。これが原因でデータベースが破損することはありませんでした。ページ番号フィールドは、論理領域を参照する後続の操作(RMU/SET AIP/LENGTH=n/LAREA=nまたはRMU/SET AIP/REBUILD_SPAMS/LAREA=nなど)によって設定されていました。ただし、初期化されるまで、AIPエントリのAIPページ番号フィールドの値はゼロで、RMU/SHOW AIP/LAREA=nなどのコマンドで表示されていました。この問題は修正され、RMU/CONVERTはRMU/CONVERTに対するAIPページの論理領域エントリのAIPページ番号フィールドをリリース7.2に正しく設定するようになりました。

次の例は、修正された問題を示しています。データベースをリリース7.2に変換した後、論理領域に対するRMU/SHOW AIPコマンドはAIPページ番号ゼロを示します。混合形式の記憶域の場合、統一形式の記憶域とは異なり、領域ビット・マップ・ページ番号フィールドはゼロになるのが正常です。この問題はAIPページ番号フィールドにのみ発生します。RMU/CONVERTで正しく処理される、AIPエントリのABMページ番号フィールドでは発生しません。

$ @SYS$LIBRARY:RDB$SETVER 7.2
$ RMU/CONVERT/COMMIT MF_PERSONNEL
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-00
%RMU-I-LOGCONVRT, database root converted to current structure level
%RMU-S-CVTDBSUC, database DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1
 successfully converted from version V7.1 to V7.2
$ RMU/SHOW AIP/LAREA=80 MF_PERSONNEL

Logical area name EMPLOYEES
Type: TABLE
Logical area 80 in mixed physical area 5
Physical area name EMPIDS_OVER
Record length 126
AIP page number: 0
ABM page number: 0
Snapshot Enabled TSN: 60

この問題を回避するには、データベースのAIPページの該当論理領域に対してAIPページ番号エントリを初期化する操作(RMU/SET AIPコマンドなど)を論理領域に対して実行します。

$ @SYS$LIBRARY:RDB$SETVER 7.2
$ RMU/CONVERT/COMMIT MF_PERSONNEL
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-00
%RMU-I-LOGCONVRT, database root converted to current structure level
%RMU-S-CVTDBSUC, database DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1
 successfully converted from version V7.1 to V7.2
$ RMU/SHOW AIP/LAREA=80 MF_PERSONNEL

Logical area name EMPLOYEES
Type: TABLE
Logical area 80 in mixed physical area 5
Physical area name EMPIDS_OVER
Record length 126
AIP page number: 0
ABM page number: 0
Snapshot Enabled TSN: 60
$ RMU/SET AIP/LAREA=80/LENGTH=126 MF_PERSONNEL
$ RMU/SHOW AIP/LAREA=80 MF_PERSONNEL

Logical area name EMPLOYEES
Type: TABLE
Logical area 80 in mixed physical area 5
Physical area name EMPIDS_OVER
Record length 126
AIP page number: 150
ABM page number: 0
Snapshot Enabled TSN: 60

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.3.2 RMU/RESTOREを圧縮型保存セットと一緒に使用する場合にACCVIOが発生する

圧縮型保存セットの2番目のファイルからリストアを開始する場合、RMU/RESTOREが失敗し、ACCVIOが発生します。保存セットに多くのランダム・データがあるため、暗号化で使用する際に発生する場合が多くあります。

$ RMU/RESTORE/NOCDD LDA100:[000000]RBF1,LDA200: -
     /DISK=READER=1/NOLOG/ENCR=(VALUE=A2345678901234567890123456789012,
     ALG=AESCBC256)
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=000002C3,
PC=0039EEF4, ...
%RMU-I-BUGCHKDMP, generating bugcheck dump file ...

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.3.3 読取り専用記憶域のRMU Verify Readyでエラーが返される

Oracle Bug#6598519

READ ONLYに定義されているOracle Rdbデータベース記憶域のRMU/VERIFY Readyで、/TRANSACTION_TYPE=READ_ONLYが指定されていない場合、RMU-E-READONLYエラーが返されていました。RMU/VERIFYでは、/TRANSACTION_TYPE=WRITEがデフォルトです。/TRANSACTION_TYPEがREAD ONLYではない場合、RMUはREAD ONLY記憶域に関連付けられたスナップショット領域を2回(最初はREAD ONLY記憶域が準備されるとき、2回目はスナップショット領域を検証する直前)準備しようとしたため、この問題が発生していました。RMU/VERIFYがREAD ONLY領域に関連付けられたスナップショット領域を2回目に準備しようとしたときに、RMU-E-READONLYエラーが返されていました。

この問題は修正されました。/TRANSACTION_TYPE=WRITE(デフォルト)の場合でも、RMU/VERIFYは記憶域がREAD ONLYに定義されているかどうかを確認して、その記憶域とそれに関連付けられているスナップショット領域を正しく準備します。このエラーが返ることでデータベースの検証が終了するわけではありません。続けて次の記憶域を検証します。また、このエラーが返される場合、READ ONLY記憶域は検証されますが、その記憶域に関連付けられているスナップショット領域は検証されません。

次の例は、Rdbデータベース記憶域がREAD ONLYに定義され、RMU/VERIFY/TRANSACTION_TYPE=READ_ONLYが指定されていない場合にRMU-E-READONLYエラーが返される状況を示しています。

$ SQL
ALTER DATABASE FILENAME MF_PERSONNEL
 ADD STORAGE AREA U_EMPIDS_MID PAGE FORMAT IS UNIFORM
ALTER DATABASE FILENAME MF_PERSONNEL ALTER STORAGE AREA U_EMPIDS_MID READ ONLY;
EXIT;
$ RMU/VERIFY/ALL/NOLOG MF_PERSONNEL
%RMU-E-BADREADY,  error readying storage area U_EMPIDS_MID
$ RMU/VERIFY/ALL/NOLOG/TRANSACTION_TYPE=WRITE MF_PERSONNEL
%RMU-E-BADREADY,  error readying storage area U_EMPIDS_MID

この問題を防ぐには、検証に対して/TRANSACTION_TYPE=READ_ONLYを指定します。

$ RMU/VERIFY/ALL/NOLOG/TRANSACTION_TYPE=READ_ONLY MF_PERSONNEL
$

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.3.4 RMU/MOVE/ROOTがジャーナル化されない変更の警告を保持しない

Oracle Bug#2967642

RMU/MOVE_AREA/ROOTコマンドはデータベース・ルートを記憶域とともに移動する必要があることを指定しますが、移動したルートのエントリ(ジャーナル化されない変更がOracle Rdbデータベース記憶域に加えられたことを示す)を誤って消去していました。/ROOTがRMU/MOVE_AREAコマンドで指定されない場合、この情報は移動していないデータベースのルート・ファイルで正しく保持されていました。この問題は修正されました。RMU/MOVE_AREA/ROOTは、ジャーナル化されない(アフター・イメージ・ジャーナル・ファイルに保存されない)変更がデータベースに加えられたことを示す情報を、移動したルート・ファイルで保持するようになりました。

次の例は、修正された問題を示しています。RMU/MOVE_AREAで/ROOT修飾子を指定しない場合、ジャーナル化されない変更情報は、移動していないRdbデータベースのルート・ファイルで保持されていましたが、RMU/MOVE_AREA/ROOTでは、移動したルート・ファイルでこの情報が保持されていませんでした。

$ RMU/DUMP/OUTPUT=BEFORE.TXT TEST.RDB
$ search before.txt "Non-journalled database modifications have been made"
      - WARNING: Non-journalled database modifications have been made
$ RMU/MOVE_AREA/NOLOG/DIRECTORY=DISK:[DIRECTORY] TEST.RDB
%RMU-W-DOFULLBCK, full database backup should be done to ensure future recovery
$ RMU/DUMP/OUTPUT=AFTER.TXT TEST.RDB
$ search after.txt "Non-journalled database modifications have been made"
      - WARNING: Non-journalled database modifications have been made
$
$ RMU/DUMP/OUTPUT=BEFORE.TXT TEST.RDB
$ search before.txt "Non-journalled database modifications have been made"
      - WARNING: Non-journalled database modifications have been made
$ RMU/MOVE_AREA/NOLOG/DIRECTORY=DISK:[DIRECTORY]/ROOT=TEST_MOVED TEST.RDB
%RMU-I-AIJRSTAVL, 0 after-image journals available for use
%RMU-I-AIJISOFF, after-image journaling has been disabled
%RMU-W-DOFULLBCK, full database backup should be done to ensure future recovery
$ RMU/DUMP/OUTPUT=AFTER.TXT TEST_MOVED.RDB
$ search after.txt "Non-journalled database modifications have been made"
%SEARCH-I-NOMATCHES, no strings matched

この問題は、Oracle Rdbリリース7.2.2で修正されました。

2.3.5 RMU /POPULATE_CACHEによってPIOFETCH$WITHIN_DBでバグチェックが発生する

Oracle Bug#6655876

RMU /POPULATE_CACHEコマンドがスナップショットのレコードのコピーを読み取ろうとするときにバグチェックが発生することが稀にありました。バグチェックのダンプ・ファイルには、次の内容が表示されます。

    Exception occurred at RMU72\PIOFETCH$WITHIN_DB + 000001E8
    Called from RMU72\PIOFETCH$FETCH + 000002E4
    Called from RMU72\PIO$FETCH + 00000914
    Called from RMU72\DIOCCH$FETCH_SNAP_SEG + 000005E4
    Called from RMU72\DIOFETCH$FETCH_ONE_LINE + 00000738
    Called from RMU72\DIO$FETCH_DBKEY + 000002A4
    Called from RMU72\PSIISCAN$WALK_BTREE_TOP_DOWN + 00000218
    Called from RMU72\RMUPOP$FETCH_ONE_SORTED_INDEX + 000002EC
    Called from RMU72\RMUPOP$FETCH_AREAS + 00000304
    Called from RMU72\RMUCLI$POPULATE_CACHE + 00000414

この問題はOracle Rdbリリース7.2.2で修正されました。RMUは、有効な記憶域とスナップショット記憶域の両方を必要に応じて正しく準備するようになりました。


第3章
Oracle Rdbリリース7.2.1.4で修正されるソフトウェアの誤り

この章では、Oracle Rdbリリース7.2.1.4で修正されるソフトウェアの誤りについて説明します。

3.1 すべてのインタフェースに適用されるソフトウェアの誤りの修正

3.1.1 PIOUTL$SERVICE_PAGE_BLASTSでのCPUバウンド・ループ

Oracle Bug#6111009

ACMSサーバー・プロセスがCPUバウンド・ループに陥ります。プロセスまたは強制バグチェックのダンプから取得したPCサンプルは、ルーチンPIOUTL$SERVICE_PAGE_BLASTSの場所を示しています。

この問題は、ブロッキングASTの配信を防ぐ同期が失敗したものです。結果は、キュー(BLASTED_QUEUE)に要素(BCB)が2回挿入されたコードになり、キュー連鎖でループが生じます。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。この状況を防ぐために、インターロックされたテスト命令とともに新しいフラグ(BCB内)が追加されました。

3.1.2 ジグザグ一致の不正な結果

Oracle Bug#6126475

ジグザグ一致ストラテジを使用する問合せが不正な結果を返します(外部区間で索引T1_SC_PC_NDXを適用する概要bug_match_outlineを使用する場合)。

set flags 'strategy, detail, sort';

SELECT E.PCODE, P.PKEY
  FROM T1 E,
       T2 P
 WHERE E.SCODE = 'AXA'
   AND P.SNO = 4
   AND E.SCODE = P.SCODE
   AND E.PKEY = P.PKEY  ;
~S: Outline "BUG_MATCH_OUTLINE" used
~S#0003
Tables:
  0 = T1
  1 = T2
Conjunct: (0.SCODE = 1.SCODE) AND (0.PKEY = 1.PKEY)
Match
  Outer loop
    Sort: 0.SCODE(a), 0.PKEY(a)
      SortId# 4., # Keys 4
        Item# 1, Dtype: 2, Order: 0, Off: 0, Len: 1
        Item# 2, Dtype: 14, Order: 0, Off: 1, Len: 3
        Item# 3, Dtype: 2, Order: 0, Off: 4, Len: 1
        Item# 4, Dtype: 8, Order: 0, Off: 5, Len: 4
        LRL: 32, NoDups:0, Blks:6, EqlKey:0, WkFls: 2
    Leaf#01 BgrOnly 0:T1 Card=3
      Bool: 0.SCODE = 'AXA'
      BgrNdx1 T1_SC_PC_NDX [1:1] Fan=16
        Keys: 0.SCODE = 'AXA'
  Inner loop      (zig-zag)
    Index only retrieval of relation 1:T2
      Index name  T2_SC_SN_PK_NDX [2:2]
        Keys: (1.SCODE = 'AXA') AND (1.SNO = 4)
0 rows selected

この問合せは、概要が索引T1_SC_PC_NDXではなくT1_SC_PK_PC_NDXを使用するように変更される場合は機能します。

create outline BUG_MATCH_OUTLINE
id '045E2C384D284FD1061D1BF58CF8872D'
mode 0
as (
  query (
-- For loop
    subquery (
      T1 0         access path index
--    T1_SC_PC_NDX        -- replace it with T1_SC_PK_PC_NDX
      T1_SC_PK_PC_NDX
        join by match to
      T2 1      access path index
      T2_SC_SN_PK_NDX
      )
    )
  )
compliance optional     ;

SELECT E.PCODE, P.PKEY
  FROM T1 E,
       T2 P
 WHERE E.SCODE = 'AXA'
   AND P.SNO = 4
   AND E.SCODE = P.SCODE
   AND E.PKEY = P.PKEY  ;
~S: Outline "BUG_MATCH_OUTLINE" used
Tables:
  0 = T1
  1 = T2
Conjunct: (0.SCODE = 1.SCODE) AND (0.PKEY = 1.PKEY)
Match
  Outer loop      (zig-zag)
    Index only retrieval of relation 0:T1
      Index name  T1_SC_PK_PC_NDX [1:1]
        Keys: 0.SCODE = 'AXA'
  Inner loop      (zig-zag)
    Index only retrieval of relation 1:T2
      Index name  T2_SC_SN_PK_NDX [2:2]
        Keys: (1.SCODE = 'AXA') AND (1.SNO = 4)
 E.PCODE        P.PKEY
     850         84900
     850         84910
2 rows selected

この問合せでエラーの一因となったのは、主に次の部分です。

  1. 主な問合せは、片側のジグザグ一致ストラテジを使用して2つの表を結合します。外部区間でのみzigzagが省略されます。
  2. いずれかの一致結合キー(PKEY)が外部索引に含まれないため、外部区間で必要な索引順序を生成するためにソートが適用されます。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.1.3 MISSING条件を使用した外部結合からの不正な結果

Oracle Bug#6404754

MISSING条件を使用する外部結合の問合せから不正な結果がレポートされていました。ユーザーの問合せは簡略化され、次のように再現されています。

create table TAB1 (COL1 CHAR(4));
create table TAB2 (COL1 CHAR(4));

insert into TAB1 values ('1030');
insert into TAB1 values ('1420');

insert into TAB2 values ('1030');
insert into TAB2 values ('1420');

commit;

! the following query should return 0 rows but returns 2 rows incorrectly:
!
SELECT *
  FROM TAB1 AAA,
 (SELECT TAB1.COL1 FROM TAB1, TAB2 WHERE TAB1.COL1 = TAB2.COL1(+) ) BBB
   WHERE AAA.COL1 = BBB.COL1(+) AND BBB.COL1 IS NULL;
Tables:
  0 = TAB1
  1 = TAB1
  2 = TAB2
Conjunct: MISSING (1.COL1)
Cross block of 2 entries        (Left Outer Join)
  Cross block entry 1
    Get     Retrieval sequentially of relation 0:TAB1
  Cross block entry 2
    Conjunct: MISSING (1.COL1)         <== See NOTE below
    Conjunct: 0.COL1 = 1.COL1
    Merge of 1 entries
      Merge block entry 1
      Conjunct: MISSING (1.COL1)        <== See NOTE below
      Cross block of 2 entries        (Left Outer Join)
        Cross block entry 1
          Get     Retrieval sequentially of relation 1:TAB1
        Cross block entry 2
          Conjunct: 1.COL1 = 2.COL1
          Get     Retrieval sequentially of relation 2:TAB2
 AAA.COL1   BBB.COL1
 1030       NULL
 1420       NULL
2 rows selected

注意: conjunctが左側外部結合の問合せの主な問合せから誤って引き下げられているため、不正な結果が生じます。

この問合せでエラーの一因となったのは、主に次の部分です。

  1. 主な問合せが、表と派生表との間の左側外部結合の問合せになっています。
  2. 派生表は、2つの表の別の左側外部結合の問合せから派生しています。
  3. WHERE句には、派生表の結合列を参照するIS NULL条件が含まれています。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.2 SQLエラーの修正

3.2.1 ALTER TABLE ... ADD COLUMN文の後の予期しない列の並べ替え

Oracle Bug#6148536

以前のリリースのOracle Rdbでは、頻繁に変更される表に対するSHOW TABLEで、列が予期せず並べ替えられたことを示すことがありました。この異常な状況は、RDB$FIELD_IDの値が65535を超えると発生します。RDB$FIELD_IDの値がかなり大きい場合、これらの行のNULLビット・ベクターがかなり大きくなるため、このような表の本番での使用はお薦めしません。ALTER TABLE操作を何度も実行すると、RDB$FIELD_VERSIONS表の説明行も伝播され、Rdbサーバーによるメタデータのロードに影響を与えます。

RDB$FIELD_IDの値が大きい場合、行の後にすべてのフィールドを保持するのに十分なNULLビット・ベクターが続きます。圧縮が無効の場合、表の処理時に行が断片化され、必要以上のI/Oが生じます。そのため、この問題を正しく解決するには、表データをアンロードして、表を再作成します。SQL EXPORTとIMPORTも同じ結果になります。

予期しない並べ替えの原因は、RDB$FIELD_IDのサイズが16ビットのままになっているため、ALTER TABLEのAFTER COLUMN句とBEFORE COLUMN句をエンコードするために、RDB$FIELD_POSITIONの上位16ビットが使用されることが前提となっていました。オーバーフローは、列の並べ替えコマンドとして誤って解釈されていました。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。Oracle Rdbは、RDB$FIELD_ID列の値を使用せず、別の方法で並べ替えを管理するようになりました。

3.2.2 複合文を使用する場合、SET ALL CONSTRAINTSでSQLCODE -1005が発生する

Oracle Bug#462035および1403770

コンパイル済SQLまたはSQLモジュール言語プログラムが、アクティブなトランザクションを含まない文を実行すると同時に制約をすぐに評価しようとする場合、その文は失敗し、SQLCODE -1005とRdbの関連するエラー・メッセージ%RDB-E-BAD_TRANS_HANDLが発生します。通常、SQL文は複合文であるか、ストアド・プロシージャまたは外部プロシージャのコールです。このような文ではトランザクションがアクティブである必要がないためです。

たとえば、次のコンパイル済SQLプログラムは、そのトランザクションをコミットしてから、SQL複合文をすぐに実行します。この複合文は失敗し、SQLCODE -1005が発生します。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
EXEC SQL DECLARE ALIAS FILENAME PERSONNEL;
EXEC SQL INCLUDE SQLCA;
main()
{
    EXEC SQL set transaction;
    printf("SET TRANS SQLCODE is %ld\n", SQLCA.SQLCODE);
    EXEC SQL set all constraints on;
    printf("SET ALL CONSTR ON SQLCODE is %ld\n", SQLCA.SQLCODE);
    EXEC SQL commit;
    printf("COMMIT SQLCODE is %ld\n", SQLCA.SQLCODE);
    EXEC SQL begin set transaction; end;
    printf("compound SQLCODE is %ld\n", SQLCA.SQLCODE);
}

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.2.3 分散トランザクションのGET DIAGNOSTICSによって、トランザクションが非分散トランザクションになる

Oracle Bug#972038

特定の状況では、GET DIAGNOSTICS文を含む複合文によって、TRANSACTION_DEFAULT=DISTRIBUTEDで組み込まれた、コンパイル済SQLまたはSQLモジュール言語プログラムが非分散トランザクションを起動していました。複合文でも、トランザクションのコンテキストが必要な文(INSERTなど)を必要としていました。このようにアクティブな分散トランザクションがない場合、SQL$PREまたはSQL$MODプログラムは、複合文を実行する前にトランザクションを開始しません。このため、サーバーはデータベースのアタッチに対して非分散トランザクションを暗黙的に開始していました。

たとえば、次のコンパイル済CコードがTRANSACTION_DEFAULT=DISTRIBUTEDというSQLOPTIONでコンパイルされたプログラムの場合、この状況が発生していました。

...
EXEC SQL DECLARE ALIAS FILENAME PERSONNEL;
...
main ()
{
    long rc;
    long status;
    short iosb[4];
    long flag = 2;
    long tid[4];
...
    status = sys$start_transw(
        0, /* efn */
        flag, /* flags */
        iosb, /* iosb */
        0, /* astadr */
        0, /* astprm */
        tid /* tid */
    );
...
    EXEC SQL BEGIN
        update employees set last_name = 'Toliver'
            where employee_id = '00164';
        get diagnostics :rc = row_count;
    END;
    printf("row count = %d\n", rc);
...
    status = sys$end_transw(
        0, /* efn */
        0, /* flag */
        iosb, /* iosb */
        0, /* astadr */
        0, /* astprm */
        tid /* tid */
    );
...
}

前述の例では、複合文にGET DIAGNOSTICS文があると、クライアント・プログラムはSYS$START_TRANSW()のコールで開始された分散トランザクションと自動的に結合しません。PERSONNELデータベースに対して進行中のRdbトランザクションがないため、Rdbサーバーは、アプリケーションの分散トランザクションとは別の1フェーズ・トランザクションを暗黙的に開始します。SYS$END_TRANSW()のコールは、Rdbトランザクションをコミットしません。これが分散トランザクションに参加するブランチ内にないためです。

TRANSACTION_DEFAULT=DISTRIBUTEDを指定する場合にコードが生成されるようにSQL$PREおよびSQL$MODが変更されました。これにより、GET DIAGNOSTICS文を含む複合文を実行する前に、既存の分散トランザクションを暗黙的に結合します。

この問題を回避するには、このような複合文の実行時に分散トランザクションがアクティブであることを確認します。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.2.4 IMPORT DATABASEコマンドでコマンドラインの一部のデータベース属性が失われる

Oracle Bug#6311200

以前のリリースのOracle Rdbでは、SQLのIMPORT DATABASEコマンドが、SHARED MEMORY IS PROCESS RESIDENT句、またはGLOBAL BUFFERS ARE ENABLED句のLARGE MEMORY IS ENABLED属性を正しく継承しませんでした。対応する属性は、常に交換ファイル(.RBR)から継承されていました。

これは、Oracle Rdbリリース7.2.1.4で修正されました。ただし、回避するには、IMPORT DATABASEコマンドの直後にALTER DATABASE文を使用してこれらの属性を設定します。RMU/EXTRACT/ITEM=DATABASEコマンドを使用して、これらの設定を検証できます。

3.2.5 設定フラグTRANSACTIONで、グローバル・トランザクションIDが表示される

Oracle Bug#3107989

フラグTRANSACTIONが分散(別名2フェーズ・コミット)トランザクションの開始時に定義される場合、Oracle Rdbはこのデータベース・トランザクションに関連付けられたグローバル・トランザクションIDを表示するようになりました。これにより、分散トランザクションに関連する統計が収集されます。

次の例に示すように、「~T Start_transaction」ログ・メッセージの直後に「~T Global transaction id:」で始まる行が表示されます。

$ DEFINE RDMS$SET_FLAGS TRANSACTION
$ SQL$
SQL> ATTACH 'ALIAS A FILENAME DB$:MF_PERSONNEL';
SQL> ATTACH 'ALIAS B FILENAME DB$:PERSONNEL';
SQL> START TRANSACTION READ WRITE;
~T Compile transaction (1) on db: 1
~T Transaction Parameter Block: (len=2)
0000 (00000) TPB$K_VERSION = 1
0001 (00001) TPB$K_WRITE (read write)
~T Start_transaction (1) on db: 1, db count=2
~T Global transaction id: 34C08373-41E3-11DC-ABB9-0008021A53CE
~T Compile transaction (1) on db: 2
~T Transaction Parameter Block: (len=2)
0000 (00000) TPB$K_VERSION = 1
0001 (00001) TPB$K_WRITE (read write)
~T Start_transaction (1) on db: 2, db count=2
~T Global transaction id: 34C08373-41E3-11DC-ABB9-0008021A53CE
SQL>

トランザクションが分散されない場合、この情報は表示されません。TEST_SYSTEMフラグを使用すると、この情報は無効になります。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.2.6 IMPORT DATABASEコマンドからの予期しないバグチェック

Oracle Bug#6313120

Oracle Rdbリリース7.1.4以降では、CREATE STORAGE MAP文で定義されるマッピングを反映する新しいシステム・ルーチンが作成されます。これらの特殊なルーチンは、CREATE STORAGE MAPによって自動的に生成されるため、手動で作成する必要はありません。7.1.4以降のバージョンのSQLのEXPORT DATABASEコマンドでは、交換ファイル(.rbr)から特別にマーク付けされた記憶域マッピング関数が省略されます。

ただし、比較的古いバージョンのSQLが交換ファイルの作成に使用される場合(複数バージョンのリリース7.0が同じシステムにインストールされる場合など)、結果として作成される交換ファイルにはこれらのルーチンのコピーが含まれます。

以前のリリースでは、このような交換ファイルの処理時にSQLのIMPORT DATABASEでバグチェックが発生していました。これらのダンプには、次の例のような内容が含まれていました。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。SQLのIMPORT DATABASEでは、重複するルーチンをインポートしようとすると、次のようなメッセージが生成されるようになりました。

%SQL-F-NOMODRES, unable to import module RDB$STORAGE_MAPS
%RDB-E-NO_META_UPDATE, metadata update failed
-RDMS-E-RTNEXTS, there is another routine named EMPLOYEE_HISTORY in
this database

3.3 RDOとRDMLのエラーの修正

3.3.1 RDBPREとCOBOLを使用する場合の「%COBOL-F-AMBIGSYM, Ambiguous Reference」

Oracle Bug#486335

特定の状況では、RDBPRE/COBOLプログラムをコンパイルすると、生成されたレコード定義に重複した名前を含むコードが生成されていました。結果として作成されるCOBOLコードがCOBOLコンパイラに送信された場合、重複した名前のフィールドが使用された時点で次のエラー・メッセージが生成されていました。

%COBOL-F-AMBIGSYM, Ambiguous reference - check name qualification ...

重複した名前のレコード構造は、データベース間の更新の際に中間結果を保存するためにRDBPREで使用されました。この問題は、ソース・データベースの列に、他のデータベースの対応するターゲット列とは異なる型やサイズがある場合に明示されていました。たとえば、次のSQL文で定義される一組のRdbデータベースについて考えてみます。

create database filename essai1
create table a_table (
    a_zone1     SMALLINT,
    a_zone2     SMALLINT,
    a_zone3     INTEGER (2));
disconnect all;
create database filename essai
create table b_table (
    b_zone1     SMALLINT,
    b_zone2     INTEGER (3),
    b_zone3     SMALLINT (1));
disconnect all;

次のRDBPRE/COBOLプログラムから生成されたコードには、重複した名前のレコード定義が含まれています。

IDENTIFICATION DIVISION.
PROGRAM-ID. tst.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
*
&RDB& INVOKE DATABASE b  = FILENAME "essai"
&RDB& INVOKE DATABASE a  = FILENAME "essai1"
*
PROCEDURE DIVISION.
DEB-PROG.
&RDB&    START-TRANSACTION ON B  USING (READ-WRITE
&RDB&                     RESERVING b.b_table            FOR SHARED READ)
&RDB&                  AND ON A  USING (READ-WRITE
&RDB&                    RESERVING a.a_table             FOR SHARED WRITE)
&RDB&    FOR   EC  IN b.b_table
&RDB&           WITH  EC.b_zone1  = 0
&RDB&           STORE ECC IN a.a_table USING
&RDB&                   ECC.a_zone2  = EC.b_zone2;
&RDB&                   ECC.a_zone3  = EC.b_zone3;
&RDB&           END_STORE
&RDB&    END_FOR
&RDB&    COMMIT
          stop run.

この問題を回避するには、STORE文の列の順序を並べ替えます。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.3.2 RDBPRE/COBOLと式のリテラルを使用する場合に%RDB-F-ARITH_EXCEPTが発生する

Oracle Bug#560785

STOREまたはMODIFYにリテラルを含む演算式がある場合、RDBPRE/COBOLで不正なコードが生成されていました。特に、生成されたコードでは、BLRメッセージと、そのメッセージに対して生成されたCOBOLレコードの対応する項目との間で型が一致していませんでした。このため、実行時に%RDB-F-ARITH_EXCEPTまたは-COSI-F-INTOVF(あるいはその両方)などのエラー・メッセージが頻繁に発生していました。

次のプログラムの例はこの問題を示しており、MAXIMUM_SALARYフィールドとMINIMUM_SALARYフィールドの型が符号付きの単語スケール0になるようにJOBSリレーションを変更したPERSONNELデータベースを使用しています。SQL$SAMPLESのJOBS.RCOプログラムは、次のように変更されます。

変更されたJOBS.RCOプログラムをコンパイルしてリンクすると、結果として作成されるコードでは、生成されたCOBOLレコードの最小給与フィールドおよび最大給与フィールドとBLRのメッセージとの間に不一致が生じます。このため、ランタイム・エラーが発生していました。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.4 RMUエラーの修正

3.4.1 RMU/RESTOREまたは/DUMP/BACKUPのバグチェック

Oracle Bug#6001187

RMUが保存セットの破損を検出すると、対話しているユーザーに対してQUITまたはCONTINUEのいずれかを求めるプロンプトが表示されます。場合によって、プロンプト・メッセージが書き出される前にコマンドがACCVIOで終了するか、またはユーザーがQUITまたはCONTINUE以外のレスポンスを入力すると、ACCVIOが表示されます。

例1:

$ RMU/DUMP/BACK MFP.RBF
%RMU-I-DMPTXT_163, No dump option selected. Performing read check.
%RMU-E-READERR, error reading USER:[USERDIR]MFP.RBF;
-RMU-E-BLOCKCRC, software block CRC error
%RMU-E-INVBLKSIZ, invalid block size in backup file
%RMU-E-INVRECSIZ, invalid record size in backup file
%RMU-E-READERRS, excessive error rate reading USER:[USERDIR]MFP.RBF;
-RMU-E-BLOCKCRC, software block CRC error
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=...

例2:

$ RMU/DUMP/BACK MFP.RBF
%RMU-I-DMPTXT_163, No dump option selected. Performing read check.
%RMU-E-READERR, error reading USER:[USERDIR]MFP.RBF;
-RMU-E-BLOCKCRC, software block CRC error
%RMU-E-INVBLKSIZ, invalid block size in backup file
%RMU-E-INVRECSIZ, invalid record size in backup file
%RMU-E-READERRS, excessive error rate reading USER:[USERDIR]MFP.RBF;
-RMU-E-BLOCKCRC, software block CRC error
%RMU-I-SPECIFYC, specify option (QUIT or CONTINUE)
RMU> exit
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=...

RMUがIA64システムで保存セットの破損を検出した場合、ユーザーがQUITで応答するとバグチェックが発生します。その後、エラー・メッセージの書出しがループします。

例3:

$ RMU/RESTORE MFP.RBF
%RMU-E-READERRS, excessive error rate reading
IVMS_USER1:[FROEHLIN.TEST4]MFP.RBF;
-RMU-E-BLOCKCRC, software block CRC error
%RMU-I-SPECIFYC, specify option (QUIT or CONTINUE)
RMU> quit
%COSI-F-BUGCHECK, internal consistency failure
%RMU-F-FATALOSI, Fatal error from the Operating System Interface.
%RMU-I-BUGCHKDMP, generating bugcheck dump file
USER:[USERDIR]RMUBUGCHK.DMP;
%RMU-F-FTL_RSTR, Fatal error for RESTORE operation at ...
%COSI-F-BUGCHECK, internal consistency failure
...loops with the following lines
%RMU-F-FATALOSI, Fatal error from the Operating System Interface.
%COSI-F-BUGCHECK, internal consistency failure

この問題の理由の1つに、プロンプト文字列の無効な記述子がありました。IA64上のループは、不適切な条件ハンドラによって生じていました。

これらの問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.4.2 RMU/CONVERTがリリース7.0以下のシステム・メタデータを削除できない

Oracle Bug#6270091

リリース7.2のRMU/CONVERTには、リリース7.0以下の古いシステム・メタデータを削除できないという制限事項がありました。リリース6.1以下の場合、古いメタデータを削除するのではなく、変換が終了すると、データベースが破損し、次のエラーが出力されていました。

$   RMU/CONVERT/COMMIT MF_PERSONNEL
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-00
%RMU-I-LOGCONVRT, database root converted to current structure version
%RMU-E-CANTCVRT, cannot convert this database version
%RMU-F-FTL_CNV, Fatal error for CONVERT operation at  7-AUG-2007 22:14:50.50

この問題は修正されました。リリース6.1以下の古いメタデータは削除され、変換が正常に終了するようになりました。このような問題は、変換前にデータベースをバックアップすることの重要性を示しています。

RMU/CONVERT/NOCOMMITまたはRMU/RESTORE/NOCOMMITを指定して、データベースを新しいメタデータ・バージョンに変換してその変換をテストできるようにする場合、古い代替のメタデータをOracle Rdbデータベースに残しておくことができます。ただし、RMU/CONVERT/COMMITまたはRMU/RESTORE/COMMITを指定して次のバージョンに移行する前に変換はコミットされません。COMMITがデフォルトであることに注意してください。/NOCOMMITを指定すると、データベースにメタデータの2つのコピー(新しい現在のバージョンと以前の代替バージョン)が保持されます。新しい現在のメタデータ・バージョンのテストが完了すると、ユーザーはRMU/CONVERT/COMMITまたはRMU/RESTORE/COMMITを指定して、古い代替メタデータを削除し、新しい現在のメタデータのみを保持できます。あるいはユーザーに問題がある場合、RMU/CONVERT/ROLLBACKを実行して新しい現在のメタデータ・バージョンを削除し、以前の代替メタデータ・バージョンを現在のメタデータ・バージョンとしてリストアできます。もちろん、/ROLLBACKを実行する場合、データベースにアクセスするには以前のバージョンのRdbを使用する必要があります。

データベースの変換が次のバージョンに移行する前にコミットされない場合、古い代替バージョンのメタデータがデータベースに保持されます。このデータベースでは、不要になった論理領域が使用されます。この問題は修正されましたが、リリース6.1以下の古い代替メタデータを削除する必要がある場合、変換も失敗していました。

新しいバージョンに移行する際にCONVERTコードが実行するのは(/NOCOMMITの場合であっても)、最初のパスを出して既存の代替メタデータを削除することです。これは、現在のデータベース設計で保存できるのは現在のメタデータ・バージョンと以前のメタデータ・バージョンのみであり、以前のバージョンのメタデータを新しい代替メタデータとして保存する必要があるためです。たとえば、現在のリリース6.0のメタデータ(6.0/0の現在のバージョンと代替バージョン)のみが含まれるリリース6.0のデータベースで考えてみます。RMU/CONVERT/NOCOMMITを7.0にする場合、データベースにはリリース7.0とリリース6.0のメタデータがあります。ただし、RMU/CONVERT/NOCOMMITを7.1にする場合、最初に6.0の古い代替メタデータを削除し、最後にリリース7.1とリリース7.0のメタデータをデータベースに残します。このバグで修正された問題の一例として、6.1/0の現在のバージョンと代替バージョンのメタデータを含むリリース6.1のデータベースがありました。RMU/CONVERT/NOCOMMITをバージョン7.1にすると、リリース7.1とリリース6.1のメタデータがデータベースに作成されます。RMU/CONVERT/NOCOMMITをリリース7.2にすると、リリース7.2とリリース7.1のメタデータが作成されますが、古いリリース6.1のメタデータを最初に削除する必要があります。RMU/CONVERT/NOCOMMITをリリース72にすると、リリース7.2/0のメタデータが作成されます。どちらの場合も、古いリリース6.1のメタデータを削除する必要があり、RMU/CONVERTはリリース6.1以下のメタデータを処理できないため、変換は失敗します。

リリース6.1とリリース6.0のメタデータ・バージョンについては、すべてのメタデータとそのメタデータの論理領域が削除されるようになりました。ただし、リリース5.1以下のメタデータ・バージョンの場合、古いメタデータのポインタは削除されますが、実際の古いメタデータとそのメタデータを含む論理領域は削除されません。ただし、データベースは有効であるため、変換は正常に行われます。ここで示す現在のメタデータと代替メタデータには、ユーザー作成の表や索引は含まれませんが、内部Rdbデータベース構造を定義する、Oracle Rdbで作成されたシステム表や索引を参照します。

次の例は、修正された問題を示しています。6.0/0の現在および代替メタデータのバージョンで開始するデータベースで、/NOCOMMITをRdbリリース7.1に変換した場合、現在および代替メタデータのバージョンは7.1と6.0になります。/COMMIT(デフォルト)をRdbリリース7.2に変換すると、RMU/CONVERTはリリース7.0以下の古いバージョンのメタデータを削除できないため、変換は失敗していました。

$   @SYS$LIBRARY:RDB$SETVER 6.0
$   RMU/RESTORE/NOLOG/NOCDD/DIRECTORY=DEVICE:[DIRECTORY] -
 DEVICE:[DIRECTORY.60]MF_PERSONNEL.RBF
 %RMU-I-AIJRSTAVL, 0 after-image journals available for use
 %RMU-I-AIJISOFF, after-image journaling has been disabled
 %RMU-W-USERECCOM, Use the RMU/RECOVER command. The journals are not
 available.
$   @SYS$LIBRARY:RDB$SETVER 7.1
$   RMU/CONVERT/NOCOMMIT MF_PERSONNEL
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.1-00
%RMU-I-LOGCONVRT, database root converted to current structure version
%RMU-S-CVTDBSUC, database DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1
 successfully converted from version V6.0 to V7.1
$   @SYS$LIBRARY:RDB$SETVER 7.2
$   RMU/CONVERT/COMMIT MF_PERSONNEL
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-00
%RMU-I-LOGCONVRT, database root converted to current structure version
%RMU-E-CANTCVRT, cannot convert this database version
%RMU-F-FTL_CNV, Fatal error for CONVERT operation at  7-AUG-2007
22:14:49.68

この問題を回避するには、データベースを次のRdbバージョンに変換する前に、現在のRdbバージョンでデータベースのRMU/CONVERT/COMMITを実行します。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.4.3 /BLOCKS_PER_PAGEを使用する場合、RMU /MOVE_AREAまたは/COPY_DATABASEが失敗する

/BLOCKS_PER_PAGE修飾子を使用する場合、RMU /MOVE_AREAまたはRMU /COPY_DATABASEコマンドが失敗することがあります。実際の失敗の現象として、予期しないバグチェックが発生します。問題の原因は、割り当てられたデータ構造の限度を超えて記述する不正なコードに関連していました。

回避するには、/BLOCKS_PER_PAGE修飾子を使用しないようにしてください。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.4.4 索引が存在しない場合にRMU/COLLECT/INDEXESがエラーを返さない

Oracle Bug#6316729

RMU/COLLECT OPTIMIZER_STATISTICS /INDEX=(A,B,C)またはRMU/SHOW OPTIMIZER_STATISTICS /INDEX=(A,B,C)に対して、Oracle Rdbデータベースに存在しない索引名が与えられた場合、その索引を無視して続行し、エラーが返されませんでした。

この問題は修正されました。ユーザーがデータベースに存在しない名前の索引を指定すると、RMU/COLLECT OPTIMIZERまたはRMU/SHOW OPTIMIZERコマンドは中断し、エラーが返されるようになりました。

$ rmu/collect opt mf_personnel /notables /log /index=bad_name
Start loading tables... at 28-AUG-2007 16:16:14.54
Done loading tables.... at 28-AUG-2007 16:16:14.54
Start loading indexes... at 28-AUG-2007 16:16:14.54
%RMU-F-INDNOTFND, index BAD_NAME does not exist in this database
%RMU-F-FTL_COL_STAT, Fatal error for COLLECT OPTIMIZER_STATISTICS operation at
28-AUG-2007 16:16:14.54

次の例は、修正された問題を示しています。指定の索引bad_nameが存在しない場合でも、RMU/COLLECT OPTIMIZER_STATISTICSはエラーを返さず続行し、索引を無視します。

$ rmu/collect opt mf_personnel /notables /log /index=bad_name
Start loading tables... at 28-AUG-2007 16:14:21.04
Done loading tables.... at 28-AUG-2007 16:14:21.05
Start loading indexes... at 28-AUG-2007 16:14:21.05
Done loading indexes.... at 28-AUG-2007 16:14:21.06
Start collecting btree index stats... at 28-AUG-2007 16:14:21.12
Done collecting btree index stats.... at 28-AUG-2007 16:14:21.12
Start collecting table & hash index stats... at 28-AUG-2007 16:14:21.12
Done collecting table & hash index stats.... at 28-AUG-2007 16:14:21.12
Start collecting workload stats... at 28-AUG-2007 16:14:21.17
Maximum memory required (bytes) = 0
Done collecting workload stats.... at 28-AUG-2007 16:14:21.18
Start calculating stats... at 28-AUG-2007 16:14:21.18
Done calculating stats.... at 28-AUG-2007 16:14:21.18
Start writing stats... at 28-AUG-2007 16:14:21.21
Done writing stats.... at 28-AUG-2007 16:14:21.21

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.4.5 RMU OPTIMIZER_STATISTICSコマンドが不正で致命的なエラー終了メッセージを返す

RMU/COLLECT OPTIMIZER_STATISTICS、RMU/DELETE OPTIMIZER_STATISTICSおよびRMU/INSERT OPTIMIZER_STATISTICSが、実行する操作を正しく指定しない、致命的なエラー終了メッセージを返していました。エラーは正しく処理されましたが、Oracle RdbのRMUが終了する前に出力された致命的なメッセージが正しくありませんでした。

この問題は修正されました。特定のコマンド操作に該当する致命的なエラー終了メッセージが出力されるようになりました。

$ rmu/collect optimizer_statistics baddb
%RMU-W-BADDBNAME, can't find database root
DEVICE:[DIRECTORY]BADDB.RDB;
-RMS-E-FNF, file not found
%RMU-F-CANTOPNROO, cannot open root file "BADDB"
%RMU-F-FTL_COL_STAT, Fatal error for COLLECT OPTIMIZER_STATISTICS operation at
 29-AUG-2007 15:44:07.54
$ rmu/delete optimizer_statistics baddb
%RMU-W-BADDBNAME, can't find database root
DEVICE:[DIRECTORY]BADDB.RDB;
-RMS-E-FNF, file not found
%RMU-F-CANTOPNROO, cannot open root file "BADDB"
%RMU-F-FTL_DEL_STAT, Fatal error for DELETE OPTIMIZER_STATISTICS operation at
 29-AUG-2007 15:44:30.18
$ rmu/insert optimizer_statistics baddb
%RMU-W-BADDBNAME, can't find database root
DEVICE:[DIRECTORY]BADDB.RDB;
-RMS-E-FNF, file not found
%RMU-F-CANTOPNROO, cannot open root file "BADDB"
%RMU-F-FTL_INS_STAT, Fatal error for INSERT OPTIMIZER_STATISTICS operation at
 29-AUG-2007 15:44:50.48

次の例は、修正された問題を示しています。致命的なエラー終了メッセージ%RMU-F-FTL_ANAがRMUから返されました。これは実行するコマンド操作を正しく表していませんでした。

$ rmu/collect optimizer_statistics baddb
%RMU-W-BADDBNAME, can't find database root
DEVICE:[DIRECTORY]BADDB.RDB;
-RMS-E-FNF, file not found
%RMU-F-CANTOPNROO, cannot open root file "BADDB"
%RMU-F-FTL_ANA, Fatal error for ANALYZE operation at 29-AUG-2007
 15:33:52.70
$ rmu/delete optimizer_statistics baddb
%RMU-W-BADDBNAME, can't find database root
DEVICE:[DIRECTORY]BADDB.RDB;
-RMS-E-FNF, file not found
%RMU-F-CANTOPNROO, cannot open root file "BADDB"
%RMU-F-FTL_ANA, Fatal error for ANALYZE operation at 29-AUG-2007
 15:34:05.65
$ rmu/insert optimizer_statistics baddb
%RMU-W-BADDBNAME, can't find database root
DEVICE:[DIRECTORY]BADDB.RDB;
-RMS-E-FNF, file not found
%RMU-F-CANTOPNROO, cannot open root file "BADDB"
%RMU-F-FTL_ANA, Fatal error for ANALYZE operation at 29-AUG-2007
 15:34:19.03

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.4.6 RMU/CONVERTで指定しない型のシステム論理領域が作成される

Oracle Bug#6390145

Oracle RdbのRMU/CONVERTでは、Rdbデータベースを現在のバージョンに変換する場合、システム表やシステム索引の論理領域を作成する際に論理領域の型を指定しませんでした。このため、データベースの変換時に、システム表と索引を含む論理領域にUNKNOWN型が与えられていました。これが原因でデータベースが破損することはありませんでしたが、RMU/SHOW AIPなどのコマンドで論理領域の型にUNKNOWNが表示されていました。RMU/CONVERTで作成されたシステム表と索引を含む論理領域の型は、TABLEおよびSORTED INDEXが正しい型です。

この問題は、次の例に示すように修正されました。RMU/CONVERTで作成される新しいシステム論理領域に正しい型が指定されました。

$ rmu/convert/noconfirm mf_personnel
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-nn
%RMU-I-LOGCONVRT, database root converted to current structure level
%RMU-S-CVTDBSUC, database DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1
 successfully converted from version V7.1 to V7.2
%RMU-I-CVTCOMSUC, CONVERT committed for
 DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 to version V7.2
$ rmu/show aip/brief mf_personnel

*-----------------------------------------------------------------------------

* Logical Area Name             LArea PArea   Len Type

*-----------------------------------------------------------------------------

RDB$PROFILES                      114     1   140 TABLE
RDB$GRANTED_PROFILES              115     1    28 TABLE
RDB$TYPES                         116     1   148 TABLE
RDB$TYPE_FIELDS                   117     1   148 TABLE
RDB$WORKLOAD                      118     1    75 TABLE
RDB$TRIGGER_ACTIONS               119     1    84 TABLE
RDB$NDX_NDX_NAME_NDX              120     1   219 SORTED INDEX
RDB$NDX_REL_NAME_NDX              121     1   219 SORTED INDEX
RDB$NDX_SEG_NAM_FLD_POS_NDX       122     1   219 SORTED INDEX
RDB$REL_REL_NAME_NDX              123     1   219 SORTED INDEX
RDB$VER_REL_ID_VER_NDX            124     1   219 SORTED INDEX

次の例は、修正された問題を示しています。RMU/CONVERTで作成される新しいシステム論理領域に指定される型はありませんでした。

$ rmu/convert/noconfirm mf_personnel
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-nn
%RMU-I-LOGCONVRT, database root converted to current structure level
%RMU-S-CVTDBSUC, database DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1
 successfully converted from version V7.1 to V7.2
%RMU-I-CVTCOMSUC, CONVERT committed for
 DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 to version V7.2
$ rmu/show aip/brief mf_personnel

*-----------------------------------------------------------------------------

* Logical Area Name             LArea PArea   Len Type

*-----------------------------------------------------------------------------

RDB$PROFILES                      114     1   140 UNKNOWN
RDB$GRANTED_PROFILES              115     1    28 UNKNOWN
RDB$TYPES                         116     1   148 UNKNOWN
RDB$TYPE_FIELDS                   117     1   148 UNKNOWN
RDB$WORKLOAD                      118     1    75 UNKNOWN
RDB$TRIGGER_ACTIONS               119     1    84 UNKNOWN
RDB$NDX_NDX_NAME_NDX              120     1   219 UNKNOWN
RDB$NDX_REL_NAME_NDX              121     1   219 UNKNOWN
RDB$NDX_SEG_NAM_FLD_POS_NDX       122     1   219 UNKNOWN
RDB$REL_REL_NAME_NDX              123     1   219 UNKNOWN
RDB$VER_REL_ID_VER_NDX            124     1   219 UNKNOWN

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.4.7 RMU/VERIFY/LOGのVMS終了ステータスが正しくない

Oracle Bug#6315971

RMU/VERIFY/LOGが指定された状態で、Oracle Rdbデータベースの検証時にエラーや警告が発生しない場合、VMS終了ステータスが、成功のステータスではなく重大度Informationalのログ・メッセージに誤って設定されていました。これは、/LOGが指定されない場合は発生しませんでした。この問題は修正されました。/LOGが指定されない場合と同様に/LOGが指定された場合も、成功のステータスが出力されるようになりました。

次の例は、修正された問題を示しています。/LOGが指定されない場合、RdbデータベースのRMU/VERIFYが成功すると、VMS成功の終了ステータスが表示されますが、/LOGが指定された場合、終了ステータスは、情報を示すログ・メッセージになっていました。どちらの場合も、現在はVMS成功の終了ステータスが設定されるようになりました。

$ rmu/verify/all mf_personnel
$ show symbol $status
  $STATUS == "%X10000001"
$ rmu/verify/all/log mf_personnel
 %RMU-I-BGNROOVER, beginning root verification
 %RMU-I-ENDROOVER, completed root verification
 %RMU-I-BGNVCONST, beginning verification of constraints for database
  DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1
 %RMU-I-ENDVCONST, completed verification of constraints for database
  DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1

 %RMU-S-ENDVERIFY, elapsed time for verification :    0 00:00:02.22
$ show symbol $status
  $STATUS == "%X12C8B51B"

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.5 LogMinerエラーの修正

3.5.1 RMU/UNLOAD/AFTER_JOURNALのソート作業ファイルのサイズの縮小

RMU/UNLOAD/AFTER_JOURNALは、ソート操作を実行して、抽出する各トランザクションの重複するレコードの変更を削除します。特定の状況では(特にデータベース内のレコード圧縮が使用された場合)、RMUはソートする最大レコード長を多めに見積るため、ディスク上のソート一時作業ファイルの割当てが必要以上になっていました。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。ソートする最大レコード・サイズが、より正確に計算されるようになりました。これは、ソート作業ファイルのサイズの縮小と、作業ファイルのIOの防止に役立ちます。

3.5.2 RMU/UNLOAD/AFTER_JOURNALの/QUICK_SORT_LIMIT修飾子

RMU/UNLOAD/AFTER_JOURNALは、ソート操作を実行して、抽出する各トランザクションの重複するレコードの変更を削除します。ソートのカーディナリティが少ない場合は、内部インメモリーのクイック・ソート・アルゴリズムが使用されます。それ以外の場合は、SORT32アルゴリズムが使用されます。以前は、クイック・ソート・ルーチンを使用する場合、修正された5000レコードという値の制限がありました。

しきい値に対して修正された値に関するこの制限は、Oracle Rdbリリース7.2.1.4で緩和されました。インメモリー・アルゴリズムでソートする最大レコード数を明示的に制御できるように、新しい修飾子/QUICK_SORT_LIMIT=nが提供されました。デフォルト値は5000です。最小値は10、最大値は100,000です。

/QUICK_SORT_LIMIT修飾子に指定した値が大きいほど、CPU時間とメモリー消費を増やしてソート作業ファイルのIOを軽減できます。値が小さすぎると、ディスク・ファイルのIOが増加します。通常は、デフォルト値が受け入れられます。

3.6 RMU Show Statisticsのエラーの修正

3.6.1 「File IO Statistics」画面でファイル名が上書きされる

Oracle Bug#6319121

Oracle Rdbリリース7.2.1以降では、ファイル名がRMU /SHOW STATISTICSユーティリティの「File IO Statistics」画面に表示されません。この問題は、統計の見出し行が極端に変わることで生じていました。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。ファイル名は上書きされなくなりました。

3.6.2 「Device Information」画面を上方向に移動する際のバグチェック

Oracle Bug#6319159

Oracle Rdbリリース7.2.1以降では、([Page Up]キーを使用して)「Device Information」画面を上方向に移動すると、RMU /SHOW STATISTICSユーティリティでバグチェックが発生することがあります。この問題は、上方向に移動するときに内部データ構造が正しく構成されないことが原因で発生していました(画面の下方向に移動する場合は発生しません)。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。

3.6.3 RMU/SHOW STATISTICS /INPUT= Possibleのエラーまたはバグチェック

Oracle Bug#6339722

Oracle Rdbリリース7.2.1以降では、RMU /SHOW STATISTICSユーティリティを入力バイナリ・ファイルとともに使用すると、入力ファイルの読取り時にエラーが発生することがあります。また、画面見出しの2行目のElapsed:時間表示フィールドが空白になることが頻繁にありました。

考えられる回避策として、バイナリ・ファイルを読み書きするRMUコマンドで/NOLOGICAL_AREA修飾子を使用して問題を防止できます。

これらの問題は、Oracle Rdbリリース7.2.1.4で修正されました。バイナリ入力ファイルは正しく処理されます。


第4章
Oracle Rdbリリース7.2.1.3で修正されるソフトウェアの誤り

この章では、Oracle Rdbリリース7.2.1.3で修正されるソフトウェアの誤りについて説明します。

4.1 すべてのインタフェースに適用されるソフトウェアの誤りの修正

4.1.1 複数のデータベースがアタッチされる場合の共有メモリーの破損

Oracle Bug#5841667

Oracle Rdbリリース7.1.4とOracle Rdbリリース7.2以降では、共有メモリーが破損することがありました。1つのRdbルート・ファイルのデータが別のデータベースの共有メモリーに書き込まれると(あるいはこれが原因で)、頻繁に破損していました。破損が起こると、データベースとデータベース・ユーザーの信頼性や機能性が危険にさらされる可能性があります。

この破損を引き起こす状況は次のとおりです。

メモリー破損は、共有メモリーへのルート・ファイル情報の更新中に、I/Oバッファの不正な同期が原因で発生していました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。


注意

一度に複数のデータベースにアタッチするアプリケーションやプロシージャを使用するユーザーは、メモリー破損の問題が起こらないようにOracle Rdbリリース7.2.1.3以上にアップグレードすることを強くお薦めします。

4.1.2 データベースが内部セキュリティ・チェックに構成される場合、リモートTCP/IPでバグチェックが発生する

Oracle Bug#6152325

TCP/IPプロトコルを使用して、内部セキュリティ・チェックに構成されるデータベースにリモートでアタッチする場合、バグチェックまたはバグチェックのダンプが生成されていました。

***** Exception at 0000000000A7730C : RDMSHRP72\RDMS$$DML$READY + 0000005C
%SYSTEM-F-ACCVIO, access violation, reason mask=00,
virtual address=00000000000001D4, PC=0000000000A7730C, PS=00000009

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.1.3 RDB$DATABASEシステム表に関する複雑な問合せからの不正な結果

Oracle Bug#6195672

Oracle Rdbリリース7.2の以前のリリースでは、RDB$DATABASEシステム表に対する複雑な問合せが、不正な行を返すことがありました。これは、問合せがDBKEY検索を常に実行するように、この特定の表に対する問合せの最適化に関連した問題です。

次の例は、問題を示しています。この問合せは、2つの行の派生表のクロス結合から4行を返します。

SQL> SELECT F.FLAG, A.ACCOUNT
cont> FROM
cont>   (SELECT 'Y' AS FLAG FROM RDB$DATABASE
cont>    UNION ALL
cont>    SELECT 'N' AS  FLAG FROM RDB$DATABASE) F,
cont>   (SELECT 'A' AS ACCOUNT FROM RDB$DATABASE
cont>    UNION ALL            ! note:: the query works if UNION
cont>    SELECT 'M' AS ACCOUNT FROM RDB$DATABASE) A ;
 F.FLAG   A.ACCOUNT
 N        A
 N        M
2 rows selected
SQL>

回避するには、問合せのRDB$DATABASEを、別の単一行の表に置き換えます。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.1.4 ALTER DATABASE ... SHARED MEMORY IS PROCESSでRESIDENTが無効にならない

以前は、SQLを使用する場合、データベース共有メモリーのRESIDENT属性が一度有効になると、無効にすることができませんでした。

次の例では、RESIDENT属性が一度有効になると、ALTER文を使用する際にRESIDENT属性が消去されません。

$ SQL$ CREATE DATA FILE FOO SHARED MEMORY IS PROCESS RESIDENT;
$ RMU/DUMP/HEAD/OUT=X.X FOO
$ SEARCH X.X MAPPED
    Database will be mapped in process space
      Shared memory will be mapped resident (OpenVMS Alpha only)
$ SQL$ ALTER DATA FILE FOO SHARED MEMORY IS PROCESS;
$ RMU/DUMP/HEAD/OUT=X.X FOO
$ SEARCH X.X MAPPED
    Database will be mapped in process space
      Shared memory will be mapped resident (OpenVMS Alpha only)

回避策として、RMU/SET SHARED_MEMORY/TYPE=コマンドを使用して、SYSTEM、PROCESSおよびRESIDENTを切り替えることができます。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。ALTER DATABASE ... SHARED MEMORY IS PROCESSを使用する場合、RESIDENT属性の設定が正しく消去されるようになりました。

4.1.5 COSI-E-WORK_DEVの不完全なエラーの処理

Oracle Bug#4898352

Rdbのソート作業ファイルがローカルでランダムなアクセス・ファイルではない場合、Rdbは不完全なエラー・メッセージをレポートしていました。該当のデータベースがリモートの場合、リモートRDBSERVERはアクセス検証で失敗していました。たとえば、エラーがローカル・データベースの対話型SQLのセッションで発生した場合、不完全なエラー・メッセージは次のように表示されます。

%COSI-E-WORK_DEV, work file !AS must be on random access local device

前述の例では、!ASは問題のソート作業ファイルの名前(NL:[]SORTWORK.TMP;など)で置き換えられていました。

エラーがリモート・データベースで発生した場合、RDBSERVERは失敗し、ローカル・セッションでは次のエラー・メッセージが表示されます。

%RDB-F-IO_ERROR, input or output error
-SYSTEM-F-LINKABORT, network partner aborted logical link

リモートの場合、リモート・システム上の該当セッションのNETSERVER.LOGは%SYSTEM-F-ACCVIOエラーを記録していました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.1.6 NOT NULLテストを使用する問合せからの不正な結果

Oracle Bug#6041167

次の例に示すように、NOT NULLテストを使用する問合せから、不正な結果がレポートされる場合があります。

SHOW INDEX T1_NDX;
Indexes on table T1:
T1_NDX                          with column COL_DATA
                                and column KEY_ID
  Duplicates are allowed
  Type is Sorted Ranked
    Duplicates are Compressed Bitmaps
  Key suffix compression is DISABLED
  Node size  430

SEL COL_DATA,KEY_ID,NUMBER FROM T1;
Get     Retrieval by index of relation T1
  Index name  T1_NDX [0:0]
    COL_DATA        KEY_ID        NUMBER
          55          NULL      96507257
          66          NULL      96509951
          68          NULL      96508028
3 rows selected
SELECT COUNT(*) FROM T1 WHERE KEY_ID IS NOT NULL;
Aggregate       Conjunct        Index only retrieval of relation T1
  Index name  T1_NDX [0:0]       Index counts lookup

           3
1 row selected

次の例に示すように、NOT NULL条件の列が先行セグメントとして定義される場合、問合せは機能します。

DROP INDEX T1_NDX;
CREATE INDEX T1_NDX  ON T1 (KEY_ID,COL_DATA)
    TYPE IS SORTED RANKED;
SELECT COUNT(*) FROM T1 WHERE KEY_ID IS NOT NULL;
Aggregate Index only retrieval of relation T1
  Index name  T1_NDX [0:0]   Index counts lookup
 0
1 row selected

この問合せでエラーの一因となったのは、主に次の部分です。

  1. 問合せは、列がNULLではない合計を選択します。
  2. 列は、SORTED RANKED索引の終了セグメントとして定義されます。
  3. Index counts lookupが選択されたストラテジです。

この問題を回避するには、影響を受ける問合せのIndex counts lookupを無効にします。これは設定フラグNOCOUNT_SCANを使用して行います。

この問題は、Oracle Rdbのリリース7.1.4.4、リリース7.1.4.5、リリース7.1.5、リリース7.2.0.1、リリース7.2.0.2、リリース7.2.1、リリース7.2.1.1およびリリース7.2.1.2に影響します。この問題はOracle Rdbリリース7.2.1.3で修正されました。

4.1.7 RDMS-F-NOREQIDTのCOSI$TIMER_GET_REQIDTでバグチェックが発生する

Oracle Bug#6069358

同じプログラム内のデータベースに定期的にデタッチおよびリアタッチするアプリケーションで高速コミット機能を使用する場合、そのアプリケーションでは、Rdbのタイマー・ブロックを最終的に使い果し、次のような内容のバグチェックが発生します。

***** Exception at 01235994 : COSI$TIMER_GET_REQIDT + 00000294
%RDMS-F-NOREQIDT, reached internal maximum number of simultaneous
timer requests
Saved PC = 01235C38 : COSI_TIMER_SET + 00000288
Saved PC = 01235DA8 : COSI_TIMER_SLEEP + 00000078
Saved PC = 012A7548 : KOD$COMMIT + 00000508
Saved PC = 01079148 : RDMS$$INT_COMMIT_TRANSACTION + 00000328
Saved PC = 01078D14 : RDMS$TOP_COMMIT_TRANSACTION + 000001E4

次の例のスクリプトのフラグメントは、高速コミットのチェックポイント期間1秒と、2秒あまり(チェックポイントのタイマーが2回発動するのに十分な時間を許可)のトランザクション間の遅れを使用して失敗を示しています。

    .
    .
    .
$ DEFINE SQL$DATABASE DKA0:[DB]DB.RDB
$ DEFINE RDM$BIND_CKPT_TIME 1
    .
    .
    .
$ SQL$
    INSERT INTO C1 VALUES (1);
    COMMIT;
    $ WAIT 0:0:2.02
    DISCONNECT ALL;
        .
        . Repeat the sequence 101 times
        .
    INSERT INTO C1 VALUES (1);
    COMMIT;
    $ WAIT 0:0:2.02
    DISCONNECT ALL;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file
DISK$USER:[USER]RDSBUGCHK.DMP;

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。この問題は、内部タイマーのデータ構造が割り当てられているが、タイマーの期限が切れている場合に割当てが解除されていないことが原因で発生していました。タイマーの期限が切れていない場合、内部タイマーのデータ構造の割当てが正しく解除されていませんでした。そのため、タイマーのデータ構造がリークして、最終的に「RDMS-F-NOREQIDT, reached internal maximum number of simultaneous timer requests」というバグチェックの例外が発生していました。

4.1.8 ジャーナルが存在しない場合にジャーナルをドロップする際の不正なメッセージ

Oracle Bug#5059712

データベースにジャーナルが定義されていない場合、存在しないジャーナルをドロップすると、次の例に示すように、「RDMS-F-AIJDISABLED, after-image journaling must be enabled for this operation」という多少の誤解を招くメッセージが返されます。

$ SQL$
        CREATE DATABASE FILE AIJTST RESERVE 3 JOURNALS
        CREATE STORAGE AREA RDB$SYSTEM;
        DISCONNECT ALL;
        ALTER DATABASE FILENAME AIJTST DROP JOURNAL FOO;
%RDMS-F-AIJDISABLED, after-image journaling must be enabled for this operation
        EXIT;
$ EXIT

この重要性の低い問題は、Oracle Rdbリリース7.2.1.3で修正されました。次の例に示すように、Rdbは、より正確で明示的なメッセージ「RDMS-F-NOSUCHAIJ, no such AIJ journal "journal-name"」を返すようになりました。

$ SQL$
        CREATE DATABASE FILE AIJTST
        RESERVE 3 JOURNALS
        CREATE STORAGE AREA RDB$SYSTEM;
        DISCONNECT ALL;
        ALTER DATABASE FILENAME AIJTST DROP JOURNAL FOO;
%RDMS-F-NOSUCHAIJ, no such AIJ journal "FOO"
        EXIT;
$ EXIT

4.1.9 定数ブールを使用するUNION問合せからのバグチェック

Oracle Bug#6125013

次の例に示すように、定数ブールを使用するUNION問合せからバグチェックが発生したというレポートがありました。

SELECT A_CLEARER_ID
FROM (SELECT A_DATE,A_CLEARER_ID
       FROM   T_CLEARED_BY
       UNION ALL
       SELECT A_DATE,A_CLEARER_ID
       FROM   T_CLEARED_BY
) AS   TMP
WHERE  A_DATE = DATE'2007-06-15' AND 1=1;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file DISK:[DIRECTORY]RDSBUGCHK.DMP;

問合せは、定数条件1=1を削除すると機能します。

SELECT A_CLEARER_ID
FROM (SELECT A_DATE,A_CLEARER_ID
       FROM   T_CLEARED_BY
       UNION ALL
       SELECT A_DATE,A_CLEARER_ID
       FROM   T_CLEARED_BY
) AS   TMP
WHERE  A_DATE = DATE'2007-06-15';
Merge of 1 entries
  Merge block entry 1
  Merge of 2 entries
    Merge block entry 1
    Conjunct        Index only retrieval of relation T_CLEARED_BY
      Index name  U1_CLEARED_BY [1:1]
    Merge block entry 2
    Conjunct        Index only retrieval of relation T_CLEARED_BY
      Index name  U1_CLEARED_BY [1:1]
0 rows selected

この問題は、主な問合せがWHERE句の1=1などのブール型条件を含むUNION問合せの派生表から選択する場合に発生します。

この問題は、Oracle Rdbのリリース7.1.4.4、リリース7.1.4.5、リリース7.1.5、リリース7.1.5.1、リリース7.2.0.1、リリース7.2.0.2、リリース7.2.1、リリース7.2.1.1およびリリース7.2.1.2に影響します。この問題はOracle Rdbリリース7.2.1.3で修正されました。

4.2 SQLエラーの修正

4.2.1 ALTER TABLE ... DISABLE CONSTRAINT後の予期しない制約のアクティブ化

以前のリリースのOracle Rdbでは、ALTER TABLEコマンドは現在のセッションですでにアクティブな制約を有効化または無効化しませんでした。制約を有効および無効にするには、ALTER TABLE ... ENABLE CONSTRAINT constraint-name、ALTER TABLE ... DISABLE CONSTRAINT constraint-name、ALTER TABLE ... ENABLE ALL CONSTRAINTSおよびALTER TABLE ... DISABLE ALL CONSTRAINTSを使用します。

次の例は、ALTER TABLEを使用して制約が無効化されている場合でも、セッション時に制約がチェックされる状態を示しています。

SQL> create table my_con3
cont>     (c1 char
cont>     ,c2 char
cont>     ,constraint MYC1 check (c1 in ('a','b')) deferrable);
SQL> commit;
SQL>
SQL> insert into my_con3 (c1,c2) values ('d','e');
1 row inserted
SQL> commit;
%RDB-E-INTEG_FAIL, violation of constraint MYC1 caused operation to fail
-RDB-F-ON_DB, on database RDB$DEFAULT_CONNECTION
SQL> rollback;
SQL>
SQL> insert into my_con3 (c1,c2) values ('a','b');
1 row inserted
SQL> commit;
SQL> rollback;
SQL>
SQL> alter table my_con3 disable constraint myc1;
SQL> show table (constraint) my_con3;
Information for table MY_CON3

Table constraints for MY_CON3:
MYC1
 Check constraint
 Table constraint for MY_CON3
 Evaluated on COMMIT
 Source:
        CHECK (c1 in ('a','b'))
Constraint is disabled

Constraints referencing table MY_CON3:
 No Constraints found

SQL> commit;
SQL>
SQL> insert into my_con3 (c1,c2) values ('d','e');
1 row inserted
SQL> commit;
%RDB-E-INTEG_FAIL, violation of constraint MYC1 caused operation to fail
-RDB-F-ON_DB, on database RDB$DEFAULT_CONNECTION

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。Oracle Rdbは、セッションのアクティブな制約に対して有効/無効を正しく適用するようになりました。

4.2.2 データベース間のINSERTでのSQL$BLRXPR - 15を含むバグチェック

Oracle Bug#4307036

特定の状況では、データベースにまたがるselectを使用するINSERT文が失敗し、次の行を含むSQLBUGCHK.DMPが生成されていました。

%SQL-F-BUGCHK, There has been a fatal error. Please contact your Oracle
support representative. SQL$BLRXPR - 15

このようなINSERT文には、SELECTにDISTINCTキーワードまたはCASE式が含まれていました。たとえば、次のデータベース宣言と変数宣言について考えてみます。

$ SQL$
SQL> create database filename temp1;
SQL> create table ctab (
cont> destination char(4),
cont> state       char(2)
cont> );
SQL> insert into ctab values ('ABCD','ME');
1 row inserted
SQL> insert into ctab values ('EFGH','ME');
1 row inserted
SQL> insert into ctab values ('IJKL','MI');
1 row inserted
SQL> insert into ctab values ('ABCD','ME');
1 row inserted
SQL> commit;
SQL> disconnect all;
SQL> create database filename temp2;
SQL> create table tb1 (
cont> ccode   char(4),
cont> snum    integer
cont> );
SQL> commit;
SQL> disconnect all;
SQL> att 'alias db2 file temp2';
SQL> att 'alias db1 file temp1';
SQL> declare : run_id integer = 5;
SQL> declare :xx char(2) = 'xx';
SQL> declare :suffix char(2) = 'ME';
SQL> declare :hv2 integer = 1;

前述のコンテキストでは、データベースにまたがる次のINSERT文が失敗します。

SQL> insert into db2.tb1
cont>  (select distinct destination, :run_id from db1.ctab where state='ME');
%RDMS-I-BUGCHKDMP, generating bugcheck dump file MY$DISK:[MY_HOME]SQLBUGCHK.DMP;
%SQL-F-BUGCHK, There has been a fatal error. Please contact your Oracle support
representative. SQL$BLRXPR - 15
SQL> insert into db2.tb1
cont> (select destination,
cont>  case when :suffix indicator :hv2 is null
cont>       then 1 else 2 end case
cont>  from db1.ctab);
%RDMS-I-BUGCHKDMP, generating bugcheck dump file MY$DISK:[MY_HOME]SQLBUGCHK.DMP;
%SQL-F-BUGCHK, There has been a fatal error. Please contact your Oracle support
representative. SQL$BLRXPR - 15

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.2.3 コメントがSQL$PRE/COBOLで必ずしも認識されない

Oracle Bug#4751103

SQLプリコンパイラがCOBOLのコメント文を適切に認識しませんでした。ほとんどの場合、違いはありませんが、レコード定義の途中などでは、名前が欠落することがあり、%SQL-F-HVNOTDECLなどのエラーが発生していました。

たとえば、埋込みSQLを使用する次のCOBOLプログラムについて考えます。

000000 IDENTIFICATION DIVISION.
000000 PROGRAM-ID.    DUMMYIO.
000000 AUTHOR.        RDB ENGINEERING.
000000
000000 ENVIRONMENT DIVISION.
000000
000000 CONFIGURATION SECTION.
000000 SOURCE-COMPUTER. ALPHA-RDB.
000000 OBJECT-COMPUTER. ALPHA-RDB.
000000
000000 DATA DIVISION.
000000
000000 WORKING-STORAGE SECTION.
000000
000000     EXEC SQL INCLUDE SQLCA END-EXEC
000000
000000 01  HOST-DATA.
000000     02  HOST-CODE                  PIC  X(03).
000000* COMPUTATIONAL ITEMS
000000     02  OLD-TOTAL-COST             PIC S9(09)V99    COMP.
000000     02  OLD-TOTAL-TAX              PIC S9(09)V99    COMP.
000000* END OF COMPUTATIONAL ITEMS
000000     02  HOST-REASON                PIC  X(60).
000000     02  USER-CODE                  PIC  X(05).
000000
000000 01  SELECTION-RANGES.
000000     02  NO-RANGE                   PIC  X(1).
000000
000000 PROCEDURE DIVISION.
000000
000000 THE-PROGRAM.
000000
000000     PERFORM SELECT-HOST-RECORD.
000000     MOVE SPACE TO NO-RANGE.
000000
000000 RETURN-TO-CALLER.
000000     EXIT PROGRAM.
000000
000000 SELECT-HOST-RECORD.
000000     EXEC SQL SELECT COUNT(*)
000000     INTO :OLD-TOTAL-COST
000000     FROM RDB$DATABASE
000000     END-EXEC.

前述のプログラムでは、HOST-DATAレコードの定義内に2つのコメントがあります。SQLプリコンパイラは、これらのコメントを正常に解析しませんでした。その結果、次のエラー・メッセージが表示されていました。

000000     INTO :OLD-TOTAL-COST
                1
%SQL-F-HVNOTDECL, (1) Host variable OLD-TOTAL-COST was not declared

バグ・レポートでは、埋込みコメントは、一組の位置合せのコンパイラ・ディレクティブで、次のように表示されるCOBOLの特殊なコメント行です。

000000 01  HOST-DATA.
000000     02  HOST-CODE                  PIC  X(03).
000000*DC SET ALIGNMENT
000000     02  OLD-TOTAL-COST             PIC S9(09)V99    COMP.
000000     02  OLD-TOTAL-TAX              PIC S9(09)V99    COMP.
000000*DC END-SET ALIGNMENT
000000     02  HOST-REASON                PIC  X(60).
000000     02  USER-CODE                  PIC  X(05).

問題を回避するには、レコード定義の途中からコメントを削除します。コメントが位置合せのコンパイラ・ディレクティブの場合(前述のALIGNMENTディレクティブやPADALIGNディレクティブなど)、これらを再配置してレコード全体をまとめることができ、同じCOBOLコードが生成されます。たとえば、前述のレコード定義は次のように再コード化できます。

000000*DC SET ALIGNMENT
000000 01  HOST-DATA.
000000     02  HOST-CODE                  PIC  X(03).
000000     02  OLD-TOTAL-COST             PIC S9(09)V99    COMP.
000000     02  OLD-TOTAL-TAX              PIC S9(09)V99    COMP.
000000     02  HOST-REASON                PIC  X(60).
000000     02  USER-CODE                  PIC  X(05).
000000*DC END-SET ALIGNMENT

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.2.4 CONCAT演算子から表示される不正なデータ

Oracle Bug#6002006および6034530

Oracle Rdbリリース7.2.1、リリース7.2.1.1およびリリース7.2.1.2では、CONCAT演算子(||)で不正な結果が生成されることがあります。次の例では、エラーが、予想される->ではなく..として表示されています。

SQL> set flags 'trace';
SQL>
SQL> begin
cont>  for :a as each row of
cont>           select s_number, s_unit
cont>            from tom
cont>           where (s_line = 0 or s_line is NULL)
cont>  do
cont>    trace :a.s_number,'-'||'>', :a.s_unit;
cont>  end for;
cont> end;
~Xt: 1         ..1
~Xt: 2         ..2
~Xt: 3         ..3
SQL>

この問題は、外部のFORループに対する範囲リストストラテジを処理する際のRdbオプティマイザとの対話が原因で発生していました。OR条件が問合せ例から削除されると、CONCATの結果が正しくなります。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.2.5 CREATE INDEXが間違ったパーティションに索引キーを挿入する

Oracle Bug#2797443

以前のリリースのOracle Rdbでは、照合順序がある降順のCHAR列またはVARCHAR列のパーティション索引を作成する場合、行が間違ったパーティションにマップされることが稀にあります。このような定義は次のように表示されます。

create collating sequence GERMAN german;
create domain NAMES_DOM char(40) collating sequence GERMAN;
create domain IDS_DOM char collating sequence GERMAN;
create table NAMES_TABLE (id IDS_DOM, last_name NAMES_DOM);
create index NAMES_INDEX
        on NAMES_TABLE (id, last_name)
        store using (id, last_name)
            in AREA1 with limit of ('1', 'k')
            in AREA2 with limit of ('1', 'm')
            otherwise AREA3;

この問題は、索引の作成後に行が挿入される場合、または照合順序が削除される場合は発生しません。

この問合せでエラーが生じる状況の一因となったのは、主に次の部分です。

  1. 列に照合順序が関連付けられています。これは、ドメインで明示的に定義されるか、データベースの広い照合順序として黙示的に定義されます。
  2. データ行が最初に挿入された後、2つ以上のセグメントで索引が作成されます。セグメントの一部は降順です。
  3. STORE USING文にはWITH LIMIT OF句が含まれます。ここで、先行するセグメントは同じですが、2番目のセグメントの値は降順です。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.2.6 ビューに挿入する際の予期しないバグチェック

Oracle Bug#4001764

Oracle Rdbリリース7.2の以前のリリースでは、AUTOMATIC AS列またはDEFAULT値を含む列を参照するビューを使用すると、バグチェックが発生していました。これは、参照される列が実表の他の列も参照した場合に発生していました。次の例は、問題を示しています。

SQL> create table sample_auto
cont>     (cola integer(3)
cont>     ,colb automatic insert as round(cola));
SQL> insert into sample_auto values (18.245);
1 row inserted
SQL>
SQL> create view sample_view as select * from sample_auto;
SQL>
SQL> insert into sample_view values (19.456);
%RDMS-I-BUGCHKDMP, generating bugcheck dump file USER2:[TESTING]RDSBUGCHK.DMP;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file USER2:[TESTING]SQLBUGCHK.DMP;
%SYSTEM-F-ACCVIO, access violation, reason mask=00,
virtual address=0000000000000010, PC=0000000000288F7C, PS=0000001B
SQL>

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。Oracle Rdbは、AUTOMATIC AS列とDEFAULT値の句の参照をビュー内から正しく解決するようになりました。

4.2.7 動的SQLでSQLSTATE 22001が返されない

Oracle Bug#5208854

ダイアレクトSQL92、SQL99、ORACLE LEVEL1またはORACLE LEVEL2を使用する場合、SQL文に入力した値が切り捨てられる際に、SQLSTATEフィールドにはマイナスのSQLCODEコードとともに22001がレポートされる必要があります。

コンパイル済SQLプログラムで変数を使用してSQL文の入力値を指定し、この変数がターゲット・データベースのフィールドより長く、フィールドのサイズを超える空白以外のデータがこの変数に含まれている場合、必要なSQLSTATEとSQLCODEがレポートされていませんでした。

たとえば、次の列が定義されているCH1という名前のデータベース表について考えます。

Column Name                     Data Type
-----------                     ---------
CH1A                            CHAR(10)
CH1B                            CHAR(1)
CH1C                            CHAR(10)

コンパイル済SQL/Cプログラムの次のフラグメントには、次の挿入コードが含まれます。

...
    long SQLCODE;
    char SQLSTATE[6] = {'\0','\0','\0','\0','\0','\0'};
    char dstmt[100];
    char x4[16];
...
    strcpy(dstmt, "SET DIALECT 'SQL92'");
    EXEC SQL EXECUTE IMMEDIATE :dstmt;

    strcpy (dstmt, "INSERT INTO CH1 VALUES ('FOO', 'F', ?)          ");
    EXEC SQL PREPARE BLAT4 FROM :dstmt;

    strcpy (x4, "LITTLETOOLONG");
    EXEC SQL EXECUTE BLAT4 USING :x4;

    printf("SQLCODE should be < 0, SQLSTATE should be 22001\n")
    printf("SQLCODE is %ld\n", SQLCODE);
    SQLSTATE[5] = '\0';
    printf ("SQLSTATE is %s\n", SQLSTATE);
...

このプログラムの出力は次のように表示されていました。

SQLCODE should be < 0, SQLSTATE should be 22001
SQLCODE is 0
SQLSTATE is 00000

プログラムの出力は次のようになります。

SQLCODE should be < 0, SQLSTATE should be 22001
SQLCODE is -306
SQLSTATE is 22001

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.2.8 SORTED RANKED索引の許容された重複を作成する場合の予期しないバグチェック

Oracle Bug#3899550

Oracle Rdbの以前のバージョンでは、SORTED RANKED索引でその重複の数がきわめて多い(16777217よりも多い)場合、CREATE INDEXコマンドが失敗します。バグチェックのダンプは、次のようになります。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。Oracle Rdbは、より大容量の内部カウンタにリーフ・ノードのカーディナリティを蓄積するようになりました。

4.2.9 SQLSTATE 22011とSQLCODE -1044の追加

ダイアレクトSQL92、SQL99、ORACLE LEVEL1またはORACLE LEVEL2を使用する場合、組込み関数SUBSTRINGのパラメータ・エラーの結果として、マイナスのSQLCODEとSQLSTATE 22011(無効なサブストリングを意味する)がレポートされる必要があります。SQLは一般的なエラー結果、つまりSQLCODE -1とSQLSTATE RR000を返していました。

たとえば、PERSONNELデータベースに対する次の問合せは、マイナスの文字列長が原因で失敗します。

SQL> select substring(last_name from 1 for -1) from employees;
%RDB-F-INVSUBSTRLEN, length specified for substring is invalid

このような失敗に対して、SQLCODE -1044(無効なサブストリングの長さを意味する)と、SQL規格の必須のSQLSTATE 22011を生成するようにOracle Rdbが拡張されました。たとえば、SQLCAは前述の問合せ後に次のように表示されます。

SQL> show sqlca
SQLCA:
        SQLCAID:        SQLCA           SQLCABC:        128
        SQLCODE:        -1044
        SQLERRD:        [0]: 3
                        [1]: 0
                        [2]: 0
                        [3]: 0
                        [4]: 0
                        [5]: 0
        SQLWARN0:       0       SQLWARN1:       0       SQLWARN2:       0
        SQLWARN3:       0       SQLWARN4:       0       SQLWARN5:       0
        SQLWARN6:       0       SQLWARN7:       0
        SQLSTATE:       22011

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.2.10 プログラムで定義されたビューに対するSUBSTRINGの切捨て

Oracle Bug#6117796

コンパイル済SQLまたはSQLモジュール言語プログラムで、組込み関数SUBSTRINGを使用して定義された列を含むビューを定義する場合、同じプログラムの実行時に検索にそのビューを使用すると、結果が切り捨てられることがあります。

たとえば、次のSQL文を含むコンパイル済SQLプログラムがあるとします。

EXEC SQL CREATE TABLE MOREGRUB (C1 VARCHAR (10), ID INT);
EXEC SQL CREATE VIEW X4 (S1, ID) AS
  SELECT (C1 FROM 2 FOR 4), ID
  FROM MOREGRUB;
EXEC SQL INSERT INTO MOREGRUB VALUES ('Pretzels', 1);
EXEC SQL SELECT S1 INTO :ch1 FROM X4 WHERE ID = 1;

前述のコードの実行後、ホスト変数:ch1の値は、正しい値retzではなくreになっていました。

この問題を回避するには、プログラムの外部にビューを定義するか、ビューを使用せずに表に対して直接選択します。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.2.11 記憶域マップ関数のコール時の予期しないPORT_LENエラー

Oracle Bug#6129632

以前のリリースのOracle Rdbでは、表の記憶域マップと同じ名前を使用して特殊な記憶域マップ関数を作成していました。この関数にはデータ値を渡すことができ、コール元に返されるパーティション番号があります。次の例に示すように、このようなコールはRDB-F-PORT_LENエラーで失敗することがあります。

SQL> SELECT sample_map (acct_num) FROM sample;
%RDB-F-PORT_LEN, buffer length 25 does not match BLR description 29

このエラーは、ユーザー・データの全長が4の倍数の場合に発生します。この場合、ACCT_NUM列はINTEGER型です(長さは4オクテット)。この問題の回避策はありません。

このリリースのOracle Rdbをインストールすると、次のコマンドを使用して、機能する関数定義を再生成できます。

SQL> ALTER STORAGE MAP sample_map COMPILE;
SQL> COMMIT;

このコマンドは、このエラーが表示される記憶域マップに適用する必要があります。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。Oracle Rdbは、記憶域マップ関数を正しく生成するようになりました。

4.2.12 PERSONAサポートを有効化するALTER DATABASEが予期せず失敗する

Oracle Bug#6132645

ALTER DATABASE ... SECURITY CHECKING IS EXTERNAL (PERSONA IS ENABLED)は、データベースでのPERSONAの有効化に失敗することがあります。これは、データベースでバッファの数がきわめて少ない場合に稀に発生します。レポートされたケースでは、データベースでNUMBER OF BUFFERSが10に定義されていました。

これを回避するには、データベースのバッファ数を100に増やすか、あるいはRDB$DATABASE行を含むバッファがメモリー内に残るようにします。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。このリリースのRdbでは、RDB$FLAGS列の更新時にRDB$DATABASE行が最新であることを確認します。

4.3 RMUエラーの修正

4.3.1 /ENCRYPTIONを使用するテープへのRMUバックアップでバグチェックが発生する

Oracle Bug#6196884

ゼロ以外のXORグループの数と暗号化を使用する、テープ操作へのRMUバックアップが失敗し、アクセス違反エラーが発生することがあります。次の例を見てみます。

$ RMU/BACKUP/ENCRYPTION=(VAL="mysecretkey") MF_PERSONNEL MKA0:TEST.RBF
...
%RMU-I-BUGCHKDMP, generating bugcheck dump file ...
%SYSTEM-F-ACCVIO, access violation, reason mask=04, virtual address=...
%RMU-F-FATALERR, fatal error on BACKUP

この問題は、XORコードで変更された不正なバッファ・サイズを使用する暗号化コードが原因で発生していました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.2 RMU /ANALYZE /INDEXがすべての論理領域と物理領域にアクセスする

Oracle Bug#3146660

以前のリリースのOracle Rdbでは、RMU /ANALYZE /INDEXコマンドがデータベースのすべての論理領域と物理領域にアクセスしようとしていました。このため、I/Oが過剰になり、ロック操作が発生し、他のデータベース・ユーザーとの論理領域または物理領域のロック競合が予期せず発生することがありました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。RMU /ANALYZE /INDEXコマンドは、分析対象の索引の論理領域と物理領域のみにアクセスするようになりました。

4.3.3 %COSI-F-NEGTIMによってRMU/VERIFYまたはRMU/BACKUPが中断する

Oracle Bug#6005440

この問題では、次のメッセージが表示されます。

%COSI-F-NEGTIM, a negative time was computed

これによって、Oracle RdbデータベースのRMU/BACKUPまたはRMU/VERIFYが中断することがあります。この問題は、RMU/VERIFYコマンドとRMU/BACKUPコマンドで実行されるOracle Rdbデータベースのルート検証時に、Oracle Rdbデータベース・ルートの作成時間が許容範囲を超える場合に発生していました。コマンドの実行の続行が許可された場合、RMU/BACKUP操作またはRMU/VERIFY操作を中断するために%COSI-F-NEGTIMエラーが割り当てられていました。

この問題の1つの原因として考えられるのは、データベースのルート破損以外に、VMSシステム時間がデータベースの作成時間よりも短く設定されている場合です。

この問題は、データベースのルートの検証時に%COSI-F-NEGTIMエラーが発生する場合、RMU/VERIFYまたはRMU/BACKUPの続行が許可されるように修正されました。

次の例で示す問題は、Oracle Rdbデータベースのバックアップを開始する際のデータベースのルートの検証時に発生します。データベースのルートに無効な作成日時の値があるために、警告%RMU-W-ROOTADINVが出力されると、%COSI-F-NEGTIMエラーによってバックアップ操作が中断されます。

$rmu/backup mf_personnel mfp.rbf
%RMU-W-ROOTADINV, root "DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1",
                  contains incorrect time stamp
                  expected between  1-DEC-1981 00:00:00.00 and
                  1-JAN-2007 00:00:01.24,
%COSI-F-NEGTIM, a negative time was computed
%RMU-F-FATALOSI, Fatal error from the Operating System Interface.
%RMU-F-FTL_BCK, Fatal error for BACKUP operation at  1-JAN-2007 00:00:02.59

VMSシステム時間がデータベースの作成時間よりも短く設定されていることが原因でこの問題が生じる場合、問題を回避するには、データベースの作成時間よりも遅い時間にシステム時間を設定します。それ以外では、RMU/RESTORE/ONLY_ROOTを使用して、以前のデータベースのバックアップから有効なデータベースのルートをリストアできます。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.4 データベースの作成日時の診断に関するRMU/VERIFYの問題

RMU/VERIFYコマンドとRMU/BACKUPコマンドで実行されるデータベースのルートの検証時に次の診断メッセージが発生した場合(Rdbデータベースのルートの作成時間がゼロまたは許容範囲外であることが原因)、不正な診断メッセージまたは診断メッセージに不正な日付の値が後から出力されることがありました。これは、いずれかのエラーが出力された場合にAIJおよびページのタイムスタンプを検証するために、ルートの作成時間が後で使用する目的で正しく保存されていなかったためです。

%RMU-W-ROOTADINV, root "DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1",
                  contains incorrect time stamp
                  expected between  1-DEC-1981 00:00:00.00 and
                  1-JAN-2007 00:00:02.54,
                  found: 19-APR-2007 03:35:27.81

%RMU-W-ROOTADZER, root "DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1",
                  contains zero time stamp

この問題は修正され、ルートの作成時間がゼロまたは許容範囲外の場合でも、後の診断で使用できるように正しく保存されるようになりました。

この問題の1つの原因として考えられるのは、データベースのルート破損以外に、VMSシステム時間がデータベースの作成時間よりも短く設定されている場合です。

次の例で示す問題は、Oracle Rdbデータベースのバックアップを開始する際のデータベースのルートの検証時に発生します。警告%RMU-W-ROOTADINVが出力されると、後から発生する%RMU-E-BADTADAIJエラーの診断には、初期化されていないVMSシステムの日付17-NOV-1858 00:00:00.00が含まれます。

$rmu/backup mf_personnel mfp.rbf
%RMU-W-ROOTADINV, root "DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1",
                  contains incorrect time stamp
                  expected between  1-DEC-1981 00:00:00.00 and
                  1-JAN-2007 00:00:01.24,
                  found:  1-JAN-2007 00:01:29.14
%RMU-E-BADTADAIJ, after-image journal creation version differs from the root
                  expected: 17-NOV-1858 00:00:00.00, found: 1-JAN-2007
    00:01:29.14
%RMU-W-ROOERRORS,        1 error encountered in root verification
%RMU-I-COMPLETED, BACKUP operation completed at  1-JAN-2007 00:00:01.40

VMSシステム時間がデータベースの作成時間よりも短く設定されていることが原因でこの問題が生じる場合、問題を回避するには、データベースの作成時間よりも遅い時間にシステム時間を設定します。それ以外では、RMU/RESTORE/ONLY_ROOTを使用して、以前のデータベースのバックアップから有効なデータベースのルートをリストアできます。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.5 間違ったバージョンを使用する場合にRMU/RESTOREがトレースバック・ログで終了する

Oracle Bug#6001235

互換性のないバージョンのデータベースをリストアするためにRMU/RESTOREを使用すると、RMU/RESTOREは単純に終了するのではなくレジスタ・ダンプで終了します。次の例でこの問題を示します。

$ RMU/RESTORE/NOCDD/DIR=SYS$DISK:[]/LOG REPRODUCER.RBF
%RMU-F-DB_CVT_FAIL, Cannot convert from version V7.2 to V7.1
%RMU-F-DB_CVT_FAIL, Cannot convert from version V7.2 to V7.1

  Improperly handled condition, image exit forced by last chance handler.
    Signal arguments:   Number = 0000000000000008
                        Name   = 0000000002C88B94
                                 0000000000000004
                                 0000000000000007
                                 0000000000000002
                                 0000000000000007
                                 0000000000000001
                                 00000000003AEB34
                                 100000000000001B
  ...

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.6 RMU/VERIFYの%RMU-I-BADNXTNOD診断メッセージから%RMU-E-BADNXTNODへの変更

Oracle Bug#4197298

Oracle Rdbデータベースのソート索引の検証時に表示される%RMU-I-BADNXTNOD診断メッセージは、索引構造が破損していることと、索引を再構築する必要があることを示していました。そのため、BADNXTNOD診断メッセージの重大度レベルは、このメッセージが無視されないようにInformationalからErrorに変更されました。

次の例は、RMU/VERIFYがRdbデータベースのソート索引の構造が破損していることを検出したときに出力される%RMU-I-BADNXTNOD診断メッセージを示しています。これは、索引を再構築する必要があることを示していました。

$ RMU/VERIFY/INDEX=bad_index mf_personnel
%RMU-I-BADNXTNOD, Bad next b-tree node at level 2.
                  Expected b-tree node at logical dbkey 39:3:2.
                  Found next b-tree node at logical dbkey 65:3:2.

次の例は、索引の破損がユーザーに確実に通知されるように、重大度がInformationalではなくErrorで出力される%RMU-E-BADNXTNOD診断メッセージを示しています。

$ RMU/VERIFY/INDEX=bad_index mf_personnel
%RMU-E-BADNXTNOD, Bad next b-tree node at level 2.
                  Expected b-tree node at logical dbkey 39:3:2.
                  Found next b-tree node at logical dbkey 65:3:2.

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.7 RMU/VERIFYの%RMU-I-BTRDUPCAR診断メッセージから%RMU-E-BTRDUPCARへの変更

Oracle Rdbデータベースのランク付きソート索引の検証時に表示される%RMU-I-BTRDUPCAR診断メッセージは、索引構造が破損していることと、索引エントリに指定されているカーディナリティがエントリの重複リストから計算されたカーディナリティと一致していないために索引を再構築する必要があることを示しています。これにより、COUNT(*)などのSQL問合せの不正な結果が生じます。そのため、RMU-I-BTRDUPCAR診断メッセージの重大度レベルは、このメッセージが無視されないようにInformationalからErrorに変更されました。

次の例は、RMU/VERIFYがRdbデータベースのランク付きソート索引の構造が破損していることを検出したときに出力される%RMU-I-BTRDUPCAR診断メッセージを示しています。これは、索引を再構築する必要があることを示していました。

$ RMU/VERIFY/INDEX=bad_index mf_personnel
%RMU-I-BTRDUPCAR, Inconsistent duplicate cardinality (C1) of 16777318  specified
                  for entry 1 at dbkey 58:10:0.
                  Actual count of duplicates is 16777317.
%RMU-I-BTRROODBK, root dbkey of B-tree is 58:10:0

次の例は、索引の破損が確実にユーザーに通知されるように、重大度がInformationalではなくErrorで出力される%RMU-E-BTRDUPCAR診断メッセージを示しています。

$ RMU/VERIFY/INDEX=bad_index mf_personnel
%RMU-E-BTRDUPCAR, Inconsistent duplicate cardinality (C1) of 16777318  specified
                  for entry 1 at dbkey 58:10:0.
                  Actual count of duplicates is 16777317.
%RMU-I-BTRROODBK, root dbkey of B-tree is 58:10:0

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.8 RMU/RESTORE、RMU/DUMP/BACKUPに対する無効な%RMU-F-NOPRIVERRエラー

Oracle Bug#6119717

RMUのすべてのコマンドと/ROOT_ONLY RESTOREコマンドの実行に必要なVMS権限を初期化する際の問題が原因で、無効な%RMU-F-NOPRIVERRが発生していました。これは、初期化の問題によって、WORLDアクセスなどの特定のVMS権限がない場合に、RMUが誤ってその権限が必要であると判断したためです。これは、ユーザー・プロセスが特権的ではないため、BYPASSやSYSPRVなどのVMS優先権限が付与されていない場合にのみ発生していました。データベースのアクセス制御リストのアクセス権限をチェックすることに関する問題ではありません。これは正しく処理されていました。

次の例は、RBFファイルに保存されたデータベースのアクセス制御リストが、データベースへのユーザー・アクセスを許可して、RMU/RESTOREコマンドの実行を許可するために必要なVMS権限をユーザーが保持している場合でも、非特権ユーザー・プロセスがRMU/RESTOREコマンドを実行する権限に対して拒否されている状況を示しています。

$ SHOW PROCESS/PRIVILEGE

Authorized privileges:
 GROUP        GRPNAM       GRPPRV       NETMBX       TMPMBX

$ RMU/SHOW PRIVILEGE MF_PERSONNEL.RDB

    (IDENTIFIER=[GROUP,USER],ACCESS=READ+WRITE+CONTROL+RMU$ALL)

$ RMU/BACKUP/NOLOG MF_PERSONNEL.RDB MFP.RBF
$ SQL
 drop database filename mf_personnel;
 exit
$ RMU/RESTORE/NOLOG MFP.RBF
 %RMU-F-NOPRIVERR, no privileges for attempted operation

この問題を回避するには、BYPASS権限またはSYSPRV権限で認可されているVMSアカウントを使用してRESTOREを実行します。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.9 スナップショット・ファイルを移動するRMU/REPAIRが新しいファイルの間違った仕様で失敗する

Oracle Bug#4083632

スナップショット・ファイルのデフォルトのファイル仕様の隠れたデバイス名と、新しいスナップショットの場所の指定により、RMU/REPAIRが失敗することがあります。次の例を見てみます。

$ RMU/REPAIR/INITIALIZE=(SNAPSHOT=CONFIRM)/AREA=MYDB_DATA -
    $1$DKA100:[USER.][SUB]MYDB
Area MYDB_DATA snapshot filename [$1$DKA100:[USER.][SUB]MYDB_DATA.SNP;1]:
    >>> User response: $1$DKA100:[USER]MYDB_DATA.SNP
Area MYDB_DATA snapshot file allocation [100]:
%RMU-F-FILACCERR, error creating database file $1$DKA100:[USER.]
[USER]MYDB_DATA.SNP;1
-RMS-E-DNF, directory not found

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.3.10 RMU/BACKUP/AFTERでの「RMU-F-FILACCERR, Error Truncating File」

Oracle Bug#5629652

1つの拡張可能なアフター・イメージ・ジャーナル・ファイル(ジャーナル・ファイルのバックアップ前に拡張されてから無効化されたファイル)のRMU/BACKUP/AFTERが失敗し、次のエラーが発生していました。

%RMU-F-FILACCERR, error truncating file
 -SYSTEM-W-ACCONFLICT, file access conflict

次の例は、1つの拡張可能なアフター・イメージ・ジャーナル・ファイル(ジャーナル・ファイルのバックアップ前に拡張されてから無効化されたファイル)のRMU/BACKUP/AFTERで発生したRMU-F-FILACCERRを示しています。

$ SQL
create data file foo;
create table tbl1 (c1 char(50),c2 char(50));
commit;
exit
$ rmu/backup foo foo
$ rmu/set after/enable/add=(name=aij1,file=aij1) foo
$ SQL
att 'f foo';
@load.sql
exit
$ rmu/set after/disable foo
$ rmu/backup/after/log foo fooaij
   %RMU-F-FILACCERR, error truncating file
   -SYSTEM-W-ACCONFLICT, file access conflict

この問題を回避するには、ジャーナル・ファイルのバックアップ前にジャーナル・ファイルを無効化しないようにします。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.4 RMU Show Statisticsエラーの修正

4.4.1 RMU/SHOW STATISTICSの不正な「Transaction Recovery Duration Estimates」

Oracle Bug#6006427

Oracle Rdb 7.2の以前のリリースでは、「Transaction Recovery Duration Estimates」画面の時間の値が大幅に間違っていることがありました。本来の値よりもかなり大きな値になっていました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。推定値は、より現実的な範囲の値に縮小されています。

4.4.2 RMU/SHOW STATISTICSのストール統計の集計の期間の値が誤って見積られる

Oracle Bug#6006202

Oracle Rdb 7.2の以前のリリースでは、「aggregate stall statistics」画面のストール期間の値が正しく見積られていないため、異常に大きな値が表示されていました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。

4.4.3 RMU /SHOW STATISTICS /ALARM=nがn秒を待機しない

Oracle Bug#6016126

Oracle Rdb 7.2の以前のリリースでは、ストールの通知アラームが誤って発動することがありました。概して、ストールの通知は予定よりもかなり早くなっていました。たとえば、60秒よりも長いストールが検出されると、OPCOMによって次のアラームが発動します。アラームは、本来よりもかなり早い時間に生成されていました。

$ RMU /SHOW STATISTICS PRODUCTION_DB -
    /NOINTERACTIVE -
    /BROADCAST -
    /TIME=60 -
    /ALARM=60 -
    /NOTIFY=(OPER12) -
    /UNTIL=TOMORROW

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。ストールの通知アラームは、予定よりも早く生成されることがなくなりました。

4.4.4 「Hot Standby Statistics」画面で状態の値が切り捨てられる

Oracle Bug#6044632

以前は、ホット・スタンバイのTCP/IPポート番号が9999よりも大きい場合、そのポート番号はRMU /SHOW STATISTICSの「Hot Standby Statistics」画面で切り捨てられていました。

たとえば、TCP/IPポート番号12345を使用する場合、状態の画面にはState: TCP/IP:1234と表示されていました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。状態の表示フィールドでは、5桁のTCP/IPポート番号を表示できるようになりました。

4.5 ホット・スタンバイ・エラーの修正

4.5.1 RMU/OPEN/ROW_CACHE=DISABLEを使用する際のホット・スタンバイ・ノードの障害のリカバリ

Oracle Bug#5957364

行キャッシュ機能とホット・スタンバイ機能を使用する構成では、データベースで最初にホット・スタンバイを開始する前に、RMU/SET ROW_CACHE/DISABLEコマンドを使用してスタンバイ・データベースで行キャッシュを明示的に無効にする必要があります。ただし、行キャッシュを無効にするには、スタンバイ・データベースでRMU/OPEN/ROW_CACHE=DISABLEコマンドを使用することもできます(推奨ではありません)。

RMU/OPEN/ROW_CACHE=DISABLEコマンドを使用する際にシステム障害が発生した場合、データベースを再開するとすぐにデータベース・リカバリは、かなり古い最後のチェックポイントの場所で開始しようとしていました。この場所は、元々スタンバイ・データベースを作成するためにマスター・データベースをバックアップしたときの行キャッシュのチェックポイントに基づいていました。必要なAIJファイルはすでにオンライン上にないため、リカバリが失敗していました。

この問題は、Oracle Rdbリリース7.2.1.3で修正されました。DBRプロセスは、RCSプロセスがアクティブのときにノード障害からリカバリしない場合、行キャッシュの最も古いチェックポイントの場所を無視するようになりました。


第5章
Oracle Rdbリリース7.2.1.2で修正されるソフトウェアの誤り

この章では、Oracle Rdbリリース7.2.1.2で修正されるソフトウェアの誤りについて説明します。

5.1 すべてのインタフェースに適用されるソフトウェアの誤りの修正

5.1.1 KOD$START + 0000080Cでのバグチェック

Oracle Bug#5059527

Oracle Rdbリリース7.1.4.3以降では、次の例外のバグチェックが発生することがありました。

***** Exception at 0193578C : KOD$START + 0000080C
%COSI-F-BUGCHECK, internal consistency failure

リリース7.1.4.3では、TSNゼロが割り当てられていないかどうかを検証するために、ルーチンKOD$STARTが変更されました。TSNゼロが割り当てられた場合、このバグチェックが発生していました。

この問題は、データベースで最も古いトランザクション順序番号(TSN)を決定するコードのわずかな競合状態が原因で発生していました。複数のプロセスがグローバルな最も古いTSNの場所に同時にアクセスしていた場合、コードは最も古いTSNがゼロであると誤って判断していました。

この問題を完全に防ぐには、以前のバージョンのOracle Rdbを使用するしかありません。発生回数を減らすには、データベースのクラスタ・ノードの数を1よりも大きな値に設定します。これにより、ノードの数が1であることに依存するパフォーマンス機能(行キャッシュなど)が無効になることに注意してください。また、システムがクラスタの一部ではない場合、クラスタ・ノードの数を1よりも大きな値に設定しても影響はありません。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。TSNゼロが割り当てられる原因となった競合状態はなくなりました。

5.1.2 大きなAIJファイルをDBに追加すると、ACCVIOエラーまたはOPCDECエラーで失敗する

Oracle Bug#5852864

データベースのアフター・イメージ・ジャーナル・ファイルの作成が失敗し、ACCVIOエラーまたはOPCDECエラーが発生します。次の例を見てみます。


SQL> CREATE DATABASE
     ...
     PRESTARTED TRANSACTIONS ARE on
        (WAIT 1 MINUTES FOR TIMEOUT)
     ...
SQL> ALTER DATABASE FILENAME myDB ADD JOURNAL journal01 FILENAME 'JOURNAL01'
ALLOCATION IS 7000000 BLOCKS;
%SYSTEM-F-ACCVIO, access violation, reason mask=00,
                  virtual address=000000000000000C, PC=000000000000000C,...

これは、同期化フラグを早めに消去するコードのバグが原因で発生していました。このため、現在のリクエストが完了する前に、期限切れの事前起動トランザクション・タイマーで作成されたリクエストが実行されていました。また、スタックも破損していました。

問題を回避するには、事前起動トランザクション・タイマーの値を大きくするか、SQLのALTER DATABASE文を使用して事前起動トランザクション・タイマーを完全に無効にします。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。

5.1.3 単純な問合せがARITH_EXCEPTで失敗する

Oracle Bug#5941200

次の例に示すように、単純な問合せが算術例外で失敗します。

SELECT * FROM auth_control WHERE scheme_code = 'aaa'
AND task_ind = 'x'  AND in_use_ind = 'g';
%RDB-E-ARITH_EXCEPT, truncation of a numeric value at runtime
-SYSTEM-F-HPARITH, high performance arithmetic trap, Imask=00000000,
Fmask=00000400, summary=04, PC=00000000008BADFC, PS=0000001B
-SYSTEM-F-FLTDIV, arithmetic trap, floating/decimal divide by zero at
PC=00000000008BADFC, PS=0000001B

次の例に示すように、SQLフラグindex_column_groupが無効の場合、問合せは機能します。

set flags 'noindex_column_group';
set flags 'stra,detail';

SELECT * FROM auth_control WHERE scheme_code = 'aaa'
AND task_ind = 'x'  AND in_use_ind = 'g';
0 rows selected

また、次の例に示すように、RMU/COLLECT OPTIMIZERが適用される場合、問合せは機能します。

$rmu/collect optimizer <database>
$SQL$
ATT 'FILE <database>';

SELECT * FROM auth_control WHERE scheme_code = 'aaa'
AND task_ind = 'x'  AND in_use_ind = 'g';
0 rows selected

この問合せでエラーの一因となったのは、主に次の部分です。

  1. 問合せは3つの等価条件(COL1 = 1 AND COL2 = 2 AND COL3 = 3)を含む表から選択します。
  2. 表には、前述の3つの列の順序が連続する(COL1、COL2、COL3、COL4など)索引が含まれます。
  3. セグメント列の1つには、接頭辞カーディナリティに対してゼロ値が含まれます。この情報を検索するには、SQLフラグcostingおよびcursor_statを設定し、問合せを再実行する必要があります。問合せでダンプされる接頭辞カーディナリティの情報は次のとおりです。
    Segment group factors of 4 segments are estimated.
       COL1     GROUP_FACTOR  3.2407680E+00     PREFIX_CARD 1
       COL2     GROUP_FACTOR  2.4153826E+00     PREFIX_CARD 1
       COL3     GROUP_FACTOR  1.8002133E+00     PREFIX_CARD 0
       COL4     GROUP_FACTOR  1.3417203E+00     PREFIX_CARD 0
    

この問題は、Oracle Rdbのリリース7.1.4.4、リリース7.1.4.5、リリース7.2.0.1、リリース7.2.0.2およびリリース7.2.1.0に影響します。この問題はOracle Rdbリリース7.2.1.2で修正されました。

5.2 SQLエラーの修正

5.2.1 ストアド・ファンクションをすべての定数パラメータでコールする際に予期しないRTN_FAIL/BAD_REQ_HANDLEがレポートされる

Oracle Bug#4764496

以前のリリースのOracle Rdbでは、問合せが失敗し、ルーチン名"(unknown)"のエラーRTN_FAILと派生メッセージBAD_REQ_HANDLEが発生していました。

次に、SQL_FUNCTIONSルーチンからREPLACE関数を使用する例を示します。

select
  replace('hallo','a','e')
  from TAB1
 where COL2 = date'2006-06-29'
   and (  COL1 = 'AA'
          or
          COL1 = 'BB' );
%RDB-E-RTN_FAIL, routine "(unknown)" failed to compile or execute successfully
-RDB-E-BAD_REQ_HANDLE, invalid request handle

この問題は、問合せのオプティマイザが問合せの構成時に定数式を使用しようとした場合に発生していました。ただし、参照されるルーチン(この例ではREPLACEという名前の関数)は、問合せで使用する目的でコンパイルされていないため、レポートされた名前は不明になっていました。関数がロードされると、この問合せは成功します。

この問題の回避策は次のとおりです。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。

5.2.2 大量のコマンドラインを使用する場合のSYSTEM-F-ROPRAND

Oracle Bug#4117738

大量のコマンドラインを使用する場合、対話型SQLでSYSTEM-F-ROPRANDメッセージが発生することがありました。さらに、SQLはすべての後続コマンドでSYSTEM-F-ROPRANDエラーが発生する状態になっていました。バグ・レポートの例では、1行が11,000バイトを超える構成のコマンド・ファイルによって、問題が明示されていました。

次のシーケンスは、BIGCMD.SQLという名前のコマンド・ファイルを使用する問題の状態を示しています。このファイルは大きすぎるため、ここでは再現できません。

SQL> @BIGCMD.SQL
%SYSTEM-F-ROPRAND, reserved operand fault at PC=0000000000F4DDA8, PS=0000001B

このような大量のコマンドラインを使用する場合、アクセス違反などの様々な現象も発生する可能性があります。

SQLの問題が修正された後でも、前述の例のコマンドラインには、Rdbのエグゼクティブ・モード・スタックのデフォルト・サイズよりも大きな再帰レベルを必要とする問合せが含まれていました。この場合、問合せは失敗し、次のメッセージが表示されます。

%RDB-F-IMP_EXC, facility-specific limit exceeded
-RDMS-F-XPR_STACK_OFLO, expression forces too many levels of recursion

エグゼクティブ・モード・スタックのサイズは、論理RDMS$BIND_EXEC_STACK_SIZEを使用して調整できます。デフォルト・サイズは20ページレットです。前述のコマンドファイルの問合せを完了するには、このサイズを330に設定する必要がありました。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。

5.2.3 ALTER VIEWからの予期しないバグチェック

Oracle Bug#5964501

以前のリリースのOracle Rdbでは、AS SELECT句を指定したALTER VIEWコマンドでバグチェックが発生することがありました。これは、CASE、COALESCE、NULLIF、NVL、NVL2、ABS、DECODEまたはsubselect文などに表示されるブール式が列の式に含まれる場合に発生していました。

次の例は、エラーを示しています。

SQL> alter view v_t1 as select nullif(col1,-999999) as nn from t1;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file
RDBVMS_USER2:[SMITHI]RDSBUGCHK.DMP;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file
RDBVMS_USER2:[SMITHI]SQLBUGCHK.DMP;
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual address=
000000000000000C, PC=000000000028878C, PS=0000001B
SQL>

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。また、Oracle RdbはビューのDB$VIEW_RELATIONSシステム表の表依存情報を正しく保存するようになりました。

5.2.4 ALTER INDEX ... BUILD PARTITIONからの予期しないバグチェック

Oracle Bug#5951999

以前のリリースのOracle Rdbでは、SORTED RANKED索引に対するALTER INDEX ... BUILD PARTITION文またはALTER INDEX ... REBUILD PARTITION文でバグチェックが発生することがありました。この問題は、HASHED索引またはSORTED索引には影響しません。

SORTED RANKED索引機能内のサニティー・チェックで、パーティションのデータベース・キーが重複する索引キー内でソートされないことが検出された場合にバグチェックが発生します。

この問題を回避するには、REBUILD ALL PARTITIONS句を使用するか、索引をドロップして再作成します。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。Rdbは、重複する索引キーの値がDBKEYで昇順になるように正しくソートするようになりました。

5.3 RMUエラーの修正

5.3.1 RMU/DUMP/BACKUPがACCVIOエラーまたはオーバーラン・エラーで失敗する

Oracle Bug#5968242

/COMPRESSION=ZLIBで保存された保存セットに対するコマンドRMU/DUMP/BACKUPが失敗し、次のエラーが表示されます。

%SYSTEM-F-ACCVIO, access violation, reason mask=04, virtual address=...,
PC=..., PS=0000001B
%RMU-F-FATALOSI, Fatal error from the Operating System Interface.

/COMPRESSION=HUFFで保存された保存セットに対するコマンドRMU/DUMP/BACKUPが失敗し、次のエラーが表示されます。

Illegal output buffer overrun
%RMU-E-INVRECEXP, Error expanding compressed backup file record.
%RMU-F-FATALERR, fatal error on DUMP_BACKUP

このエラーは、領域に適切な圧縮コンテキストに切り替わらない、/DUMPに固有のコード・セクションで発生していました。

これらの問題は、Oracle Rdbリリース7.2.1.2で修正されました。

5.3.2 クライアント順序が32を超える場合のRMU/RESTOREの変換の問題

Oracle Bug#5963088

Rdbデータベースのルートのクライアント順序カウントは、リリース7.2に変換するリリース7.1データベースで32より大きな場合でも、変換したリリース7.2データベースで適宜32に設定されていました。これが原因で、データベースが破損していました。これは、リリース7.1データベースのRBFバックアップ・ファイルのリリース7.2のRMU/RESTOREによって、リストアの最後にデータベースがリリース7.2に変換される場合のみ発生していました。RMU/CONVERTコマンドを使用してリリース7.1データベースをリリース7.2データベースに変換する場合は発生しませんでした。この問題は、クライアント順序のカウントが、リリース7.2に変換されるリリース7.1データベースで32を超えない場合は発生しません。ただし、データベースを破損させないようにするには、次に示す2つの回避策のいずれかを使用して変換を繰り返すしかありません。このような問題は、リリース7.1データベースをリリース7.2に変換する前にリリース7.1データベースをバックアップして、データベースの変換直後にRMU/VERIFY/ALLを実行することの重要性を示しています。

次の例は、変換がエラーなしで完了したことを示しています。ただし、RMU/VERIFYは、データベースのルートに入力するよりも多くのクライアント順序がRDB$SEQUENCESシステム表に含まれていることを示しており、SQLでクライアント順序を表示しようとすると、RDMSのバグチェックのダンプが発生します。

$ RMU/RESTORE/LOG/DIR=DEVICE:[DIRECTORY]/nocdd -
_$ MFP_SEQUENCES.RBF
%RMU-I-CVTCOMSUC, CONVERT committed for DEVICE:[DIRECTORY]
 MF_PERSONNEL.RDB;1 to version V7.2
%RMU-W-USERECCOM, Use the RMU Recover command. The journals are not
available.
%RMU-I-COMPLETED, RESTORE operation completed at 30-MAR-2007 15:42:40.23
GIBSON>rmu/verify/all mf_personnel
%RMU-E-NOSEQENT, sequence id 35 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 37 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 38 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 39 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 40 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 41 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 42 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 43 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 44 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 45 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 46 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 47 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 48 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 49 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 51 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 52 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 53 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 54 has no valid entry in the root file
%RMU-E-NOSEQENT, sequence id 55 has no valid entry in the root file
$ SQL
SQL> ATTACH 'FILENAME MF_PERSONNEL';
SQL> SHOW SEQUENCES;
Sequences in database with filename mf_personnel
     EMPID
     N1
     N10
     N11
     N12
     N13
     N14
     N15
     N16
     N17
     N18
     N19
     N2
     N20
     N21
     N22
     N23
     N24
     N25
     N26
     N27
     N28
     N29
     N3
     N30
%RDMS-I-BUGCHKDMP, generating bugcheck dump file
 DEVICE:[DIRECTORY]RDSBUGCHK.DMP;

この問題を回避するには、リリース7.1データベースのRMU/CONVERTをリリース7.2に実行します(次の例を参照)。また、リリース7.1データベースをバックアップする前にそのデータベースでクライアント順序をドロップし、リリース7.2にリストアして、リリース7.2データベースでクライアント順序を再定義する方法もあります。

$ RMU/CONVERT MF_PERSONNEL
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-00
 Are you satisfied with your backup of
 DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 and
  your backup of any associated .aij files [N]? Y
%RMU-I-LOGCONVRT, database root converted to current structure level
%RMU-S-CVTDBSUC, database DEVICE:[DIRECTORY]
  MF_PERSONNEL.RDB;1 successfully converted from version V7.1 to V7.2
%RMU-I-CVTCOMSUC, CONVERT
 committed for DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 to
 version V7.2

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。

5.3.3 NULL値を解析する際のRMU LOADのテキスト区切りの問題

Oracle Bug#5768090

DELIMITED TEXTデリミタを使用して、RMU UNLOADおよびLOADでNULLとしてフラグ付けされた値を解析する場合に問題が発生していました。これは、NULLとしてフラグ付けされたフィールドを示すために使用する文字列が、列の値の最初と最後をマークするPREFIXデリミタとSUFFIXデリミタを示すために使用する組合せ文字列と同じ場合に発生していました。この問題は、RMU/LOADが、NULL値をPREFIXデリミタの後に続くSUFFIXデリミタとして解釈することが原因で発生していました。そのため、列がロードされるときにNULLとしてフラグ付けされませんでした。これにより、RMU/LOADでエラーが発生しました。一例として、ロードするフィールドが日付フィールドのときに無効な日付の値をロードしようとする場合などです。また、NULLとしてフラグ付けされることになっているフィールドに予想外の値がロードされてしまうこともあります。

この問題は修正されました。ただし、接頭辞、接尾辞、または接頭辞と接尾辞による単一文字または文字列値の解析でRMU UNLOADとLOADが混乱しないように、NULLに対して一意の文字列または1つの文字値を使用することを強くお薦めします。

同一のデリミタを混同するような紛らわしい状況では、パーサーは選択の優先順位を付ける必要があります。最も一般的で適切なケースを選択しようとしますが、ユーザーの本来の意図と必ずしも一致するとはかぎりません。一意のNULL値を使用するか、またはデフォルトのNULL値を取ることで、このようなケースを防ぐことができます。

次に、このようなケースで修正された一例を示します。この例では、NULL文字列が、接頭辞と接尾辞の文字列を組み合せた値(それぞれは単一文字列で構成される)と同じであるため、RMU/LOADで問題が発生しました。このケースは、接頭辞文字と接尾辞文字が指定されていないため、ユーザーにとって明確ではありませんが、ドキュメントに記載されているデフォルトの接頭辞と接尾辞の単一文字デリミタの値"が使用されていました。NULL文字列を""と指定していたため、RMU/LOADはNULL値""を、デフォルトの接頭辞の値"とそれに続くデフォルトの接尾辞の値"として解釈しました。このため、NULLビットが中間列に対して用意されていませんでした。ドキュメントには、次のように記載されています。

NULL=""""""

これは、2つの外部の二重引用符文字が削除されるため、NULL値""を示しています。それぞれの"文字は""として入力する必要があります。

$ SQL
create database filename test;
create table t1 (col1 char(5), col2 date vms, col3 char(5));
create table t2 (col1 char(5), col2 integer, col3 char(5));
create table t3 (col1 char(5), col2 char(5), col3 char(5));
commit;
insert into t1 (col1,col3) values ('first','last');
insert into t2 (col1,col3) values ('first','last');
insert into t3 (col1,col3) values ('first','last');
commit;
SQL> sel * from t1;
 COL1    COL2                      COL3
 first   NULL                      last
1 row selected
SQL> sel * from t2;
 COL1           COL2   COL3
 first          NULL   last
1 row selected
SQL> sel * from t3;
 COL1    COL2    COL3
 first   NULL    last
1 row selected
 Exit
$ rmu/unload/record=(file=t1,format=delimited,null="""""") test t1 t1
$ rmu/unload/record=(file=t2,format=delimited,null="""""") test t2 t2
$ rmu/unload/record=(file=t3,format=delimited,null="""""") test t3 t3
$ type t1.unl
"first","","last "
$ type t2.unl
"first","","last "
$ type t3.unl
"first","","last "

RMUが、NULL値と、PREFIXおよびSUFFIXの値を混同したため、日付フィールドに対してRMU/LOADが失敗し、整数(または実数)の場合にゼロを挿入し、文字フィールドの場合は空の文字列を挿入します。

$ rmu/load/record=(file=t1,format=delimited,null="""""") test t1 t1
%RMU-I-LOADERR, Error loading row 1.
%RDB-E-CONVERT_ERROR, invalid or unsupported data conversion
-COSI-F-IVTIME, invalid date or time
%RMU-I-DATRECREAD,  1 data records read from input file.
%RMU-I-DATRECSTO,   0 data records stored.
%RMU-F-FTL_LOAD, Fatal error for LOAD operation at 18-JAN-2007 04:23:54.48
$ rmu/load/record=(file=t2,format=delimited,null="""""") test t2 t2
%RMU-I-DATRECREAD,  1 data records read from input file.
%RMU-I-DATRECSTO,   1 data records stored.
$ rmu/load/record=(file=t3,format=delimited,null="""""") test t3 t3
%RMU-I-DATRECREAD,  1 data records read from input file.
%RMU-I-DATRECSTO,   1 data records stored.
$ SQL
SQL> att 'f test';
SQL> sel * from t1;
 COL1    COL2                      COL3
 first   NULL                      last
1 row selected
SQL> sel * from t2;
 COL1           COL2   COL3
 first          NULL   last
 first             0   last
2 rows selected
SQL> sel * from t3;
 COL1    COL2    COL3
 first   NULL    last
 first           last
2 rows selected

この問題を回避するには、デフォルト、または他のDELIMITED TEXTデリミタに指定した値と混同されない一意の値をNULLに指定します。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。

5.4 RMU Show Statisticsエラーの修正

5.4.1 RMU/SHOW STATISTICSのAIJ ARB:I/Oの割合、ブロックごとのI/Oの割合に関する問題

アフター・イメージ・ジャーナルが有効なOracle RdbデータベースのRMU/SHOW STATISTICSコマンドで生成された「AIJ Analysis」画面表示で「Examine ARB:I/O ratio」オプションと「Examine blocks-per-I/O ratio」オプションに設定された警告のしきい値の検出に関する問題がありました。この問題により、「ARB:I/O ratio」の警告

#.# ARBs per I/O below #.# threshold

が、この割合に対して現在設定されているしきい値を超えたときに出力されない場合がありました。また、それにより、「blocks-per-I/O ratio」の警告

#.# blocks written per I/O below #.# threshold

が、この割合に現在設定されているしきい値を超えたときに、出力されない場合がありました。この問題は、これらのしきい値がカウント値ではなくパーセント値として処理されることが原因で発生していました。この問題は修正され、誤解を招くパーセント記号はこれらの警告メッセージから削除されました。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。

5.5 ホット・スタンバイ・エラーの修正

5.5.1 ホット・スタンバイ・ガバナーを完全に無効にできない

Oracle Bug#5166721

以前は、ホット・スタンバイ・ガバナーを明示的に無効にした場合、負荷が非常に高いときに、スタンバイ・システムのLRSバッファの使用率が75%を超えると、ガバナーが再有効化されることがありました。

この動作はデフォルトで無効になりました。ガバナーは、スタンバイ・システムのLRSバッファの使用率が75%を超える場合でも再有効化されないようになりました。

以前の動作に戻す場合は、システム全体の論理名RDM$BIND_LRS_ALLOW_AUTOMATIC_HOT_STANDBY_GOVERNORの値を1に定義して、以前のリリースと同様にガバナーを再有効化できます。

この問題は、Oracle Rdbリリース7.2.1.2で修正されました。


第6章
Oracle Rdbリリース7.2.1.1で修正されるソフトウェアの誤り

この章では、Oracle Rdbリリース7.2.1.1で修正されるソフトウェアの誤りについて説明します。

6.1 すべてのインタフェースに適用されるソフトウェアの誤りの修正

6.1.1 問合せが予期せず失敗し、DB-E-NO_RECORDエラーが表示される

Oracle Bug#5846989

以前のリリースのOracle Rdbでは、MIN関数またはMAX関数を使用した問合せが失敗し、次のエラーが発生することがありました。

%RDB-E-NO_RECORD, access by dbkey failed because dbkey is
no longer associated with a record
-RDMS-F-NODBK, -524:22806:1 does not point to a data record

表示されるDBKEYは、一致キーの重複連鎖を参照する、エンコードされたDBKEYです。

この問題は、次の状況で発生します。

回避策として動的オプティマイザを無効にするために、論理名RDMS$SET_FLAGS、またはキーワードMAX_STABILITYを指定したSET FLAGSコマンドを使用するか、あるいは論理名RDMS$MAX_STABILITYの値を1に定義します。

また、ISOLATION LEVEL REPEATABLE READ句を使用してトランザクションを開始する方法もあります。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.1.2 AIJバックアップ操作がNONAME-F-NOMSGメッセージ番号00000004で中断する

Oracle Bug#5890612

アフター・イメージ・ジャーナルのバックアップ操作が、予期しない不正なステータス値で失敗することが稀にあります。実際の値は変わる場合がありますが、この問題に関する少なくとも1つのユーザー・レポートでは、値00000004が示されていました。この問題のバグチェックのダンプ・ファイルは次のとおりです。

***** Exception at 0054D94C : AIJBCK$GET_NEXT_JOURNAL + 00000CFC
Saved PC = 005452E8 : AIJBCK$FULL_BACKUP + 00000FF8
Saved PC = 00543C0C : AIJBCK$BACKUP + 0000113C
Saved PC = 0040E7A4 : RMUCLI$BACKUP_AIJ + 00000904
Saved PC = 003A2414 : RMU_DISPATCH + 00000484
Saved PC = 003A1AE8 : RMU_STARTUP + 000004E8
Saved PC = 001E002C : RMU$MAIN + 0000002C

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。間違ったステータス値は、初期化されていない戻りステータスが返されるという結果になりました。正しいステータスが返されるようになりました。

6.1.3 一部のRDMS$SET_FLAGS設定がアタッチ後に表示されない

Oracle Bug#4103971、4116768および5245116

一部のデータベース環境設定が、論理名またはRDMS$SET_FLAGS論理名を使用する場合に変更されることがありました。以前のバージョンでは、RDMS$SET_FLAGS論理で設定された値がデフォルト値で上書きされていました。

次の例は、一部の値が無視される状況を示しています。

$ define/nolog rdms$set_flags "MAX_STABILITY,NOINDEX_COLUMN_GROUP,
NOTRANSITIVITY,MAX_RECURSION(1000)"
$ SQL$
attach 'filename sql$database';
show flags;
Alias RDB$DBHANDLE:
Flags currently set for Oracle Rdb:
   PREFIX,WARN_DDL,INDEX_COLUMN_GROUP,MAX_SOLUTION
   ,MAX_RECURSION(1000),REFINE_ESTIMATES(127),NOBITMAPPED_SCAN
$

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。アクションに対するデフォルト値は、RDMS$SET_FLAGS論理名を処理する前に割り当てられます。

6.1.4 SET TRANSACTIONの失敗後のRDB-E-EXCESS_TRANSエラー

Oracle Bug#5755008

ある状況では、複数のデータベース(少なくとも1つのリモート・データベースを含む)でSET TRANSACTION文が失敗すると、そのリモート・データベースは予測できない状態になっていました。この状態では、すべてのSQL文で%RDB-E-EXCESS_TRANSエラーが発生し、このエラーには、すでに進行中のトランザクションがあるものとしてリモート・データベースが指定されていました。問題を出現させるには、次の要因が必要でした。

前述の状況では、Rdbはいずれかのデータベースで失敗する前にトランザクションを正常に起動するために、各データベースのトランザクションをロールバックします。このような失敗の最も一般的な理由としてあげられるのは、別のプロセスとのロック競合です。

次の例は、失敗を示しています。

SQL> ATTACH 'ALIAS A1 FILENAME XENA::PERSONNEL';
SQL> ATTACH 'ALIAS A2 FILENAME PERSONNEL';
SQL> SET TRANSACTION ON A1 USING
cont>    (READ ONLY RESERVING A1.employees FOR SHARED READ)
cont>            AND ON A2 USING
cont>    (READ ONLY RESERVING A2.employees FOR SHARED READ,
cont>                         A2.bogus FOR SHARED READ);
%RDB-E-OBSOLETE_METADA, request references metadata objects that no longer exist
-RDMS-F-RELNOEXI, relation BOGUS
SQL>
SQL> show table a2.employees
%RDB-E-EXCESS_TRANS, exceeded limit of 1 transaction per database attachment
-RDB-F-ON_DB, on database DISK:[DIR]MF_PERSONNEL.RDB;1

前述の例では、エイリアスA1はリモート・データベースで、エイリアスA2はローカル・データベースです。SET TRANSACTION文はどちらのデータベースに対してもREAD ONLYを指定しているため、Rdbは分散トランザクションを使用しません(これが最適化です)。SET TRANSACTION文は、エイリアスA2で存在しないbogusという名前の表を予約しようとするため失敗します。この失敗は通常どおりで予期されるものです。ただし、SET TRANSACTIONの失敗後に、RdbはエイリアスA1でトランザクションを適切にロールバックしませんでした。このため、後続のSHOW文とすべての後続の文が失敗し、RDB-E-EXCESS_TRANSエラーが発生していました。

この問題を回避するには、SET TRANSACTION文の最後でリモートのエイリアスを指定します。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.1.5 Rdbオプティマイザのコスト見積りにおける浮動小数のオーバーフロー

Oracle Bug#5727379

次の問合せは、次の浮動小数オーバーフローのエラーを生成します。

select * from game t1, post t2
  where (t1.post_ref_1 = t2.post_ref
      OR t1.post_ref_2 = t2.post_ref
      OR t1.post_ref_3 = t2.post_ref
      OR t1.post_ref_4 = t2.post_ref
      OR t1.post_ref_5 = t2.post_ref)
     AND t2.post_flag = 1
  limit to 1 row;
%RDB-E-ARITH_EXCEPT, truncation of a numeric value at runtime
-SYSTEM-F-HPARITH, high performance arithmetic trap, Imask=00000000,
Fmask=00000001, summary=02, PC=00000000007FB6F4, PS=0000001B
-SYSTEM-F-FLTINV, floating invalid operation, PC=00000000007FB6F4, PS=0000001B

問合せは、次の条件がCASTを使用して変更されると機能します。

select * from game t1, post t2
  where (t1.post_ref_1 = t2.post_ref
      OR t1.post_ref_2 = t2.post_ref
      OR t1.post_ref_3 = t2.post_ref
      OR t1.post_ref_4 = t2.post_ref
      OR t1.post_ref_5 = t2.post_ref)
     and CAST(t2.post_flag AS INTEGER) = 1   ! <==
  limit to 1 row;
0 rows selected

この問題の既知の回避策はありません。

この問合せでエラーが生じる状況の一因となったのは、主に次の部分です。

  1. 主な問合せは、複数のOR条件と1つのANDフィルタ条件を含むWHERE句を使用して2つの表を結合します。
  2. すべてのOR条件には、右辺の2つ目の表の同じ列が含まれます。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.1.6 ジグザグ一致と逆スキャンを使用する問合せからの不正な結果

Oracle Bug#5842319、5850013および4771936

逆スキャンを使用してジグザグ一致ストラテジを含む次の問合せが不正な結果を返します(本来は1行を返します)。

SQL> set flags 'strategy,detail';
SQL> select d.trx_id
cont>  from t1 d
cont>  where exists (select * from t2 where trx_id = d.trx_id);
Tables:
  0 = T1
  1 = T2
Conjunct: <agg0> <> 0
Match
  Outer loop      (zig-zag)
    Index only retrieval of relation 0:T1
      Index name  T1_NDX [0:0]
  Inner loop      (zig-zag)
    Aggregate-F1: 0:COUNT-ANY (<subselect>)
    Index only retrieval of relation 1:T2
      Index name  T2_NDX [0:0]      Reverse Scan
0 rows selected

表には次のデータが含まれます。

SQL> select * from t1;
 TRX_ID    SEQUENCE_NO
 0000044             1
 0000046             2
 0000047             1

SQL> select * from t2;
 TRX_ID    LOCATION_ID    COMPANY_NO
 0000046             5             2
 0000045             5             2

回避するには、SET FLAGSを使用するか、RDMS$SET_FLAGSの値をNOREVERSE_SCANに定義して逆スキャン機能を無効にします。次の例を見てみます。

SQL> set flags 'noreverse_scan'
SQL> !... execute the same above query here ...
Tables:
  0 = T1
  1 = T2
Cross block of 2 entries
  Cross block entry 1
    Index only retrieval of relation 0:T1
      Index name  T1_NDX [0:0]
  Cross block entry 2
    Conjunct: <agg0> <> 0
    Aggregate-F1: 0:COUNT-ANY (<subselect>)
    Index only retrieval of relation 1:T2
      Index name  T2_NDX [1:1]
        Keys: 1.TRX_ID = 0.TRX_ID
 TRX_ID    SEQUENCE_NO
 0000046             2
1 row selected

これはOracle Bug#4771936の不完全な修正に関連する問題です。この問合せでエラーが生じる一因は、主に次の部分です。

  1. 主なselect問合せは2つの表を結合し(この例ではEXISTS句を使用)、ジグザグ一致ストラテジが解決に選択されます。
  2. 結合の内部区間の結合キーは、DESC(降順)索引セグメント(ただし、外部索引の昇順セグメント)の索引に基づきます。
  3. 逆スキャンは、内部区間の索引検索に適用されます。

この問題は、NOT EXISTSと通常の結合問合せに類似した状況で発生することがあります。

この問題は、Oracle Rdbのリリース7.1.4.4、リリース7.1.4.5、リリース7.2.0.1、リリース7.2.0.2およびリリース7.2.1に影響します。この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.1.7 カーソルからフェッチする際の%RDB-E-REQ_NO_TRANS

Oracle Bug#3000645

ある状況では、SQLストアド・プロシージャ、または現在アクティブなトランザクションがないプロセスを残した複数文のプロシージャを実行すると、SQLで%RDB-E-REQ_NO_TRANSエラーが生成されます。このエラーは、ホールド・カーソルとともに使用する場合、頻繁に発生していました。

次のSQLは、実行すると状態を設定するストアド・プロシージャ(TX_END)を作成します。この状況で問題が発生していました。ストアド・プロシージャは、アクティブなトランザクションを単純に終了し、戻ることに注意してください。

create module tx_end
    language sql
    declare transaction read only

procedure tx_end();
begin
declare :v_active tinyint  default 0;
get diagnostics :v_active = TRANSACTION_ACTIVE;
if (:v_active <> 0) then
    rollback;
end if;
end;
end module;

問題を回避するには、ストアド・プロシージャ内でトランザクションを実行するのではなく、明示的なSQL文でトランザクションを終了させます。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.1.8 ビットマップ・スキャンが有効なDistinct問合せのバグチェック

Oracle Bug#5295755

ビットマップ・スキャンが有効なDistinct問合せの2回目の実行時に、バグチェックが発生することがありました。

set flags 'nobitmap,strategy,detail';
select  distinct test_nbr from t1 where asn='10000';
Tables:
  0 = T1
Reduce: 0.TEST_NBR
Leaf#01 Sorted 0:T1 Card=141
  Bool: 0.ASN = '10000'
  FgrNdx  IND_TN [0:0] Fan=17
  BgrNdx1 IND_ASN [1:1] Fan=14
    Keys: 0.ASN = '10000'
     TEST_NBR
        1.000
        2.000
2 rows selected

set flags 'bitmap,strategy,detail';
select  distinct test_nbr from t1 where asn='10000';
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;

次の2つの例外が発生する可能性がありました。

***** Exception at 01001154 : RDMS$$EXE_CLOSE + 00000574
%COSI-F-BUGCHECK, internal consistency failure

または

***** Exception at 0124631C : KOD$ROLLBACK + 0000032C
%COSI-F-BUGCHECK, internal consistency failure

次の例に示すように、2回目の実行でビットマップが有効ではない場合、問合せは機能します。

set flags 'nobitmap,strategy';
select  distinct test_nbr from t1 where asn='10000';
Tables:
  0 = T1
Reduce: 0.TEST_NBR
Leaf#01 Sorted 0:T1 Card=141
  Bool: 0.ASN = '10000'
  FgrNdx  IND_TN [0:0] Fan=17
  BgrNdx1 IND_ASN [1:1] Fan=14
    Keys: 0.ASN = '10000'
     TEST_NBR
        1.000
        2.000
2 rows selected

この問合せでエラーの一因となったのは、主に次の部分です。

  1. 主なselectは、フィルタ条件を含む表からのdistinct問合せです。
  2. 表には2つの索引があり、各索引には1つのセグメント列が含まれています。
  3. フィルタ条件で参照される列を含む索引は、バックグラウンド索引として適用されます。
  4. distinct関数で参照される列を含む索引は、フォアグラウンド索引として適用されます。
  5. SQLフラグBitmapは、最初の実行では有効にする必要はありませんが、2回目を実行する前に明示的に有効にする必要があります。
  6. ストラテジの動的な方法をソートする必要があります。
  7. バックグラウンド索引スキャンは正常に実行されます。

この問題は、Oracle Rdbのリリース7.1.4.4、リリース7.1.4.5、リリース7.2.0.1、リリース7.2.0.2およびリリース7.2.1に影響します。この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.1.9 ALTERには記憶域への読み書きアクセスが必要

Oracle Rdbリリース7.2.1では、ディスク上の行の長さを変更する可能性があるSQLのALTER TABLE文、ALTER STORAGE MAP文、TRUNCATE TABLE文またはALTER INDEX文では、読み書きアクセスを許可する記憶域にオブジェクトのすべてのパーティションが存在する必要があります。さらに、読み書きアクセスを許可するにはRDB$SYSTEM記憶域も必要です。

エラー「RDMS-F-READONLY, data in a read-only storage area may not be accessed for update」が返されます。このエラーは、次の例のように、参照する記憶域への読み書きアクセスが許可されないことを示します。

SQL>ALTER DATA FILE 'PLUGH' ALTER STORAGE AREA U2 READ ONLY;
    .
    .
    .
SQL>ALTER TABLE PARTUNIF ADD COLUMN RDB_TEST1 INT;
%RDB-E-NO_META_UPDATE, metadata update failed
-RDMS-F-READONLY, data in a read-only storage area may
not be accessed for update

Oracle Rdbリリース7.2.1.1では、読み書きアクセスを許可する記憶域に、変更されたオブジェクトが存在するという制限はなくなりました。

6.2 SQLエラーの修正

6.2.1 SQL/Services実行プログラムで99%のCPU消費がループする

Oracle Bug#4401924および5353228

Rdb 7.1.4.3.1以降のバージョンのSQL/Services 7.1.5.9.1にアップグレードした後、一部のアプリケーションでは、SQL/Services実行プログラムでかなりの割合のCPUを消費する逼迫したループに陥ることが頻繁にありました。これはプログラムが終了するまで続きました。この問題は、通常、実行プログラムが新しいクライアントへのサービス提供を開始して、問題が発生するVMSノードの他のすべてのパフォーマンスが著しく低下した直後に発生します。この問題を取り除くには、ループしている実行プログラムのプロセスに対してSTOP/IDを実行します。

この問題は、キャッシュ済メタデータのSQLの管理に関連するメモリー破損が原因で生じていました。メモリー破損は、一部の接続にカーソルが定義されている複数のSQL接続に関連していました。通常、DISCONNECT文の後に発生しますが、それ以外でも発生する可能性はあります。同様に、前述のSQL/Services実行プログラムだけでなく、SQL接続やカーソルを使用するアプリケーションにも影響します。どのメモリーが破損しているかによって、Rdbの他のレイヤーやユーザー・アプリケーションでの障害など様々な現象が発生することがありました。

注意: リリース7.1.2では、ループ動作の発生に関して、この問題の影響を軽減する変更が行われました。この変更は修正ではありません。

この問題の回避策はありません。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.2.2 一部のSQLのダイアレクトに必要な警告が配信されない

Oracle Bug#3651847および4532451

NULLの行の削除(%RDB-I-ELIM_NULL)や、文字列の切捨て(%RDB-I-TRUN_RTRV)に対する必要な警告(情報コード)が、シングルトンのSELECT文およびシングルトンのUPDATE文(つまり、INTO句を使用する単一行を返す文)に対して返されませんでした。これは、次の対話型SQLのコマンドを使用するPERSONNELデータベースで示されます。

SQL> set dialect 'sql92';
SQL> attach 'filename sql$database';
SQL>
SQL> ! Force a row to contain NULL for SALARY_AMOUNT
SQL> update salary_history
cont> set salary_amount = NULL
cont> where employee_id = '00471'
cont>   and salary_end = date vms'20-Aug-1981';
1 row updated
SQL>
SQL> declare :avg_sal integer(2);
SQL>
SQL> ! No informational generated (but is expected)
SQL> select avg(salary_amount) into :avg_sal
cont> from salary_history where employee_id = '00471'
cont>  and salary_end >= date vms'1-AUG-1970';
SQL> show sqlca
SQLCA:
        SQLCAID:        SQLCA           SQLCABC:        128
        SQLCODE:        0
        SQLERRD:        [0]: 0
                        [1]: 0
                        [2]: 1
                        [3]: 0
                        [4]: 0
                        [5]: 0
        SQLWARN0:       0       SQLWARN1:       0       SQLWARN2:       0
        SQLWARN3:       0       SQLWARN4:       0       SQLWARN5:       0
        SQLWARN6:       0       SQLWARN7:       0
        SQLSTATE:       00000
SQL> print :avg_sal;
        AVG_SAL
       60893.86
SQL> rollback;

必要なSQLCODEの値とSQLSTATEの値が返されるようになりました。これにより、前述の例では次の相違が生じます。

SQL> select avg(salary_amount) into :avg_sal
cont> from salary_history where employee_id = '00471'
cont>  and salary_end >= date vms'1-AUG-1970';
%RDB-I-ELIM_NULL, null value eliminated in set function
SQL> show sqlca
SQLCA:
        SQLCAID:        SQLCA           SQLCABC:        128
        SQLCODE:        1003
        SQLERRD:        [0]: 0
                        [1]: 0
                        [2]: 1
                        [3]: 0
                        [4]: 0
                        [5]: 0
        SQLWARN0:       0       SQLWARN1:       0       SQLWARN2:       0
        SQLWARN3:       0       SQLWARN4:       0       SQLWARN5:       0
        SQLWARN6:       0       SQLWARN7:       0
        SQLSTATE:       01003
%RDB-I-ELIM_NULL, null value eliminated in set function

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.2.3 SET AUTOMATIC TRANSLATION ONで問合せから不正な結果が生じる

Oracle Bug#5849845

Oracle Rdbリリース7.2の以前のリリースでは、SET AUTOMATIC TRANSLATION ONコマンドにより、一部の問合せで不正な結果が返されることがありました。これは、テキスト文字列リテラル、パラメータまたは変数が数列と比較される場合に発生していました。AUTOMATIC TRANSLATIONは、テキスト以外の値を誤って処理していました。

次の例は、SET AUTOMATIC TRANSLATION ONコマンドがセッションで使用される場合の不正な結果を示しています。

SQL> set automatic translation 'off';
SQL> select * from TEST_NLS_D where num = '333.333';
%SQL-I-NUMCMPTXT, Numeric column will be compared with string literal as text
             NUM   TDATE
         333.333    3-MAR-2099 00:00:00.00
1 row selected
SQL>
SQL> set automatic translation 'on';
SQL> select * from TEST_NLS_D where num = '333.333';
%SQL-I-NUMCMPTXT, Numeric column will be compared with string literal as text
0 rows selected
SQL> rollback;

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。ほどんどのOracle Rdbユーザーの場合、デフォルトはOFFです。ただし、Rdbの最新バージョンのOCI Servicesではこのコマンドを使用するため、OCIアプリケーションを介した問合せは影響を受ける可能性があります。

6.2.4 宣言した変数がOracleダイアレクトの動的な文によって無視される

Oracle Bug#5847260

以前のバージョンのOracle Rdbでは、動的な文がDECLARE構文によって作成された変数を無視することがありました。これは、ダイアレクトがORACLE LEVEL1またはORACLE LEVEL2に設定されている場合に発生していました。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。Oracleダイアレクトは、これらの変数を宣言された変数として正しく認識し、パラメータ・マーカーとして認識しないようになりました。

6.2.5 パラメータがCONCAT操作にある場合、予期しないDATTYPUNKエラーがレポートされる

Oracle Bug#5847260

Oracle Rdbリリース7.2.1では、動的なSQL文を処理する際に、文にパラメータ・マーカーのある連結が含まれている場合、エラーがレポートされていました。次の例は、このエラーを示しています。

-> UPDATE EMPLOYEES SET ADDRESS_DATA_2='My Address '  || :B1  WHERE
EMPLOYEE_ID = :B1;
Error -1:
%SQL-F-DATTYPUNK, Data type unknown. Expression cannot use only host variables

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。連結はデフォルトのVARCHAR(2000)型をパラメータに割り当て、文字列の最終的な結果の長さを計算できるようになりました。以前のバージョンでは、パラメータは、短すぎる最初のパラメータの長さにデフォルトで設定されていました。

6.2.6 マップされていない表に対するALTER TABLEでAIPの長さが設定されない

Oracle Rdbリリース7.2.1.0では、AIPの長さを更新するサポートが追加されました。ただし、STORE句を使用するSTORAGE MAPが含まれない表に対するALTER TABLEでは、現在、AIPの長さが更新されません。

次の例は、問題を示しています(ログ出力にLOGMODVALメッセージはありません)。

SQL> set flags 'stomap_stats';
SQL>
SQL> create table T (a integer);
SQL>
SQL> alter table T
cont>     add column b varchar(230);
~As: reads: async 0 synch 8, writes: async 10 synch 0
SQL>
SQL> commit;
SQL>
SQL> create storage map T_MAP
cont>     for T
cont>     store in RDB$SYSTEM;
~As: create storage map "T_MAP"
~As: Table "T" (sys=0, rest=0, tmptbl=0)
~As: creating storage mapping routine T_MAP (columns=0)
~As: creating system module RDB$STORAGE_MAPS
SQL>
SQL> alter table T
cont>     add column c timestamp(2);
~As: reads: async 0 synch 15, writes: async 11 synch 0
SQL>
SQL> commit;
%RDMS-I-LOGMODVAL,     modified record length to 252
%RDMS-W-REBUILDSPAMS, SPAM pages should be rebuilt for logical area T
~As unlocking table "T" (PU -> PR)

この問題を回避するには、前述の例に示すように表に記憶域マップを追加するか、あるいは次の例に示すように新しいRMU Set AIPコマンドを使用します。

SQL> set flags 'stomap_stats';
SQL>
SQL> create table T (a integer);
SQL>
SQL> alter table T
cont>     add column b varchar(230);
~As: reads: async 0 synch 8, writes: async 10 synch 0
SQL>
SQL> commit;
$ define/user rdms$set_flags "stomap_stats"
$ rmu/set aip abc t/length
%RDMS-I-LOGMODVAL,     modified record length to 244
%RDMS-W-REBUILDSPAMS, SPAM pages should be rebuilt for logical area T

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.3 RMUエラーの修正

6.3.1 RMUのオンライン検証のRMUVLAREA$VERIFY_LAREA_PAGESでACCVIOが発生する

オンラインのRMU /VERIFY操作で、検証の実行中に記憶域が拡張された場合、内部データ構造のサイズが縮小されることがありました。このため、次のようなRMUバグチェックのダンプ・ファイルなど、いくつかの障害が発生することがありました。

***** Exception at 000000000080B101 :
    RMU72\RMUVLAREA$VERIFY_LAREA_PAGES + 00000581
%SYSTEM-F-ACCVIO, access violation, reason mask=00,
virtual address=00000000014E0005, PC=000000000080B101, PS=0000001B
Saved PC = 000000000080A6B0 : RMU72\RMUVLAREA$VERIFY_ALL_LAREAS + 00000390
Saved PC = 00000000007BA110 : RMU72\RMUVER$VERIFY + 00003100
Saved PC = 0000000000470820 : RMU72\RMU$VERIFY + 00002E70
Saved PC = 0000000000463A30 : RMU72\RMU_DISPATCH + 00002840
Saved PC = 0000000000460A50 : RMU72\RMU_STARTUP + 00000910

通常、検証操作を再実行すると正しく完了します。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。データ構造にアクセスする場合、割り当てられたメモリー以外にアクセスしないようになりました。

6.3.2 RMU/SHOW LOGICAL_NAMESにRDM$MONITORnnが含まれない

Oracle Bug#5847856

以前は、RMU/SHOW LOGICAL_NAMESコマンドで表示される論理名のリストには、論理名RDM$MONITORnnが含まれていませんでしたが、論理名RDM$MONITORが含まれていました。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。論理名RDM$MONITORnn(nnは実行するRMUの複数バージョンのRdbインストール・バージョンを参照する)が表示されるようになりました。

6.3.3 ビットマップ索引に対するRMU/VERIFY/INCREMENTALの不正な診断

Oracle Bug#4149656

RMU/VERIFYがBツリー・ビットマップ索引を参照していることを把握している場合でも、索引を検証するルーチンに渡される不正なフラグによって、ハッシュが索引タイプのメッセージに誤って挿入されることがありました。また、索引に問題がない場合でも、RMU-W-BADHDADBK、RMU-I-BTRDUPCARおよびRMU-I-BTRERPATHなどのビットマップBツリー索引の無効な診断がRMU/VERIFY/INCREMENTALによって出力されていました。これは、RMU/VERIFYがBツリー索引のビットマップの重複連鎖を検証しているときにコンテキストが失われることで発生していました。

この問題は、RMU/VERIFY/INCREMENTALがBツリー・ビットマップ索引の重複連鎖を検証しているときにのみ発生しました。/NODATAを指定する場合は発生しませんでした。複数の重複ビットマップ・レコードのフェッチを必要とする長いビットマップ連鎖で発生していました。

次の例は、RMU/VERIFY/INCREMENTALで出力される無効な索引診断を示しています。

$ RMU/VERIFY/INCREMENTAL/ALL TEST_DATABASE
%RMU-W-BADHDADBK, Bad logical area DBID in hashed index data record
dbkey 1716:674953227:-32678 Found 06B4 (hex).
%RMU-W-BADHDADBK, Bad logical area DBID in hashed index data record dbkey
1716:674953227:-32677 Found 06B4 (hex).
%RMU-W-BADHDADBK, Bad logical area DBID in hashed index data record dbkey
1716:674953227:-32676 Found 06B4 (hex).

この問題を回避するには、/NODATAを指定するか、または検証に/INCREMENTALを指定しないようにします。

$ RMU/VERIFY/INCREMENTAL/INDEX/NODATA TEST_DATABASE
$ RMU/VERIFY/ALL TEST_DATABASE

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.3.4 PARALLELおよびCOMPRESS=ZLIBを指定したRMU/BACKUPが失敗する

Oracle Bug#5870330

PARALLEL修飾子とCOMPRESS=ZLIB修飾子を指定したRMU/BACKUPコマンドを実行すると、次の内容のバグチェックが発生していました。

Alpha OpenVMS 8.2
Oracle Rdb Server 7.2.1.0.1
Got a RMUBUGCHK.DMP
SYSTEM-F-ACCVIO, access violation, virtual address=0000000000000000
Exception occurred at RMUSHR72\COSIZLIB$FINISH_COMPRESS + 00000048
Called from RMUSHR72\RMUBCK$BF_BACKUP_THREAD + 00001244
Called from RMUSHR72\RMUIO$TERMINATE_THREAD + 00000040
Called from RMUSHR72\RMUIO$FIREWALL + 00000040
Running image RMUEXEC72.EXE
Dump created: 7-FEB-2007 08:45:58.93

バックアップ・コードの管理では、初期化されていない圧縮コンテキスト構造が使用されていました。PARALLELを使用せずにCOMPRESS=ZLIBを使用し、出力に複数のテープ・ドライブを使用する場合、同じエラーが発生することがありました。

この問題の既知の回避策はありません。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.4 行キャッシュ・エラーの修正

6.4.1 行キャッシュのスナップショットが有効な場合のオンラインRMUバックアップ時のバグチェック

Oracle Bug#4260102

行キャッシュのスナップショット機能を使用する場合、データベースのキャッシュ済の行が大きくなるように変更できます。この変更を行うには、データベース・ページに領域を割り当てる必要があります。この場合、行のスナップショットはデータベースに書き込まれませんが、行キャッシュに単独で保持されます。オンラインのRMU操作(RMU /BACKUPなど)は、スナップショットの行のコピーを見つけられずに失敗し、ダンプ・ファイルにエラー「BADPAGNUM, PAGE 4294967295」が表示されます。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。実際のディスク上の行の変更が行われる前に、サイズを調整する行のスナップショット連鎖がスナップショットの記憶域に書き込まれます。

6.4.2 VMS$MEM_RESIDENT_USER要件の緩和

Oracle Bug#5859487

以前は、データベースに対して有効化されたキャッシュがない場合でも、常駐メモリーに構成された行キャッシュがあるデータベースを開くにはVMS$MEM_RESIDENT_USER修飾子が必要でした。

この制限は、Oracle Rdbリリース7.2.1.1で緩和されました。データベースが行キャッシュに対して有効化されていない場合、キャッシュが常駐メモリーに定義されている場合でもVMS$MEM_RESIDENT_USER修飾子は必要ありません。

6.5 RMU Show Statisticsエラーの修正

6.5.1 RMU /SHOW STATISTICSからのラッチによるハング

Oracle Bug#4397634および5842040

以前のリリースのOracle Rdbでは、非常にわずかな時間内で、データベース・アタッチ・シーケンス時にラッチを操作している間にRMU /SHOW STATISTICSコマンドを実行するプロセスがハングすることがありました。イベントの正確なタイミングとシーケンスに応じて、このプロセスはデータベースの他のユーザーをブロックすることがあります。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.5.2 KUTDIS$LONG_TX_NOTIFYでのRMU/SHOW STATISTICSのバグチェック

Oracle Bug#5867253

Oracle Rdbリリース7.2.1では、構成オプションLONG_TX_SECONDSの使用時に、RMU /SHOW STATISTICSコマンドが失敗し、バグチェックのダンプが発生することがありました。バグチェックのダンプの内容は、次のようになります。

SYSTEM-F-ACCVIO, access violation
Exception occurred at RMU72\KUTDIS$LONG_TX_NOTIFY + 00000424
Called from RMU72\KUTDIS$EVENT_NOTIFY +  00000054
Called from RMU72\KUTDIS$DISPLAY_ASTX + 00000584
Called from RMU72\KUT$DISPLAY + 0000199C
Running image RMU72.EXE
Command line was "RMUI/SHOW STATISTIC
DSA0:[DB]FOO.RDB;/NOINTERACTIVE/CONFIGURATION=DSA0:[FOO]FOO.CFGCFG"

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。

6.6 ホット・スタンバイ・エラーの修正

6.6.1 LRSの停止の失敗RDMS-F-PARTDTXNERR/SYSTEM-F-NOSUCHID

Oracle Bug#5754461

Oracle Rdbのホット・スタンバイ機能に関する問題が確認されています。OpenVMS $GETGTIシステム・サービスがステータス値SS$_NOSUCHIDを返す場合、LRSプロセスを正常に停止することができないことがあります。このため、スタンバイ・データベースに不整合が生じていました。

この問題は、Oracle Rdbリリース7.2.1.1で修正されました。LRSプロセスは、返されたSS$_NOSUCHIDステータスをSS$_NOSUCHTIDステータスと同じものとして処理するようになりました。ステータスは正常に処理され、LRSが失敗することはなくなりました。


第7章
Oracle Rdbリリース7.2.1.0で修正されるソフトウェアの誤り

この章では、Oracle Rdbリリース7.2.1.0で修正されるソフトウェアの誤りについて説明します。

7.1 すべてのインタフェースに適用されるソフトウェアの誤りの修正

7.1.1 I64でのバックアップの不正なチェックサムとCRC値

Rdbリリース7.2.0.2以降のI64システムで、.RBFバックアップ・ファイル内のチェックサムまたはCRC値が正しくない場合があります。この違いにより、/CRC=CHECKSUMを使用する場合、リストア操作時にチェックサムのエラーが発生することがあります。つまり、CRC=CHECKSUMが使用された場合、I64のRdb 7.2.0.2でのリストアは、その他のプラットフォームまたはバージョンで行われたバックアップを読み取ることができません。

回避策として、/CRC=CHECKSUMではなく、/CRC=AUTODIN_IIのデフォルトのCRCアルゴリズムを使用することをお薦めします。

この問題はOracle Rdbリリース7.2.1で修正されました。Oracle Rdbで計算されたチェックサムの値は、すべてのプラットフォームやバージョンと同じになりました。

7.1.2 バグチェックのループによって多くのバグチェックのダンプが作成される

Oracle Bug#5411895および5361954

特定の状況では、あるバグチェックのダンプが原因で別のバグチェックのダンプが発生します。その結果、実際に制限された数が生成される場合を除いて、バグチェックのダンプが無制限に生成されます。作成されるバグチェックのダンプ数が制限されるのは、使用可能なディスク領域を使い切ってしまうためです。

この問題を修正する試みがなされました。プロセスで3つのバグチェックのダンプが作成されると、それ以降のダンプはミニ・ダンプとなります。3つのバグチェックのミニ・ダンプが作成されると、ダンプは止まり、COSI$_FATINTERRステータスが返されます。

これ以降にバグチェックのダンプが作成されそうになると、COSI$_FATINTERRが単純に返されます(つまり、バグチェックのダンプは生成されなくなります)。

この問題の原因となる問合せの例を次に示します。

SELECT   TIPO, OPFU
FROM     T1
WHERE    CODE  ='100' AND
         VALUE = '0057984193004785667' AND
         COOP  = 'OCA0604WOREST' AND
         CRTC = 'MFV' AND
         OPFU  = '20011228' AND
       ( TIPO  = 'TCI' OR
         (IVSN = 'I' AND (TIPO = 'COM' OR TIPO  = 'ATR') ) ) ;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;
...etc...

この変更は、Oracle Rdbリリース7.2.1で行われました。

7.1.3 全索引スキャンを使用する場合、左側外部結合の問合せの速度が低下する

Oracle Bug#5567495

リリース7.1.4.1からリリース7.1.4.4にアップグレードした後、左側外部結合操作の外部区間で全索引スキャンを使用する場合、特定の問合せの実行速度が著しく低下するという状況がユーザーからレポートされました。データを使用せずに次の単純なスクリプトを使用して問題を再現できました。出力ストラテジの違いが問題を示しています。

create table t1 (
    col_one integer,
    col_two integer,
    price   integer);

create table t2 (
    col_one     integer,
    col_two     integer,
    line_amt    COMPUTED BY
    (select c1.price from t1 c1
     where ((c1.col_one = t2.col_one)
         and (c1.col_two = t2.col_two)))) ;

create unique index t1_ndx on t1 (col_one, col_two);
create unique index t2_ndx on t2 (col_one, col_two);

create view v_t1_loj_t2
    (col_one, col_two, total) as
    (select c2.col_one, c2.col_two, SUM(c3.line_amt)
    from t1 as c2
       LEFT OUTER JOIN
         t2 as c3
            ON ((c3.col_one = c2.col_one) AND
  (c3.col_two = c2.col_two))
    GROUP BY c2.col_one, c2.col_two);

! The following is the query that slows down in performance since the
! strategy applies a full index scan at the outer leg of the left outer join
! operation, as compared to "Direct lookup" index retrieval strategy.

select t1.col_two,
    (select v1.total from v_t1_loj_v2 v1
     where v1.col_one = t1.col_one and
            v1.col_two = t1.col_two) as v_total
from t1 where t1.col_one = 1 ;
Cross block of 2 entries
  Cross block entry 1
    Conjunct        Index only retrieval of relation T1
      Index name  T1_NDX [1:1]
  Cross block entry 2
    Aggregate       Conjunct        Aggregate
    Cross block of 2 entries
      Cross block entry 1
        Match    (Left Outer Join)
          Outer loop
            Index only retrieval of relation T1
              Index name  T1_NDX [0:0]               <== Full index scan
          Inner loop      (zig-zag)
            Index only retrieval of relation T2
              Index name  T2_NDX [0:0]
      Cross block entry 2
        Aggregate       Get     Retrieval by index of relation T1
          Index name  T1_NDX [2:2]   Direct lookup
0 rows selected

Rdbリリース7.1.4.1.1のストラテジは、左側外部結合操作の外部ループで索引検索がより正確に実行される点を除き、ほとんど同じです。

Cross block of 2 entries
  Cross block entry 1
    Conjunct        Index only retrieval of relation T1
      Index name  T1_NDX [1:1]
  Cross block entry 2
    Aggregate       Conjunct        Aggregate
    Cross block of 2 entries
      Cross block entry 1
        Match    (Left Outer Join)
          Outer loop
            Index only retrieval of relation T1
              Index name  T1_NDX [2:2]   Direct lookup      <== Best one
          Inner loop      (zig-zag)
            Index only retrieval of relation T2
              Index name  T2_NDX1 [0:0]
      Cross block entry 2
        Aggregate       Get     Retrieval by index of relation T1
          Index name  T1_NDX [2:2]   Direct lookup

この問題の既知の回避策はありません。

この問合せでエラーが生じる状況の一因となったのは、主に次の部分です。

  1. 主な問合せは、列でWHEREフィルタ条件を使用する表(T1)から選択します。この列は、別のビューを結合するsubselect問合せの結合項目の1つとして使用されます。
  2. ビューは、2つの結合列でT1と2番目の表(T2)との間の集計左側外部結合の問合せとして定義されます。
  3. ビューの最後の列は、表T2のCOMPUTED BY列に対する集計関数SUMです。この表には、同じ2つの列を使用する表T1と結合するSELECT問合せが含まれています。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.4 DIO$LACB_CREATE + 00000174でのDBRのバグチェック

Oracle Bug#5467328

新しい表または索引の作成をロールバックしている間にプロセスが終了した場合、データベース・リカバリ・プロセス(DBR)でバグチェックが発生することがありました。たとえば、次のスクリプトについて考えます。

SQL> CREATE DATABASE FILENAME TEST;
SQL> CREATE TABLE T1 (C1 INT);
SQL> INSERT INTO T1 VALUES (1);
1 row inserted
SQL> ROLLBACK;

コマンドの前述のシーケンスでは、トランザクションのロールバック時に、プロセスが表T1の作成をロールバックし、表の領域インベントリ・ページ(AIP)を更新して、変更されたAIPエントリをディスクにフラッシュし、リカバリ・ユニット・ジャーナル(RUJ)を切り捨てる前に終了する場合、存在しない表T1にアクセスしようとするとDBRが失敗していました。最初のDBRのバグチェックには、次のような例外が含まれます。

***** Exception at 00000000001A6C0C : RDMDBR72\DIOLACB$LACB_AIP_ENT_GET +
000005CC
%COSI-F-BUGCHECK, internal consistency failure

次にデータベースにアクセスしようとすると、DBRのバグチェックが発生し、次のような例外が表示されます。

***** Exception at 00000000001A6174 : RDMDBR72\DIO$LACB_CREATE + 00000174
%RDMS-F-CANTFINDLAREA, cannot locate logical area 58 in area inventory page list

この問題は、表の挿入をロールバックしようとしたときに、表が存在しないという可能性に対してDBRの準備ができていなかったために発生していました。

この問題が発生する場合、問題を解決する回避策はサポートされていません。データベースをリストアおよびリカバリするか、またはデータベースにアクセスする前にこの問題の修正が含まれるリリースにOracle Rdbを更新する必要があります。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.5 モニター終了後にプロセスが必ずしも終了しない

Oracle Bug#5361981

Oracle Rdbモニター・プロセスが異常終了すると、そのノードのデータベースにアタッチされているすべてのユーザー・プロセスはすぐに終了します。ただし、このようにならない場合があり、モニターが失敗した後も、ユーザー・プロセスはOracle Rdbリソースに引き続きアクセスしていました。次の例を見てみます。

  1. ユーザー1、ノード1: SQL> ATTACH 'FILENAME MF_PERSONNEL';
  2. ユーザー2、ノード2: SQL> ATTACH 'FILENAME MF_PERSONNEL';
  3. ユーザー3、ノード1: $ STOP/ID={pid of monitor process on node 1}

イベントの前述のシーケンスでは、ノード1のユーザー・プロセスは、モニター・プロセスが終了するとすぐに終了しますが、アクティブのままでした。

この問題を回避するには、RMU/OPENコマンドを使用するか、ユーザーがデータベースにアクセスするすべてのノード上のデータベースを手動で開きます。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.6 OR Index Retrievalとビットマップ式スキャンを使用する場合の不正な結果

Oracle Bug#5363170

OR Index Retrievalを含むオプティマイザでストラテジが選択され、ビットマップ式スキャンが有効な場合、問合せから不正な結果が返されることがありました。

次の例では、通常は100行を返しますが、1行しか返されていません。ビットマップ・スキャンが有効で、2番目(内部)のcross blockでストラテジにOR Index Retrievalが含まれることに注意してください。

SQL> set flags 'bitmap,strategy,detail'
SQL> select t1.id from t1 join t2
cont>  on t1.id=t2.id or t1.id=t2.id
cont>  where t1.f2=1 and t1.f2=1;
Tables:
  0 = T1
  1 = T2
Cross block of 2 entries
  Cross block entry 1
    Conjunct: 0.F2 = 1
    Conjunct: 0.F2 = 1
    Get     Retrieval sequentially of relation 0:T1
  Cross block entry 2
    Conjunct: ((0.ID = 1.ID) OR (0.ID = 1.ID)) AND (0.F2 = 1) AND (0.F2 = 1)
               AND (0.ID = 1.ID)
    OR index retrieval
      Index only retrieval of relation 1:T2
        Index name  I2 [1:1]
          Keys: 0.ID = 1.ID
 T1.ID
 00164
1 row selected

この問題を回避するには、ビットマップ・スキャンを使用しないようにします。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.7 AND/OR条件を使用する問合せの単一表でのバグチェック

Oracle Bug#5361954

データベースをAlpha Rdb 7.0.6.5からItanium 7.2.0.0に移行した後、特定の問合せで次の問合せを含むバグチェックが常に発生することがユーザーから報告されました。

SELECT   TIPO, OPFU
FROM     T1
WHERE    CODE  ='100' AND
         VALUE = '0057984193004785667' AND
         COOP  = 'OCA0604WOREST' AND
         CRTC = 'MFV' AND
         OPFU  = '20011228' AND
       ( TIPO  = 'TCI' OR (IVSN = 'I' AND (TIPO = 'COM' OR TIPO  = 'ATR') ) ) ;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;
%RDB-F-BUG_CHECK, internal consistency check failed

問題は、Rdb 7.2 Integrityプラットフォームに固有のものではありません。このバグチェックは、Rdbのすべてのバージョンで発生していました。

select * from rdb$databaseなどのメタデータの問合せ後に問合せを実行する場合、問合せが失敗しなくなることがありました。EXPORT/IMPORTを実行する場合も問題は発生しません。

次の例に示すように、SQLフラグMAX_STABILITYが定義される場合、問合せは機能します。

SET FLAGS 'MAX_STABILITY';

SELECT   TIPO, OPFU
FROM     T1
WHERE    CODE  ='100' AND
         VALUE = '0057984193004785667' AND
         COOP  = 'OCA0604WOREST' AND
         CRTC  = 'MFV' AND
         OPFU  = '20011228' AND
       ( TIPO  = 'TCI' OR (IVSN = 'I' AND (TIPO = 'COM' OR TIPO  = 'ATR') ) ) ;
Firstn                    Sort                      Conjunct
Get                       Retrieval by index of relation T1
  Index name  T1_NDX3 [5:5,(7:7)2] Bool
 TIPO   OPFU
 COM    20011228
1 row selected

問合せが失敗する表T1に対して次の索引を定義する必要があります。

T1_NDX1 with column CODE
    and column NUMOP

T1_NDX2 with column TIPO
    and column CODE
    and column VALUE
    and column COOP
    and column CRTC
    and column OPFU
    and column IVSN
    and column NUMOP

T1_NDX3 with column CODE descending
    and column VALUE descending
    and column COOP
    and column CRTC
    and column TIPO
    and column IVSN
    and column OPFU

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.8 ビットマップ・スキャンが有効な場合のバグチェック

Oracle Bug#5414635

次の問合せでは、ビットマップ・スキャン機能が有効な場合にバグチェックが発生します。

set flags 'bitmap';
select * from T1 where C2 = 'XYZ' or C4 >='03-jul-2006' ;
%RDMS-I-BUGCHKDMP, generating bugcheck dump file RDSBUGCHK.DMP;

次の例に示すように、ビットマップ・スキャンが無効の場合、問合せは機能します。

set flags 'nobitmap';
SQL> select * from T1 where C2 = 'XYZ' or C4 >='03-jul-2006' ;
Tables:
  0 = T1
Conjunct: (0.C2 = 'XYZ') OR (0.C4 >= '3-JUL-2006')
Get     Retrieval by index of relation 0:T1
  Index name  X1_T1 [0:0]
0 rows selected

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.9 Aggregateを使用するスター型結合の問合せからの不正な結果

Oracle Bug#5192800

次の問合せは、表t0とその他の2つの表(t1およびt2)を結合するスター型結合のようになります。通常はゼロ行を返しますが、かわりに1つの行が誤って検索されています。

select t0.acct_num, t1.scard_id
  from
    subscr t0
    inner join
    scard t1
    on
        (t1.acct_num = t0.acct_num
         and exists
           (select *
             from hwatt t3 where t3.acct_num = t1.acct_num))
    left outer join
    service t2
    on
      t2.acct_num = t0.acct_num and
      t2.dt_tim_stmp =
            (select max(t4.dt_tim_stmp)
              from service t4
              where t4.acct_num = t0.acct_num);
Tables:
  0 = SUBSCR
  1 = SCARD
  2 = SERVICE
  3 = HWATT
  4 = SERVICE
Cross block of 2 entries
  Cross block entry 1
    Cross block of 2 entries        (Left Outer Join)
      Cross block entry 1
        Cross block of 3 entries
          Cross block entry 1
            Get     Retrieval sequentially of relation 0:SUBSCR
          Cross block entry 2
            Aggregate: 0:MAX (4.DT_TIM_STMP)
            Conjunct: 4.ACCT_NUM = 0.ACCT_NUM
            Get     Retrieval sequentially of relation 4:SERVICE
          Cross block entry 3
            Conjunct: 1.ACCT_NUM = 0.ACCT_NUM
            Get     Retrieval sequentially of relation 1:SCARD
      Cross block entry 2
        Conjunct: (2.ACCT_NUM = 0.ACCT_NUM) AND (2.DT_TIM_STMP = <agg0>)
        Get     Retrieval sequentially of relation 2:SERVICE
  Cross block entry 2
    Aggregate-F1: 1:COUNT-ANY (<subselect>)
    Conjunct: 3.ACCT_NUM = 1.ACCT_NUM
    Get     Retrieval sequentially of relation 3:HWATT
 T0.ACCT_NUM   T1.SCARD_ID
           1             2
1 row selected

次の例に示すように、MAX aggregateのsubselect問合せを含む等式条件がWHERE句に変換される場合、問合せは機能します。

select t0.acct_num, t1.scard_id
  from
    subscr t0
    inner join
    scard t1
    on
        (t1.acct_num = t0.acct_num
         and exists
           (select *
             from hwatt t3 where t3.acct_num = t1.acct_num))
    left outer join
    service t2
    on
      t2.acct_num = t0.acct_num
where ! <== converted into WHERE clause
      h.dt_tim_stmp =
            (select max(sv2.dt_tim_stmp)
              from service sv2 where sv2.acct_num = ss.acct_num);
Tables:
  0 = SUBSCR
  1 = SCARD
  2 = SERVICE
  3 = HWATT
  4 = SERVICE
Cross block of 2 entries
  Cross block entry 1
    Cross block of 2 entries        (Left Outer Join)
      Cross block entry 1
        Cross block of 3 entries
          Cross block entry 1
            Get     Retrieval sequentially of relation 0:SUBSCR
          Cross block entry 2
            Conjunct: 1.ACCT_NUM = 0.ACCT_NUM
            Get     Retrieval sequentially of relation 1:SCARD
          Cross block entry 3
            Conjunct: <agg0> <> 0                  <== See Note
            Aggregate-F1: 0:COUNT-ANY (<subselect>)
            Conjunct: 3.ACCT_NUM = 1.ACCT_NUM
            Get     Retrieval sequentially of relation 3:HWATT
      Cross block entry 2
        Conjunct: 2.ACCT_NUM = 0.ACCT_NUM
        Get     Retrieval sequentially of relation 2:SERVICE
  Cross block entry 2
    Conjunct: 2.DT_TIM_STMP = agg1
    Aggregate: 1:MAX (4.DT_TIM_STMP)
    Conjunct: 4.ACCT_NUM = 0.ACCT_NUM
    Get     Retrieval sequentially of relation 4:SERVICE
0 rows selected

注意: conjunct <agg0> <> 0は、EXISTS文のAggregateの最上部の適切なストラテジ出力に表示されますが、このconjunctは問題の問合せのストラテジ出力では欠落しています。

この問合せでエラーが生じる状況の一因となったのは、主に次の部分です。

  1. 主な問合せは、主な表(t0)と複数の表(この場合は2つの表t1およびt2)を結合するスター型結合のようになります。
  2. 表t0とt1は内部結合され、その後にt3を参照するEXISTSのsubselect問合せがあります。
  3. 表t0とt2は左側外部結合され、その後に表t0とt4を結合するMAX aggregateのsubselect問合せを含む等式条件があります。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.10 権限を与えられたイメージで外部ルーチンを実行する場合の制限の緩和

Oracle Bug#4595983および4606819

以前のバージョンのOracle Rdbでは、OpenVMSによって現在のプロセスに付与されたよりも多くの権限を持つイメージから外部ルーチンがコールされた場合、その外部ルーチンをアクティブ化することはできませんでした。このセキュリティの防御策により、安全ではない共有可能イメージが本番環境で置き換えられることはありませんでした。

次の例は、Oracle Rdbでレポートされるエラーを示しています。

%RDB-E-EXTFUN_FAIL, external routine failed to compile or execute successfully
-RDMS-E-RTNUSENOTALL, routine "GET_ONE" can not be used, too many privileges
available

この制限では、SQL/ServicesアプリケーションでBIND ON SERVERを含む外部ルーチンを定義して、権限を与えられた環境以外でルーチンをアクティブ化できるようにする必要がありました。このため、RMU Loadの問題(制約、トリガーおよびAUTOMATIC INSERT列が外部ルーチンをコールする場合)、RMU Unloadの問題(COMPUTED BY列とビューが外部ルーチンをコールする場合)、RMU Verifyの問題(制約を評価する)も発生していました。

Rdbリリース7.2以降では、INSTALL ADD/SHAREコマンドを使用して、外部ルーチンの共有可能なknownイメージを作成できます。この共有可能イメージは、/EXECUTIVEモード・オプションを指定するシステム全体の論理名によってアクティブ化する必要があります。このようなイメージは、権限を与えられたイメージ(RMUなど)が外部ルーチンを実行する場合に信頼できるものとみなされます。

次の例では、FUNCS.OBJという名前の単一モジュールから構築されるFUNCS.EXEと呼ばれる共有イメージに、GET_ONEという名前の関数があると仮定します。データベースには、次の外部関数の定義があります。

SQL> create function get_one() returns integer;
cont> external
cont>  name RETURN_ONE
cont>  location 'MY_DIR:FUNCS.EXE'
cont>  language general
cont>  parameter style general
cont>  deterministic
cont>  comment is 'Always returns 1';

PRIV_APPという名前のSQL$PRE/CCアプリケーションがあるとします。このアプリケーションは、追加の権限とともにインストールする必要があり、この中には次のコードが含まれています。

EXEC SQL select get_one() into :result from rdb$database;
printf("%d is the loneliest number\n");

FUNCS.EXEがインストールされず、PRIV_APPがそのインストール時に与えられたよりも低い権限のアカウントから実行される場合、前述のGET_ONE()のコールは失敗し、RTNUSENOTALLエラーが発生します。PRIV_APP内からGET_ONE()を実行できるようにするには、SYS$SHAREで共有可能イメージを探し、次のようなDCLを使用してFUNCS.EXEをインストールします。

$ LINK/SHARE/NOTRACE/EXE=SYS$COMMON:[SYSLIB]FUNCS.EXE FUNCS,SYS$INPUT:/OPTIONS
SYMBOL_VECTOR=(RETURN_ONE=PROCEDURE)
$ SET FILE /PROTECTION=W:RE SYS$SHARE:FUNCS.EXE
$ INSTALL ADD SYS$SHARE:FUNCS.EXE /SHARE
$ DEFINE/SYSTEM/EXECUTIVE_MODE MY_DIR SYS$SHARE

インストールした共有可能イメージPRIV_APPを使用すると、SQL文が正常に実行され、関数GET_ONEのコールが成功します。

この問題は、Oracle Rdbリリース7.2で修正されました。

7.1.11 RDMS$_ SymbolsがI64のRDMMSGSHRから欠落している

Oracle Bug#5309253

I64のOracle Rdb 7.2より前のリリースでは、すべてのメッセージ記号がRDMMSGSHR.EXEから誤って省略されていました。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.12 ページの競合が多い場合のハングまたはループ

ページの競合が多いアプリケーションでは、ページのロックがプロセスで解放されずにハングするか、CPUのループに陥ることがありました。これは、Oracle Rdbリリース7.2のみの問題です。

この問題は、ブロッキングASTのリクエストの管理に使用する内部キューが破損すると発生していました。この状況では、ブロッキングASTが失われるか、キューの処理によって無限ループに陥っていました。

この問題の回避策はありません。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.1.13 論理RDMS$ENABLE_INDEX_COLUMN_GROUPが機能しない

Oracle Bug#5614198

Oracle Rdbリリース7.2では、VMSの論理RDMS$ENABLE_INDEX_COLUMN_GROUPを使用して、この機能を無効にできません。

$define RDMS$ENABLE_INDEX_COLUMN_GROUP 0
$SQL$
attach 'file personnel';
show flags;
Alias RDB$DBHANDLE:
Flags currently set for Oracle Rdb:
   STRATEGY,PREFIX,WARN_DDL,INDEX_COLUMN_GROUP,MAX_SOLUTION
   ,MAX_RECURSION(100),DETAIL_LEVEL(1),REFINE_ESTIMATES(127)
   ,NOBITMAPPED_SCAN

回避するには、コマンドのSQLフラグNOINDEX_COLUMN_GROUPを使用します。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2 SQLエラーの修正

7.2.1 CREATE OUTLINEが複数スキーマのデータベースに対して完全にサポートされない

整形式の問合せの概要は、複数スキーマのデータベース内で必ず正常に機能するとはかぎりません。これは、MODULEタグ、RELATIONタグおよびINDEXタグに対して、STORED NAMEではなくオブジェクト名が使用されるためです。これらの参照が機能するのは、STORED NAMEがスキーマ内の名前と同じ場合のみです。

次の例は、誤って渡された名前が原因でOracle Rdbからレポートされるエラーを示しています。

SQL> create outline S.QO_0
cont> id 'DAE28B9C6DA276E600C68C32AFF46F88'
cont> mode 0
cont> as (
cont>   query (
cont> -- Select
cont>     subquery (
cont>       TT      MODULE S.M2 0     access path sequential
cont>       )
cont>     )
cont>   )
cont> compliance optional     ;
%RDB-E-NO_META_UPDATE, metadata update failed
-RDB-E-OBSOLETE_METADA, request references metadata objects that no longer exist
-RDMS-E-MODNEXTS, module M2 does not exist in this database
SQL>
SQL> create outline S.QO
cont>     stored name is "qoQOqo"
cont> id '74263C5C965F88554C9E67744616925C'
cont> mode 0
cont> as (
cont>   query (
cont> -- For loop
cont>     subquery (
cont>       S.TTABLE 0      access path sequential
cont>       )
cont>     )
cont>   )
cont> compliance optional     ;
%RDB-E-NO_META_UPDATE, metadata update failed
-RDB-E-OBSOLETE_METADA, request references metadata objects that no longer exist
-RDMS-F-RELNOEXI, relation TTABLE does not exist in this database
SQL>
SQL> create outline S.QO_2
cont> id '21CA5C0637609367779EB2D7967FF11B'
cont> mode 0
cont> as (
cont>   query (
cont> -- For loop
cont>     subquery (
cont>       S.T 0     access path index       S.T_INDEX
cont>       )
cont>     )
cont>   )
cont> compliance optional     ;
%RDB-E-NO_META_UPDATE, metadata update failed
-RDMS-F-INDNOTEXI, index T_INDEX does not exist in this database

また、SQLは、宣言されたローカルの一時(別名スクラッチ)表の名前を正しく処理しませんでした。CREATE OUTLINE構文は、表名のスキーマ(およびカタログ)を許可しますが、モジュール内の一時表の場合、表のサブオブジェクトはモジュール名によって完全に指定されます。SQLは、非限定の名前を制限するようになりました。

これらの問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.2 コンパイル済ソースのCREATE MODULEからの予期しないINV_TBL_DCLエラー

SQLモジュール言語またはSQLプリコンパイラのソース・ファイルに、DECLARE LOCAL TEMPORARY TABLEを使用するCREATE MODULE文が含まれる場合、複数のエラーがレポートされていました。対話型SQLまたは動的SQLでは、同じCREATE MODULE文が受け入れられていました。

次の例は、これらのエラーを示しています。

    declare local temporary table module.T2T (f float)
                                         1
%SQL-E-INV_TBL_DCL, (1) Invalid use of declared local temporary table T2T
    select f into :x from module.T2T where module.T2T.f = 0e0;
                          1
%SQL-F-RELNOTDCL, (1) Table T2T has not been declared in module or environment

この制限は、このリリースのOracle Rdbで解除されました。この禁止事項はCREATE MODULE文に対して誤って適用されたもので、DECLARE LOCAL TEMPORARY TABLEに対する制限は、コンパイル済モジュールのDDL文に適用されません。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.3 範囲外の数値でSQLSTATE 22003が返されない

Oracle Bug#5208860

表の列にNUMERICが定義されている場合、範囲外の数値を列に挿入すると、返されるSQLCODEは-1、SQLSTATEはRR000になっていました。正しいSQLCODEは-304、SQLSTATEは22003です。

たとえば、次のように定義される表について考えます。

CREATE TABLE NUM1 ( NUM1C1 NUMERIC (3, 2),  NUM1C2 NUMERIC (2) );

次の例は、範囲外の値が表に挿入される場合に、古い不正なSQLCODEとSQLSTATEが返される状況を示しています。

SQL> INSERT INTO NUM1 VALUES (-10, 0);
%RDB-E-VALOUTRANGE, value outside the specified precision (3) for column
"NUM1C1"
SQL> show sqlca
SQLCA:
        SQLCAID:        SQLCA           SQLCABC:        128
        SQLCODE:        -1
        SQLERRD:        [0]: 2
                        [1]: 0
                        [2]: 0
                        [3]: 0
                        [4]: 0
                        [5]: 0
        SQLWARN0:       0       SQLWARN1:       0       SQLWARN2:       0
        SQLWARN3:       0       SQLWARN4:       0       SQLWARN5:       0
        SQLWARN6:       0       SQLWARN7:       0
        SQLSTATE:       RR000

このINSERTは、現在、次の結果を生成するようになりました。

SQL> INSERT INTO NUM1 VALUES (-10, 0);
%RDB-E-VALOUTRANGE, value outside the specified precision (3) for column
"NUM1C1"
SQL> show sqlca
SQLCA:
        SQLCAID:        SQLCA           SQLCABC:        128
        SQLCODE:        -304
        SQLERRD:        [0]: 0
                        [1]: 0
                        [2]: 0
                        [3]: 0
                        [4]: 0
                        [5]: 0
        SQLWARN0:       0       SQLWARN1:       0       SQLWARN2:       0
        SQLWARN3:       0       SQLWARN4:       0       SQLWARN5:       0
        SQLWARN6:       0       SQLWARN7:       0
        SQLSTATE:       22003

正しいSQLCODE/SQLSTATEを取得する既知の回避策はありません。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.4 TIME式に追加されたDATEのTIMESTAMPの結果が切り捨てられる

Oracle Rdbでは、TIMESTAMPの結果を生成するために、DATE ANSIとTIMEデータ型の値の追加を許可しています。SQLは、小数秒の精度を、TIMESTAMPの結果ゼロ(0)に誤って割り当てていました。そのため、結果は対話型SQLによって切り捨てられていました。SQLは、TIME値の式による小数秒の精度を、TIMESTAMPの結果に正しく割り当てるようになりました。

次の例は、小数秒が切り捨てられた状態を示しています。

SQL> select date ansi'2006-1-1' + time'12:12:12.12' from rdb$database;

 2006-01-01 12:12:12
1 row selected

この問題はOracle Rdbリリース7.2.1で修正されました。SQLは、TIME値の式による小数秒の精度を、TIMESTAMPの結果に正しく割り当てるようになりました。

7.2.5 INSERT ... SELECT文からの予期しない制約の失敗

以前のリリースのOracle Rdbでは、NOT DEFERRABLE制約は、INSERT INTO ... SELECT ... FROM ...文によって挿入される行ごとに評価されていました。この行ごとの評価が原因で、成功すると思われていたINSERT文が失敗していました。SQLのためのANSIおよびISOのデータベース言語規格では、SELECTからのINSERT文はアトミックであり、制約の評価はすべての行の挿入後に行う必要があると定めています。

次の例は、本来は成功するはずの制約が失敗する状況を示しています。

SQL> set dialect 'SQL99';
SQL>
SQL> create table TEST_A (a integer);
SQL> insert into TEST_A values (1);
1 row inserted
SQL> insert into TEST_A values (-1);
1 row inserted
SQL>
SQL> create table TEST_B
cont>     (b integer);
SQL>
SQL> insert into TEST_B select * from TEST_A;
2 rows inserted
SQL>
SQL> -- add constraint that ensures total is zero
SQL> alter table TEST_B
cont>     add constraint BB
cont>   check ((select sum (b) from TEST_B) = 0)
cont>   not deferrable;
SQL>
SQL> insert into TEST_B select * from TEST_A;
%RDB-E-INTEG_FAIL, violation of constraint BB caused operation to fail
-RDB-F-ON_DB, on database DISK1:[DATABASES]MF_PERSONNEL.RDB;1
SQL>

この問題はOracle Rdbリリース7.2.1で修正されました。SQL言語のダイアレクトSQL92、SQL99、ORACLE LEVEL1またはORACLE LEVEL2が設定される場合、NOT DEFERRABLE制約の評価は、すべての行がINSERT ... SELECT文に対して挿入された後に実行されるようになりました。

7.2.6 SQL$MOD /LISが不正な/ALIGN値を表示する

Oracle Bug#5350528

SQLモジュール言語コンパイラで作成されたリストには、リストの最後のコマンドラインの概要セクションで使用される/(NO)ALIGN修飾子の不正な値が表示されていました。この修飾子の正しい値はコンパイルで使用されていました。つまり、問題は誤解を招くリストに限定されていました。

たとえば、リストのコマンドラインの概要セクションには次のように表示されます。

Command Line Summary:

    /LIST/NOALIGN/MACH TEST$SOURCE:MOD_DATETIME_ADA_4.SQLMOD

    /FLOAT=D_FLOAT
    /WARNING=(WARNING, DEPRECATED)
    /NOFLAG_NONSTANDARD
    /CONSTRAINT_MODE=DEFERRED
    /NOCONNECT
    /INITIALIZE_HANDLES
    /NORESTRICT_INVOKER
    /ALIGN_RECORDS
        ...

前述の例では、コマンドラインで/NOALIGNを指定しましたが、レコードが実際に並べられていない場合でも、使用する値として/ALIGN_RECORDSが表示されています。

この問題の回避策はありません。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.7 FOR UPDATE句がDECLARE CURSORに対して無視される

Oracle Bug#4990176

Oracle Rdbリリース7.1.2以降では、SELECT ... FOR UPDATE句はUPDATE ONLY CURSOR構文と同義のものとしてみなされていました。FOR UPDATE句は、行を最初に読み取るときにさらに強力なロックを示す、SQLの様々なダイアレクトで使用されます。たとえば、シングルトンのSELECT文はFOR UPDATEを使用して行をフェッチし、アプリケーションで続いて更新するためにDBKEY(またはROWID)を保存します。

動的SQLと対話型SQLの場合、FOR UPDATEは行を更新するカーソルを使用する際の重要な機能です。このような環境では、カーソルを更新する目的は、UPDATE ... WHERE CURRENT OF文が現れるまでわかりません。FOR UPDATE句は、問合せを最適化するための重要な情報を提供するだけでなく、更新予定の行をロックします。ただし、DECLARE CURSOR構文は、ORACLE LEVEL1とORACLE LEVEL2を除くすべてのダイアレクトでFOR UPDATE句を無視し、Oracle Rdbによる強力なロックが適用されていませんでした。

この問題はOracle Rdbリリース7.2.1で修正されました。SQLのすべてのダイアレクトで、強力な行ロックのためにFOR UPDATEを受け入れるようになりました。

7.2.8 UPDATE ... WHERE CURRENT OFがIF文内で不正な結果を割り当てる

Oracle Bug#2266270

以前のバージョンのOracle Rdbでは、IF THEN ELSE文またはCASE文などの条件文内で実行されたUPDATE ... WHERE CURRENT OFが、ターゲット列に対して不正な結果を割り当てることがありました。これは、次の状況でのみ発生します。

問題は、共通式の評価がIF文の1つのブランチでのみ行われ、他の条件ブランチに対して不可視であるため発生します。このような他のブランチによって、不正な結果が割り当てられます。

次の例は、このような問題のある問合せの構造を示しています。この例の共通式はA + Bです。

begin
for :x as each row of cursor y
    for select id, a, b from t_table
do
    if :x.id = 1 then
        update t_table set res = a + b + 1 where current of y;
    else
        update t_table set res = a + b where current of y;
    end if;
end for;
end;

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.9 SHOWコマンドで予期しないCOSI-F-BUGCHECKエラーがレポートされる

Oracle Bug#5256548

SHOW INDEX (PARTITION)コマンド、SHOW TABLEコマンドまたはSHOW STORAGE MAPコマンドが失敗し、COSI-F-BUGCHECKエラーが発生することがあります。これは、記憶域が統一形式の領域内にあり、名前の長さが厳密に31オクテットの場合に発生します。エラーはバッファのサイズ設定が小さすぎるために発生します。

次の例は、問題を示しています。

SQL> show table SAMPLE_TABLE;
Information for table SAMPLE_TABLE:
...
 Partition information for index:
  Partition: (1) SYS_P00150
   Storage Area: A_VERY_LONG_STORAGE_AREA_NAME_1
%COSI-F-BUGCHECK, internal consistency failure

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.10 ALTER DOMAINがDEFAULTの変更を表の列に誤って伝播する

Oracle Bug#5203032

以前のリリースのOracle Rdbでは、ALTER DOMAIN ... DROP DEFAULT句は、そのドメインに基づいてすべての列に変更を伝播していました。ほとんどの場合、この動作は適切ですが、列に各自のDEFAULTがあり、それがドメインの列を上書きする場合、このアクションの実行は不要です。

DROP DEFAULTによって列のデフォルト値が失われてしまうという影響があります。ただし、SHOW TABLE (COLUMN)などのコマンドでは古い値が表示されます。

次の例は、この動作を示しています。ここで、ドメインには、NULL値が挿入されないようにするCHECK制約が含まれています。DROP DEFAULTは、DEFAULT式をアクティブにせず、NULLが挿入されます。

SQL> create domain D_TEST
cont>     integer
cont>     default -99
cont>     check (value is not null) not deferrable;
SQL>
SQL> create table T_TEST
cont>     (ident_column D_TEST default 1
cont>     ,subident_column D_TEST default 0
cont>     );
SQL>
SQL> insert into T_TEST default values;
1 row inserted
SQL> select * from T_TEST;
 IDENT_COLUMN   SUBIDENT_COLUMN
            1                 0
1 row selected
SQL>
SQL> alter domain D_TEST
cont>     drop default;
SQL>
SQL> insert into T_TEST default values;
%RDB-E-NOT_VALID, validation on field IDENT_COLUMN caused operation to fail
SQL>

これを修正するには、ALTER TABLE ... ALTER COLUMN ... DEFAULTを使用して列のデフォルトを再定義します。

この問題はOracle Rdbリリース7.2.1で修正されました。ALTER DOMAINは、列レベルで上書きするDEFAULT句を持つ列にDROP DEFAULTの変更を伝播しなくなりました。

7.2.11 モジュールのグローバル変数が64のDECLARE文に制限される

Oracle Bug#5346544

以前のバージョンのOracle Rdbでは、モジュールのグローバル変数に64を超えるDECLARE文を使用するCREATE MODULE文でバグチェックが発生することがありました。バグチェックの概要は、次のように表示されます。

この問題はメモリーの割当てエラーが原因で発生していましたが、Oracle Rdbリリース7.2.1で修正されました。Oracle Rdbは、実質的に無制限のモジュールのグローバル変数をサポートするようになりました。

7.2.12 無効なエスケープ・シーケンスがSQLSTATEに存在しない

Oracle Bug#5208821

SQLの規格では、無効なエスケープ・シーケンスはコード22025のSQLSTATEでレポートされる必要があります。また、Rdbでは、SQLCODE -1040でこの状況をレポートすることになっています。以前のバージョンのRdbでは、SQLSTATE RR000とSQLCODE -1がかわりにレポートされていました。

たとえば、SQL$PRE/CCプログラムに次の問合せが含まれているとします。

EXEC SQL SELECT COUNT(*) FROM CPBASE
         WHERE JUNK1 LIKE 'P%X%%X' ESCAPE 'X';

前述の問合せのエスケープ・シーケンスは、エスケープ文字で終わるため無効です。以前のバージョンでは、動的SQLは、一般的なSQLCODE -1およびSQLSTATE RR000でエラーをレポートしていました。現在は、正しいSQLCODE -1040とSQLSTATE 22025がレポートされるようになりました。

この問題の既知の回避策はありません。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.13 DROP STORAGE AREA ... CASCADEによって、パーティション索引が完全にドロップされない

Oracle Bug#5620530

以前のリリースのOracle Rdbでは、ALTER DATABASE ... DROP STORAGE AREA ... CASCADE文が、パーティション表から削除された行を参照するパーティション索引を正しく更新しない場合があります。

次の例は、一部の索引ノードが古い行を参照する状態を示しています。これはRMU Verifyで検出されます。

$ DEFINE/USER RDMS$SET_FLAGS -
    "TEST_SYSTEM,STOMAP_STATS,INDEX_STAT,INTERNAL,ITEM_LIST"
$ SQL$
alter database
    filename SAMPLE_DATABASE
    drop storage area AREA_MAIN_07 cascade;
~As: Drop Storage Area "AREA_MAIN_07" Cascade
~As: ...area referenced by index: "INDEX1"
~As: ...area referenced by map: "MAP_TABLE_001"
~As: ...purge index "INDEX2"
~As: ...update the AIP for larea=65 (table)
~As: ...update the AIP for larea=77 (index)
~H Extension (VERIFY CONSTRAINTS) Item List:
0000 (00000) RDB$K_EXT_VFYC_EXCLUDE_UNIQUE
0003 (00003) RDB$K_EXT_VFYC_TABLE_NAME "TABLE_001"
000F (00015) RDB$K_INFO_END
$
$ RMU/VERIFY/INDEX SAMPLE_DATABASE
%RMU-W-CANTFINDLAREA, cannot locate logical area 65 in area inventory page list
%RMU-E-BDLAREADY, error readying logical area with dbid 65
%RMU-I-READYDATA, ready needed for data record at 65:5:0
%RMU-I-BTRNODDBK, Dbkey of B-tree node is 89:3:0
%RMU-W-BTRVFYPRU, B-tree verification pruned at this dbkey
%RMU-I-BTRPARROO, root dbkey of b-tree partition in AREA_INDEX_07 is 89:3:0
$

この問題はOracle Rdbリリース7.2.1で修正されました。この問題を回避するには、影響を受ける索引をドロップして再作成するしかありません。

7.2.14 TRANSLATE ... USING関数を使用する場合の予期しないLENMISMAT警告

Oracle Bug#5629307

以前のバージョンのOracle Rdbでは、TRANSLATE (... USING ...)関数の結果の長さが、SQLによって過度に見積られていました。このため、予期しない不正な警告が発行されることがありました。

次の例は、単純な列でのこの状況を示しています。このコマンドからの警告はありません。

SQL> set character length 'characters';
SQL> create table utest (u5 char(10) character set unicode) ;
SQL> show table (column) utest
Information for table UTEST

Columns for table UTEST:
Column Name                     Data Type        Domain
-----------                     ---------        ------
U5                              CHAR(10)
         UNICODE 10 Characters,  20 Octets

SQL> insert into utest values ( translate ('A' using rdb$unicode ) ) ;
1 row inserted
SQL> insert into utest values ( translate ('AB' using rdb$unicode ) ) ;
1 row inserted
SQL> insert into utest values ( translate ('ABC' using rdb$unicode ) ) ;
1 row inserted
SQL> insert into utest values ( translate ('ABCD' using rdb$unicode ) ) ;
1 row inserted
SQL> insert into utest values ( translate ('ABCDE' using rdb$unicode ) ) ;
1 row inserted
SQL> insert into utest values ( translate ('ABCDEF' using rdb$unicode ) );
%SQL-W-LENMISMAT, Truncating right hand side string for assignment to column U5
1 row inserted
SQL> insert into utest values ( translate ('ABCDEFG' using rdb$unicode ) );
%SQL-W-LENMISMAT, Truncating right hand side string for assignment to column U5
1 row inserted
SQL> commit;

この問題はOracle Rdbリリース7.2.1で修正されました。SQLは、キャラクタ・セットの最大サイズ文字のオクテット長を使用して見積りを行うようになりました。TRANSLATEが不要なLENMISMAT警告を発行する可能性はほとんどなくなりましたが、SQLはソースの文字列の最終的な翻訳を理解しないことがあります。一部の可変長のキャラクタ・セットの場合、代入が切り捨てられずに成功する場合でも警告が正当化されることがあります。

7.2.15 NULL例外を含むUNIONからの予期しないエラー

Oracle Bug#5645199

以前のバージョンのOracle Rdbでは、最初の区間のselectリストでNULLを指定したUNION演算子が、一般的なデータ型に対して無効なデータ型を取得することがあります。このため、(次の例に示すように)文字化けが発生するか、または実行時にエラーが生成されます。

%RDB-E-ARITH_EXCEPT, truncation of a numeric value at runtime
-SQL-F-UNSDTPCVT, Unsupported data type conversion

次の例は、不正な結果を示しています。

SQL> select null from ntab
cont> union
cont> select d1 from dtab;
 D1
 @L.oGe%.....(x/z(x/z...
 NULL
2 rows selected

この問題を回避するには、CAST式をNULLでラップして、UNIONの他の区間と互換性のあるデータ型を指定するか、またはNULL式が最後に処理されるようにselect式を逆にします。次の例は、予期される結果を示しています。

SQL> select d1 from dtab
cont> union
cont> select null from ntab;
 D1
  6-NOV-2006 16:16:52.62
 NULL
2 rows selected

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.16 IS NULL式へのデータ型の割当てが一貫していない

Oracle Bug#5484239

以前のリリースのOracle Rdbでは、動的SQLは、隣接する式に基づいてIS NULL句のパラメータ・マーカーにデータ型を割り当てていました。多くの場合、このデータ型は一貫して適用されていませんでした。

次の例は、ユーザーからのデータを求める動的SQLアプリケーションを示しています。? IS NULLでは、整数(4および8を入力)をリクエストする場合と、char(30)の入力をリクエストする場合があります。

Enter statement:
create table CUSTOMERS
    (id INTEGER
    ,ORDERID INTEGER
    ,NAME CHAR(30)
    );
Enter statement:
update CUSTOMERS
set ID=?, ORDERID=?, NAME=?
where (ID= ? OR (ID IS NULL AND ? IS NULL))
  and (ORDERID= ? OR (ORDERID IS NULL AND ? IS NULL))
  and (NAME= ? OR (NAME IS NULL AND ? IS NULL));
[9 fields]
 0/ID/Integer: 12345
 1/ORDERID/Integer: 345
 2/NAME/Char(30/30): Jones
 3/ID/Integer: 12355
 4//Integer: 0
 5/ORDERID/Integer: 344
 6//Char(30/30):
 7/NAME/Char(30/30): Lee
 8//Integer: 0
Enter statement:

この問題はOracle Rdbリリース7.2.1で修正されました。このリリースでは、SQLは、式? IS NULLのデータ型としてデフォルトの型(VARCHAR(2000))を割り当てるようになりました。

7.2.17 表のシノニムが問合せの概要で使用されない

以前のリリースのOracle Rdbでは、CREATE SYNONYMまたはRENAME TABLEを使用して表に作成されたシノニムが、実行時に問合せの概要で認識されませんでした。STRATEGYフラグがSET FLAGS文で指定された場合、次のようなメッセージがレポートされていました。

SQL> select a from t000 order by a;
~S: Outline "QO_A" used
~S: Outline/query mismatch; assuming T000 0 renamed to TABLE_000 0
Tables:
  0 = TABLE_000
Index only retrieval of relation 0:TABLE_000
  Index name  T000_INDEX [0:0]
0 rows selected
SQL>

この問題はOracle Rdbリリース7.2.1で修正されました。Oracle Rdbは、結果のターゲット表を、問合せの概要で参照される名前と比較するだけではなく、問合せの表の名前と比較するようになりました。

7.2.18 文字列の連結時の予期しないUNSDTPCVTエラー

Oracle Bug#5584169

長さゼロの文字列を別の文字列と連結する場合、SQLはUNSDTPCVTエラーを予期せずレポートします。これは、問合せにOracleセマンティクスを適用しようとするために発生します。このエラーは、ダイアレクトがORACLE LEVEL1またはORACLE LEVEL2に設定されている場合のみ発生します。

次の例は、この問題が原因で失敗する問合せを示しています。

SQL> set dialect 'oracle level1';
SQL> select 'test'||'' from rdb$database;
%SQL-F-UNSDTPCVT, Unsupported data type conversion
SQL>

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.2.19 LIKEパターンのパラメータのサイズが小さすぎる

Oracle Bug#4179408

動的SQLが、LIKEパターンにパラメータ・マーカーを使用する問合せを処理している場合、パラメータの長さがソースの文字列の長さと同じであると仮定されます。ただし、%123%などのパターンは、CHAR(4)列に対する一致で使用するには完全に有効ですが(先頭の123または最後の123が一致)、想定されるデータ型により、パターンがOracle Rdbで切り捨てられるため、すべての値が一致するとはかぎりません。

次の例は、古い動作を示しています。3つのすべての行が問合せで一致する必要があります。

$ run test$tools:tester
Enter statement:
attach 'filename sql$database';
Enter statement:
create table LL (val char(4));
Enter statement:
insert into LL (val) values ('1234');
Enter statement:
insert into LL (val) values ('1235');
Enter statement:
insert into LL (val) values ('0123');
Enter statement:
select * from LL where val like ?;
[1 fields]
 0/VAL/Varchar(4/8): %123%
Enter statement:

次の例は、修正された動作と、パラメータ・マーカーのデータ型の長さが増加したことを示しています。

$ run test$tools:tester
Enter statement:
attach 'filename sql$database';
Enter statement:
create table LL (val char(4));
Enter statement:
insert into LL (val) values ('1234');
Enter statement:
insert into LL (val) values ('1235');
Enter statement:
insert into LL (val) values ('0123');
Enter statement:
select * from LL where val like ?;
[1 fields]
 0/VAL/Varchar(8/12): %123%
 0/VAL: 1234
 0/VAL: 1235
 0/VAL: 0123
Enter statement:

この問題はOracle Rdbリリース7.2.1で修正されました。SQLは、likeパターンのサイズがソースの文字列の2倍であると仮定するか、またはESCAPE句がある場合は、サイズを3倍に仮定します。これはほとんどのパターン文字列にとって余裕があります。このサイズ設定でも小さすぎる場合、CAST(? AS VARCHAR(n))を使用して、パラメータのサイズをより正確な長さに設定します。

7.3 RMUエラーの修正

7.3.1 /EDIT_FILENAMEが含まれる場合、RMU/BACKUP/AFTERがデフォルトのファイル名を無視する

Oracle Bug#5464971

RMU/BACKUP/AFTERコマンドが発行され、出力ファイル名が指定されず、/EDIT_FILENAME修飾子が含まれている場合、バックアップ・ファイルの作成時にデフォルトのジャーナル・ファイル名が使用されませんでした。次に例を示します。

$ RMU/BACKUP/AFTER/LOG -
  /EDIT_STRING=("_", VNO, "_", YEAR,MONTH,DAY_OF_MONTH) -
  MF_PERSONNEL .AIJ
.
.
.
%RMU-I-LOGCREBCK, created backup file DEV:[DIR]_0_20060829.AIJ;1

前述の例では、ジャーナル・ファイル名はJ1であり、バックアップのファイル名の接頭辞としてこの名前が使用されるはずでしたが、かわりに編集文字列のコンテンツのみがファイル名の構成に使用されました。

この問題を回避するには、バックアップ・コマンドでバックアップの出力ファイル名を明示的に指定します。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.2 RMU COLLECT OPTIMIZERの作業負荷統計のメモリー破損

Oracle Bug#5436532

RMU/COLLECT OPTIMIZERコマンドを使用してRdbデータベースの作業負荷統計を収集する場合、システムのアクセス違反が発生することがありました。この問題は、メモリー破損の問題が原因で発生していました。このメモリー破損は、多くの行がある表の作業負荷統計を計算するために使用するビットマップ表以外にビットが設定されている場合に発生することがありました。この問題は修正され、ビットマップ表の範囲外でビットが設定されることはなくなりました。この問題は、Oracle Rdb RMUリリース7.2でのみ発生します。

次の例は、作業負荷統計が収集される場合に発生するシステムのアクセス違反を示しています。

$ RMU/COLLECT OPTIMIZER/STATISTICS=(WORKLOAD) test_datatbase
%SYSTEM-F-ACCVIO, access violation, reason mask=04,
virtual address=000000000000000C, PC=0000000000501D2C, PS=0000001B
%RMU-F-FATALOSI, Fatal error from the Operating System Interface.
%RMU-I-BUGCHKDMP, generating bugcheck dump file
device:[directory]RMUBUGCHK.DMP

この問題を部分的に回避するには、最初にRMU/COLLECT OPTIMIZERコマンドで/TABLE修飾子を使用して、どの表がこの問題を引き起こしているのかを確認し、次に/EXCLUDE_TABLES修飾子を使用して該当する表の作業負荷統計が収集されないようにします。

$ RMU/COLLECT OPTIMIZER/STATISTICS=(WORKLOAD)-
 /EXCLUDE_TABLE=problem_table test_database
$

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.3 RMU VERIFYのメモリー破損

Oracle Bug#5349580および5276155

データベースが破損したために、データベースの検証を行う構造にメモリーを割り当てるためのカウンタが小さすぎる場合がありました。破損によってシステム表の問合せが整合性のないデータを返す場合、この問題が発生することがあります。この問題の原因の1つが、統一領域の領域ビット・マップ・ページの破損です。

表、索引、セグメント化された文字列などのエントリを検証構造に入力するために、その他の問合せがデータベースに対して実行された場合、データベースの各種オブジェクトの検証構造に入力されたエントリが、その構造に割り当てられたメモリーを超える可能性があります。このため、メモリーが破損し、システム・エラーとRMU/VERIFYのバグチェックが発生することがあります。

データベースの破損が原因でシステム表から整合性のないデータが返される場合、検証によって修正することはできません。ただし、検証構造に割り当てられたメモリー・サイズの超過を防ぐためのチェックが行われるようになり、システム表へのアクセス問題があるためすべてのデータベース・オブジェクトが検証されるわけではないが、検証が続行されることを示す警告メッセージが出力されるようになりました。データベースへの問合せが信頼できるものではなく、この非一貫性が発生した時点でその原因を検証の開始時に通知する方法がないため、問題を示すことができるように検証を続行する機会が与えられます。

次の例は、データベースのRMU/VERIFYで、検証構造をロードするときにメモリー超過の原因となった破損が生じた状況を示しています。これにより、メモリーが破損し、システムの予約オペランド・フォルトが繰り返されます。検証を続行しようとしますが、検証を続けるために必要な構造をロードできない場合、検証は中断され、予期しないシステム・エラーのためにバグチェックのダンプが出力されます。

$ RMU/VERIFY/ALL device:[directory]database.rdb
%RMU-I-BGNROOVER, beginning root verification
%RMU-I-ENDROOVER, completed root verification
%SYSTEM-W-ROPRAND, reserved operand fault at PC=000000000032E178,
PS=0000001B
%RMU-E-ERRRDBIND, error accessing RDB$INDICES relation
%RMU-I-PARTLVFY,  continuing partial verification
%RMU-F-ABORTVER,  fatal error encountered; aborting verification
%SYSTEM-F-ROPRAND, reserved operand fault at PC=000000000032E178,
PS=0000001B
%RMU-F-FATALOSI, Fatal error from the Operating System Interface.
%RMU-I-BUGCHKDMP, generating bugcheck dump file
 device:[directory]RMUBUGCHK.DMP;
%RMU-F-FTL_VER, Fatal error for VERIFY operation at 21-JUN-2006
08:03:57.63

次の例は、修正された動作を示しています。メモリー超過は回避され、データベース・オブジェクトの特定の型に関して、その型のすべてのオブジェクトを完全に検証するために情報をロードする際の問題があることを示す警告メッセージが出力されます。検証によって返される診断が問題の特定に役立つように検証は続行されます。領域ビット・マップ・ページが破損している場合、RMU/REPAIRを実行して破損を修正できます。

$ RMU/VERIFY/ALL device:[directory]database.rdb
%RMU-W-NOTALLDAT, Not all data for database TABLES can be loaded from
system tables - verify continuing.
%RMU-W-ABMBITERR, inconsistency between spam page 9475371 and bit 918
in area bitmap in larea 1 page 6
%RMU-W-ABMBITERR, inconsistency between spam page 9490631 and bit 932
in area bitmap in larea 1 page 6
%RMU-W-ABMBITERR, inconsistency between spam page 9491721 and bit 933
in area bitmap in larea 1 page 6
%RMU-E-BADABMPAG,       error verifying ABM pages
$ RMU/REPAIR/ABM/AREA=UNIFORM_AREA device:[directory]DATABASE.RDB
%RMU-I-FULBACREQ, A full backup of this database should be performed
 after RMU REPAIR
$ RMU/VERIFY/ALL device:[directory]DATABASE.RDB

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.4 接尾辞の先行文字がデータに表示される場合の予期しないDLMNOTFND

Oracle Bug#4245634

以前のバージョンのOracle Rdbでは、SUFFIXの先行文字がデータに含まれる場合、RMU Loadがエラーをレポートしていました。これは、SUFFIXオプションが指定されたFORMAT=DELIMITEDで発生していました。たとえば、次のサンプル・データでは、名前SMITH, ANDREWの後に/が続きます。/はRMU Loadのコマンドラインで定義されるSUFFIXの先行文字でもあります。

/:/key3/:/,/:/SMITH, ANDREW//:/,/:/Z/:/&END&

これにより、次の例に示すようにRMU Loadが失敗します。

$ RMU/LOAD/RECORD_DEFINITION=(-
    FILE=NAMES_TABLE.RRD,-
    FORMAT=DELIMITED_TEXT, -
    PREFIX="/:/",-
    SUFFIX="/:/",-
    TERMINATOR="&END&",-
    NULL="")-
    LOAD_TEST NAMES_TABLE NAMES.DAT
%RMU-F-DLMNOTFND, Separator (,) not found for column 2 of row 1 in the input.
%RMU-I-DATRECREAD,  3 data records read from input file.
%RMU-I-DATRECSTO,   0 data records stored.
%RMU-I-DATRECREJ,   0 data records written to exception file.
%RMU-F-FTL_LOAD, Fatal error for LOAD operation at 14-JUL-2006 12:49:18.79

この問題は、Oracle Rdbリリース7.2.1で修正されました。RMU Loadは、正しいSUFFIXに対して前もってスキャンを正しく実行するようになりました。

7.3.5 NULL文字列が列データで表示される場合の予期しないRMU Loadの失敗

Oracle Bug#4865227

以前のリリースのOracle Rdbでは、RMU Loadコマンドは、列データ内でNULL文字列を検出すると失敗していました。これはFORM=DELIMITEDで、NULLオプションをRECORD_DEFINITION修飾子に指定すると発生します。次の例は、単純なケースを示しています。

$ RMU/UNLOAD/RECORD=(FILE=T1.RRD,FORMAT=DELIMITED,-
        SEPARATOR="|",PREFIX="",SUFFIX="",NULL="***") -
        SAMPLE_DB T1 T1.DAT
%RMU-I-DATRECUNL,   1 data records unloaded.
$ TYPE T1.DAT
abcde|N***N     |z
$ RMU/LOAD/RECORD=(FILE=T1.RRD,FORMAT=DELIMITED,-
        SEPARATOR="|",PREFIX="",SUFFIX="",NULL="***") -
        SAMPLE_DB T1 T1.DAT
  DEFINE FIELD C1 DATATYPE IS TEXT SIZE IS 5.
  DEFINE FIELD C2 DATATYPE IS TEXT SIZE IS 10.
  DEFINE FIELD C3 DATATYPE IS TEXT SIZE IS 1.
  DEFINE RECORD T1.
     C1 .
     C2 .
     C3 .
  END T1 RECORD.
%RMU-F-UNEXPDELIM, Unexpected delimiter encountered (***) in row 1 of input
%RMU-I-DATRECREAD,  1 data records read from input file.
%RMU-I-DATRECSTO,   0 data records stored.
%RMU-F-FTL_LOAD, Fatal error for LOAD operation at 14-JUL-2006 00:57:40.42

RMU Loadは、データが不明瞭でなければ、エラーをレポートすることはありません。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.6 RMU Loadで予期しないINVALID_BLRエラーがレポートされる

Oracle Bug#4040175

以前のリリースのOracle Rdbでは、RMU Loadコマンドは、データ型PACKED DECIMAL、UNSIGNED NUMERICおよびLEFT SIGNED NUMERICを含むレコード定義ファイルを受け入れていました。このため、次の例のようなエラーが発生していました。

$ rmu/load abc temp_table /rec=(format=text,file=z.rrd) z.dat
%RDB-E-INVALID_BLR, request BLR is incorrect at offset 8
%RMU-I-DATRECREAD,  0 data records read from input file.
%RMU-I-DATRECSTO,   0 data records stored.
%RMU-F-FTL_LOAD, Fatal error for LOAD operation at 13-JUL-2006 20:50:23.81

これらの型は、Oracle Rdbサーバーでサポートされておらず、RMU Loadで許可されません。このリリースでは、これらの型の使用が正しく診断されるようになりました。

%RMU-F-UNSSUPDAT, Unsupported data type: 16
%RMU-I-DATRECSTO,   0 data records stored.
%RMU-F-FTL_LOAD, Fatal error for LOAD operation at 13-JUL-2006 20:50:40.17

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.7 RMU /COPY、/MOVEおよび/RESTOREでABMページが破損する

Oracle Bug#5276155

RMU COPY、MOVEおよびRESTOREで、論理領域に対して複数のABMビットマップ・ページの連鎖があり、連鎖の以前のABMページにビットが設定されておらず、連鎖の後続のABMページにビットが設定されている場合、統一記憶域の領域ビット・マップ・ページが誤って設定されることがあります。すべてのSPAM PAGESを1つのABMページのビットマップで表すことができるとはかぎらず、論理領域ごとにSPAMページを表すには複数のABMページ(それぞれにビットマップがある)が必要とされるために、統一記憶域に十分なSPAMページがある場合にこの問題が発生することがあります。論理領域のいずれかのABMページ(だたし最後ではない)にビットが設定されていない場合、RMU MOVE、COPYまたはRESTOREの前にビットが設定されていたページの後のABMページでは、RMU COPY、MOVEまたはRESTOREの後にすべてのビットが消去されていました。ビットが論理領域のABMページに設定されていない場合、Rdbは、そのSPAMページで制御されるデータベースのデータ・ページを取得しません。これは、説明したケースで、統一記憶域の場合にのみ発生する点に注意してください。この問題はRMU/VERIFYで検出され、RMU/REPAIR/ABM/AREASで修正できます。この問題は修正され、ABMビットマップのビットは正しく設定されるようになりました。

次の例は、データベースのRMU/COPYによってこの問題が生じる状況を示しています。問題はRMU/VERIFYで検出され、RMU/REPAIRで修正されます。

$ RMU/COPY/NOLOG/DIRECTORY=device:[directory] DATABASE.RDB
$ RMU/VERIFY/AREAS/LAREAS device:[directory]DATABASE.RDB
%RMU-W-ABMBITERR, inconsistency between spam page 8650241 and bit 161 in
area bitmap in larea 113 page 8650819
%RMU-W-ABMBITERR, inconsistency between spam page 8651331 and bit 162 in
area bitmap in larea 113 page 8650819
%RMU-W-ABMBITERR, inconsistency between spam page 8652421 and bit 163 in
area bitmap in larea 113 page 8650819
%RMU-W-ABMBITERR, inconsistency between spam page 8653511 and bit 164 in
area bitmap in larea 113 page 8650819
%RMU-W-ABMBITERR, inconsistency between spam page 8654601 and bit 165 in
area bitmap in larea 113 page 8650819
%RMU-W-ABMBITERR, inconsistency between spam page 8655691 and bit 166 in
area bitmap in larea 113 page 8650819
%RMU-W-ABMBITERR, inconsistency between spam page 8656781 and bit 167 in
area bitmap in larea 113 page 8650819
%RMU-E-BADABMPAG,       error verifying ABM pages
$ RMU/REPAIR/ABM/AREA=UNIFORM_AREA device:[directory]DATABASE.RDB
%RMU-I-FULBACREQ, A full backup of this database should be performed
 after RMU REPAIR
$ RMU/VERIFY/AREAS/LAREAS device:[directory]DATABASE.RDB
$

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.8 区切り形式またはテキスト形式が使用される場合、RMU Unloadで実際のデータが切り捨てられる

Oracle Bug#4297346

以前のリリースのOracle Rdbでは、実際の列のRMU Unloadでデータが切り捨てられることが稀にあります。

LEAST、GREATEST、CASE、NULLIF、COALESCE、NVL、NVL2またはDECODEの各式を使用して結果を計算する表のCOMPUTED BYまたはビュー列が計算の場合に発生します。この問題が発生するには、計算にREAL(浮動小数F)になる1つの式と、SMALLINTになる別の式が含まれている必要があります。ただし、Oracle Rdbは、値を文字列値に変換する前にDOUBLE PRECISION(浮動小数G)に結果を促していました。値がRMU Unloadに配信されると、ターゲット文字列(REAL文字列値に正しくサイズ設定されている)は、結果として生成されるDOUBLE PRECISION文字列に対して小さすぎるため、結果が切り捨てられていました。

この問題を回避するには、COMPUTED BYまたはビュー列の定義に明示的なCAST(... AS REAL)を含めます。

次の出力は、列の切捨てを示しています。

003537||| 9.7500000E+01|||975||| 9.750000000000

想定される結果には、指数が含まれます。

003537||| 9.7500000E+01|||975||| 9.750000000000000E+001

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.9 RMU Extractで複数スキーマのデータベースが完全にサポートされない

Oracle Bug#5558122、5568079および5568040

以前のリリースのOracle Rdbでは、複数スキーマのデータベースに対してRMU Extractのサポートが完全ではありませんでした。このリリースでは、RMU Extractに関して次の部分の修正が行われました。

これらの問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.10 RMU Extract Item=Protectionsで保護が一貫して抽出されない

Oracle Bug#5225643

以前のバージョンのOracle Rdbでは、表に対するRMU Extract Item=Protectionsの出力では、表に対して未使用のOPERATOR権限が含まれるか、またはモジュール、関数またはプロシージャに対するREFERENCES権限が省略されることがあります。これらのエラーに害はありませんが、2番目のエラーが発生すると、生成スクリプトで作成された、シノニムの対象となるルーチンが実行されない可能性があります。

この問題は、Oracle Rdbリリース7.2.1で修正されました。RMUは、すべてのオブジェクトの保護を一貫して出力するようになりました。

7.3.11 統計が無効の場合、RMU/CONVERTのPIO$LOCK_PAGEでバグチェックが発生する

RMU/CONVERTコマンドの実行中に統計が無効の場合、RMUユーティリティでバグチェックが発生し、次のようなスタックが表示されていました。

***** Exception at 0000000000719708 : RMU72\PIO$DEMOTE_PAGE + 000001A8
%SYSTEM-F-ACCVIO, access violation, reason mask=00, virtual
address=0000000000000000, PC=0000000000719708, PS=0000001B
Saved PC = 0000000000722E14 : RMU72\PIOUTL$EMPTY_ONE_BUFFER + 000002B4
Saved PC = 000000000071D654 : RMU72\PIOFETCH$WITHIN_DB_HNDLR + 00000134
Saved PC = FFFFFFFF81104EC8 : Image LIBOTS + 00008EC8
Saved PC = FFFFFFFF800A693C : symbol not found
***** Exception at 000000000071C020 : RMU72\PIO$LOCK_PAGE + 00000320
Saved PC = 000000000071E114 : RMU72\PIOFETCH$WITHIN_DB + 00000924
Saved PC = 000000000071B444 : RMU72\PIOFETCH$FETCH + 000002E4
Saved PC = 000000000071A4E4 : RMU72\PIO$FETCH + 000008F4

以前のバージョンのOracle Rdbで行われたバックアップをリストアすることにより暗黙的な変換が行われる場合も、同じ問題が発生することがありました。

この問題は、次のコマンドを使用して明示することができます。

$ @SYS$LIBRARY:RDB$SETVER 71
Current PROCESS Oracle Rdb environment is version V7.1-441 (MULTIVERSION)
Current PROCESS SQL environment is version V7.1-441 (MULTIVERSION)
Current PROCESS Rdb/Dispatch environment is version V7.1-441 (MULTIVERSION)
$ MCR SQL$71
SQL> CREATE DATABASE FILENAME TEST;
SQL> EXIT
$
$ DEFINE RDM$BIND_STATS_ENABLED 0
$
$ @SYS$LIBRARY:RDB$SETVER 72
Current PROCESS Oracle Rdb environment is version V7.2-010 (MULTIVERSION)
Current PROCESS SQL environment is version V7.2-010 (MULTIVERSION)
Current PROCESS Rdb/Dispatch environment is version V7.2-010 (MULTIVERSION)
$ RMU/CONVERT/NOCONFIRM TEST
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2-010
%RMU-I-LOGCONVRT, database root converted to current structure level
%RMU-I-BUGCHKDMP, generating bugcheck dump file dev:[dir]RMUBUGCHK.DMP;

この問題を回避するには、RMU/CONVERTコマンドの実行前にRDM$BIND_STATS_ENABLED論理の割当てを解除します。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.12 RMU/RESTORE/AREA/ONLINEが、読取り保護のRDB$SYSTEMを不要にロックする

Oracle Bug#5203722

RMU/RESTORE/AREA/ONLINEが、読取り保護モードのRDB$SYSTEM領域をロックしていました。これは、RDB$SYSTEMがリストアする記憶域ではない場合も同様です。領域インベントリ・ページが一貫していない場合、これを読み取って場合によっては変更するために、RMU/RESTORE/AREA/ONLINEはシステム領域にアクセスする必要があります。領域インベントリ・ページはシステム領域にあります。ただし、参照するAIPページがない混合形式の記憶域のみがリストアされる場合でも、RMUはシステム領域を不要にロックしていました。

領域ごとにオンラインでリストアする場合、システム領域のAIPページのロックとページへのアクセスは変更されました。リストアする領域すべてが混合形式の場合、システム領域がリストアする領域でなければ、そのシステム領域はロックされません。統一領域がオンラインでリストアされる場合、システム領域は、読取り保護モードではなく同時書込みモードになり、リストア中の同時実行性が向上します。統一領域では、領域ビット・マップ・ページと領域管理ページを再構築するためにAIPページにアクセスして、これらのページが一貫していないときは、場合によって変更する必要があります。

リストア・コマンドで指定する、実際にリストアする領域(システム領域など)は、排他更新のために引き続きロックされます。

次の例は、これらの変更で影響を受ける、領域ごとのオンライン・リストア・コマンドを示しています。リストアが混合領域のみを参照する場合、システム領域はロックされません。リストアが統一領域を参照する場合、以前はシステム領域の読取り保護がロックされていましたが、システム領域の同時書込みになりました。システム領域自体がリストアされる場合、システム領域は、排他更新のために引き続きロックされます。

$ RMU/RESTORE/ONLINE/AREA/NOLOG/DIR=DEVICE:[DIRECTORY] -
         DEVICE:[DIRECTORY]DATABASE.RBF MIXED_1_AREA, MIXED_2_AREA
$ RMU/RESTORE/ONLINE/AREA/NOLOG/DIR=DEVICE:[DIRECTORY] -
         DEVICE:[DIRECTORY]DATABASE.RBF MIXED_1_AREA, MIXED_2_AREA, -
                        UNIF_1_AREA, UNIF_2_AREA
$ RMU/RESTORE/ONLINE/AREA/NOLOG/DIR=DEVICE:[DIRECTORY] -
         DEVICE:[DIRECTORY]DATABASE.RBF MIXED_1_AREA, MIXED_2_AREA,-
                        UNIF_1_AREA, UNIF_2_AREA, RDB$SYSTEM

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.13 データベースの記憶域の数が非常に多く、/BLOCK_SIZEに指定した値が小さい場合、RMU /BACKUPが失敗する

Oracle Bug#5376038

以前は、記憶域の数が非常に多く、/BLOCK_SIZEに指定された値が小さいデータベースでは、RMU /BACKUPが失敗することがありました。内部バッファが、出力ファイルのブロック・サイズをオーバーフローし、リカバリ時に読み取れないレコード、またはメモリーを破損させるレコードを書き込み、バックアップ時にACCVIOのバグチェックが発生します。一部のバージョンでは、バッファのオーバーフローが実行時に検出され、RMU /BACKUP操作が終了して、次のようなバグチェックのダンプが発生していました。

$ RMU/BACKUP FOO.RDB FOO.RBF /BLOCK_SIZE=2048
***** Exception at 003E95F0 : RMUBCK$BACKUP_SUMMARY + 00000270
%COSI-F-BUGCHECK, internal consistency failure
Saved PC = 003E8584 : RMUBCK$BF_BACKUP_THREAD + 00000494
Saved PC = 008302FC : RMUIO$TERMINATE_THREAD + 00000040
Saved PC = 008304B8 : RMUIO$FIREWALL + 00000040
Saved PC = 00830478 : RMUIO$FIREWALL + 00000000
Saved PC = 003A18E4 : RMU_DISPATCH + 00000434
Saved PC = 003A1008 : RMU_STARTUP + 000004E8
Saved PC = 001E002C : RMU$MAIN + 0000002C

この問題はOracle Rdbリリース7.2.1で修正されました。RMU /BACKUPは、データベースの記憶域の数とページ・サイズに適応するように、バックアップのブロック・サイズを必要に応じて適切に調整するようになりました。

7.3.14 RMU ExtractがBITSTRING関数でBAD_CODEエラーをレポートする

以前のリリースのOracle Rdbでは、RMU Extractが、CASE、ABS、COALESCE、DECODE、NULLIF、NVLまたはNVL2の関数内にネストされたBITSTRING関数を抽出しようとすると、BAD_CODEエラーを生成していました。次の例は、レポートされたエラーを示しています。

%RMU-F-BLRINV, internal error - BLR string 83 for . is invalid
-RDMS-E-BAD_CODE, corruption in the query string
%RMU-F-FTL_RMU, Fatal error for RMU operation at 10-JUL-2006 03:27:48.68

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.3.15 UNIONとGROUP BY句を含むビューで不正なSQL構文が生成される

Oracle Bug#5666305および5672460

以前のリリースでは、RMU Extractは、UNIONにGROUP BY句を含むブランチがある場合、select値のリストの後にアスタリスク*を付けてビューの定義を誤って抽出していました。

次の例は元のビューの定義を示しています。

SQL> create view SAMPLE_VIEW (a, b, c)
cont>     as
cont>     select last_name, first_name, middle_initial
cont>     from candidates
cont>     group by last_name, first_name, middle_initial
cont> union
cont>     select last_name, first_name, middle_initial
cont>     from employees
cont>     group by last_name, first_name, middle_initial
cont> ;

これは、RMU Extractからの出力で不正な構文を示しています。

   .
   .
   .
create view SAMPLE_VIEW
    (A,
     B,
     C) as
    select C3.LAST_NAME, C3.FIRST_NAME, C3.MIDDLE_INITIAL
        * from CANDIDATES C3
        group by C3.LAST_NAME, C3.FIRST_NAME, C3.MIDDLE_INITIAL
    union
    select C5.LAST_NAME, C5.FIRST_NAME, C5.MIDDLE_INITIAL
        * from EMPLOYEES C5
        group by C5.LAST_NAME, C5.FIRST_NAME, C5.MIDDLE_INITIAL;
   .
   .
   .

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.4 LogMinerエラーの修正

7.4.1 RMU/UNLOAD/AFTER_JOURNALの不正なNULLビットの設定

Oracle Bug#5256671

以前のリリースのOracle Rdbでは、データベースの表定義の変更や構造によって、LogMinerがNULL列の情報を不適切に処理することがありました。

次に、不正なNULLの処理の一因と考えられる例を示します。抽出されたレコードでは、不正な列がNULLで示されています。

$ DEFINE /NOLOG SQL$DATABASE FOO
$ SQL$
    CREATE DATA FILE SQL$DATABASE
        NUMBER OF BUFFERS 100 NUMBER OF CLUSTER NODES 1;
    DISCONNECT ALL;
    ALTER DATA FILE SQL$DATABASE
        JOURNAL ENA (FAST COMMIT ENA) ADD JOURNAL J1 FILE J1;
    CREATE TABLE T1 (
        I1 INT,I2 INT,I3 INT,I4 INT,I5 INT,I6 INT,
        I7 INT,I8 INT,I9 INT,I10 INT,I11 INT,I12 INT);
    CREATE STORAGE MAP M1 FOR T1 DISABLE COMPRESSION;
    COMMIT;
    ALTER TABLE T1 DROP COLUMN I5;
    COMMIT;
    ALTER TABLE T1
        ADD COLUMN I13 INT
        ADD COLUMN I14 INT
        ADD COLUMN I15 INT
        ADD COLUMN I16 INT
        ADD COLUMN I17 INT;
    COMMIT;
    ALTER TABLE T1 DROP COLUMN I17;
    ALTER TABLE T1 ADD COLUMN I18 INT;
    COMMIT;
    ALTER TABLE T1 DROP COLUMN I18;
    COMMIT;

    DISCONNECT ALL;
    EXIT;
$ RMU/SET LOGMINER/ENABLE/NOLOG SQL$DATABASE
$ RMU/BACKUP/AFTER/NOLOG SQL$DATABASE NLA0:BAR
$ RMU/BACKUP/NOLOG/NOCRC/NOCHECKSUM SQL$DATABASE NLA0:BAR
$ SQL$
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (NULL,2,3,4,6,7,8,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,NULL,3,4,6,7,8,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,NULL,4,6,7,8,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,NULL,6,7,8,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,NULL,7,8,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,NULL,8,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,NULL,9,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,NULL,10,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,NULL,11,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,10,NULL,12,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,10,11,NULL,13,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,10,11,12,NULL,14,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,10,11,12,13,NULL,15,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,10,11,12,13,14,NULL,16);
    INSERT INTO T1 VALUES (1,2,3,4,6,7,8,9,10,11,12,13,14,15,NULL);
    COMMIT;
$ RMU/BACKUP/AFTER/NOLOG SQL$DATABASE B1
$ RMU/UNLOAD/AFTER/NOLOG/FORMAT=DUMP SQL$DATABASE B1 -
    /TABLE=(NAME=T1,OUTPUT=T1.DAT)
$ SEARCH T1.DAT NULL
I13                             : NULL
I9                              : NULL
I13                             : NULL
I10                             : NULL
I13                             : NULL
I11                             : NULL
I13                             : NULL
I12                             : NULL
I13                             : NULL
I13                             : NULL
I14                             : NULL
I13                             : NULL
I15                             : NULL
I13                             : NULL
I16                             : NULL
I13                             : NULL
I13                             : NULL
I13                             : NULL
I13                             : NULL
I13                             : NULL
I13                             : NULL
I13                             : NULL
I13                             : NULL
$ EXIT

この問題はOracle Rdbリリース7.2.1で修正されました。LogMinerは、表定義に基づいて内部のNULL情報の構造の長さを正確に追跡するようになりました。

7.4.2 テキスト形式のRMU /UNLOAD /AFTER_JOURNALのAERCP_LENフィールドが正しくない

Oracle Bug#5617814

以前は、TEXTまたはDELIMITED_TEXTの出力形式を使用する場合、コミット・レコード・コンテンツのAERCP_LENフィールドが正しくありませんでした。

たとえば、区切りテキスト形式を使用する場合、次の情報がコミット・レコードに返されます。

"C",
"",
    .
    .
    .
"16",
"7169",
"00000000-0000-0000-0000-000000000000",
"000000000000038F000000000000038F000000160000000000001C01"

ここでは、フィールドの値16がRM_TID_LENで、値7169が正しくないAERCP_LENフィールドです。

この問題は、Oracle Rdbリリース7.2.1で修正されました。AERCP_LENフィールドの正しい値が返されるようになりました。AERCP_LENの値は28です。これはAERCP構造のフォーマットされていないバイナリの長さを表します。テキスト形式フィールドの長さではありません。

7.5 行キャッシュ・エラーの修正

7.5.1 ジャーナル化された行キャッシュの変更のRMU/RECOVERでデータベースが破損する

Oracle Bug#5469750

データベースの行キャッシュ・パラメータが変更され、データベースがリストアおよびリカバリされると、結果としてそのデータベースは破損していました。場合によっては、RMU/RECOVERプロセスも失敗し、Oracle Rdbモニター・プロセスが失敗することもあります。

次のスクリプトで問題を示します。

$
$ ! Create a database with a few basic caches.
$
$ SQL$
  CREATE DATABASE FILENAME TEST
  NUMBER OF CLUSTER NODES 1
  RESERVE 4 STORAGE AREAS
  RESERVE 3 JOURNALS
  RESERVE 3 CACHE SLOTS
  ROW CACHE IS ENABLED
  CREATE STORAGE AREA RDB$SYSTEM FILENAME TEST
  CREATE STORAGE AREA TEST_A1 FILENAME TEST_A1
  CREATE STORAGE AREA TEST_A2 FILENAME TEST_A2
  CREATE STORAGE AREA TEST_A3 FILENAME TEST_A3
  CREATE CACHE TEST_A1 CACHE SIZE 100 ROWS ROW LENGTH 100 BYTES
  CREATE CACHE TEST_A2 CACHE SIZE 200 ROWS ROW LENGTH 200 BYTES
  CREATE CACHE TEST_A3 CACHE SIZE 300 ROWS ROW LENGTH 300 BYTES;
  DISCONNECT ALL;

  ALTER DATABASE FILENAME TEST
    ADD JOURNAL TEST_J1 FILENAME SYS$DISK:[]TEST_J1.AIJ
    ADD JOURNAL TEST_J2 FILENAME SYS$DISK:[]TEST_J2.AIJ
    ADD JOURNAL TEST_J3 FILENAME SYS$DISK:[]TEST_J3.AIJ
    JOURNAL IS ENABLED (FAST COMMIT ENABLED);
%RDMS-W-DOFULLBCK, full database backup should be done to ensure future recovery
  EXIT;
$
$ ! Save away the original cache configuration.
$
$ RMU/BACKUP/NOLOG TEST TEST
$ RMU/DUMP/HEADER=BRIEF/OUTPUT=BEFORE.TXT TEST
$
$ ! Alter a cache parameter.
$
$ SQL$
  ALTER DATABASE FILENAME TEST ALTER CACHE TEST_A2 ROW LENGTH 400 BYTES;
  DISCONNECT ALL;

-- Delete the database

  DROP DATABASE FILENAME TEST;
  EXIT;
$
$ ! Restore the database.  RMU will automatically recover the journals.
$
$ RMU/RESTORE/NOCDD/NOLOG TEST
%RMU-I-AIJRSTAVL, 3 after-image journals available for use
%RMU-I-AIJRSTMOD, 1 after-image journal marked as "modified"
%RMU-I-AIJISON, after-image journaling has been enabled
%RMU-W-DOFULLBCK, full database backup should be done to ensure future recovery
%RMU-I-LOGRECDB, recovering database file DEV:[DIR]TEST.RDB;1
%RMU-I-AIJAUTOREC, starting automatic after-image journal recovery
%RMU-I-AIJONEDONE, AIJ file sequence 0 roll-forward operations completed
%RMU-I-AIJONEDONE, AIJ file sequence 1 roll-forward operations completed
%RMU-W-NOTRANAPP, no transactions in this journal were applied
%RMU-I-AIJALLDONE, after-image journal roll-forward operations completed
%RMU-I-AIJSUCCES, database recovery completed successfully
%RMU-I-AIJFNLSEQ, to start another AIJ file recovery, the sequence number
needed will be 2
$ RMU/DUMP/HEADER=BRIEF/OUTPUT=AFTER.TXT TEST
$
$ ! Compare the original database with the recovered database.
$ ! In this example, instead of the cache row length being changed
$ ! to 400 the number of database buffers is changed to 400.
$
$ DIFFERENCE BEFORE.TXT AFTER.TXT
.
.
.
************
File DEV:[DIR]BEFORE.TXT;1
   35         - Default user buffer count is 20
   36         - Default recovery buffer count is 20
   37         - Global buffers are disabled
******
File DEV:[DIR]AFTER.TXT;1
   35         - Default user buffer count is 400
   36         - Default recovery buffer count is 400 (stored as 20)
   37         - Global buffers are disabled
************

どの行キャッシュ・パラメータを変更するかによって、RMU/RECOVER操作またはデータベースのモニターで発生する障害は異なる可能性があります。レポートされた問題では、RMU/RECOVERが失敗し、次の例外が発生しました。

***** Exception at 007E35BC : PIO$FETCH + 000003EC
%SYSTEM-F-ACCVIO, access violation, reason mask=00,
virtual address=0000000000000000, PC=00000000007E35BC, PS=0000001B

また、データベースのモニターも失敗し、次の例外が発生しました。

**** Exception at hhhhhhhh : MON$DELETE_UNREFERENCED_GBL + 00000DAC
%SYSTEM-F-ACCVIO, access violation, virtual address=0000000000414000

この問題を回避するには、行キャッシュ・パラメータの変更後、データベースの全体バックアップとジャーナルのバックアップを行います。この問題が発生すると、リストアされたデータベースを、行キャッシュの変更が含まれるジャーナルの時点までリカバリできます。つまり、/UNTIL修飾子を使用する場合、行キャッシュの変更が行われた時点までジャーナルをリカバリします。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.5.2 行のスナップショットが有効な場合、リカバリされたデータベースが破損する

キャッシュ機能のスナップショットが有効な場合、アフター・イメージ・ジャーナル(AIJ)のエントリが不正なトランザクション順序番号(TSN)で記録されることがありました。このため、リストアされたデータベースをリカバリするためにジャーナルが使用されると、データベースが破損することがありました。この問題は、更新文でエラーが発生して、トランザクションが後からコミットされる場合に発生していました。たとえば、制約の失敗またはロックのタイムアウトの後にCOMMITを実行すると、不正なジャーナルのエントリが作成されていました。

この問題は、Oracle Rdbリリース7.1.4.4および7.2.0.2で導入されました。

この問題を回避するには、すべてのキャッシュをROW SNAPSHOT IS DISABLEDに設定します。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.6 RMU Show Statisticsエラーの修正

7.6.1 RMU/SHOW STATISTICSの「Hot Standby Statistics」の「State」表示フィールド

Oracle Bug#5396571

以前は、ホット・スタンバイ機能でTCP/IPネットワーク・トランスポートを使用する場合、RMU /SHOW STATISTICSの「Hot Standby Statistics」画面の「State」フィールドが、次の例に示すように、見出し「UserSync:」を上書きすることがありました。

Node: HSVMS  (1/1/16)  Oracle Rdb V7.1-441 Perf. Monitor 18-JUL-2006 06:17:59.97
Rate: 3.00 Seconds           Hot Standby Statistics         Elapsed: 00:07:28.63
Page: 1 of 1  $1$DGA113:[MWILLEMS.HS.HS1.MASTER]MF_PERSONNEL.RDB;1  Mode: Online
-------------------------------------------------------------------------
State: TCP/IP:72     rSync: Cold Current.Msg: 1       Cl Mstr.AIJ: 1:2
LagTime: 00:00:00 AutoSync: Cold Stalled.Msg: none     1 Stby.AIJ: 1:2
Stby.DB: HSVMS1::$1$DGA20:[MWILLEMS.HS.HS1.STANDBY]STANDBY_MF_PERSONNEL

「State」で開始される行が、「UserSync:」を部分的に上書きしています。

この問題は、Oracle Rdbリリース7.2.1で修正されました。

7.6.2 RMU /SHOW STATISTICSの「Defined Logicals」のリストが完全ではない

Oracle Bug#5600122

以前は、RMU /SHOW STATISTICSの「Defined Logicals」画面がFullモードに設定されている場合、その画面にすべての論理が適切にリストされないことがありました。この問題は、考えられる論理名の数が誤って計算されることで生じていました。

この問題は、Oracle Rdbリリース7.2.1で修正されました。論理名の完全なリストが正しく表示されるようになりました。

7.6.3 Rdbエグゼクティブのソートと一時作業ファイルの統計

Oracle Bug#5617519

以前は、全データベース・レベルでRdbエグゼクティブ内のソート操作の数と一時作業ファイル操作の数を決定する、信頼性の高い方法がありませんでした。

Rdbエグゼクティブ内のソート操作と一時作業ファイル操作の数およびタイプの把握に役立つ新しい統計が利用できます。これらの統計は、RMU /SHOW STATISTICSユーティリティの「Rdb Executive Statistics」画面で使用できます。

ソートと一時作業ファイルの統計を示す「Rdb Executive Statistics」画面の例を示します。

Node: LUCAS (1/1/1)    Oracle Rdb X7.2-00 Perf. Monitor  26-OCT-2006 22:41:29.41
Rate: 3.00 Seconds          Rdb Executive Statistics        Elapsed: 00:02:50.14
Page: 1 of 1           $1$DGA203:[HSEC]MF_PERSONNEL.RDB;1           Mode: Online
--------------------------------------------------------------------------------
statistic.........      rate.per.second............. total....... average......
name..............      max..... cur..... avg....... count....... per.trans....
queries compiled              16        0        0.7           82          16.4
index scans                   84        0        3.8          430          86.0
 index only                    0        0        0.0            0           0.0
 index full                   21        0        1.0          112          22.4
dynamic optimizer             10        0        0.3           34           6.8
 one abandoned                 0        0        0.0            1           0.2
 all abandoned                 0        0        0.0            0           0.0
records sorted                37        0        3.0          339          67.8
 quick-sorts                   0        0        0.0            3           0.6
 sort32 sorts                  0        0        0.0            4           0.8
  workfile write IO            0        0        0.0            0           0.0
  workfile read IO             0        0        0.0            0           0.0
temp file create              63        0        2.7          301          60.2
          delete              63        0        2.7          301          60.2
        truncate               0        0        0.0            0           0.0
      record put             246        0       11.3         1268         253.6
      record get             267        0       11.3         1268         253.6
 record position              63        0        2.7          301          60.2


第8章
Oracle Rdbリリース7.2.2.0で提供された拡張機能と変更

8.1 Oracle Rdbリリース7.2.2.0で提供された拡張機能と変更

8.1.1 実行可能イメージのサイズの縮小、CPU使用率の軽減、パフォーマンスの向上

このリリースのOracle Rdbでは、いくつかのパフォーマンスの拡張機能が実装されました。これらの変更は、ほとんどの場合、I64システムで実行するアプリケーションに固有のものか、あるいはI64システムに重大な影響を与えます。拡張機能は次のとおりです。

8.1.2 最適化レベルを制御するSET FLAGSの新しいキーワード

Oracle Bug#6389282

最適化レベルのTOTAL TIMEおよびFAST FIRSTは、次の方法で指定できます。

ただし、一部の動的SQL環境では、これらの方法によって影響を受けない問合せが生成されます。そのため、Oracle Rdbはこのような問合せをカバーできる新しいフラグをSET FLAGS(およびRDMS$SET_FLAGS論理名)に追加しました。

フラグOPTIMIZATION_LEVELを使用して、問合せのデフォルトの最適化レベルを変更できます。問合せがOPTIMIZE FOR句を明示的に使用するか、または前述の方法を使用してデフォルトを上書きする環境内で問合せがコンパイルされる場合、問合せの最適化に対する変更は行われません。問合せがデフォルトの最適化レベルを使用する場合、最適化はこのフラグで変更されます。

次の例は、動的オプティマイザを使用する問合せの動作の変更を示しています。

SQL> -- show with default behavior (FFirst tactic used)
SQL> select *
cont> from xtest
cont> where col2 between 999980 and 1000000
cont>   and col1 > 0
cont> ;
Tables:
  0 = XTEST
Leaf#01 FFirst 0:XTEST Card=10
  Bool: (0.COL2 >= 999980) AND (0.COL2 <= 1000000) AND (0.COL1 > 0)
  BgrNdx1 XTEST_IDX [1:0] Fan=17
    Keys: 0.COL1 > 0
0 rows selected
SQL>
SQL> -- use SET FLAGS
SQL> set flags 'optimization_level(total_time)';
SQL>
SQL> -- show that BgrOnly is used for TOTAL TIME
SQL> select *
cont> from xtest
cont> where col2 between 999980 and 1000000
cont>   and col1 > 0
cont> ;
Tables:
  0 = XTEST
Leaf#01 BgrOnly 0:XTEST Card=10
  Bool: (0.COL2 >= 999980) AND (0.COL2 <= 1000000) AND (0.COL1 > 0)
  BgrNdx1 XTEST_IDX [1:0] Fan=17
    Keys: 0.COL1 > 0
0 rows selected
SQL>

この機能は、Oracle Rdbリリース7.2.2で追加されました。

8.1.3 新しい修飾子/ABMS_ONLYは、RdbデータベースのABMページのみをダンプする

現在、RMU/DUMPコマンドを使用する場合、Oracle Rdbデータベースの領域ビット・マップ・ページは、統一記憶域または統一記憶域内の論理領域のその他のページと一緒にダンプできます。RMU/DUMPコマンドに新しい修飾子/ABMS_ONLYが追加されました。/ABMS_ONLYは、統一記憶域または統一記憶域内に含まれる論理領域のABMページのみをダンプします。既存の/START=n修飾子または/END=n修飾子(あるいはその両方)で指定した限定ページ範囲内のABMページをダンプできます。nはページ番号です。あるいは、限定ページ範囲を指定しない場合、統一記憶域内または統一記憶域に含まれる論理領域内のABMページをすべてダンプできます。

/ABMS_ONLY修飾子を無効にすることはできません。この修飾子は、デフォルトにはなりません。/ABMS_ONLYを指定しない場合、デフォルトでは、ABMページとともに記憶域と論理領域の他のデータベース・ページを引き続きダンプします。既存の/AREAS、/LAREAS、/ALL_LIVE、/ALL_LAREAの各修飾子を、RMU/DUMPのコマンドラインで/ABMS_ONLY修飾子とともに使用しない場合、/ALL_LIVEのデフォルトでは、すべての有効な統一記憶域内に含まれるABMページのみがダンプされます。ABMページのダンプの形式は変更されていません。ヘッダーは現在と同様に出力され、ダンプする有効な統一記憶域、または有効な統一記憶域内の論理領域の後に続く各論理領域内に含まれるABMページ(あるいはその両方)を特定します。データベース・ヘッダーのダンプが、現在と同様にダンプの開始時に含まれます。

指定したページ範囲内にABMページがない場合、記憶域が混合形式領域の場合、または論理領域が混合記憶域内に含まれる場合、ABMページが存在しないため、ダンプするABMページはありません。RMU/DUMP/HEADERコマンドを実行する場合、Rdbデータベースに定義された記憶域のエントリは、どの領域が統一形式であるか、どの領域が混合形式であるかを指定します。/ABMS_ONLY修飾子は、領域管理ページのみをダンプする既存の/SPAMS_ONLY修飾子と同じダンプ・コマンドで指定できません。/ABMS_ONLY修飾子は、SNAPSHOT領域をダンプする既存の/SNAPSHOTS修飾子と同じダンプ・コマンドで指定できません。

ABMページのみをダンプする構文は次のとおりです。

/ABMS_ONLY

次の例では、指定したRdbデータベースのすべての統一記憶域に含まれるABMページがすべてダンプされます。

$ rmu/dump/abms_only/out=dmp.out mf_personnel

次の例では、指定したRdbデータベースの指定の統一記憶域に含まれるABMページのみがダンプされます。

$ rmu/dump/abms_only/area=rdb$system mf_personnel

次の例では、指定したRdbデータベースの統一記憶域の指定の論理領域に含まれるABMページのみがダンプされます。

$ rmu/dump/abms_only/larea=rdb$relations mf_personnel

次の例では、指定したRdbデータベースの指定の統一記憶域の指定のページ範囲内に含まれるABMページのみがダンプされます。

rmu/dump/abms_only/area=rdb$system/start=1/end=5 mf_personnel

8.1.4 RMU/BACKUPのパフォーマンスの拡張機能

記憶域が異なるデバイスにある場合、RMU/BACKUPは、最初の入力デバイスのすべての記憶域の読取りを開始してから、次の入力デバイスに進んでいました。このため、各種デバイスのI/O負荷が均一ではなくなっていました。1つの入力デバイスの読取りI/Oがかなりアクティブに実行されている間は、その他の入力デバイスがアイドリング状態になっていました。

このリリースの拡張機能では、RMU/BACKUPは、記憶域のディスク・デバイスに基づいてラウンドロビン方式を使用することで、保存する記憶域をリーダー・スレッドに割り当てます。このディスク・デバイスに対して、比較的大きな記憶域が最初に選択されます。以前と同様に、各出力デバイス、保存セットまたはメディア・マネージャのストリームに移行するデータ量のバランスが均一になります。

$ RMU/BACKUP/LOG=FULL LDA100:[DB]MYTESTDB -
    $1$DGA20:[BACKUP]RBF1,$1$DGA40:[BACKUP]RBF2/DISK=WRITERS=2
%RMU-I-BCKTXT_01, Writer thread 1 writes $1$DGA20:[BACKUP]RBF1.RBF; containing:
    File LDA100:[DB]MYTESTDB.RDA;1    1404 blocks
    File LDA100:[DB]A0007.RDA;1       5388 blocks
    File LDA300:[DB]A0006.RDA;1       7758 blocks
    File LDA100:[DB]A0004.RDA;1       4490 blocks
    File LDA200:[DB]A0005.RDA;1       9310 blocks
    File LDA300:[DB]A0009.RDA;1       4490 blocks
    File LDA200:[DB]A0011.RDA;1       3742 blocks
    File LDA100:[DB]A0001.RDA;1       2599 blocks
    File LDA300:[DB]A0012.RDA;1       3742 blocks
%RMU-I-BCKTXT_01, Writer thread 2 writes $1$DGA40:[BACKUP]RBF2.RBF; containing:
    File LDA200:[DB]A0002.RDA;1      27802 blocks
    File LDA100:[DB]A0010.RDA;1       3742 blocks
    File LDA300:[DB]A0003.RDA;1       4490 blocks
    File LDA200:[DB]A0008.RDA;1       2166 blocks
%RMU-I-BCKTXT_00, Backed up root file LDA100:[DB]MYTESTDB.RDB;1
%RMU-I-RESUME, resuming operation on volume 2 using _$1$DGA40
%RMU-I-BCKTXT_02, Starting full backup of storage area (RDB$SYSTEM)
LDA100:[DB]MYTESTDB.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (RDB$SYSTEM)
LDA100:[DB]MYTESTDB.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0009)
LDA300:[DB]A0009.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0002)
LDA200:[DB]A0002.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0007)
LDA100:[DB]A0007.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0010)
LDA100:[DB]A0010.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0006)
LDA300:[DB]A0006.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0003)
LDA300:[DB]A0003.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0004)
LDA100:[DB]A0004.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0008)
LDA200:[DB]A0008.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0005)
LDA200:[DB]A0005.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0008)
LDA200:[DB]A0008.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0010)
LDA100:[DB]A0010.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0003)
LDA300:[DB]A0003.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0004)
LDA100:[DB]A0004.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0011)
LDA200:[DB]A0011.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0009)
LDA300:[DB]A0009.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0001)
LDA100:[DB]A0001.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0007)
LDA100:[DB]A0007.RDA;1
%RMU-I-BCKTXT_02, Starting full backup of storage area (A0012)
LDA300:[DB]A0012.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0001)
LDA100:[DB]A0001.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0002)
LDA200:[DB]A0002.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0006)
LDA300:[DB]A0006.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0011)
LDA200:[DB]A0011.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0005)
LDA200:[DB]A0005.RDA;1
%RMU-I-BCKTXT_12, Completed full backup of storage area (A0012)
LDA300:[DB]A0012.RDA;1
%RMU-I-COMPLETED, BACKUP operation completed

8.1.5 RMU/SET SERVERコマンドでの/NOOUTPUTの指定が可能

RMU /SET SERVER /OUTPUT=filespec servertypeコマンドを使用して、いくつかのデータベース・サーバー・プロセスに対してデフォルトの出力ファイルの仕様を指定できます。出力ファイルの仕様が空の場合、出力ファイルのエントリは無効です。現在、出力ファイルのエントリを無効にするには、空の出力ファイルの仕様を/OUTPUT修飾子で指定する以外に、RMU /SET SERVER /NOOUTPUT servertypeを指定する方法もあります。/NOOUTPUTはデフォルトであり、/OUTPUTが指定されない場合、出力ファイルのサーバー・ロギングのエントリは無効になることに注意してください。

そのため、/OUTPUT修飾子の構文は次のようになります。

[NO]OUTPUT[=filespec]

次の例は、出力ファイルのエントリをRMU/SET SERVERコマンドで無効にする方法を示しています。無効にするには、/NOOUTPUTを指定するか、空の出力ファイルの仕様で/OUTPUTを指定するか、または/NOOUTPUTがデフォルトなので/OUTPUTを指定しないようにします。

$ RMU /SET SERVER LRS /NOOUTPUT DUA0:[ZDB]ZDB.RDB
$ RMU /SET SERVER LRS /OUTPUT="" DUA0:[ZDB]ZDB.RDB
$ RMU /SET SERVER LRS DUA0:[ZDB]ZDB.RDB

8.1.6 新しい構成パラメータSQL_PROTOCOL_RETRY

Oracle Bug#6494061

以前のバージョンのOracle Rdbでは、現在のバージョンを使用してエラーが発生した場合、リモート接続のクライアント側は、デフォルトで古いバージョンのリモートRdbプロトコルを使用してリモート・サーバーとの通信を試みます。この再試行は、データベースのアタッチ、作成または削除が失敗する場合に発生していました。古いプロトコル・バージョンは、Rdb 5.1以下で使用されたものです。この再試行は、クライアントがかなり古いバージョンのリモート・サーバーと自動的に通信できるようにすることを目的としていました。

データベースのアタッチ、作成または削除の失敗がレポートされる場合、この再試行によって、ほとんどのユーザーは2倍の長さと2倍の量のリソースを消費するという影響を受けました。クライアントとサーバーのプロトコルの交換がかなり混乱するため、クライアントがLEF状態でハングすることもありました。たとえば、リモート・サーバーが実行していたノードでRdbモニターが稼働していなかった場合などに発生していました。

前述の問題を解決するために、古いプロトコルを使用する再試行が行われないようにデフォルトの動作が変更されました。ユーザーがRdb 5.1以下のバージョンのリモート・サーバーを使用してリモート・データベースに接続する必要がある場合、Rdbで古いプロトコルを使用して再試行するための新しい構成ファイル・パラメータが追加されました。この構成ファイル・パラメータの名前はSQL_PROTOCOL_RETRYで、RDB$CLIENT_DEFAULTS.DATファイルにあります。構成ファイルの情報の詳細は、Oracle Rdbのインストレーションおよび構成ガイドの第4章を参照してください。

たとえば、リモート・データベースを使用するクライアント・アプリケーションは、RDB$CLIENT_DEFAULTS.DATに次のエントリが含まれる場合、古いリモート・プロトコルを使用して再試行します。

SQL_PROTOCOL_RETRY TRUE

8.1.7 RMU /RESTOREでの統一形式の記憶域に対するページ・サイズの変更許可

Oracle Bug#705542

以前は、RMU/RESTOREコマンドは、混合形式の記憶域の場合のみ、ページ・サイズの増加を許可していました。

この制限は緩和されました。RMUリモート操作時に混合記憶域と統一記憶域のどちらの形式でも、ページ・サイズを増加できるようになりました。


第9章
Oracle Rdbリリース7.2.1.4で提供された拡張機能と変更

9.1 Oracle Rdbリリース7.2.1.4で提供された拡張機能と変更

9.1.1 RMU/SHOW STATISTICSの/STALL_LOGと/ALARM

Oracle Enhancement Bug#6331702

以前のリリースのOracle Rdbでは、RMU/SHOW STATISTICSの/STALL_LOG機能を使用すると、すべてのアクティブなストール・メッセージがサンプルの期間ごとにストール・ログ・ファイルに書き込まれていました。ほとんどのアクティブなストールが短期間にあるため、情報量が多すぎてしまいます。

この問題は、Oracle Rdbリリース7.2.1.4で修正されました。RMU/SHOW STATISTICSコマンドは、/OPTION修飾子に対して新しいLOG_STALL_ALARMキーワードを受け入れるようになりました。/STALL_LOGと/ALARMを使用する際にLOG_STALL_ALARMが存在する場合、/ALARMで指定した期間を超えるストールのみがストール・ログ出力ファイルに書き込まれます。

9.1.2 RMU/SHOW STATISTICSのストール・アラーム起動プロシージャのパラメータの追加

Oracle Enhancement Bug#6331702

ストール・アラーム起動コマンドに渡されるパラメータにパラメータP6が追加されました。P6パラメータには、書式設定されたストール・メッセージ文字列が含まれます。

起動コマンドに渡されるパラメータは次のとおりです。

表9-1 ストール・アラーム起動プロシージャのパラメータ
パラメータ 説明
P1 ルート・ファイルの仕様
P2 現在のデータ/時間
P3 プロセスID
P4 ストリームID
P5 アラームのしきい値の秒数
P6 書式設定されたストール・メッセージ

9.1.3 RMU /SHOW AIPの新しい修飾子/BRIEF

Oracle Enhancement Bug#3390639

RMU /SHOW AIPコマンドは、次の例に示すように、AIP情報を要約した表形式で表示する修飾子/BRIEFをサポートするようになりました。

$ RMU/SHOW AIP  DKA0:[DB]DB /PAREA=(4,5)/BRIEF
*----------------------------------------------------------------------------
* Logical Area Name             LArea PArea   Len Type
*----------------------------------------------------------------------------
RDB$SYSTEM_RECORD                  60     4   215 SYSTEM RECORD
RDB$SYSTEM_RECORD                  61     5   215 SYSTEM RECORD
EMPLOYEES_HASH                     79     4   215 HASH INDEX
EMPLOYEES                          82     4   121 TABLE
JOB_HISTORY_HASH                   85     4   215 HASH INDEX
JOB_HISTORY                        88     4    42 TABLE
DEPARTMENTS_INDEX                  89     5   430 SORTED INDEX
DEPARTMENTS                        90     5    55 TABLE

表示される列は次のとおりです。

9.1.4 RMU /SHOW AIPの新しい修飾子/PAREA

RMU /SHOW AIPコマンドは、指定した物理領域に保存される論理領域のAIP情報を表示する修飾子/PAREAをサポートするようになりました。

$ RMU/SHOW AIP DKA0:[DB]DB /BRIEF /PAREA=(4,5)
*----------------------------------------------------------------------------
* Logical Area Name             LArea PArea   Len Type
*----------------------------------------------------------------------------
RDB$SYSTEM_RECORD                  60     4   215 SYSTEM RECORD
RDB$SYSTEM_RECORD                  61     5   215 SYSTEM RECORD
EMPLOYEES_HASH                     79     4   215 HASH INDEX
EMPLOYEES                          82     4   121 TABLE
JOB_HISTORY_HASH                   85     4   215 HASH INDEX
JOB_HISTORY                        88     4    42 TABLE
DEPARTMENTS_INDEX                  89     5   430 SORTED INDEX
DEPARTMENTS                        90     5    55 TABLE

9.1.5 RMU DUMP EXPORTコマンドの新しいオプション

このリリースのOracle Rdbでは、RMU Dump ExportのOPTIONS修飾子に新しいキーワードが追加されています。OPTIONS修飾子を使用すると、このダンプ・コマンドからの出力を変更できます。

使用上の注意


第10章
ドキュメントの修正、追加および変更

この章では、ドキュメントの誤りと省略に関する修正について説明します。

10.1 ドキュメントの修正

10.1.1 SET OPTIMIZATION LEVEL文の例の修正

Oracle Bug#6350960

例1: 最適化レベルの設定

動的オプティマイザは、FAST FIRSTまたはTOTAL TIMEの方法を使用してアプリケーションに行を返すことができます。デフォルトの設定FAST FIRSTでは、アプリケーション(特に対話型SQLを使用するアプリケーション)が可能なかぎり早く行を確認して、場合によっては完了前に問合せを中断することを前提とします。そのため、FAST FIRSTの方法が可能な場合、オプティマイザはすべての検索時間を使って、最初に行を素早く返します。この選択は、OPTIMIZATION LEVELの設定によって影響を受けます。

次の例は、FAST FIRSTとTOTAL TIMEが有効な場合に選択される問合せのストラテジを対比したものです。データベースと問合せは、その要件によって変わります。問合せを調整して、どの設定がアプリケーション環境のニーズに最適かを確認する必要があります。MF_PERSONNELデータベースの場合、これらの方法に違いはほとんど(まったく)ありませんが、比較的大きな表の場合、違いが顕著になる可能性があります。

SQL> set flags 'STRATEGY,DETAIL';
SQL> --
SQL> -- No optimization level has been selected. The optimizer
SQL> -- selects the FAST FIRST (FFirst) retrieval tactic to
SQL> -- retrieve the rows from the EMPLOYEES table in the
SQL> -- following query:
SQL> --
SQL> select EMPLOYEE_ID, LAST_NAME
cont> from EMPLOYEES
cont> where EMPLOYEE_ID IN ('00167', '00168');
Tables:
  0 = EMPLOYEES
Leaf#01 FFirst 0:EMPLOYEES Card=100
  Bool: (0.EMPLOYEE_ID = '00167') OR (0.EMPLOYEE_ID = '00168')
  BgrNdx1 EMPLOYEES_HASH [(1:1)2] Fan=1
    Keys: r0: 0.EMPLOYEE_ID = '00168'
          r1: 0.EMPLOYEE_ID = '00167'
 EMPLOYEE_ID   LAST_NAME
 00167         Kilpatrick
 00168         Nash
2 rows selected
SQL> --
SQL> -- Use the SET OPTIMIZATION LEVEL statement to specify that
SQL> -- you want the TOTAL TIME (BgrOnly) retrieval strategy to
SQL> -- be used.
SQL> --
SQL> SET OPTIMIZATION LEVEL 'TOTAL TIME';
SQL> select EMPLOYEE_ID, LAST_NAME
cont> from EMPLOYEES
cont> where EMPLOYEE_ID IN ('00167', '00168');
Tables:
  0 = EMPLOYEES
Leaf#01 BgrOnly 0:EMPLOYEES Card=100
  Bool: (0.EMPLOYEE_ID = '00167') OR (0.EMPLOYEE_ID = '00168')
  BgrNdx1 EMPLOYEES_HASH [(1:1)2] Fan=1
    Keys: r0: 0.EMPLOYEE_ID = '00168'
          r1: 0.EMPLOYEE_ID = '00167'
 EMPLOYEE_ID   LAST_NAME
 00167         Kilpatrick
 00168         Nash
2 rows selected
SQL> --
SQL> -- When the SET OPTIMIZATION LEVEL 'DEFAULT' statement
SQL> -- is specified the session will revert to the default FAST FIRST
SQL> -- optimizer tactic.
SQL> --
SQL> SET OPTIMIZATION LEVEL 'DEFAULT';
SQL> select EMPLOYEE_ID, LAST_NAME
cont> from EMPLOYEES
cont> where EMPLOYEE_ID IN ('00167', '00168');
Tables:
  0 = EMPLOYEES
Leaf#01 FFirst 0:EMPLOYEES Card=100
  Bool: (0.EMPLOYEE_ID = '00167') OR (0.EMPLOYEE_ID = '00168')
  BgrNdx1 EMPLOYEES_HASH [(1:1)2] Fan=1
    Keys: r0: 0.EMPLOYEE_ID = '00168'
          r1: 0.EMPLOYEE_ID = '00167'
 EMPLOYEE_ID   LAST_NAME
 00167         Kilpatrick
 00168         Nash
2 rows selected
SQL>

10.1.2 RMU /VERIFYプロセスの割当てと制限の明確化

RMU/VERIFYコマンドを使用する場合、プロセスには最低でも次の割当てが必要です。

10.1.3 メモリーによる転送でオンライン・バックアップの実行が可能

Oracle RMU BACKUPコマンドの次の間違った制限事項は、『Oracle Rdb for OpenVMS Oracle RMUリファレンス・マニュアル』から削除されます。

以前のリリースの『Oracle Rdb for OpenVMS Oracle RMUリファレンス・マニュアル』では、RMU Backupオンライン・オプションの下に、「メモリーによる転送(ページ転送の最適化とも呼ばれる)が有効な場合は、オンラインのバックアップ・オプションを実行できない」と記載されています。(ページ転送の最適化の詳細は、『Oracle Rdb SQLリファレンス・マニュアル』のSQL ALTER DATABASE文の説明を参照してください。)この制限事項は現在当てはまらないため、『Oracle Rdb for OpenVMS Oracle RMUリファレンス・マニュアル』から削除される予定です。

Online Copy DatabaseコマンドとOnline Move Areaコマンドにも同じ制限事項がリストされています。この制限事項は現在これらのコマンドに当てはまらないため、『Oracle Rdb for OpenVMS Oracle RMUリファレンス・マニュアル』から削除される予定です。

10.1.4 CREATE STORAGE MAPの例の欠落

Oracle Bug#5655348

『Oracle Rdb SQLリファレンス・マニュアル』には、LIST記憶域マップの記憶域属性を示す例が記載されていませんでした。次の例は、Oracle Rdbリリース7.2の将来のバージョンの『Oracle Rdb SQLリファレンス・マニュアル』のCREATE STORAGE MAPに関する項に記載される予定です。


次の例は、LIST記憶域マップの記憶域属性の使用状況を示しています。記憶域属性は、記憶域名(表の記憶域マップと同様)の直後にします。

SQL> create database
cont>     filename 'DB$:MULTIMEDIA'
cont>
cont>     create storage area PHOTO_AREA1
cont>         filename 'DB$:PHOTO_AREA1'
cont>         page format UNIFORM
cont>
cont>     create storage area PHOTO_AREA2
cont>         filename 'DB$:PHOTO_AREA2'
cont>         page format UNIFORM
cont>
cont>     create storage area TEXT_AREA
cont>         filename 'DB$:TEXT_AREA'
cont>         page format UNIFORM
cont>
cont>     create storage area AUDIO_AREA
cont>         filename 'DB$:AUDIO_AREA'
cont>         page format UNIFORM
cont>
cont>     create storage area DATA_AREA
cont>         filename 'DB$:DATA_AREA'
cont>         page format UNIFORM
cont> ;
SQL>
SQL> create table EMPLOYEES
cont>     (name       char(30),
cont>      dob        date,
cont>      ident      integer,
cont>      photograph list of byte varying (4096) as binary,
cont>      resume     list of byte varying (132) as text,
cont>      review     list of byte varying (80) as text,
cont>      voiceprint list of byte varying (4096) as binary
cont>     );
SQL>
SQL> create storage map EMPLOYEES_MAP
cont>     for EMPLOYEES
cont>     enable compression
cont>     store in DATA_AREA;f
SQL>
SQL> create storage map LISTS_MAP
cont>     store lists
cont>         in AUDIO_AREA
cont>                 (thresholds are (89, 99, 100)
cont>                 ,comment is 'The voice clips'
cont>                 ,partition AUDIO_STUFF)
cont>             for (employees.voiceprint)
cont>         in TEXT_AREA
cont>                 (thresholds is (99)
cont>                 ,partition TEXT_DOCUMENTS)
cont>             for (employees.resume, employees.review)
cont>         in (PHOTO_AREA1
cont>                 (comment is 'Happy Smiling Faces?'
cont>                 ,threshold is (99)
cont>                 ,partition PHOTOGRAPHIC_IMAGES_1)
cont>             ,PHOTO_AREA2
cont>                 (comment is 'Happy Smiling Faces?'
cont>                 ,threshold is (99)
cont>                 ,partition PHOTOGRAPHIC_IMAGES_2)
cont>             )
cont>             for (employees.photograph)
cont>             fill randomly
cont>         in RDB$SYSTEM
cont>                 (partition SYSTEM_LARGE_OBJECTS);
SQL>
SQL> show storage map LISTS_MAP;
     LISTS_MAP
 For Lists
 Store clause:          STORE lists
        in AUDIO_AREA
                (thresholds are (89, 99, 100)
                ,comment is 'The voice clips'
                ,partition AUDIO_STUFF)
            for (employees.voiceprint)
        in TEXT_AREA
                (thresholds is (99)
                ,partition TEXT_DOCUMENTS)
            for (employees.resume, employees.review)
        in (PHOTO_AREA1
                (comment is 'Happy Smiling Faces?'
                ,threshold is (99)
                ,partition PHOTOGRAPHIC_IMAGES_1)
            ,PHOTO_AREA2
                (comment is 'Happy Smiling Faces?'
                ,threshold is (99)
                ,partition PHOTOGRAPHIC_IMAGES_2)
            )
            for (employees.photograph)
            fill randomly
        in RDB$SYSTEM
                (partition SYSTEM_LARGE_OBJECTS)

 Partition information for lists map:
 Vertical Partition: VRP_P000
  Partition: (1) AUDIO_STUFF
    Fill Randomly
   Storage Area: AUDIO_AREA
         Thresholds are (89, 99, 100)
 Comment:       The voice clips
  Partition: (2) TEXT_DOCUMENTS
    Fill Randomly
   Storage Area: TEXT_AREA
         Thresholds are (99, 100, 100)
  Partition: (3) PHOTOGRAPHIC_IMAGES_1
    Fill Randomly
   Storage Area: PHOTO_AREA1
         Thresholds are (99, 100, 100)
 Comment:       Happy Smiling Faces?
  Partition: (3) PHOTOGRAPHIC_IMAGES_2
   Storage Area: PHOTO_AREA2
         Thresholds are (99, 100, 100)
 Comment:       Happy Smiling Faces?
  Partition: (4) SYSTEM_LARGE_OBJECTS
    Fill Randomly
   Storage Area: RDB$SYSTEM
SQL>
SQL> commit;

10.1.5 RDM$BIND_MAX_DBR_COUNTのドキュメントの明確化

Oracle Bug#1495227および3916606

『Oracle Rdb7データベース・パフォーマンスおよびチューニングのためのガイド』のA-17ページでは、RDM$BIND_MAX_DBR_COUNT論理の使用について誤って説明されています。

更新版の説明を次に示します。既存のドキュメントとソフトウェア間での実際の動作の違いは、論理名が各データベースのノード障害のリカバリ時(つまり、システムまたはモニターのクラッシュ、あるいはその他の異常終了の後)に同時に作成されたデータベース・リカバリ・プロセスの数のみを制御する点です。

データベース全体が異常終了する場合は(たとえばシステム障害などが原因)、ノード障害リカバリ・モードでデータベースをリカバリする必要があります。このリカバリは、データベースを別のノードで開く場合に別のノードで実行されるか、または次にデータベースを開くときに実行されます。

RDM$BIND_MAX_DBR_COUNT論理名とRDB_BIND_MAX_DBR_COUNT構成パラメータは、ノード障害のリカバリ時に各データベースのデータベース・モニターで同時に起動されるデータベース・リカバリ(DBR)プロセスの最大数を定義します。

この論理名と構成パラメータは、グローバルなバッファが有効ではないデータベースのみに適用されます。グローバルなバッファを使用するデータベースでは、ノード障害のリカバリ時に一度に1つのリカバリ・プロセスのみを開始します。

行キャッシュ機能が有効なノード障害のリカバリ(グローバル・バッファの状態には関係ない)では、データベース・モニターは1つのデータベース・リカバリ(DBR)プロセスを開始して、データベースの最も古いアクティブなチェックポイントからRow Cache Server(RCS)プロセスとすべてのユーザー・プロセスをリカバリします。


データベースごとの値

RDM$BIND_MAX_DBR_COUNT論理名は、各データベースに対して同時に実行するデータベース・リカバリ・プロセスの最大数を指定します。たとえば、リカバリするデータベースが10あり、RDM$BIND_MAX_DBR_COUNT論理名の値が8の場合、最大で80のデータベース・リカバリ・プロセスがノード障害後にモニターで開始されます。

RDM$BIND_MAX_DBR_COUNT論理名は、モニター・プロセスがデータベースを開くと変換されます。論理の新しい値を有効にするには、データベースを閉じて再度開く必要があります。

10.1.6 データベース・サーバー・プロセスの優先順位の明確化

デフォルトでは、Rdbモニターで作成されたデータベース・サーバー(ABS、ALS、DBR、LCS、LRS、RCS)は、VMSプロセスのスケジュールに基づく優先順位をRdbモニター・プロセスから継承します。Rdbモニター・プロセスのデフォルトの優先順位は15です。

各サーバーの優先順位は、表10-1に示すようにシステム全体の論理名によって明示的に制御できます。

表10-1 サーバー・プロセスの優先順位の論理名
論理名 使用する優先順位
RDM$BIND_ABS_PRIORITY ABSサーバー・プロセスの基本優先順位
RDM$BIND_ALS_PRIORITY ALSサーバー・プロセスの基本優先順位
RDM$BIND_DBR_PRIORITY DBRサーバー・プロセスの基本優先順位
RDM$BIND_LCS_PRIORITY LCSサーバー・プロセスの基本優先順位
RDM$BIND_LRS_PRIORITY LRSサーバー・プロセスの基本優先順位
RDM$BIND_RCS_PRIORITY RCSサーバー・プロセスの基本優先順位

ホット・スタンバイ機能をインストールする場合、アカウントの優先順位を15に指定するとRDMAIJSERVERアカウントが作成されます。システム上のAIJサーバー・プロセスの優先順位は、システム全体の論理名RDM$BIND_AIJSRV_PRIORITYで制限できます。この論理名を15よりも少ない値に定義する場合、AIJサーバー・プロセスの開始時に指定された値にその基本優先順位を調整します。RDM$BIND_AIJSRV_PRIORITYには値0〜31を使用できますが、プロセスの優先順位はRDMAIJSERVERアカウントの値よりも上にすることはできません。

ほとんどのアプリケーションとシステムの場合、サーバー・プロセスの優先順位を変更することはお薦めしません。

10.1.7 複数バージョンのSQL環境におけるSQL$INTの説明とSQL$INTの再定義方法

Oracle Bug#2500594

複数のバージョンのOracle Rdb(たとえばRdbリリース7.0とRdbリリース7.1など)を実行する環境では、SQL$70.EXEやSQL$71.EXEなどの改良されたSQLイメージがあります。ただし、SQL$INT.EXEは改良されていませんが、正しいSQLランタイム環境をアクティブ化する論理名RDMS$VERSION_VARIANTの変換を使用するディスパッチャとして機能します。このイメージは、比較的高いバージョンのOracle Rdbをインストールする場合に置き換えられます。そのため、前述の例を使用すると、Rdbリリース7.1をインストールする場合、SQL$INT.EXEはリリース7.1のSQL$INT.EXEに置き換えられます。

アプリケーションが、この環境(リリース7.1のSQL$INTを使用)と、Oracle Rdbリリース7.0の複数バージョンのみを実行するシステムにデプロイされた対応する実行可能ファイルでリンクされる場合、このアプリケーションを実行すると、次のエラーが発生することがあります。


%IMGACT-F-SYMVECMIS, shareable image's symbol vector table mismatch

このような問題を回避するには、次の代替方法が提供されます。

Oracle Rdbリリース7.0とOracle Rdbリリース7.1の両方を実行する複数バージョンの環境では、コマンド・プロシージャRDB$SETVER.COM 70とRDB$SETVER RESETを実行することでOracle Rdbリリース7.0の複数バージョンを実行します。これは、Oracle Rdbリリース7.0の環境の構築に必要な論理名と記号を設定します。

次に例を示します。

$ @SYS$LIBRARY:RDB$SETVER 70

Current PROCESS Oracle Rdb environment is version V7.0-63 (MULTIVERSION)
Current PROCESS SQL environment is version V7.0-63 (MULTIVERSION)
Current PROCESS Rdb/Dispatch environment is version V7.0-63 (MULTIVERSION)

$ @SYS$LIBRARY:RDB$SERVER RESET

SQLを実行して、バージョンが正しいことを確認します。

$ sql$
SQL> show version
Current version of SQL is: Oracle Rdb SQL V7.0-63

改良されたSQL$SHR.EXEを指し示すようにSQL$INTを定義します。次に、この新しく定義されたSQL$INTとリンクするリンカーを指示するオプション・ファイルを作成します。次に例を示します。

$ DEFINE SQL$INT SYS$SHARE:SQL$SHR'RDMS$VERSION_VARIANT'.EXE
$ LINK TEST_APPL,SQL$USER/LIB,SYS$INPUT/option
SQL$INT/SHARE
^Z

これでOracle Rdbリリース7.0の複数バージョンの環境に実行可能ファイルをデプロイする準備ができました。この実行可能ファイルは正常に実行されます。

Oracle Rdbの各リリースでは、SQL$INT共有可能イメージに新しいエントリ・ポイントが追加されていることに注意してください。この新しいエントリ・ポイントにより、新機能の実装が可能です。そのため、Oracle Rdbリリース7.1のSQL$INTとリンクするアプリケーションは、Oracle Rdbリリース7.0のみをインストールするシステムで実行できません。これは、共有可能イメージに十分なエントリ・ポイントが含まれていないためです。

ここで示す回避策を使用すると、アプリケーションはそのイメージのOracle Rdbリリース7.0と明示的にリンクできます。このようなアプリケーションには上位互換性があり、Oracle Rdbリリース7.0とOracle Rdbリリース7.1で実行されます。アプリケーションは最も低いバージョンでコンパイルしてリンクされます。

Oracle Rdbリリース7.1がインストールされている環境では、SQL$INTイメージが該当するSQL$SHRxxイメージを予定どおりに動的にアクティブ化するため、この回避策は必要ありません。

10.1.8 PREPARE文の動作の明確化

Oracle Bug#2581863

『Oracle Rdb SQLリファレンス・マニュアル』には、PREPAREのstatement-idパラメータを使用する際、「そのパラメータが整数の場合、PREPARE文を実行する前に、その整数を明示的にゼロに初期化する必要がある」と記載されています。

この説明は正しくありません。次の情報に書き換える必要があります。

  1. statement-idがゼロ以外で、どのPREPARE文とも一致しない場合(idが古い、またはidにランダムな値が含まれる)、準備ができていない文に対してエラー「%SQL-F-BADPREPARE, Cannot use DESCRIBE or EXECUTE」が発生します。
  2. statement-idがゼロ以外の場合、または文の名前が以前に使用されたもので、既存のPREPARE文と一致する場合、その文は新しい文を準備する前に自動的に解放されます。詳細はRELEASE文を参照してください。
  3. statement-idがゼロであるか、または自動的に解放された場合、新しいstatement-idが割り当てられ、文が準備されます。

statement-id-parameterではなくstatement-nameを使用する場合、SQLはアプリケーションで使用するためにidを暗黙的に宣言します。そのため、statement-nameを使用する場合、記述されたセマンティクスが同様に適用されます。詳細はRELEASE文を参照してください。

10.1.9 RDM$BIND_LOCK_TIMEOUT_INTERVALがデータベース・パラメータを上書きする

Oracle Bug#2203700

トランザクションを開始する場合、そのトランザクションのロック・タイムアウト時間の決定に使用する3つの異なる値があります。値は次のとおりです。

  1. SET TRANSACTION文に指定する値
  2. CREATEまたはALTER DATABASEに指定する、データベースに保存する値
  3. 論理名RDM$BIND_LOCK_TIMEOUT_INTERVALの値

トランザクションのタイムアウト時間は、SET TRANSACTION文で指定する値やCREATE DATABASEで指定する値よりも小さくなります。ただし、論理名RDM$BIND_LOCK_TIMEOUT_INTERVALを定義する場合、この論理名の値はCREATE DATABASEに指定した値を上書きします。

これら3つの値の相互関係については、Rdbドキュメント・セットのいくつかの異なる箇所で説明されていますが、この説明には誤りがあるため、前述の説明で書き換えられる予定です。

データベースのロック・タイムアウト値は、RMU/SHOW STATISTICSのロック・ダッシュボードから動的に変更できます。プロセスごとのロック・ダッシュボードを使用して、1つ以上のプロセスに対して論理名RDM$BIND_LOCK_TIMEOUT_INTERVALを動的に上書きできます。

10.2 オンライン・ドキュメントの形式とオーダー情報

ドキュメントは、Acrobat Readerを使用するAdobe Acrobat形式で表示できます。Acrobat Readerを使用すると、Adobe Portable Document Format(PDF)のドキュメントを表示、ナビゲート、印刷できます。Acrobat Readerの無料コピーの入手やサポートされるプラットフォームの詳細は、http://www.adobe.comを参照してください。

Adobe Acrobat形式のOracle Rdbドキュメントは次のMetaLinkで入手できます。

Top Tech Docs\Oracle Rdb\Documentation\<bookname>

印刷されたドキュメントを購入するには、Oracleの担当者に連絡してください。


第11章
既知の問題と制限事項

この章では、Oracle Rdbに関連する問題と制限事項について説明し、該当する回避策を示します。

11.1 すべてのインタフェースにおける既知の問題と制限事項

この項では、すべてのインタフェースに影響する既知の問題と制限事項について説明します。これは完全なリストではありません。Oracleバグのデータベースをチェックして、オープンしているすべてのRdbバグとその現在のステータスのリストを確認してください。

11.1.1 RCSの予期しない終了

Rdbリリース7.2.2の内部テストでは、Record Cache Server(RCS)が制御できずに終了する場合、特定の状況でデータベースまたはアフター・イメージ・ジャーナル・ファイル(あるいはその両方)が破損する問題が見つかりました。

RCSが終了すると、データベースは停止し、次のようなメッセージがモニター・ログに書き込まれます。

6-DEC-2007 15:04:17.02 - Received Record Cache Server image termination from
22ED5144:1
  - database name "device:[directory]database.RDB;1" [device] (1200,487,0)
  - abnormal Record Cache Server termination detected
  - starting delete-process shutdown of database:
    - %RDMS-F-RCSABORTED, record cache server process terminated abnormally
  - sending process deletion to process 22ED10F9
  - sending process deletion to process 22ECED59
  - sending process deletion to process 22EC0158
  - sending process deletion to process 22EB9543 (AIJ Log server)
  - database shutdown waiting for active users to terminate

この問題が発生した場合、データベース・バックアップのリストアの後にAIJをロールフォワードしようとする試みは失敗し、バグチェックのダンプが発生します。

現在わかっている、この問題が発生する唯一の状況は、論理名RDM$BIND_RCS_VALIDATE_SECSがある値に定義され、同時に論理名RDM$BIND_RCS_LOG_FILEが未定義であるか、または誤って定義されている場合です。

この問題を防ぐには、ユーザーが行キャッシュ機能を使用する場合、論理名RDM$BIND_RCS_VALIDATE_SECSを定義しないようにするか、またはなんらかの理由でこの論理名を定義する必要がある場合はRDM$BIND_RCS_LOG_FILEが正しく定義されているかどうか(/SYSTEM修飾子と/EXECUTIVE修飾子で定義され、十分な空き領域のある、クラスタからアクセス可能なデバイスの既存のディレクトリにある有効なファイル名を指し示しているかどうか)を確認することをお薦めします。

この推奨事項はすべてのバージョンのOracle Rdbに適用されます。

11.1.2 I64で降順のパーティション索引を使用する場合の不正な結果

Rdbリリース7.2を使用してI64システムで実行する場合、降順のパーティション索引を使用する際に、一部の問合せが不正な結果を返すことがあります。Alphaシステムは、この問題による影響を受けません。

次の例は、降順のパーティション索引を使用する場合のAlphaとI64の動作の違いを示しています。

SQL> CREATE DATABASE FILE FOO
cont>        CREATE STORAGE AREA FOOA
cont>        CREATE STORAGE AREA FOOB;
SQL>
SQL> CREATE TABLE MESA (ID INTEGER, M4 CHAR (1), M5 INTEGER);
SQL> CREATE TABLE RASA (ID INTEGER, R4 CHAR (1), R5 INTEGER);
SQL>
SQL> INSERT INTO MESA (ID, M4, M5) VALUES  (1, 'M', 1 );
1 row inserted
SQL> INSERT INTO RASA (ID, R4, R5) VALUES  (1, 'M', 1 );
1 row inserted
SQL>
SQL> CREATE INDEX X4 ON MESA (ID ASC , M4 DESC)
cont>        STORE USING (ID, M4)
cont>        IN FOOA WITH LIMIT OF (1, 'G')
cont>        OTHERWISE IN FOOB ;
SQL>
SQL> CREATE INDEX Y4 ON RASA (ID ASC , R4 DESC)
cont>        STORE USING (ID, R4)
cont>        IN FOOA WITH LIMIT OF (1, 'G' )
cont>        OTHERWISE IN FOOB ;
SQL>
SQL> COMMIT;

    ! This query correctly returns 1 row
    ! on Alpha but returns 0 rows on I64:

SQL> SELECT M.ID, M.M4, R.R4 FROM
cont> MESA M INNER JOIN RASA R ON (M.ID = R.ID);
0 rows selected
SQL>

この問題は、Oracle RdbがI64で実行される場合の降順キーの値の構成と比較に関連します。この問題は、Rdb72の将来のリリースで修正される予定です。

11.1.3 RMU再起動プロンプトに対するレスポンスQUITでループが発生する

Oracle Bug#6001187

Itaniumでは、再起動プロンプトに対してQUITで応答すると、RMUコマンドがバグチェックの作成をループします。

この問題はAlphaでは発生しません。Itaniumに関する将来のリリースで修正される予定です。

11.1.4 実在する論理名の処理の変更

このリリースのOracle Rdbでは、Rdb環境の調整に使用する、実在する論理名の処理が変更されます。過去のバージョンでは、これらの実在する論理名をどの値に定義しても有効でした。Rdbドキュメントでは、ほとんどの場合、その値に値1またはYESを使用するように説明されており、今回の変更はこのドキュメントとの上位互換性があります。

Rdbは、これらの論理名(次のリストを参照)をブール型論理として扱い、TRUEを意味するY、y、T、tまたは1で開始する文字列を受け入れます。その他の値はすべてFALSEとみなされます。この変更により、以前は不可能だった、プロセス・レベルの定義で高度な論理名の表の定義を上書きできます。

次の論理名を定義するすべてのプロシージャを確認して、その値がこれらのルールに確実に適合するようにします。これは、予想外の動作の変更を防止するために、Oracle Rdbリリース7.2.1.1以上にアップグレードする前に行います。

11.1.5 VMSバージョン8.3と専用CPUロック・マネージャの使用時に必要なパッチ

OpenVMSバージョン8.3システムでのOracle Rdbリリース7.2.1の機能テスト中に、拡張ロック値ブロックおよびOpenVMS専用CPUロック・マネージャ機能の使用に関する問題が検出されました。

この問題を防ぐために、ユーザーがOracle RdbとOpenVMS専用CPUロック・マネージャ機能をOpenVMSバージョン8.3で使用する場合、OpenVMSバージョン8.3システムでOracle Rdbリリース7.2.1を使用する前に、次のアーキテクチャに固有のいずれかのパッチ・キット(かわっている場合は後続のキット)をインストールすることを強くお薦めします。

11.1.6 SQLモジュールまたはプログラムが失敗し、%SQL-F-IGNCASE_BADが発生する

Oracle Bug#2351258

Rdb 6.1以前で構築されたSQLモジュールまたはコンパイル済SQLプログラムは、そのプログラムが問合せのパラメータに対するある種の文字列操作を含む問合せを発行する場合にRdb 7.2で実行すると失敗することがあります。たとえば、SQL文のWHERE句のLIKE演算子では、SQLが文字または文字列に一致するワイルドカード文字を検索する必要があります。また、IGNORE CASEを使用すると、使用するキャラクタ・セットの大文字と小文字がSQLで同じになってしまうという例もあります。

次の例は、PERSONNELデータベースに問合せを行うSQLモジュール言語プログラムの一部を示しています。

DECLARE MANL_NAME_LIST CURSOR FOR
 SELECT DISTINCT E.LAST_NAME,E.FIRST_NAME,J.JOB_CODE,J.DEPARTMENT_CODE,E.CITY
FROM   DB1_HANDLE.EMPLOYEES E,DB1_HANDLE.JOB_HISTORY J
 WHERE J.EMPLOYEE_ID = E.EMPLOYEE_ID
   AND E.STATUS_CODE = STATUS_CODE
   AND E.CITY LIKE CITYKEY IGNORE CASE
   ORDER BY E.EMPLOYEE_ID DESC, E.LAST_NAME DESC

PROCEDURE SQL_OPN_NAME_LIST
SQLCODE
CITYKEY       CHAR(20)
STATUS_CODE   CHAR(1);
OPEN MANL_NAME_LIST;

前述のコードを含むSQLモジュールがコンパイルされて、7.0より前のバージョンのRdbを使用する実行プログラムにリンクされる場合、このモジュールは該当バージョンに対して適切に実行されます。ただし、同じプログラムがRdb 7.2の環境で実行される場合、SQL_OPN_NAME_LISTプロシージャのコールは、SQLCODE -1を返します。RDB$MESSAGE_VECTORには、次のメッセージに関連するコードが含まれます。

%SQL-F-IGNCASE_BAD, IGNORE CASE not supported for character set

この問題を回避するには、リリース7.2のSQL$INT.EXEまたはSQL$USER.OLB(あるいはその両方)を使用するプログラムを再リンクします。

11.1.7 PTHREAD$RTLにリンクされる外部ルーチンのイメージ

『OpenVMS Guide to the POSIX Threads Library』には、コア・ランタイム・ライブラリの共有可能イメージPTHREAD$RTLを動的にアクティブ化することはサポートされていないと記載されています。Oracleのテストでは、PTHREAD$RTLにリンクされる外部ルーチンとして使用するために提供される共有可能イメージによって、OpenVMS I64システムの動的なイメージをアクティブ化する間にハングする可能性があることがわかりました。この問題はOpenVMS Alphaシステムでは検出されていません。

Rdb外部ルーチンに使用される共有可能イメージがPTHREAD$RTLとリンクされる状況でこの問題を回避するには、主なプログラムのイメージを同様にPTHREAD$RTLとリンクする必要があります。この要件は、ユーザーが構築したアプリケーションの主なプログラムと主な対話型SQLイメージにも適用されます。

OCI Services for Oracle Rdb(SQL/Servicesの一部)で提供された共有可能イメージRDB$NATCONN_FUNC72.EXEは、PTHREAD$RTLとリンクする共有可能イメージの1つです。RDB$NATCONN_FUNC72.EXEイメージから外部ルーチンを使用するユーザー構築プログラムでは、主なイメージがPTHREAD$RTLとリンクしているかどうかを確認する必要があります。ユーザーがコールして、RDB$NATCONN_FUNC72.EXEから関数を使用する外部ルーチンは次のとおりです。

OpenVMSのコマンドANALYZE/IMAGEを使用して、イメージがPTHREAD$RTLに依存するかどうかを判断します。詳細は、OpenVMSのドキュメントを参照してください。

11.1.8 SQLプロシージャの外部の場所は大文字にする

Oracle Bug#4722422

外部ルーチンを使用する場合、同じ共有可能イメージの宣言はすべて、そのイメージ・ファイルの仕様と完全に同じ文字列を使用することが重要です。同じ文字列のコンテンツを使用しないと、イメージの複数のコピーがアクティブ化されるか、または外部ルーチンが正しくコールされません。

ALTER FUNCTION ... LOCATIONコマンドを使用して、関数のドロップや再作成は行わずに、既存の関数の場所の文字列を変更できます。

次の例は、EXTERNAL LOCATION仕様の同じ文字列を示しています。

create procedure sys$asctim(
    out :timlen smallint by reference,
    out :timbuf char(23) by descriptor,
    in  :timadr date vms by reference,
    in  :cvtflag integer by value);
    external location 'SYS$SHARE:SYS$PUBLIC_VECTORS.EXE'
    language general general parameter style;

create procedure sys$gettim(
    in  :timadr date vms by reference);
    external location 'SYS$SHARE:SYS$PUBLIC_VECTORS.EXE'
    language general general parameter style;

11.1.9 リリース7.0より前のデータベースの使用

Oracle Rdbリリース7.0の形式よりも前のデータベースは、Oracle Rdbリリース7.2の形式に直接変換またはリストアすることはできません。Oracle Rdbリリース7.2のRMU Convertコマンドは、Oracle Rdbリリース7.0およびリリース7.1形式のデータベースからの変換のみをサポートします。Oracle Rdbリリース3.0からリリース6.1の形式のデータベースを使用している場合、最低でもOracle Rdbリリース7.0の形式に変換してから、Oracle Rdbリリース7.2の形式に変換する必要があります。たとえば、Oracle Rdbリリース4.2の形式のデータベースを使用している場合、まず最低でもOracle Rdbリリース7.0の形式に変換してから、Oracle Rdbリリース7.2の形式に変換する必要があります。

Oracle Rdbリリース7.0の形式よりも前のデータベースをOracle Rdbリリース7.2の形式に直接変換またはリストアしようとすると、Oracle RMUでエラーが生成されます。

11.1.10 降順列で照合順序が指定されたパーティション索引

Oracle Bug#2797443

問合せが不正な結果を返すという既知の問題があります(返される行数が正しくありません)。この問題は、複数の列があり、いずれかの列が降順でソートされてその列に照合順序が関連付けられているパーティション索引がある表で発生することがあります。

次の例を使用して、問題を示すことができます。

$ sql$
create database file mf_collating.rdb alloc 10
  collating sequence french french
  create storage area area1 alloc 10
  create storage area area2 alloc 10
  create storage area area3 alloc 10;
create table tab1 (id tinyint, r3 char (3));
insert into tab1 (id, r3) values (1, 'a');
insert into tab1 (id, r3) values (1, 'b');
insert into tab1 (id, r3) values (1, 'f');
create index y3 on tab1 (id asc, r3 desc)
       store using (id, r3)
       in area1 with limit of (1, 'k')
       in area2 with limit of (1, 'e')
       otherwise in area3 ;
commit;

set flags 'strategy';

! Here is a query that returns the correct rows using sequential rather
! than indexed access.

select id, r3 from tab1 where id = 1 and r3 <= 'e'
  optimize for sequential access;
Conjunct        Get     Retrieval sequentially of relation TAB1
   ID   R3
    1   a
    1   b
2 rows selected

! Here is the same query without the sequential access restriction.
! Note in the query strategy that index Y3 is used for data retrieval.
! This query ought to (but does not) return the same set of rows as
! for the sequential access query.

select id, r3 from tab1 where id = 1 and r3 <= 'e';
Leaf#01 FFirst TAB1 Card=3
  BgrNdx1 Y3 [2:1] Fan=16
0 rows selected

11.1.11 分散トランザクションのドメイン修飾TCP/IPノード名

Oracle Bug#3735144

Oracle Rdbリモート接続にTCP/IPを使用する場合、同じサブネットではないノードのデータベースを含む分散トランザクションが機能しないことがあります。

リモートのRdbは、DECnetではなくTCP/IPを介してリモート接続を可能にします。(この設定方法については、Oracle Rdb OpenVMSのインストレーションおよび構成ガイドを参照してください。)ただし、TCP/IPを介して接続されたリモート・データベースを含む分散トランザクションには問題がありました。これは、Rdbが分散トランザクション・サポートのOpenVMS DECdtmに依存し、DECdtmではオフノード通信にDECnetが必要であるためです。(これはRdbの制限事項ではなくOpenVMSの制限事項です。詳細は、Hewlett-Packard社のOpenVMSサポートに連絡してください。)

TCP/IPネットワークが通信の重要な要素として使用される環境で、DECnet(DECdtmなど)を必要とするOpenVMSサービスが機能するように、OpenVMSにはTCP/IPを介してDECnetを実行する機能があります。この機能を使用すると、DECdtm(およびRdb)はTCP/IPで分散トランザクションを管理できます。(この機能の構成と使用の方法については、HP社のOpenVMS DECnet-Plusのドキュメント・セットを参照してください。)

ただし、リモート・データベースに関連するトランザクションの場合、RdbはDECdtmにのみリモート・ノードのSCSNODE名を提供します。たとえば、次のSQLがTCP/IPを使用して2つのリモート・データベースにアタッチする状況について考えます。

SQL> attach 'alias db1 filename node1.a.b.c::db_root:db1 user ''me'' using
''pw''';
SQL> attach 'alias db2 filename node1.a.b.c::db_root:db2 user ''me'' using
''pw''';

前述の例では、RdbはTCP/IPアドレスnode1.a.b.c.を使用して両方のリモート・データベースに正常に接続できますが、複数のデータベースをアタッチする場合、RdbはDECdtmを介して分散トランザクションを暗黙的に使用します。Rdbは接続の相手側のRDBSERVERnnから取得したSCSNODE名のみをDECdtmに渡すため、通常、DECdtmにはリモート参照を解決するために必要な情報はありません。SCSNODE名とTCP/IPノード名が同じでローカル・ノードが同じサブネット(例では.a.b.c)上にある場合、このようにするしかありません。それ以外の場合は、2番目のアタッチの後に、トランザクションを開始するとすぐに次のエラー・メッセージが発生します。

SQL> set trans read write;
%RDB-F-SYS_REQUEST_CAL, error from system services request - called from 100001
-RDB-E-DECDTMERR, DECdtm system service call error
-IPC-E-BCKTRNSFAIL, failure on the back translate address request

3つの考えられる回避策があります。

11.1.12 I64のILINK-E-INVOVRINIエラー

複数のモジュールを使用するアプリケーションをリンクする場合、次のエラー・メッセージが返されることがあります。

%ILINK-E-INVOVRINI, incompatible multiple initializations for overlaid section
        section: VMSRDB
        module: M1
        file: DKA0:[BLD]M1.OBJ;1
        module: M2
        file: DKA0:[BLD]SYS.OLB;1

I64システムでは、後で初期化されるプログラム・セクションで、初期化のゼロ以外の部分が一致しないことは許可されません。リンカーがこのような初期化を許可するOpenVMS AlphaシステムやVAXシステムとは異なります。

指定したモジュールがSQLモジュール言語または生成されたプリコンパイラの場合、アプリケーションで構築されたプロシージャは通常変更する必要があります。一般的には、データベースを初期化するソリューションは、いずれかのモジュールのみで処理します。SQLMODコマンドライン修飾子/NOINITIALIZE_HANDLESおよび/INITIALIZE_HANDLESは、エイリアス定義がエイリアス参照に強要されるかどうかを指定するために使用されます。

11.1.13 以前のバージョンとの互換性がない、RMU/LOADで保存される新しい属性

Oracle Bug#2676851

Oracle Rdbリリース7.1.2では、ビューをアンロードする動作を改善するために、ビュー列のアンロード方法が変更されました。これにより、ビューの計算列COMPUTED BY列およびAUTOMATIC列の属性が保存されるようになりました。これらの新しい属性は、以前のリリースのOracle Rdbでは受け入れられません。

次の例は、リリース7.1.0.4でリリース7.1.2のファイルをロードしようするとレポートされるエラーを示しています。

%RMU-F-NOTUNLFIL, Input file was not created by RMU UNLOAD
%RMU-I-DATRECSTO,   0 data records stored.
%RMU-F-FTL_LOAD, Fatal error for LOAD operation at 21-OCT-2003 16:34:54.20

この問題を回避するには、/RECORD_DEFINITION修飾子を使用してFORMAT=DELIMITEDオプションを指定します。ただし、この方法はLIST OF BYTE VARYING列のアンロードはサポートしていません。

11.1.14 Galaxy環境でSHARED MEMORY IS SYSTEMまたはLARGE MEMORY IS ENABLEDを使用する場合の致命的エラーSYSTEM-F-INSFMEM

OpenVMS Galaxy環境でGALAXY SUPPORT IS ENABLED機能を使用する場合、レコード・キャッシュをマップするか、またはデータベースを開くときに「%SYSTEM-F-INSFMEM, insufficient dynamic memory error」が返されることがあります。Galaxy構成に固有のこの問題では、Galaxy共有メモリー・リージョンを使い果していることが原因の1つです。Galaxyシステムの場合、GLX_SHM_REGは、Galaxy Management Database(GMDB)に構成された共有メモリー・リージョンの構造の数を表します。

64リージョンというデフォルト値(少なくともリリース7.3-1までのOpenVMSの場合)は、一部のインストールでは十分ですが、SHARED MEMORY IS SYSTEM機能またはLARGE MEMORY IS ENABLED機能が有効な場合に多くのデータベースや行キャッシュを使用するサイトでは、このデフォルトでは不十分であることがわかっています。

レコード・キャシュをマップしたり、データベースを開くときに「%SYSTEM-F-INSFMEM, insufficient dynamic memory error」が返される場合、GLX_SHM_REGパラメータを、行キャッシュの数と、一度にGalaxyでアクセスできるデータベースの数の合計の2倍に増やすことをお薦めします。Galaxy共有メモリー・リージョンの構造がそれほど大きくない場合、このパラメータを必要な値より高く設定しても、物理メモリーが大幅に消費されることはありません。また、Galaxy環境を後から再起動することも避けられます。このパラメータはGalaxyのすべてのノードで設定する必要があります。


Galaxyの再起動が必要

GLX_SHM_REGシステム・パラメータを変更する場合、OpenVMS Galaxy環境を最初から起動する必要があります。つまり、Galaxyのすべてのノードを停止してから、各インスタンスを開始してGalaxyを再構築する必要があります。

11.1.15 Oracle RdbとOpenVMS ODS-5のボリューム

OpenVMSリリース7.2では、2つの主なコンポーネントで構成される拡張ファイル仕様の機能が導入されました。

Advanced Server for OpenVMS 7.2(以前のPATHWORKS for OpenVMS)、DCOMおよびJAVAアプリケーションのユーザーに対して、機能を共有する拡張ファイルを提供することを主な目的としてODS-5が導入されました。

Oracle Rdbは各自のファイルとディレクトリ名の解析を実行し、ODS-2(OpenVMSの従来のボリューム構造)ファイルとディレクトリ名の表記規則に明示的に従う必要があります。このため、Oracleでは、ODS-2以外のファイル命名規則の機能を使用するOracle Rdbデータベースのファイル・コンポーネント(ルート・ファイル、記憶域ファイル、アフター・イメージ・ジャーナル・ファイル、レコード・キャッシュのバックエンドのデータストア・ファイル、データベース・バックアップ・ファイル、アフター・イメージ・ジャーナルのバックアップ・ファイルなど)をサポートしていません。このような理由で、Oracle RdbデータベースのコンポーネントをODS-5ボリュームに配置しないことをお薦めします。

Oracle Rdbで使用するこのようなファイルとディレクトリがすべてODS-2のファイルとディレクトリ名の表記規則に厳密に従っている場合は、ODS-5ボリューム上のOracle Rdbデータベースのファイル・コンポーネントがサポートされます。特に、すべてのファイル名は全体を大文字で指定してください。ファイル名やディレクトリ名で特殊文字を使用することは禁止されています。

11.1.16 チェック制約の最適化

Oracle Bug#1448422

CHECK構文を使用して制約を表す場合、同じまたは類似した制約が参照整合性(PRIMARYとFOREIGN KEY)制約を使用して表現される場合よりも質の悪いストラテジがオプティマイザによって選択されることがあります。

たとえば、T1およびT2という2つの表があり、どちらの表にも1つの列があります。表T1のすべての値がT2に存在することを確認するとします。どちらの表にも参照フィールドに索引があります。T2ではPRIMARY KEY制約を使用し、T1ではFOREIGN KEY制約を使用します。

SQL> alter table t2 alter column f2 primary key not deferrable;
SQL> alter table t1 alter column f1 references t2 not deferrable;

PRIMARY KEY表から削除する場合、RdbはFOREIGN KEYに削除された値があるFOREIGN KEY表の行のみをチェックします。これは、検索ストラテジでT1の索引の検索として示されます。

SQL> delete from t2 where f2=1;
Get     Temporary relation      Retrieval by index of relation T2
  Index name  I2 [1:1]
Index only retrieval of relation T1
  Index name  I1 [1:1]
%RDB-E-INTEG_FAIL, violation of constraint T1_FOREIGN1 caused operation to fail

制約の失敗は重要ではありません。重要なのは、T2で削除された行と同じ値を持つT1の行のみが影響を受けることをRdbが効率的に検出することです。

CHECK制約を使用してこのようなリレーションシップを定義することが必要な場合があります。これは、表T2にNULL値があるためにその表の主キーの定義が排除されるため必要になります。これは次の形式のCHECK制約で実行されます。

SQL> alter table t1 alter column f1
cont>   check (f1 in (select * from t2)) not deferrable;
SQL> delete from t2 where f2=1;
Get     Temporary relation      Retrieval by index of relation T2
  Index name  I2 [1:1]
Cross block of 2 entries
  Cross block entry 1
    Index only retrieval of relation T1
      Index name  I1 [0:0]
  Cross block entry 2
    Conjunct        Aggregate-F1    Conjunct
    Index only retrieval of relation T2
      Index name  I2 [0:0]
%RDB-E-INTEG_FAIL, violation of constraint T1_CHECK1 caused operation to fail

cross blockは、制約の評価に使用されます。この検索ストラテジは、制約を評価するために、表T1の索引全体をスキャンして、キーごとに表T2の索引全体をスキャンすることを示しています。この動作は、制約のselect句の等式結合条件を使用してある程度改善できます。

SQL> alter table t1 alter column f1
cont>   check (f1 in (select * from t2 where f2=f1)) not deferrable;

or:

SQL> alter table t1 alter column f1
cont>   check (f1=(select * from t2 where f2=f1)) not deferrable;

どちらの場合も、検索ストラテジは次のようになります。

SQL> delete from t2 where f2=1;
Get     Temporary relation      Retrieval by index of relation T2
  Index name  I2 [1:1]
Cross block of 2 entries
  Cross block entry 1
    Index only retrieval of relation T1
      Index name  I1 [0:0]
  Cross block entry 2
    Conjunct        Aggregate-F1    Conjunct
    Index only retrieval of relation T2
      Index name  I2 [1:1]
%RDB-E-INTEG_FAIL, violation of constraint T1_CHECK1 caused operation to fail

T1の索引全体のスキャン中に、少なくともT1の値がT2の索引検索の実行に使用されます。

これらの制限事項は、NULL処理に関するIN操作とEXISTS操作の動作のセマンティックの違いと、等式以外の結合条件を扱う複雑さに起因します。

比較的大きな表でこのようなタイプの整合性チェックの実行を改善するには、制約チェックを実行する一連のトリガーを使用できます。次のトリガーは、前述の制約に対して類似するチェックを実行します。

SQL> create trigger t1_insert after insert on t1
cont>  when (not exists (select * from t2 where f2=f1))
cont>    (error) for each row;
SQL> create trigger t1_update after update on t1
cont>  when (not exists (select * from t2 where f2=f1))
cont>    (error) for each row;
SQL> ! A delete trigger is not needed on T1.
SQL> create trigger t2_delete before delete on t2
cont>  when (exists (select * from t1 where f1=f2))
cont>    (error) for each row;
SQL> create trigger t2_modify after update on t2
cont>  referencing old as t2o new as t2n
cont>  when (exists (select * from t1 where f1=t2o.f2))
cont>    (error) for each row;
SQL> ! An insert trigger is not needed on T2.

T2での削除ストラテジは次のようになりました。

SQL> delete from t2 where f2=1;
Aggregate-F1    Index only retrieval of relation T1
  Index name  I1 [1:1]
Temporary relation      Get     Retrieval by index of relation T2
  Index name  I2 [1:1]
%RDB-E-TRIG_INV_UPD, invalid update; encountered error condition defined for
trigger
-RDMS-E-TRIG_ERROR, trigger T2_DELETE forced an error

トリガーのストラテジは、最初に索引のみの検索を表示しています。T1の索引が、削除で影響を受ける行のみを確認するために使用されることに注意してください。

この回避策を使用する場合、トリガーの操作、INとEXISTSの使用、参照整合性制約の使用でセマンティックの違いがあることに注意する必要があります。

この回避策は、制約の形式がより複雑で、参照整合性制約を使用して表すことができない場合に役立ちます。たとえば、アプリケーションが表T1の値を、値がないことを示す空白またはNULLのように使っている場合、このようなセマンティックを許容するために前述のトリガーを簡単に変更できます。

11.1.17 キャリーオーバー・ロックとNOWAITトランザクションの明確化

NOWAITトランザクションで、BLAST(ブロッキングAST)メカニズムは使用できません。ブロッキング・ユーザーがBLASTシグナルを受け取るには、リクエストするユーザーは、ロックするリソースをWAITでリクエストする必要があります(NOWAITトランザクションは行いません)。Oracle Rdbは、NOWAITというリソースを定義します。NOWAITは、NOWAITトランザクションが開始されたことを示すために使用されます。NOWAITトランザクションが開始すると、ユーザーはNOWAITリソースをリクエストします。他のすべてのデータベース・ユーザーは、NOWAITトランザクションの開始時に、他のすべてのユーザーにNOWAITのBLASTが通知されるようにNOWAITリソースをロック状態にします。BLASTにより、ブロッキング・ユーザーはキャリーオーバー・ロックを解放します。キャリーオーバー・ロックのトランザクションがNOWAITトランザクションの存在を検出して、そのキャリーオーバー・ロックを解放するまでに遅延が発生することがあります。この状態を検出するには、ストール・メッセージを確認します。ストール・メッセージ「Waiting for NOWAIT signal (CW)」が頻繁に表示される場合、アプリケーションのパフォーマンスが低下している可能性があるため、キャリーオーバー・ロックの動作を無効にすることを検討してください。

11.1.18 ホット・スタンバイ・データベースでの読取りトランザクションで予期しない結果が発生する

ホット・スタンバイを使用する場合、スタンバイ・データベースは、レポートの作成、簡単な問合せ、およびその他の読取り専用トランザクションの目的で使用することが一般的です。スタンバイ・データベースでこのような読取り専用トランザクションを実行している場合、分離レベルREAD COMMITを許容できることを確認します。これは、読取り専用トランザクションが終了する前にホット・スタンバイ・データベースが別のトランザクションで更新され、取得されたデータが想定したものとは異なる可能性があるためです。

ホット・スタンバイがスナップショット・ファイルに書き込まれず、読取り専用トランザクションについてスタンバイ・データベースで達成する分離レベルがREAD COMMITEDトランザクションであるためです。つまり、読取り専用トランザクションでノンリピータブル・リードとファントム・リードが許容されます。

そのため、スタンバイ・データベースからのデータの読取りが変化しないことを保証することはできません。スタンバイ・データベースからデータを読み取って使用するプロシージャを実装する前に、読取り専用トランザクションが分離レベルREAD COMMITを許容できることを確認します。

11.1.19 SYS$HIBERを使用するアプリケーションとOracle Rdb

Oracle Rdbと$HIBERシステム・サービスを使用するアプリケーション・プロセス(場合によっては、LIB$WAITなどのRTLルーチン、またはPTHREAD$RTLを使用するマルチスレッド・プロセス(JAVAベースなど)を使用する)では、待機中のイベントが実際に発生したかどうかをアプリケーションで確認する必要があります。Oracle Rdbは、プロセス間通信に$HIBER/$WAKEシーケンスを使用します。

Oracle Rdbで$WAKEシステム・サービスを使用すると、$HIBERの他のユーザー(RTLルーチンLIB$WAITなど)が妨げられることがあります。$HIBERの他のユーザーはイベントの完了をチェックしないため、$HIBERがまったく待機せず予想外に再開する場合があります。それ以外の場合、SYS$HIBERサービスの1つのコール元が、他のSYS$WAKEに対して意図された警鐘または保留中の警鐘を消費することがあります。Rdbを使用する場合、そのRdbでSYS$HIBER/SYS$WAKEを使用すると、内部アクセス・モードで発生する可能性が高くなります。

このような状況を防ぐには、操作(遅延やタイマーの発動など)の完了をチェックしないで続行しないようにするコード・シーケンスを使用するアプリケーションの変更を検討します。アプリケーション内でhiber/wakeを使用するには、常に疑似警鐘を扱うように正しくコード化する必要があります。

次の疑似コードは、timed-waitが正常に完了したことを示すためのフラグの使用状況を示しています。この待機は、タイマーが実際に発動してTIMER_FLAGをTRUEに設定するまで完了しません。このコードは、ASTが有効であるかどうかに依存します。

OWN WAKEFLG : VOLATILE; ! Volatile to force memory fetch

ROUTINE TIMER_WAIT:
    BEGIN
    WAKEFLG = FALSE ! Clear timer flag

    ! Schedule an AST for sometime in the future
    STAT = SYS$SETIMR (TIMADR = DELTATIME, ASTRTN = TIMER_AST)
    IF STAT <> SS$_NORMAL THEN LIB$SIGNAL (STAT)

    ! Hibernate.  When the $HIBER completes, check to make sure
    ! WAKEFLG is set indicating that the wait has finished.
    WHILE WAKEFLG = FALSE DO SYS$HIBER()
    END

ROUTINE TIMER_AST:
    BEGIN
    WAKEFLG = TRUE ! Set flag indicating timer expired
    STAT = SYS$WAKE () ! Wake the main-line code
    IF STAT <> SS$_NORMAL THEN LIB$SIGNAL (STAT)
    END

OpenVMS LIB$WAITルーチンを使用して、代替の待機方法($SYNCHシステム・サービスを使用)を可能にする場合、LIB$K_NOWAKEフラグを指定できます。この代替の待機方法では、$HIBERシステム・サービスを使用する複数のコード・シーケンスに関連する問題を防止できます。

アプリケーションのハングを防止するには、SYS$HIBERの内部モード・ユーザーが追加の手順を実行して、保留中の警鐘が誤って消費されないようにする必要があります。これを実行するには、SYS$HIBERのコールが行われた場合、イベントの完了後、プロセスにSYS$WAKEを発行するのが一般的な方法です。Rdbがこの手順を実行するため、警鐘が予期せず表示される場合に備えて、アプリケーション・プログラムを準備しておく必要があります。

11.1.20 ホット・スタンバイのレプリケーションがアクティブの場合、行キャッシュが許可されない

レプリケーションがアクティブの場合、行キャッシュ機能をホット・スタンバイ・データベースで有効にできません。行キャッシュが有効な場合、ホット・スタンバイ機能は開始されません。

この制限があるのは、論理dbkeysから行キャッシュの行にアクセスされるためです。ただし、アフター・イメージ・ジャーナルからスタンバイ・データベースに変換される情報には物理dbkeysのみが含まれます。ホット・スタンバイ処理によってキャシュに行を維持する方法がないため、スタンバイ・データベースが開いていてレプリケーションがアクティブな場合、行キャッシュを無効にする必要があります。

新しいコマンド修飾子ROW_CACHE=DISABLEDがRMU Openコマンドに追加されました。レプリケーションを開始する前にホット・スタンバイ・データベースを開くには、RMU OpenコマンドでROW_CACHE=DISABLED修飾子を使用します。

11.1.21 Oracle Rdbのソート時の多すぎるプロセス・ページ・フォルトとパフォーマンスのその他の考慮事項

ハード・ページ・フォルトまたはソフト・ページ・フォルトが多すぎると、プロセス・パフォーマンスを制限する要因となります。Oracle Rdbのプロセス・ページ・フォルトの一因はソート操作です。ソートのよくある原因として、問合せに指定したSQLのGROUP BY句、ORDER BY句、UNION句、DISTINCT句、索引作成操作などがあります。論理名RDMS$DEBUG_FLAGSをRSに定義すると、Oracle Rdbのソート操作の発生のタイミングと、ソート・キーおよび統計の表示の決定に役立ちます。

Oracle Rdbには、Oracle Rdbイメージ内にOpenVMS SORT32コードの独自のコピーが含まれ、通常、OpenVMSランタイム・ライブラリのルーチンをコールしません。SORT32コードのコピーを使用すると、Oracle RdbとOpenVMSのバージョン間の安定性が得られます。Oracle Rdbは、SORT32の共有可能イメージを使用して実行することが困難なエグゼクティブ・プロセッサ・モードからソート・ルーチンをコールするためです。SQL IMPORT操作およびRMU Load操作は実行しますが、OpenVMS SORTランタイム・ライブラリをコールします。

ソート操作の開始時に、SORTコードは作業領域にメモリーを割り当てます。SORTコードは、バッファ、データのメモリー内コピー、ツリーのソートにこの領域を使用します。

SORTは、メモリーを割り当てるときにプロセスの割当て量やパラメータを直接検討しません。WSQUOTAおよびWSEXTENTによる影響は間接的なものです。各ソート操作の開始時に、SORTコードは、$ADJWSLシステム・サービスを使用して、リクエストされた作業セットの制限を%X7FFFFFFFページ(最大可能数)に指定し、プロセス作業セットを最大可能サイズに調整しようとします。SORTは、仮想メモリーのスクラッチ領域に対して、返された作業セットの値75%を使用します。スクラッチ領域は初期化され、ソートが開始します。

スクラッチ領域の初期化により、通常、作業セットにページが新たに追加され、ページフォルトが発生します。新しいページがフォルトインすると、すでに作業セットにあったページはフォルトアウトします。ソート操作が完了してSORTがOracle Rdbに戻ると、作業セットからフォルトアウトしたページは、作業セットにフォルトバックします。

プロセス作業セットが作業セットの割当て(WSQUOTA)パラメータで制限され、作業セットの範囲(WSEXTENT)パラメータがより大きな値である場合、ソート・ルーチンを最初にコールすると、作業セットが大きくなるにつれて多くのページ・フォルトが発生します。WSEXTENTの値をWSQUOTAに近い値にすると、この影響が軽減されます。

一部のOpenVMSバージョンの場合、AUTOGENは、SYSGENパラメータPQL_MWSEXTENTをWSMAXパラメータと同じに設定します。つまり、システム上のすべてのプロセスが、WSMAXと同じWSEXTENTで終了します。この値はかなり高いため、ソートによって過度のページ・フォルトが発生します。この状況が使用するシステムで発生する場合、PQL_MWSEXTENTの値を明示的に低く設定します。

ソート作業ファイルは、Oracle Rdbのソート操作の調整時に検討するもう1つの要素です。使用可能なメモリーで操作を実行できない場合、SORTは一時ディスク・ファイルを使用して、ソートするデータを保持します。ソート作業ファイルの詳細は、『Oracle Rdb7データベース・パフォーマンスおよびチューニングのためのガイド』を参照してください。

論理名RDMS$BIND_SORT_WORKFILESは、作業ファイルが必要な場合に使用する作業ファイルのソートの数を指定します。デフォルトは2で、最大数は36です。作業ファイルは、SORTWORKn論理名でそれぞれ制御できます(nの範囲は0〜Z)。ソート操作の効率を上げるには、一時ソート作業ファイルの場所を異なるディスクに割り当てます。これらの割当ては、最大で36の論理名(SORTWORK0〜SORTWORKZ)を使用して行われます。

通常、SORTはSYS$SCRATCHディレクトリに作業ファイルを配置します。デフォルトでは、SYS$SCRATCHはSYS$LOGINの場所と同じデバイスとディレクトリです。複数のディスクまたはコントローラ(あるいはその両方)にI/O負荷を分散すると、より多くのシステム・リソースを利用することで効率とパフォーマンスが向上し、ディスクI/Oのボトルネックの防止に役立ちます。作業ファイルが別々のディスクに配置されるように指定すると、SORTの読取り/書込みのサイクルの重複が許可されます。SYS$SCRATCHディスク・デバイスに十分な領域が存在しない場合もあります(たとえば、Oracle Rdbがきわめて大きな表の索引を構築しているときなど)。論理名SORTWORK0からSORTWORKZを使用すると、この問題の防止に役立ちます。

SORTでは様々なソートの実行に作業ファイルを使用し、そのソートの実行をより大きなグループにマージすることに注意してください。ソース・データがほとんどソートされる場合、すべてのソート作業ファイルにアクセスする必要はありません。これは、36のソート作業ファイルを使用する場合でも、最初のSORTファイルのデバイスの容量を超えて、残りの35のソート作業ファイルにアクセスせずにソート操作が失敗することがあり、混乱の原因となる可能性があります。

この時点では、CREATE INDEX、ALTER INDEX、およびUNION DISTINCT句、ORDER BY句、GROUP BY句、SELECT DISTINCT句で使用されるものとして、10を超えるソート作業ファイルのみがOracle Rdbのソート・インタフェースで使用されます。RMUインタフェースおよびSQL IMPORTインタフェースは、OpenVMS SORTインタフェースを使用しますが、このインタフェースは、現在10を超えるソート作業ファイルをサポートしていません。

論理名RDMS$BIND_WORK_VMおよびRDMS$BIND_WORK_FILEはソート操作に影響を与えることはありません。あるいは、ソート操作を制御することはありません。これらの論理名を使用して、Oracle Rdb内のその他の一時領域の割当てを制御します。

11.1.22 ソート作業のメモリー割当ての制御

Oracle Rdbは、組込みのSORT32パッケージを使用して多くのソート操作を実行します。ソートに使用する作業メモリーを初期化する際に、これらのソートによって重大なパフォーマンスの問題が示されることがあります。この動作は、たとえば、ソートのカーディナリティがかなり高く見積られる場合(ただし、実際のソートのカーディナリティは低い)に発生することがあります。

ソート・パッケージによる作業メモリーの使用を人為的に制限することが望ましい場合があります。この制御を行うために、2つの論理が作成されました。通常、これらの論理名のいずれかを使用する必要はありません。これらの論理名を誤って使用すると、ソートのパフォーマンスに重大な影響を及ぼす可能性があります。これらの論理を注意深く慎重に使用することをお薦めします。

論理名は次のとおりです。

表11-1 ソート・メモリーの論理
論理 定義
RDMS$BIND_SORT_MEMORY_WS_FACTOR 組込みのSORT32パッケージにソート・メモリーを割り当てる際に、使用するプロセスの作業セットの制限の割合を指定します。定義しない場合、デフォルト値は75(75%を表す)、最大値は75(75%を表す)、最小値は2(2%を表す)になります。かなり大きな作業セットの制限があるプロセスでは、ソート・メモリーを初期化している間にかなりの数のページ・フォルトが発生し、CPUを著しく消費することがあります。この論理名は、ソートの作業メモリーをプロセスの最大作業セットの割合に制限できます。
RDMS$BIND_SORT_MEMORY_MAX_BYTES 組込みのSORT32パッケージにソート・メモリーを割り当てる際に、使用する絶対的な制限を指定します。定義しない場合、デフォルト値は無制限(最大で1GB)、最大値は2147483647、最小値は32768になります。

11.1.23 ハロウィーン問題

カーソルが表から選択された行を処理している場合、別の問合せがそのカーソルで使用する索引列のキー値を変更して、カーソルの検索を妨害することがあります。

たとえば、カーソルがLAST_NAME >= 'M'のすべてのEMPLOYEESを選択する場合、問合せはLAST_NAMEでソート索引を使用してカーソルの行を検索します。MasonからRickardまでの従業員のLAST_NAMEを変更するカーソルの処理時に更新が行われる場合、従業員の行は2回処理される可能性があります。最初に名前Masonでフェッチし、次に新しい名前Rickardでアクセスされます。

ハロウィーン問題は、リレーショナル・データベースでよく知られている問題です。I/Oの要件を最適化するアクセス・ストラテジ(索引検索など)では、この問題に陥る傾向があります。他のセッションによる問合せの妨害はロックで防ぎ、SQLのISOLATION LEVELオプションまたはRDO/RDMLのCONCURRENCY/CONSISTENCYで制御します。

Oracle Rdbがカーソルのサブジェクト表の更新を認識する場合、この問題は防止されます。たとえば、SQLの構文UPDATE ... WHERE CURRENT OFを使用してターゲット行の更新を実行するか、またはRDO/RDML MODIFY文がストリームにコンテキスト変数を使用するとします。この場合、ハロウィーン問題の原因となる更新が行われると、オプティマイザはかわりのアクセス・ストラテジを選択します。これは、カーソルの問合せの結果を保持するために一時リレーションが作成される例2-2のアクセス・ストラテジで確認できます。

対話型SQLまたは動的SQLを使用する場合、UPDATE ... WHERE CURRENT OF文またはDELETE ... WHERE CURRENT OF文は、カーソルが宣言されて開かれるまで表示されません。これらの環境では、FOR UPDATE句を使用して、カーソルで選択された列がカーソルの処理時に更新されるように指定する必要があります。この場合、これがハロウィーン問題に対して保護するためのRdbオプティマイザへの指示となります。例2-1および例2-2でこれを示します。

次の例は、EMP_LAST_NAME索引が検索に使用される状況を示しています。実行される更新は、場合によってはハロウィーン問題に陥ります。

SQL> set flags 'strategy';
SQL> declare emp  cursor for
cont> select * from employees where last_name >= 'M' order by last_name;
SQL> open emp;
Conjunct        Get     Retrieval by index of relation EMPLOYEES
  Index name  EMP_LAST_NAME [1:0]
SQL> close emp;

次の例は、列LAST_NAMEが後の問合せで更新されるように問合せが指定する状況を示しています。問合せの結果セットを保持するために一時リレーションを使用することで、オプティマイザが検索に使用するEMP_LAST_NAME索引を保護します。LAST_NAMEに対して実行される更新は、ハロウィーン問題を防止するようになりました。

SQL> set flags 'strategy';
SQL> declare emp2 cursor for
cont> select * from employees where last_name >= 'M'
cont> order by last_name for update of last_name;
SQL> open emp2;
Temporary relation      Conjunct        Get
Retrieval by index of relation EMPLOYEES
  Index name  EMP_LAST_NAME [1:0]
SQL> close emp2;

SQLプリコンパイラまたはSQLモジュール言語コンパイラを使用する場合、カーソルに関連するすべての文がモジュール内に存在するため、カーソルのコンテキストはそのカーソルの処理時に更新される可能性があることが判断できます。DECLARE_STREAM文とSTART_STREAM文、および同じストリーム・コンテキストを使用してすべてのMODIFY文とERASE文を実行する場合、これはRDML/RDBPREプリコンパイラにも当てはまります。

ここで、後続のUPDATEまたはDELETEのときではなく、SQLカーソル(またはRDOストリーム)を開くときに保護が有効になることに注意してください。

カーソルからフェッチされる行を変更する個々のUPDATE問合せを実行する場合、フェッチされる実際の行は、Rdbオプティマイザで選択されるアクセス・ストラテジによって異なります。問合せをカーソルの問合せと区別する場合(つまり、カーソルのコンテキストを参照しない)、オプティマイザは、カーソルが選択した行が更新されることを認識しないため、ハロウィーン問題に対する通常の保護を行うことができません。

11.2 SQLの既知の問題と制限事項

この項では、SQLインタフェースの既知の問題と制限事項について説明します。

11.2.1 設定フラグCRONO_FLAGの削除

SET FLAGS文とRDMS$SET_FLAGS論理名は、古いキーワードCRONO_FLAGを受け入れなくなりました。このキーワードは削除されました。キーワードCHRONO_FLAGを使用するにはすべてのスクリプトとアプリケーションを更新してください。

11.2.2 Oracle Rdbリリース7.2で作成された交換ファイル(RBR)は以前のリリースと互換性がない

データベースの新しい属性とオブジェクトを数多くサポートするために、SQL EXPORTとSQL IMPORTで使用するプロトコルが拡張され、より多くのプロトコル・タイプをサポートするようになりました。そのため、Oracle Rdbリリース7.2の交換ファイルの形式は、古いバージョンのOracle Rdbで読み取ることができなくなりました。

Oracle Rdbは、古いバージョンで生成された交換ファイルの上位互換性を引き続き提供します。

Oracle Rdbは下位互換性をサポートしませんが、古いバージョンのIMPORTを含む交換ファイルを使用することがありました。ただし、このプロトコルの変更によって、この交換ファイルの使用が許可されなくなりました。

11.2.3 単一文LOCK TABLEがSQLモジュール言語およびSQLプリコンパイラに対してサポートされない

新しいLOCK TABLE文は、モジュール言語内または埋込みSQL言語コンパイラ内の単一文として現在サポートされていません。

かわりに、複合文でこの文を囲む必要があります。つまり、次の例に示すように、この文の前後でBEGIN... ENDを使用します。この形式では、LOCK TABLEのすべての構文と柔軟性が提供されます。

この制限事項は、対話型SQLや動的SQLには適用されません。

モジュール言語リスト・ファイルから抽出された次の内容は、LOCK TABLEを単一文のプロシージャとして使用する場合にレポートされるエラーを示しています。同じモジュールの他のプロシージャは、LOCK TABLE文を含む複合文を使用するため受け入れられます。

1 MODULE sample_test
2 LANGUAGE C
3 PARAMETER COLONS
4
5 DECLARE ALIAS FILENAME 'mf_personnel'
6
7 PROCEDURE a (SQLCODE);
8 LOCK TABLE employees FOR EXCLUSIVE WRITE MODE;
%SQL-F-WISH_LIST, (1) Feature not yet implemented - LOCK TABLE requires compound
statement
9
10 PROCEDURE b (SQLCODE);
11 BEGIN
12 LOCK TABLE employees FOR EXCLUSIVE WRITE MODE;
13 END;

SQLモジュール言語または埋込みSQLアプリケーションにLOCK TABLEを使用する場合に発生するこの問題を回避するには、EXEC SQL文で複合文を使用します。

11.2.4 複数文またはストアド・プロシージャが原因でハングする

長期間実行している複数文またはストアド・プロシージャでは、そのプロシージャがデータベースの他のユーザーに必要なリソースを取得する場合、その他のユーザーがハングすることがあります。複数文またはストアド・プロシージャの実行で取得されるリソースは、その複数文またはストアド・プロシージャが終了するまで解放されません。そのため、長期間実行している複数文またはストアド・プロシージャが原因で他のプロセスがハングすることがあります。この問題は、文にSQL COMMIT文またはROLLBACK文が含まれている場合でも発生する可能性があります。

次の例は、問題を示しています。最初のセッションが無限ループに陥り、2番目のセッションがデータベースをバックアップしようとしますが、永久にハングします。

Session 1:

SQL> attach 'filename MF_PERSONNEL';
SQL> create function LIB$WAIT (in real by reference)
cont> returns integer;
cont> external name LIB$WAIT location 'SYS$SHARE:LIBRTL.EXE'
cont> language general general parameter style variant;
SQL> commit;
        .
        .
        .
$ SQL
SQL> attach 'filename MF_PERSONNEL';
SQL> begin
cont> declare :LAST_NAME LAST_NAME_DOM;
cont> declare :WAIT_STATUS integer;
cont> loop
cont> select LAST_NAME into :LAST_NAME
cont> from EMPLOYEES where EMPLOYEE_ID = '00164';
cont> rollback;
cont> set :WAIT_STATUS = LIBWAIT (5.0);
cont> set transaction read only;
cont> end loop;
cont> end;

Session 2:

$ RMU/BACKUP/LOG/ONLINE MF_PERSONNEL MF_PERSONNEL

From a third session, you can see that the backup process is waiting for a lock
held in the first session:

$ RMU/SHOW LOCKS /MODE=BLOCKING MF_PERSONNEL
    .
    .
    .
Resource: nowait signal

ProcessID Process Name        Lock ID  System ID Requested Granted
--------- ---------------     --------- -------- --------- -------
20204383  RMU BACKUP.....     5600A476  00010001 CW        NL
2020437B  SQL............     3B00A35C  00010001 PR        PR

この制限事項の回避策はありません。複数文またはストアド・プロシージャの実行が終了すると、他のプロセスで必要なリソースが解放されます。

11.2.5 共有可能イメージからのOracle Rdbの使用

共有可能イメージのイメージ初期化ルーチンのコードが、SQLやその他の手段でOracle Rdbにコールする場合、Oracle Rdbのイメージに各自の初期化を行う機会がないと、アクセス違反または予期しないその他の動作が発生することがあります。

この問題を回避するには、アプリケーションで次のいずれかの手順を実行する必要があります。

これはバグではありません。OpenVMSイメージのアクティブ化から派生する制限事項です。

11.3 Oracle RMUの既知の問題と制限事項

この項では、RMUインタフェースの既知の問題と制限事項について説明します。

11.3.1 リレーションIDの最大値を超えるとRMU Convertが失敗する

リリース7.2のデータベースに対するRMU Convertの際に、リレーションIDが新しいシステム表に割り当てられる場合、Oracle RdbでのリレーションIDの最大許容値8192を超えると、致命的エラー%RMU-F-RELMAXIDBADが表示され、データベースが以前のデータベース・バージョンにロールバックされます。このエラーが発生した場合は、Oracleサポート・サービスに連絡してください。データベースがロールバックされる場合、ロールバックは成功したが、そのロールバックは致命的エラーの検出によって生じたものであり、ユーザーからリクエストされたものではないことを示す致命的エラー%RMU-F-CVTROLSUCが表示されます。

この状況は、データベースで定義される表の数が著しく多い場合、または多くの表が定義されて、その後に削除された場合にのみ発生します。

次の例は、データベースでのリレーションIDの最大許容値8192を超えた場合の%RMU-F-RELMAXIDBADエラー・メッセージと、データベースがリリース7.2に変換できないためにリリース7.0にロールバックされた場合の%RMU-F-CVTROLSUCエラー・メッセージを示しています。

$rmu/convert mf_personnel
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2
Are you satisfied with your backup of
 DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 and your backup of
 any associated .aij files [N]? Y
 %RMU-I-LOGCONVRT, database root converted to current structure level
 %RMU-F-RELMAXIDBAD, ROLLING BACK CONVERSION - Relation ID exceeds maximum
  8192 for system table RDB$RELATIONS
 %RMU-F-CVTROLSUC, CONVERT rolled-back for
  DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 to version V7.0

次の例は、リレーションIDの最大許容値を超えない場合を示しています。

$rmu/convert mf_personnel
%RMU-I-RMUTXT_000, Executing RMU for Oracle Rdb V7.2
Are you satisfied with your backup of
 DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 and your backup of
 any associated .aij files [N]? Y
%RMU-I-LOGCONVRT, database root converted to current structure level
%RMU-S-CVTDBSUC, database DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1
 successfully converted from version V7.0 to V7.2
%RMU-I-CVTCOMSUC, CONVERT committed for
 DEVICE:[DIRECTORY]MF_PERSONNEL.RDB;1 to version V7.2

11.3.2 RMU Unload /After_Journalには正確なAIP論理領域情報が必要

RMUのUnload /After_Journalコマンドは、混合形式の記憶域に保存されるレコードの論理dbkeysを再構築する場合、ディスク上の領域インベントリ・ページ(AIP)を使用して、各論理領域に適切なタイプを決定します。ただし、AIPの論理領域タイプ情報は、通常、Oracle Rdbリリース7.0.1以前に作成された論理領域の場合は不明です。RMU Unload /After_Journalコマンドが1つ以上のAIPエントリの論理領域タイプを決定できない場合、領域ごとに警告メッセージが表示され、混合形式の記憶域に保存されるレコードに対して領域番号ゼロで最終的に論理dbkeysを返します。

AIPのディスク上の論理領域タイプを更新するには、RMU Repairユーティリティを使用する必要があります。INITIALIZE=LAREA_PARAMETERS=optionfile修飾子のオプション・ファイルは、TYPE修飾子とともに使用できます。たとえば、MF_PERSONNELデータベースのEMPLOYEES表を修正するには、次の行を含むオプション・ファイルを作成します。

EMPLOYEES /TYPE=TABLE

パーティション化された論理領域の場合、AREA=name修飾子を使用して、更新する特定の記憶域を識別できます。たとえば、MF_PERSONNELデータベースのEMPLOYEES表でEMPID_OVER記憶域のみを修正するには、次の行を含むオプション・ファイルを作成します。

EMPLOYEES /AREA=EMPID_OVER /TYPE=TABLE

TYPE修飾子は、論理領域のタイプを指定します。次のキーワードが許可されます。

論理領域に指定したタイプのエラーの明示的なチェックはありません。ただし、不正なタイプが原因で、RMU Unload /After_Journalコマンドが有効かつ論理的なdbkeysを正しく返すことができないことがあります。

11.3.3 HYPERSORTをRMU Optimize After_Journalコマンドと一緒に使用しないこと

OpenVMS Alphaバージョン7.1オペレーティング・システムでは、高パフォーマンスのSort/Mergeユーティリティ(HYPERSORTとも呼ばれる)が導入されました。このユーティリティでOpenVMS Alphaアーキテクチャを使用すると、ほとんどのソート操作とマージ操作のパフォーマンスが向上します。

高パフォーマンスのSort/Mergeユーティリティは、SORルーチンのサブセットをサポートします。ただし、高パフォーマンスのSort/Mergeユーティリティでは、RMU Optimize After_Journalコマンドで使用する一部のインタフェースをサポートしていません。また、RMU Optimize After_Journalコマンドで使用するサポートされていないオプションでこのユーティリティがコールされる場合、高パフォーマンスのSort/Mergeユーティリティからエラーや警告はレポートされません。

このため、高パフォーマンスのSort/Mergeユーティリティの使用は、RMU Optimize After_Journalコマンドでサポートされていません。HYPERSORT.EXEを参照するために論理名SORTSHRを定義しないでください。

11.3.4 RMU Backupに関するEXCLUDE修飾子とINCLUDE修飾子の変更

RMU Backupコマンドは、同じコマンド内でInclude修飾子とExclude修飾子の両方を受け入れなくなりました。この変更により、IncludeとExcludeを同じ行で指定した場合のバックアップ内容に関する混乱はなくなりますが、RMU Backupコマンドの機能が低下することはありません。

バックアップから一部の記憶域を明示的に除外するには、Exclude修飾子を使用して除外する記憶域を指定します。これにより、Exclude修飾子で指定された領域を除くすべての記憶域がバックアップされます。

同様に、Include修飾子により、この修飾子で指定された記憶域のみがバックアップされます。Include修飾子で指定されない記憶域はバックアップされません。Noread_only修飾子とNoworm修飾子を指定すると、読取り専用記憶域とWORM記憶域はバックアップから引き続き省略されます。これはこれらの領域がInclude修飾子で明示的にリストされている場合も同様です。

もう1つの関連する変更はEXCLUDE=*の動作にあります。以前のバージョンでは、EXCLUDE=*によってすべての記憶域がバックアップされていました。リリース7.1以降では、EXCLUDE=*によってルートのバックアップのみが行われます。EXCLUDE=*を使用して作成されるバックアップは、RMU Restore Only_Rootコマンドでのみ使用できます。

11.3.5 RMU Backup操作では1つのタイプのテープ・ドライブのみを使用する

RMU Backupコマンドに複数のテープ・ドライブを使用する場合、すべてのテープ・ドライブのタイプを同じにする必要があります(たとえば、テープ・ドライブをすべてTA90s、TZ87sまたはTK50sにします)。データベースの1回のバックアップ操作に対して異なるテープ・ドライブのタイプ(1つのTK50と1つのTA90など)を使用すると、データベースのリストアが困難または不可能になることがあります。

Oracle RMUは、バックアップ操作時に異なるテープ・ドライブの密度の使用を防ぐようにしますが、すべての無効なケースを検出することはできず、バックアップに対するすべてのテープ・ドライブのタイプが同じであると考えます。

バックアップ操作時に使用するすべてのテープを、リストア操作時に同じタイプのテープ・ドライブで読み取ることができる場合、バックアップが有効になる可能性が高くなります。たとえば、TA90とTA90Eを使用する場合などです。

基本的には、テスト・システムを使用して、バックアップ、リカバリ・プロシージャおよび環境をテストすることをお薦めします。本番システムの障害リカバリをシミュレートするには、データベースをリストアしてから、AIJを使用してリカバリする必要があります。

Oracle Rdbのバックアップ操作とリストア操作の詳細は、『Oracle Rdb7 Guide to Database Maintenance』、『Oracle Rdb7 Guide to Database Design and Definition』および『Oracle Rdb for OpenVMS Oracle RMUリファレンス・マニュアル』を参照してください。

11.3.6 RMU/VERIFYがPGSPAMENTエラーまたはPGSPMCLSTエラーをレポートする

RMU/VERIFYは、記憶域の検証時にPGSPAMENTエラーまたはPGSPMCLSTエラーをレポートすることがあります。これらのエラーは、特定のデータ・ページの領域管理ページ(SPAM)の全体しきい値が、データ・ページの実際の領域の使用量と一致していないことを示しています。SPAMページの詳細は、『Oracle Rdb7 Guide to Database Maintenance』を参照してください。

通常、これらのエラーは、データベースの操作に悪影響を及ぼすことはありません。データ・ページの領域が全体的に使用されていない可能性があるか、または新しい行を保存する領域を検索するときに少量の余分なI/Oが消費されてしまう可能性があります。ただし、これらのエラーが大量に発生しなければ、影響はほとんどありません。

このような非一貫性がOracle Rdbのエラーで生じる場合があります。このような状況が発生した場合は、非一貫性が生じないようにOracle Rdbを修正します。Oracle Rdbの通常操作でこれらのエラーが生じることもあります。次のシナリオでは、SPAMページが一貫していません。

  1. プロセスはページで行を挿入し、対応するSPAMページでしきい値エントリを更新してデータ・ページの新しい領域の使用を反映させます。データ・ページとSPAMページは、ディスクにフラッシュされません。
  2. 別のプロセスは、そのプロセスで保持するSPAMページにアクセスすることを最初のプロセスに通知します。最初のプロセスは、SPAMページの変更をディスクにフラッシュしてページを解放します。データ・ページはフラッシュされない点に注意してください。
  3. その後、最初のプロセスが異常終了します(たとえば、DCL STOP/IDENTIFICATIONコマンドから)。そのプロセスはデータ・ページをディスクにフラッシュしないため、リカバリ・ユニット・ジャーナル(RUJ)ファイルに変更を書き込むことはありません。RUJファイルでは、そのデータ・ページに関する変更がないため、データベース・リカバリ(DBR)プロセスはどの変更もページにロールバックする必要がありませんでした。データ・ページがディスクにフラッシュされない場合でも、SPAMページでは前述のしきい値の更新の変更が保持されます。

SPAMページが対応するデータ・ページと非同期にならないようにするメカニズムを作成できますが、パフォーマンスへの影響はささいなものではありません。これらのエラーは比較的珍しく、影響が重大ではないため、これらのエラーの発生は、Oracle Rdbの通常操作の一部とみなされます。エラーが前述のシナリオによるものではないことがわかった場合は、Oracleサポート・サービスに連絡してください。

PGSPAMENTエラーおよびPGSPMCLSTエラーを修正するには、次のいずれかの操作を実行します。

11.4 リリース7.0以前のすべてのインタフェースでの既知の問題と制限事項

リリース7.0以前から存在する、次の問題と制限事項について説明します。

11.4.1 単一ファイルのデータベースの変換

リリース7.0のデータベース・ルート・ファイルの情報は大幅に増加しているため、単一ファイルのデータベースとリリース7.0以上でRMU Convertコマンドを使用する前に、ディスク領域が十分にあることを確認する必要があります。

あるデータベースのデータベース・ルート・ファイルのサイズは、最大で約600ディスク・ブロック増加しています。実際の増加は、ほとんどの場合、データベースに指定した最大ユーザー数によって異なります。

11.4.2 行キャッシュと排他アクセス

表に行レベルのキャッシュが定義されている場合、Row Cache Server(RCS)が表に対する共有ロックを取得して、他のユーザーがその表に対する保護ロックまたは排他ロックを取得できないようにします。

11.4.3 排他アクセスのトランザクションがRCSプロセスでデッドロックになる

長期実行トランザクション(EXCLUSIVE WRITEの表を予約するREAD/WRITEアクセスをリクエストする)から表に頻繁にアクセスする場合、および表に複数の索引がある場合、ユーザー・プロセスとRow Cache Server(RCS)プロセスの間でデッドロックが発生することがあります。

この問題を回避するには、少なくとも3つの回避策が提案されます。

11.4.4 厳密なパーティション化によって、余分なパーティションがスキャンされる

演算子<または>や記憶域マップの境界値と同じ値を含むWHERE句を使用する場合、Oracle Rdbは余分なパーティションをスキャンします。境界値は、WITH LIMIT OF句で指定した値です。次の例は、論理名RDMS$DEBUG_FLAGSをSに定義して実行したもので、その動作を示しています。

ATTACH 'FILENAME MF_PERSONNEL';
CREATE TABLE T1 (ID INTEGER, LAST_NAME CHAR(12), FIRST_NAME CHAR(12));
CREATE STORAGE MAP M FOR T1 PARTITIONING NOT UPDATABLE
 STORE USING (ID)
 IN EMPIDS_LOW WITH LIMIT OF (200)
 IN EMPIDS_MID WITH LIMIT OF (400)
 OTHERWISE IN EMPIDS_OVER;
INSERT INTO T1 VALUES (150,'Boney','MaryJean');
INSERT INTO T1 VALUES (350,'Morley','Steven');
INSERT INTO T1 VALUES (300,'Martinez','Nancy');
INSERT INTO T1 VALUES (450,'Gentile','Russ');
SELECT * FROM T1 WHERE ID > 400;
Conjunct Get Retrieval sequentially of relation T1
Strict Partitioning: part 2 3
ID LAST_NAME FIRST_NAME
450 Gentile Russ
1 row selected

前述の例では、パーティション2をスキャンする必要はありません。このことが、結果の精度に影響を与えるわけではありません。ユーザーが余分なスキャンをしないようにするには、境界値以外の値を使用します。

11.4.5 ユーザーがデータベースにアタッチされる記憶域を追加する場合の制限事項

ページ・サイズが既存の最小ページ・サイズよりも小さな新しい記憶域を対話形式で追加しようとして、データベースを手動で開くかまたはユーザーがアクティブな場合、追加操作は失敗し、次のエラーが発生します。

%RDMS-F-NOEUACCESS, unable to acquire exclusive access to database

または

%RDB-F-SYS_REQUEST, error from system services request
-RDMS-F-FILACCERR, error opening database root DKA0:[RDB]TEST.RDB;1
-SYSTEM-W-ACCONFLICT, file access conflict

この変更は、ユーザーがデータベースにアタッチされていない場合、およびデータベースがOPEN IS MANUALに設定されて、データベースを終了する場合のみ行えます。Oracle Rdbの一部の内部データ構造は、ページの最小サイズに基づいており、ユーザーがデータベースにアタッチされる場合、これらの構造のサイズ変更はできません。

さらに、この特定の変更はAIJで記録されないため、リカバリのシナリオが失敗します。.aijファイルを使用する場合、この変更によって現在のAIJのリカバリが無効になるため、データベースをバックアップしてアフター・イメージ・ジャーナルを再起動する必要があります。

11.4.6 複数ブロックのページの書込みにはリストア操作が必要

複数ブロックのページがディスクに書き込まれているときにノードに障害が発生した場合、ディスクのページに一貫性がなくなり、フェイルオーバー時にすぐに検出されます。(フェイルオーバーは、アプリケーションを別のコンピュータ上で再起動するアプリケーションのリカバリです。)この問題はあまり発生しません。単一ブロックのI/O操作の自動的な書込みがOpenVMSで保証されるために発生します。この問題は、ユーザーからレポートされたことはありませんが、Oracleでのストレス・テスト中に検出されました。

領域レベルのリストア操作でページを修正します。データベースの整合性が危険にさらされることはありませんが、リストア操作が完了するまで影響のある領域は使用できません。

Oracle Rdbの将来のリリースでは、複数ブロックのアトミックな書込み操作を保証するソリューションが提供される予定です。クラスタのフェイルオーバーによって、複数ブロックのページが自動的にリカバリされるため、手動による操作は不要になります。

11.4.7 レプリケーション・オプションによるコピー・プロセスがアプリケーションより先にデータベース・ページを処理しない

レプリケーション・オプション(以前のデータ・ディストリビュータ)で開始されるコピー・プロセスのグループが、アプリケーションでデータベースの変更を開始した後に実行する場合、そのコピー・プロセスがアプリケーションを捕捉し、RDB$CHANGESシステム・リレーションで論理的にアプリケーションよりも先にあるデータベース・ページを処理できません。すべてのコピー・プロセスは、同じデータベース・ページの待機を調整し、アプリケーションが解放するまで移動しません。アプリケーションによってペースが調整されるため、各コピー・プロセスのパフォーマンスは低下します。

コピー・プロセスが各自のリモート・データベースへの更新を完了すると、RDB$TRANSFERSシステム・リレーションを更新してから、転送で不要なRDB$CHANGES行を削除しようとします。このプロセスでは、RDB$CHANGES表をアプリケーション・プロセスによって更新することはできません。削除プロセスが完了するまでデータベースの更新を待機します。アプリケーションは、RDB$CHANGES表を待機している間、停滞します。その結果、RDB$CHANGESのSPAMページとデータ・ページの競合が発生し、この競合がパフォーマンスのスループットに重大な影響を及ぼすため、通常の処理にユーザーが介入する必要があります。

これは、リリース4.0以上で既知の制限事項です。Oracle Rdbは、ページ・ロックをラッチとして使用します。これらのラッチは、ページでアクションの期間中のみ保持されます。トランザクションの終了まで保持されません。ページ・ロックには、ブロッキング非同期システム・トラップ(AST)も関連付けられています。そのため、プロセスがページ・ロックをリクエストするときは必ず、そのページ・ロックを保持するプロセスが、OpenVMSによってブロッキングAST(BLAST)に送信されます。このようなブロッキングASTを受け取るプロセスは、ページ・ロックをできるだけ早く解放する必要があることをキューします。ただし、ページ・ロックをすぐに解放することはできません。

ページ・ロックを解放する作業リクエストは、verbのコミット時に処理されます。Oracle Rdbのverbは、トランザクション内でアトミックに実行するOracle Rdbの問合せです。そのため、たとえば大きな表のスキャンを必要とするverbはかなり長くなることがあります。更新中のアプリケーションは、そのverbが完了するまでページ・ロックを解放しません。

verbが終了するまでページ・ロックを保持するのは、データベース管理システムの基本的な仕組みのためです。

11.5 Oracle Rdbリリース7.0以前の既知の問題と制限事項

Oracle Rdbリリース7.0以前から存在する、次の問題と制限事項について説明します。

11.5.1 LIKE IGNORE CASEを使用する場合のARITH_EXCEPTまたは不正な結果

LIKE...IGNORE CASE(Oracle Rdbリリース4.2とリリース5.1でリンクされるプログラム)を使用して、Oracle Rdbの上位のバージョンで実行する場合、不正な結果または%RDB-E-ARITH_EXCEPT例外が発生することがあります。

問題を回避するには、IGNORE CASEをLIKEと一緒に使用しないようにするか、または上位バージョン(リリース6.0以上)で再コンパイルして再度リンクします。

11.5.2 問合せから返される行を制限するための様々な方法

問合せから返される行の問合せガバナーを構築するには、SQLのSET QUERY LIMIT文または論理名のいずれかを使用します。次の注意事項は、2つのメカニズムの違いを示しています。

RDMS$BIND_QG_REC_LIMIT論理名を小さな値に定義すると、論理に割り当てる値に関係なく、問合せが行を返さずに失敗することが多くあります。次の例は、制限を10行に設定して、結果として発生する失敗を示しています。

$ DEFINE RDMS$BIND_QG_REC_LIMIT 10
$ SQL$
SQL> ATTACH 'FILENAME MF_PERSONNEL';
SQL> SELECT EMPLOYEE_ID FROM EMPLOYEES;
%RDB-F-EXQUOTA, Oracle Rdb runtime quota exceeded
-RDMS-E-MAXRECLIM, query governor maximum limit of rows has been reached

対話型SQLは、SELECT文を処理する前に、表のメタデータ・キャッシュをロードする必要があります。この例では、対話型SQLはメタデータ・キャッシュをロードして、列EMPLOYEE_IDが実際に表に対して存在するかどうかを確認できるようにします。Oracle Rdbシステム・リレーションRDB$RELATIONSおよびRDB$RELATION_FIELDSに対する問合せは、行の制限を超えています。

Oracle RdbはSELECT文を作成しません。もちろん実行もしません。制限を100よりも少ない数(EMPLOYEESのカーディナリティ)で、EMPLOYEESの列数よりも多い数(つまりRDB$RELATION_FIELDSシステム・リレーションから読み取る行数)に増やすと、各列の定義を読み取るには十分になります。

システム・リレーションに対して実行する問合せの指示を確認するには、RDMS$DEBUG_FLAGS論理名をSまたはBに定義します。

SQLのSET QUERY文を使用して行制限を設定し、同じ問合せを実行する場合、失敗する前にSQLのSET QUERY文で指定した行数が返されます。

 SQL> ATTACH 'FILENAME MF_PERSONNEL';
 SQL> SET QUERY LIMIT ROWS 10;
 SQL> SELECT EMPLOYEE_ID FROM EMPLOYEES;
 EMPLOYEE_ID
 00164
 00165
    .
    .
    .
 00173
 %RDB-E-EXQUOTA, Oracle Rdb runtime quota exceeded
 -RDMS-E-MAXRECLIM, query governor maximum limit of rows has been reached

SET QUERY LIMITは、ユーザーの問合せのみを10行に制限することを指定します。そのため、メタデータ・キャッシュのロードに使用する問合せは制限されません。

SET QUERY LIMIT文と同様に、SQLプリコンパイラとモジュール・プロセッサのコマンドライン修飾子(QUERY_MAX_ROWSおよびSQLOPTIONS=QUERY_MAX_ROWS)は、ユーザーの問合せのみを制限します。

論理名RDMS$BIND_QG_REC_LIMITを使用して返される行を制限する場合の違いに注意してください。これらの論理名は、明らかに多くの問合せを制限できます。これは、4GLツール(SQLプリコンパイラ、SQLモジュール・プロセッサ、Oracle Rdbシステム・リレーションを問合せ処理の一部として読み取るその他のインタフェース)を使用する場合に重要です。

11.5.3 パラレル索引作成にSHARED DATA DEFINITION句を最適に使用する場合の提案

CREATE INDEXプロセスでは、次の手順が必要です。

  1. メタデータを処理します。
  2. 索引名をロックします。
    新しいメタデータ(索引名を含む)は索引プロセスが終了するまでディスクに書き込まれないため、Oracle Rdbは、指定した索引名に特定のロックをかけることで、この期間のデータベース全体における索引名の一意性を確保する必要があります。
  3. 選択した索引列と順序に基づいてソートする表を読み取ります。
  4. キー・データをソートします。
  5. 索引(記憶域にまたがるパーティション化を含む)を作成します。
  6. 新しいメタデータをディスクに書き込みます。

手順6は、システム・リレーションと索引が他の更新済の表と同様にロックされているため、他の索引定義者との競合ポイントになります。

複数のユーザーが同じ表で索引を作成するには、SET TRANSACTION文のRESERVING table_name FOR SHARED DATA DEFINITION句を使用します。この機能を最適に使用するために、Oracle Rdbは次のガイドラインを提供します。

次の表は、SHARED DATA DEFINITION句を使用してパラレルで複数の索引を作成する場合の経過時間のメリットを示しています。この表は、10個のパラレル・プロセス索引の作成(Index1、Index2、...Index10)の経過時間と、10個連続の索引の作成(All10)を含む1つのプロセスを示しています。この例では、グローバル・バッファが有効であり、バッファの数は500です。パラレル索引作成での最長時間はIndex7で、経過時間は00:02:34.64です。これと比較して、10個連続の索引作成の経過時間は00:03:26.66です。1つのパラレル作成の索引の最長経過時間は、10個連続の索引作成の経過時間よりも短くなります。

表11-2 索引作成の経過時間
索引作成のジョブ 経過時間
Index1 00:02:22.50
Index2 00:01:57.94
Index3 00:02:06.27
Index4 00:01:34.53
Index5 00:01:51.96
Index6 00:01:27.57
Index7 00:02:34.64
Index8 00:01:40.56
Index9 00:01:34.43
Index10 00:01:47.44
All10 00:03:26.66

11.5.4 ストアド・ルーチンをコールする際の影響

ストアド・ルーチンをコールする場合、同じルーチンを使用して、ストアド・ファンクションで引数の値を計算しないでください。たとえば、コールするルーチンが引数の値の計算時にストアド・ファンクションからもコールされる場合、ルーチンに渡される引数は正しくないことがあります。

次の例は、ストアド・プロシージャPをコールする際に、引数の計算で同じストアド・プロシージャPを別に起動する状況を示しています。

SQL> create module M
cont>     language SQL
cont>
cont>     procedure P (in :a integer, in :b integer, out :c integer);
cont>     begin
cont>     set :c = :a + :b;
cont>     end;
cont>
cont>     function F () returns integer
cont>     comment is 'expect F to always return 2';
cont>     begin
cont>     declare :b integer;
cont>     call P (1, 1, :b);
cont>     trace 'returning ', :b;
cont>     return :b;
cont>     end;
cont> end module;
SQL>
SQL> set flags 'TRACE';
SQL> begin
cont> declare :cc integer;
cont> call P (2, F(), :cc);
cont> trace 'Expected 4, got ', :cc;
cont> end;
~Xt: returning 2
~Xt: Expected 4, got 3

前述に示した結果は正しくありません。ルーチンの引数の値は、複雑な式の値が計算される前に、コールされたルーチンのパラメータ領域に書き込まれます。これらの計算は、(例に示すように)以前にコピーされたデータを上書きします。

これを回避するには、引数の式(この例ではストアド・ファンクションFのコール)を一時変数に割り当て、この変数をルーチンの入力として渡します。次の例は、回避策を示しています。

SQL> begin
cont> declare :bb, :cc integer;
cont> set :bb = F();
cont> call P (2, :bb, :cc);
cont> trace 'Expected 4, got ', :cc;
cont> end;
~Xt: returning 2
~Xt: Expected 4, got 4

この問題は、Oracle Rdbの将来のバージョンで修正される予定です。

11.5.5 保留可能カーソルを使用する場合の考慮事項

アプリケーションで保留可能カーソルを使用する場合、COMMIT文またはROLLBACK文の実行後、カーソルで選択された結果セットが安定した状態に保たれないことに注意してください。つまり、コミットやロールバックが行われた後に保留可能カーソルで選択された行に対してロックがかけられていないため、他のユーザーによって行の挿入、更新および削除が行われることがあります。さらに、アクセス・ストラテジに応じて、Oracle Rdbが実際に行をフェッチする前に、まだフェッチされていない行が変更される場合があります。

その結果、同時実行ユーザー環境で保留可能カーソルを使用する場合、次の異常が発生することがあります。

保留可能カーソルは、読取り専用またはほとんどの部分が読取り専用の環境にとっては非常に強力な機能です。ただし、同時更新環境では、カーソルが不安定な状態は受け入れられません。更新環境での保留可能カーソルの安定性は、Oracle Rdbの将来のバージョンで解決される予定です。

論理名RDMS$BIND_HOLD_CURSOR_SNAPを値1に定義して、すべての保留カーソルが結果セットをキャッシュされたデータ領域にフェッチするようにできます。(キャッシュされたデータ領域は、SET FLAGS 'STRATEGY'文またはRDMS$DEBUG_FLAGSのSフラグで表示されるオプティマイザ・ストラテジの一時リレーションとして表示されます。)この論理名は、カーソルのある程度の安定に役立ちます。

11.5.6 AIJSERVER権限

セキュリティの理由から、AIJSERVERアカウント(RDMAIJSERVER)は、NETMBX権限およびTMPMBX権限でのみ作成されます。これらの権限は、ほとんどの場合、ホット・スタンバイを起動するのに十分です。

ただし、本番のホット・スタンバイ・システムの場合、これらの権限は、すべての環境と作業負荷の状況で連続したレプリケーションを確保するには十分ではありません。そのため、DBAがAIJSERVERアカウントに次の追加の権限を提供することをお薦めします。

| 目次