BLOB Usage and Notes (ja) #126
akirakw
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
BLOB の利用方法と注意点
Tsurugi 1.3.0 より、試験的機能として BLOB, CLOB 型のカラムをサポートしました。
このドキュメントでは、BLOB, CLOB 型の利用方法と注意点について解説します。
なお、本機能は試験的なものであり、今後のバージョンで仕様が変更される可能性があります。
BLOB, CLOB 型の特徴
BLOB, CLOB 型は、バイナリデータやサイズが大きな文字列データを格納するためのデータ型です。
Tsurugi はインメモリ型のデータベースであり、基本的には小さなデータを大量に処理することに最適化してデザインしています。
対して、BLOB, CLOB 型のデータは基本的に大きなデータであるため、Tsurugi はそれらのデータをメモリ上には保持せず、ファイルシステム上に保存することでメモリの使用量を削減しています。
上記のような関係で、BLOB, CLOB 型はほかのデータ型と比べて利用時の特性が異なる場合があります。
以下に例を挙げます:
=
,<>
,IN
,GROUP BY
,DISTINCT
など) や順序比較 (<
,>
,ORDER BY
, インデックスキーとしての利用など) ができないなお、Tsurugi 上に記録した BLOB, CLOB データのファイルは、BLOB または CLOB データを含む行が参照されなくなった後に自動的に削除されます。
Tsurugi ではマルチバージョン並列性制御 (MVCC) 方式を採用しているため、
DELETE
文等で行を削除しても即座にそのファイルが削除されるわけではありません。詳しくは BLOB のライフサイクル を参照してください。
現状における BLOB, CLOB 型のサポート状況
現状の Tsurugi では、BLOB, CLOB 型のデータ (以下、BLOBデータ) をクライアント・サーバ間で交換する際に、ローカルファイルシステムを経由して行います。
これを「特権モード (privileged mode)」とよび、以下のような制約があります。
tsurugidb
プロセスが読み出し可能でなければならないtsurugidb
プロセスが作成した BLOB データのファイルを、クライアントが読み出し可能でなければならないtsurugi.ini
のdatastore
セクション、log_location
で指定したディレクトリ配下にblob
というフォルダを作成し、その配下に個別のファイルを配置しますまた、上記のファイルをやり取りする際、クライアント・サーバそれぞれから見て同一のファイルシステム上の、同一のパスでファイルにアクセスできなければなりません。
例えば、TCP接続 (
tcp://host:port
) でリモートのサーバに接続する場合、ファイルシステムが異なるため、 BLOB データのやり取りに失敗します。また、IPC 接続であっても Docker などを利用している場合、クライアントとサーバでファイルパスの解釈が異なるため、同様に失敗する可能性があります。
特権モードの制約を満たしていない状況では、以下のようなエラーメッセージが表示されます:
クライアントからBLOB データの登録(INSERT文など)に失敗する例: クライアントが指定したBLOB データのファイルパスがサーバ上で見つからなかった場合
クライアントからBLOB データを参照(SELECT文実行後、BLOB データの取得)に失敗する例: サーバが管理するBLOB データのファイルパスがクライアント上で見つからなかった場合
なお、上記のような問題を解決するため、以下の2点の改善を計画しています:
また、特権モードには注意すべきセキュリティ上の問題があります。
詳しくは 特権モードのセキュリティ を参照してください。
BLOB, CLOB 型の列を定義する
BLOB, CLOB 型の列を定義するには、
CREATE TABLE
文のカラム定義に、それぞれBLOB
またはCLOB
を指定します。なお、
BLOB
,CLOB
型にはそれぞれ別名があります:BINARY LARGE OBJECT
CHARACTER LARGE OBJECT
CHAR LARGE OBJECT
SQL コンソールから BLOB, CLOB 型の列を参照する
tgsql
コマンドを利用して BLOB, CLOB 型のデータを取得するには、以下のように記述します:注意点として、
SELECT
文の結果セットに含まれる BLOB, CLOB 型のデータを取得するには、そのSELECT
文を実行したトランザクションが終了するまでの間に実施する必要があります。トランザクションが終了すると、その結果セットに含まれる BLOB, CLOB 型のデータは利用不可能になります。
なお、現時点では
tgsql
コマンド経由で BLOB, CLOB 型のデータをテーブルに登録する仕組みは提供していません。tgsql
のBLOB, CLOB 型に対する機能の詳細については、以下のドキュメントを参照してください。アプリケーションから BLOB, CLOB 型の列にデータを挿入する (Iceaxe)
Iceaxe が提供するAPIを利用して BLOB, CLOB 型の列にデータを挿入するには、以下のようなプログラムを作成します:
アプリケーションから BLOB, CLOB 型の列を参照する (Iceaxe)
Iceaxe が提供するAPIを利用して BLOB, CLOB 型の列を参照するには、以下のようなプログラムを作成します:
IceaxeのBLOB, CLOB 型に対する機能の詳細については、以下のドキュメントを参照してください。
低レベルJava APIの利用方法 (Tsubakuro)
Tsubakuro が提供するAPIを利用して BLOB, CLOB 型の列にデータを挿入するには、以下のようなプログラムを作成します:
Tsubakuro が提供するAPIを利用して BLOB, CLOB 型の列を参照するには、以下のようなプログラムを作成します:
また、TransactionインターフェースではBLOBを扱ういくつかのユーティリティメソッドも提供しています:
TsubakuroのAPI詳細については、以下のJavadocを参照してください。
BLOB, CLOB 型の型変換
BLOB, CLOB 型はCASTにより以下の型変換が可能です。
型変換に詳しくは、以下のドキュメントを参照してください。
ファイルパスの変換
[FROM Tsurugi 1.4.0] Tsurugi 1.4.0 でファイルパスの変換機能とAPIが提供されました。
/opt/tsurugi/var/logs/blob
上に BLOB ファイルが配備されている際、それをクライアントはC:\Users\dba\AppData\Local\Tsurugi\logs\blob
に読み替えてアクセスすることが可能ですIceaxe
Iceaxe では以下のようにファイルパスの変換ルールを指定します。
Tsubakuro
Tsubakuro では以下のようにファイルパスの変換ルールを指定します。
高度な話題
特権モードのセキュリティ
現状の Tsurugi では、特権モード (privileged mode) により、クライアント・サーバ間において BLOB データの交換を行っています。
この特権モードは、ファイルシステムを介して BLOB データを交換するため、「サーバの
tsurugidb
プロセスの権限を利用して、本来アクセスできないはずのファイルを読めてしまう」というセキュリティ上の問題があります。このため、 TCP 接続ではデフォルトで特権モードの利用が無効になっています。
有効にするには、
tsurugi.ini
のstream_endpoint
セクションにおいてallow_privileged_mode
をtrue
に設定します。(Tsurugi Dockerコンテナでは
stream_endpoint.allow_privileged_mode
はデフォルトでtrue
に設定されています)また、上記に対応するため、「許可リスト」の導入を予定しています。
これは、サーバが BLOB データのファイルパスを受け取った際、許可リストに含まれないディレクトリの配下であれば、それを拒否するという仕組みです。
これにより、「本来アクセスできないはずのファイルを読めてしまう」という問題の大半を解消します。
BLOB のライフサイクル
BLOB データは、クライアントからの要請 (例: SQLのプレースホルダに対する指定) によって作成され、Tsurugi 内に保存します。
このとき、ログ (WAL) データを格納しているディレクトリ (
datastore.log_location
) の下にblob
というディレクトリを作成し、その配下に BLOB ごとに個別のファイルを作成します。BLOB データは、不要になった際にガベージコレクション機構によって自動的に削除されます。
これはつまり、
DELETE
文やDROP TABLE
文を実行しても、即座に BLOB データが削除されるわけではありません。具体的には、次の 3 つのステップで削除が行われます:
DELETE
文等を実行)上記のような仕組みで BLOB データを管理しているため、BLOB データを取得するには、その行を取得したトランザクション内で、 BLOB データを取り出す必要があります。
なぜなら、当該トランザクションが終了すると、2番目の手順によってガベージコレクションの境界が替わり、当該 BLOB データが削除される可能性があるためです。
なお、ガベージコレクションを実際に実行するには、以下のいずれかの操作が必要です:
バックアップ・リストアについて
バックアップ・リストアにおいて BLOB, CLOB を含むテーブルデータを対象とする場合、上述の
blob
ディレクトリの配下で管理している BLOB ファイルもバックアップ・リストアの対象となります。tgctl backup create
コマンドでバックアップを作成する際、BLOB, CLOB ファイルもバックアップに含まれます。tgctl restore backup
コマンドでバックアップをリストアする際、バックアップに含まれる BLOB, CLOB ファイルもリストアされます。Beta Was this translation helpful? Give feedback.
All reactions