18.3.9での変更点

Oracle NoSQL Databaseリリース18.3.9 Enterprise Editionで次の変更が行われました。

新機能

  1. 再配布、ストア拡張、縮小などの拡張度操作中にストリームがサポートされるようになりました。特定のキーに適用されるイベントは、そのイベントが適用されたシャードに関係なく、ストアへの適用と同じ順序でストリームされます。この機能の前は、アクティブなサブスクライバを持つストアで拡張度操作を試みた場合、AdminFaultExceptionが発生しました。[#26662]

  2. 表名にネームスペース・コンポーネントが追加されました。

    問合せでは、ns:TableNameという形式のネームスペース修飾名を使用します。DDLでは、新しい文が追加されています(CREATE NAMESPACEおよびDROP NAMESPACE)。

    APIの変更点: TableAPI.listNamespaces()は、問合せで使用される未修飾名のネームスペースを指定するために、すべての既知のネームスペースおよびExecuteOptions.setNamespace()getNamespace()を返します。

    新しいシステム権限が2つあります。

    • CREATE_ANY_NAMESPACE

    • DROP_ANY_NAMESPACE

    また、ネームスペース・スコープを持つ新しい権限もあります。

    • CREATE_TABLE_IN_NAMESPACE

    • DROP_TABLE_IN_NAMESPACE

    • EVOLVE_TABLE_IN_NAMESPACE

    • CREATE_INDEX_IN_NAMESPACE

    • DROP_INDEX_IN_NAMESPACE

    • MODIFY_IN_NAMESPACE

    • READ_IN_NAMESPACE

    • INSERT_IN_NAMESPACE

    • DELETE_IN_NAMESPACE

    これらの権限は、次を使用して付与または取り消すことができます。

    GRANT namespace_privilege ON NAMESPACE ns0 TO role_name
    REVOKE namespace_privilege ON NAMESPACE ns0 FROM role_name
    [#26036]
  3. GeoJSONデータの問合せに関するサポートが追加されました。

    ノート:

    この機能は、Oracle NoSQL DatabaseのEnterprise Editionでのみ使用できます。

    GeoJSON仕様(https://tools.ietf.org/html/rfc7946)は、地球上の地理的形状(ジオメトリと呼ばれます)を描写することを目的としたJSONオブジェクトの構造およびコンテンツを定義します。Oracle NoSQL Databaseは、このようなJSONオブジェクトを実際にジオメトリとして解釈し、特定の条件を満たすジオメトリを含む行を検索できる多数の関数を実装します。GeoJSONデータに対して特殊索引を使用すると、検索を効率的に実行できます。

    たとえば、興味のある場所を行に格納した表を考えてみます。この表には、主キーとしてのid列、およびJSON型のpoi列があります。poi列の値は、次の2つのJSONドキュメントのようになります。

    {
      "kind" : "city hall",
      "address" : { "state" : "CA",
                    "city" : "Campbell",
                    "street" : "70 North 1st street"
                  },
      "location" : { "type" : "point", "coordinates" : [-121.94, 37.29] }
    } 
    
    {
      "kind" : "nature park",
      "name" : "castle rock state park",
      "address" : { "state" : "CA",
                    "city" : "Los Gatos",
                    "street" : "15000 Skyline Blvd"
                  },
      "location" : { "type" : "polygon",
                     "coordinates" : [
                                       [
                                         [-122.1301, 37.2330],
                                         [-122.1136, 37.2256],
                                         [-122.0920, 37.2291],
                                         [-122.1020, 37.2347],
                                         [-122.1217, 37.2380],
                                         [-122.1301, 37.2330]
                                       ]
                                     ]
                   }
    }

    これらの文書には両方とも、locationフィールドがあり、その値はGeoJSONオブジェクトです。最初のドキュメントでは、GeoJSONは、その座標(経度と緯度のペア)によって定義された1つの場所を表します。2番目のドキュメントでは、GeoJSONは、頂点の座標で定義されたポリゴンを表します。

    次の問合せでは、北カリフォルニア州の自然公園(近隣の州との境界にまたがる公園を含む)を探します。この問合せでは、北カリフォルニア州を2番目の引数として表すポリゴンを使用するgeo_intersect関数を使用します。

    select t.poi as park
    from PointsOfInterest t
    where t.poi.kind = "nature park" and
          geo_intersect(t.poi.location,
                        { "type" : "polygon",
                          "coordinates" : [
                                            [
                                              [-121.94, 36.28],
                                              [-117.52, 37.38],
                                              [-119.99, 39.00],
                                              [-120.00, 41.97],
                                              [-124.21, 41.97],
                                              [-124.39, 40.42],
                                              [-121.94, 36.28]
                                            ]
                                          ]
                        })

    次の問合せは、特定のルートの1マイル(1609m)以内にあるガソリン・スタンドを検索します。これには、適格なガソリン・スタンドごとのルートからの実際の距離も含まれます。この問合せでは、ルートを2番目の引数として表すLineStringを使用するgeo_near()関数を使用します。さらに、geo_near関数は、暗黙的なorder-by距離を加算します。その結果、問合せでは、返されたガソリン・スタンドがルートからの昇順の距離で順序付けされます。

    select t.poi as gas_station,
           geo_distance(t.poi.location,
                        { "type" : "LineString",
                          "coordinates" : [
                                           [-121.9447, 37.2975],
                                           [-121.9500, 37.3171],
                                           [-121.9892, 37.3182],
                                           [-122.1554, 37.3882],
                                           [-122.2899, 37.4589],
                                           [-122.4273, 37.6032],
                                           [-122.4304, 37.6267],
                                           [-122.3975, 37.6144]
                                         ]
                        }) as distance
    from PointsOfInterest t
    where t.poi.kind = "gas station" and
          geo_near(t.poi.location,
                   { "type" : "LineString",
                     "coordinates" : [
                                       [-121.9447, 37.2975],
                                       [-121.9500, 37.3171],
                                       [-121.9892, 37.3182],
                                       [-122.1554, 37.3882],
                                       [-122.2899, 37.4589],
                                       [-122.4273, 37.6032],
                                       [-122.4304, 37.6267],
                                       [-122.3975, 37.6144]
                                      ]
                    },
                    1609)

    前述の問合せはいずれも、次の索引を作成することで効率的に実行できます。

    create index idx_kind_loc on PointsOfInterest(poi.kind as string,
                                                  poi.location as geometry)
    [#27078]
  4. シーケンス集計関数が追加されました。

    次の関数が追加されました: seq_count、seq_sum、seq_avg、seq_minおよびseq_max。対応するSQL集計関数(count、sumなど)とは対照的に、シーケンス集計関数は行のグループ化を意味するものではなく、様々な行の値も集計しません。かわりに、単純に入力シーケンス内のアイテムを集計します。その際、対応するSQL集計関数と同じルールが使用されます。たとえば、seq_sumでは、入力シーケンス内の数値以外のアイテムがスキップされます。

    例として、様々なカテゴリの各ユーザーの費用が格納されたマップであるUsers表を考えてみます。この場合、次の問合せでは、ユーザーごとにそのid、housingを除くすべてのカテゴリの費用の合計、これらの費用の最大金額を選択します。

    select id,
           seq_sum(u.expenses.values($key != "housing")) as sum,
           seq_max(u.expenses.values($key != "housing")) as max
    from Users u
    [#27082]
  5. SQLのINSERT/UPSERT文が実装されました。

    この文は、新しい行を作成し、指定した表に挿入するために使用されます。INSERTキーワードが使用されている場合、行が存在していない場合のみ挿入されます。UPSERTキーワードが使用されている場合、行がまだ存在していなければ挿入され、存在していれば新しい行によって既存の行が置き換えられます。

    例として、次のCREATE TABLE文を考えてみます。

    create table Users (
      id INTEGER,
      firstName STRING,
      lastName STRING,
      otherNames ARRAY(RECORD(first STRING, last STRING)),
      age INTEGER,
      income INTEGER,
      address JSON,
      expenses MAP(INTEGER),
      PRIMARY KEY (id),
    )
    

    この場合、次に示すINSERT文は、idが10である行がまだ存在しない場合、新しい行を作成してUsers表に挿入します。

    insert into table users values (
        10,
        "John",
        "Smith",
        [ {"first" : "Johny", "last" : "BeGood"} ],
        22,
        45000,
        { "street" : "Main", "number" : 10, "city" : "Reno", "state" : "NV"},
        { "travel" : 5000, "books" : 2000 }
    ) set ttl 3 days

    前述の文でinsertのかわりにupsertキーワードが使用された場合、行がまだ存在していなければ新しい行が挿入され、存在していれば行の現在のバージョンが置き換えられます。[#27006]

  6. SQLのタイムスタンプに整数または長整数をキャストできるようになりました。整数/長整数は、当初からミリ秒数であると解釈されています。[#27006]

  7. 文字列をJSONインスタンスに変換するためにparse_json SQL関数が追加されました。[#27006]

  8. 表のIDENTITY列に対するサポートが追加されました。

    ユーザーは、シーケンス・ジェネレータを使用するIDENTITY列を持つ表を作成できます。IDENTITY列は数値データ型です。つまり、内部シーケンス・ジェネレータ(SG)を使用して一意の番号が自動的に生成されて列に付加されるINTEGER、LONG、NUMBERです。1つの表には1つのIDENTITY列のみを使用できます。ユーザーは、シーケンス・ジェネレータに対して属性START WITH (デフォルト=1)、INCREMENT BY (デフォルト=1)、MINVALUE (デフォルト=データ型の最小値)、MAXVALUE(デフォルト=データ型の最大値)、CACHE(デフォルト=1000)、CYCLEまたはNO CYCLE(デフォルト=NO CYCLE)を指定できます。

    IDENTITY列は、GENERATED ALWAYSまたはGENERATED BY DEFAULTのいずれかとして定義できます。GENERATED ALWAYSオプションでは、常にIDENTITY列の値が生成され、ユーザーがその値を指定するとエラーが返されます。GENERATED BY DEFAULTオプションでは、IDENTITY列の値は、ユーザーが値を指定しなかった場合のみ生成されます。

    ユーザーはまた、ALTER TABLE DDLを使用してIDENTITY列プロパティおよびSG属性を変更することもできます。IDENTITY列を定義および変更するために、CREATE TABLEおよびALTER TABLE構文をそれぞれ使用した新しい構文が導入されています。次に例を示します。

    CREATE Table t1 (id INTEGER GENERATED ALWAYS AS IDENTITY 
      (START WITH 1 INCREMENT BY 2 MAXVALUE 100),
    name STRING, PRIMARY KEY (id))

    これにより、値1、3、5から最大99まで生成される表t1が作成されます。CACHEおよびCYCLE属性をSGに追加する場合は、次のALTER TABLE文を発行できます。

    ALTER Table t1 (ADD id INTEGER GENERATED ALWAYS AS IDENTITY
      (CACHE 3, CYCLE))

    idのIDENTITYプロパティを削除するには、次に示すように実行できます。

    ALTER Table t1 (MODIFY id DROP IDENTITY)
    

    SQL文(INSERT、UPSERTおよびUPDATEまたはTable.Api - PUT、PUTIFPRESENTおよびPUTIFABSENT)の実行中にIDENTITY列の値が生成されます。IDENTITY列が関係する場合のこれらのセマンティクスについては、Oracle NoSQL Databaseのドキュメントを参照してください。

    [#25154]
  9. JVMのオーバーヘッド率に関してユーザー指定可能な新しいポリシー・パラメータが追加されました。

    コマンドchange-policy -params [name=value].jvmOverheadPercentという名前の新しいポリシー・パラメータを追加します。指定しない場合、デフォルトは25.です

    [#27089]
  10. 新しいマイグレータ・ツールが追加されました。マイグレータ・ユーティリティを使用すると、(mongoexportユーティリティを使用してエクスポートされた)厳密モード表現のMongoDB JSONエントリまたは通常のJSONエントリをOracle NoSQL Databaseストアにインポートできます。これはプレビュー・バージョンです。将来のリリースでは、IMPORT/EXPORTを使用して統合された一般的な可用性バージョンが使用できるようになります。

  11. REST APIを介して管理コマンドが追加されました。管理REST APIを使用すると、Oracle NoSQL Databaseストアに対するHTTPまたはHTTPS要求を通じて管理コマンドを実行できます。要求および応答ペイロードはJSON形式です。ユーザーはcurlのようなユーティリティを使用して、ストアに対して管理コマンドを実行できます。

    [#26596]
  12. KVStoreConfigには、KVStoreに接続する際にクライアント・マシン上でローカル・アドレスを指定することを可能にする新しい構成オプションがあります。そのような構成では、複数のNICを持つクライアント・マシンで実行する際にネットワーク・トラフィック制御の追加レベルが許可されます。詳細は、oracle.kv.KVStoreConfig.setLocalAddress(InetSocketAddress)に関連するjavaドキュメントを参照してください。

    [#26879]

バグとパフォーマンスの修正

  1. キャストのバグが修正されました。

    1. 数値への文字列のキャストが正しくありませんでした。

    2. 任意の種類の値を文字列にキャストできる必要がありますが、そうではありませんでした。

    3. マップをレコードにキャストする際、JSON nullのキャストがサポートされていませんでした。

    4. 空の文字列をタイムスタンプにキャストしようとすると、StringIndexOutOfBoundsExceptionが発生しました。現在は、IllegalArgumentExceptionが適切なメッセージとともに発生します。

    [#27006]
  2. UPDATE文のバグが修正されました。文にRETURNING句があるときに、行の新しいバージョンが設定されませんでした。

    [#27006]
  3. サーバーからストリームAPIクライアントにセキュリティ・チェック失敗応答が返されるようになりました。

    [#26091]
  4. alter tableによって表の存続時間(TTL)設定が誤って削除される問題が修正されました。

    [#26983]
  5. キー統計パラメータに対して次の変更が行われました。

    • rnStatisticsSleepWaitDurationのデフォルト値が1 secondから60 secondsに変更されました

    • rnStatisticsGatherIntervalには、60 seconds以上の値が必要です。rnStatisticsGatherInterval60 secondsより小さい値に設定されている場合、その値には60 secondsが使用されます。

    • rnStatisticsLeaseDurationの値は1日(24時間)以下である必要があります。rnStatisticsLeaseDurationが1日より大きい値に設定されている場合、値として1日が使用されます。

    • rnStatisticsSleepWaitDurationには、10 seconds以上でrnStatisticsGatherInterval以下の値が必要です。rnStatisticsSleepWaitDuration10 seconds未満に設定されている場合、10 secondsの値が使用されます。rnStatisticsSleepWaitDurationrnStatisticsGatherIntervalより大きい値に設定されている場合、rnStatisticsGatherIntervalの値が使用されます。

    RNが起動したとき、またはパラメータ値が変更されたときは、各RNでパラメータ値がチェックされます。キー統計パラメータのいずれかが上書きされると、1つ以上の警告メッセージがRNログに表示されます。

    [#26939]
  6. 18.1リリースで導入されたversionCheckInterval管理サービス・パラメータのスペルが修正されました。このリリース以降、スペルが間違っているverionCheckIntervalパラメータに指定された値は無視されるため、正しいスペルを使用して再度指定する必要があります。

    [#27000]
  7. このリリースにアップグレードする場合、再配分、リバランスおよび縮小などの一部の拡張度操作では、ノードはすべて、起動または再開する前にアップグレードする必要があります。

    影響を受ける拡張度操作は、あるシャードから別のシャードにデータを移行する必要がある操作です。

    アップグレードの開始時にこれらの操作のいずれかが実行されている場合、またはアップグレード中に開始された場合、その操作はアップグレードが完了するまで一時停止します。アップグレードが完了すると、拡張度操作が再開されます。

    [#26943]
  8. DurabilityExceptionクラスには、このDurabilityExceptionを生成した操作に副作用がないことがわかっているかどうかを返す新しいメソッドgetNoSideEffectsがあります。変更操作の実行中にDurabilityExceptionを受け取り、getNoSideEffects()がtrueを返すことが判明したアプリケーションでは、操作によって要求された変更が1つも実行されていないと想定しても差しつかえなく、操作を再試行できます。falseが返された場合、操作の副作用があったかどうかは不明です。

    [#27073]
  9. メモリー割当ての計算で、JVMオーバーヘッドが考慮されるようになりました。要求されたJavaヒープ・サイズ用に予約されたSNメモリーの割合をrnHeapPercentで表すようになりました。また、JVMで使用された追加メモリーを、要求されたJavaヒープ・サイズの割合として表す新しいユーザー指定可能パラメータjvmOverheadPercentが追加されます。jvmOverheadPercentのデフォルト値は25です。

    デフォルトのSNメモリー割当ては次のとおりです。

    • Javaヒープおよびオーバーヘッド用として85%

      • 要求Javaヒープ・サイズ(rnHeapPercent)として68%

      • 25% (jvmOverheadPercent) * 68 (rnHeapPercent)= JVMオーバーヘッド用として17%

    • オペレーティング・システム用として10% (systemPercent)

    • オフヒープ・キャッシュ用として5% (残り)

    [#27089]
  10. NullValue外部変数を使用して実行する問合せでUnsupportedOperationException.が発生しないバグが修正されました。

    [#27177]
  11. ストア内に索引が存在する場合の拡張度操作(トポロジの再分散、リバランスおよび縮小)でいくつかのバグが修正されました。これらの修正には、索引が破損したときに再構築する新機能が含まれます。

    [#26856] [#27024] [#27189]
  12. 問合せ操作中にRNが誤って再起動する原因となった例外処理の問題が修正されました。

    [#27183]
  13. 次のような例外が発生し、RNが使用できなくなる原因となったバグが修正されました。このバグはバージョン18.1.20より前のバージョン18.1にありました。これは、ストアの存続期間中に336以上の表が作成される一定の状況下で発生する可能性があります。

    2018-08-29 14:16:12.965 UTC SEVERE [rg1-rn1] Process exiting
    oracle.kv.impl.rep.EnvironmentFailureRetryException: com.sleepycat.je.EnvironmentFailureException: (JE +18.1.xx)
    Environment must be closed, caused by: com.sleepycat.je.EnvironmentFailureException:
    Environment invalid because of previous exception: (JE 18.1.xx)
    rg1-rn1(1):/DATA00/rg1-rn1/env fetchLN of 0x6030/0x95727f6 parent IN=130 IN class=com.sleepycat.je.tree.BIN
    lastFullLsn=0x6039/0x1e1138 lastLoggedLsn=0x603a/0x60ac3e parent.getDirty()=false state=0
    expires=2018-09-02.00 LOG_FILE_NOT_FOUND: Log file missing, log is likely invalid.
    Environment is invalid and must be closed.
            at oracle.kv.impl.api.RequestHandlerImpl.executeInternal(RequestHandlerImpl.java:934)
            at oracle.kv.impl.api.RequestHandlerImpl.executeRequest(RequestHandlerImpl.java:682)
            at oracle.kv.impl.api.RequestHandlerImpl.trackExecuteRequest(RequestHandlerImpl.java:649)
            at oracle.kv.impl.api.RequestHandlerImpl.access$100(RequestHandlerImpl.java:153)
            at oracle.kv.impl.api.RequestHandlerImpl$2$1.run(RequestHandlerImpl.java:523)
            at oracle.kv.impl.api.RequestHandlerImpl$2$1.run(RequestHandlerImpl.java:520)
            at oracle.kv.impl.security.ExecutionContext.runWithContext(ExecutionContext.java:192)
    ...
    [#27199]

ユーティリティの変更点

  1. 問合せおよび表操作のネームスペースを設定またはクリアするnamespace [namespace]コマンドが管理CLIおよびSQLシェルに追加されしました。

  2. 特定のネームスペース内のすべての表をエクスポート/インポートする-namespace <namespaces>がエクスポート/インポート・ユーティリティに追加されました。

  3. verify configurationおよびpingコマンド出力にstoragedirおよびavailableLogSize情報が追加されました。RNでディスク不足制限の例外が発生した場合、verify configuration出力で違反が発生します。availableLogSize5 GB未満になった場合、verify configuration出力で警告ノートが発行されます。

    [#25458]
  4. Pingおよびverifyでは、レプリケーション・ノードに関する読取り専用ステータスが表示されるようになりました。

    [#26469][#26711]