AWS Database Migration Service のターゲットとしての Amazon DynamoDB データベースの使用 - AWS Database Migration Service

「翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。」

AWS Database Migration Service のターゲットとしての Amazon DynamoDB データベースの使用

を使用して、 AWS DMS テーブルにデータを移行できます。 Amazon DynamoDB は、高速で予測可能なパフォーマンスとシームレスなスケーラビリティを実現する完全マネージド型Amazon DynamoDBデータベースサービスです。 NoSQL は、リレーショナルデータベースまたは をソースAWS DMSとしてサポートしています。MongoDB

DynamoDB では、テーブル、項目、および属性が、操作するコアコンポーネントです。テーブルは項目のコレクションであり、各項目は属性のコレクションです。DynamoDB はプライマリキー (パーティションキーと呼ばれる) を使用してテーブルの各項目を一意に識別します。より柔軟なクエリを提供するために、キーおよびセカンダリインデックスを使用することもできます。

ソースのデータベースから、ターゲット DynamoDB テーブルにデータを移行するために、オブジェクトのマッピングを使用します。オブジェクトのマッピングを使用すると、ソースデータがターゲットのどこにあるか判定できます。

AWS DMS が DynamoDB ターゲットエンドポイントでテーブルを作成するときに、ソースデータベースのエンドポイントと同じ数のテーブルを作成します。また、AWS DMS はいくつかの DynamoDB パラメータ値も設定します。テーブル作成のコストは、データの量および移行するテーブルの数によって異なります。

転送の速度を高めるために、AWS DMS は DynamoDB ターゲットインスタンスへのマルチスレッドフルロードがサポートされています。DMS では、このマルチスレッドでのタスク設定を、以下でサポートします。

  • MaxFullLoadSubTasks – 並行してロードするソーステーブルの最大数を指定するには、このオプションを使用します。DMS は、専用のサブタスクを使用して、対応する DynamoDB ターゲットテーブルに各テーブルをロードします。デフォルト値は 8 です。最大の値は 49 です。

  • ParallelLoadThreads – AWS DMS が各テーブルを DynamoDB ターゲットテーブルにロードするために使用するスレッドの数を指定するには、このオプションを使用します。デフォルト値は 0 (シングルスレッド) です。最大の値は 200 です。この上限を増やすよう依頼できます。

  • ParallelLoadBufferSize – DynamoDB ターゲットにデータをロードするために並列ロードスレッドが使用する、バッファ内に保存するレコードの最大数を指定するには、このオプションを使用します。デフォルト値は 50 です。最大値は 1000 です。この設定は ParallelLoadThreads で使用します。ParallelLoadBufferSize は、複数のスレッドがある場合にのみ有効です。

  • 個々のテーブルのテーブルマッピング設定 – table-settings ルールを使用して、並行してロードするソースから個々のテーブルを識別します。また、これらのルールを使用して、各テーブルの行をマルチスレッドロード用にセグメント化する方法を指定します。詳細については、を参照してください テーブルおよびコレクション設定のルールとオペレーション

    注記

    DMS は、テーブルの各セグメントを独自のスレッドに割り当てロードします。したがって、ParallelLoadThreads をソースのテーブルに指定するセグメントの最大数に設定します。

AWS DMS が移行タスクの DynamoDB パラメータ値を設定するときに、デフォルトの読み込みキャパシティーユニット (RCU) パラメータ値が 200 に設定されます。

書き込みキャパティティーユニット (WCU) のパラメータ値も設定されますが、その値は他のいくつかの設定によって異なります。

  • WCU パラメータのデフォルト値は 200 です。

  • ParallelLoadThreads タスク設定が 1 より大きい値に設定された場合 (デフォルトは 0)、WCU パラメータは ParallelLoadThreads 値の 200 倍に設定されます。

  • 米国東部(バージニア北部) リージョン (us-east-1) では、使用可能な最大 WCU パラメータ値は 40,000 です。AWS リージョンが us-east-1 で、WCU パラメータが 40,000 より大きい場合、WCU パラメータ値は 40,000 に設定されます。

  • us-east-1 以外の AWS リージョンでは、使用可能な最大 WCU パラメータは 10,000 です。us-east-1 以外の AWS リージョンでは、WCU パラメータが 10,000 より大きい値に設定された場合、WCU パラメータ値は 10,000 に設定されます。

リレーショナルデータベーステーブルから DynamoDB テーブルへの移行

AWS DMS は、DynamoDB のスカラーデータ型へのデータの移行をサポートしています。Oracle や MySQL などのリレーショナルデータベースから に移行する場合は、データを格納する方法を再編成が必要となる場合があります。DynamoDB

現在 AWS DMS は、単一テーブルから単一テーブルに移行する場合の、DynamoDB のスカラー型属性への再構成をサポートしています。リレーショナルデータベースのテーブルから DynamoDB にデータを移行する場合、テーブルからデータを取得し、DynamoDB のスカラーデータ型属性に形式を変更します。これらの属性は複数の列からデータを受け入れることができるため、列を属性に直接マッピングすることができます。

AWS DMS は以下の DynamoDB のスカラーデータ型をサポートしています。

  • 文字列

  • 数値

  • Boolean

注記

ソースからの NULL データは、ターゲットで無視されます。

AWS Database Migration Service のターゲットとして DynamoDB を使用する場合の前提条件

AWS DMS のターゲットとして DynamoDB データベースの使用を開始する前に、IAM ロールを必ず作成します。この IAM ロールは、AWS DMS によって引き受けることができ、移行先の DynamoDB テーブルへのアクセスを付与できることが必要です。アクセス許可の最小設定は、次の IAM ポリシーで示します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "dms.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

DynamoDB に移行する際に使用するロールには、次のアクセス許可が必要です。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:CreateTable", "dynamodb:DescribeTable", "dynamodb:DeleteTable", "dynamodb:DeleteItem", "dynamodb:UpdateItem" ], "Resource": [ "arn:aws:dynamodb:us-west-2:account-id:table/name1", "arn:aws:dynamodb:us-west-2:account-id:table/OtherName*", "arn:aws:dynamodb:us-west-2:account-id:table/awsdms_apply_exceptions", "arn:aws:dynamodb:us-west-2:account-id:table/awsdms_full_load_exceptions" ] }, { "Effect": "Allow", "Action": [ "dynamodb:ListTables" ], "Resource": "*" } ] }

AWS Database Migration Service のターゲットとして DynamoDB を使用する場合の制限

ターゲットとして DynamoDB を使用する場合、以下の制限が適用されます。

  • DynamoDB は、数値データ型の最大精度を 38 に制限します。文字列として高い精度のすべてのデータ型を保存します。オブジェクトマッピング機能を使用して、これを明示的に指定する必要があります。

  • DynamoDB に Date データ型はないため、Date データ型を使用しているデータは、文字列に変換されます。

  • DynamoDB はプライマリキー属性を更新しません。この制限は、ターゲットで不要なデータが発生する可能性があるため、変更データキャプチャ (CDC) で継続的なレプリケーションを使用する場合に重要です。オブジェクトのマッピング方法に応じて、プライマリキーを更新する CDC オペレーションは 2 つのうちのいずれかを実行できます。これは、更新されたプライマリキーおよび不完全なデータがある新しい項目を挿入できるか、あるいは失敗するかのいずれかです。

  • AWS DMS は、非複合プライマリキーを含むテーブルのレプリケーションのみをサポートします。例外は、カスタムパーティションキーまたはソートキー、あるいはその両方があるターゲットテーブルにオブジェクトマッピングを指定する場合です。

  • AWS DMS は、CLOB でない限り LOB データはサポートしません。AWS DMS は、データの移行時に CLOB データを DynamoDB 文字列に変換します。

  • をターゲットDynamoDBとして使用するときは、例外適用制御テーブル (dmslogs.awsdms_apply_exceptions) のみがサポートされます。統制テーブルの詳細については、「制御テーブルタスク設定」を参照してください。

DynamoDB にデータを移行するためのオブジェクトマッピングの使用

AWS DMS は、ソースからターゲット DynamoDB テーブルにデータをマッピングするためのテーブルマッピングルールを使用します。DynamoDB ターゲットにデータをマッピングするために、オブジェクトマッピングと呼ばれるテーブルマッピングルールのタイプを使用します。オブジェクトマッピングにより、移行するデータの属性名とデータを定義できます。オブジェクトマッピングを使用するときは選択ルールが必要です。

DynamoDB には、パーティションのキーとオプションのソートキー以外に、プリセット構造はありません。非複合プライマリキーが存在する場合は、AWS DMS はそのキーを使用します。複合プライマリキーがある場合、またはソートキーを使用する必要がある場合は、ターゲット DynamoDB テーブルでそれらのキーと他の属性を定義します。

オブジェクトマッピングルールを作成するには、rule-typeobject-mapping として指定します。このルールが、使用したいオブジェクトマッピングのタイプを指定します。

ルールの構造は次のとおりです。

{ "rules": [ { "rule-type": "object-mapping", "rule-id": "<id>", "rule-name": "<name>", "rule-action": "<valid object-mapping rule action>", "object-locator": { "schema-name": "<case-sensitive schema name>", "table-name": "" }, "target-table-name": "<table_name>" } ] }

AWS DMS では現在、rule-action パラメータに対する有効な値として map-record-to-record および map-record-to-document のみがサポートされています。これらの値は、exclude-columns 属性リストの一部として除外されてないものとして AWS DMS がデフォルトで記録するものを指定します。これらの値は、どのような方法でも属性マッピングに影響しません。

  • リレーショナルデータベースから DynamoDB に移行するときに map-record-to-record を使用できます。DynamoDB のパーティションキーとしてリレーショナルデータベースからプライマリキーを使用し、ソースデータベース内の各列の属性を作成します。map-record-to-record を使用する場合、exclude-columns 属性リストに示されていないソーステーブル内のすべての列について、AWS DMS はターゲット DynamoDB インスタンスに対応する属性を作成します。これは、そのソース列が属性マッピングで使用されているかどうかにかかわらず作成されます。

  • map-record-to-document を使用して、ターゲットの 1 つのフラット DynamoDB マップに "_doc." 属性名でソース列を配置します。map-record-to-document を使用する場合、AWS DMS はソースの 1 つのフラットな DynamoDB マップ属性にデータを配置します。この属性は "_doc." と呼ばれます。この配置は、exclude-columns 属性リストに含まれていないソーステーブル内のすべての列に適用されます。

rule-action パラメータの map-record-to-recordmap-record-to-document の違いを理解する 1 つの方法は、この 2 つのパラメータの動作を確認することです。この例では、次の構造とデータを含むリレーショナルデータベースのテーブルから始めると想定してください。


                    例のためのサンプルデータベース

この情報を DynamoDB に移行するには、データを DynamoDB テーブル項目にマッピングするルールを作成します。パラメータにリストされている exclude-columns 列を書き留めてください。これらの列はターゲットに直接マッピングされていません。その代わりに、データを新しい項目 (ターゲット上の場所FirstNameとグループ化LastName) に組み合わせるために、属性マッピングが使用されます。CustomerNameDynamoDBNickName収益は除外されません。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "object-mapping", "rule-id": "2", "rule-name": "TransformToDDB", "rule-action": "map-record-to-record", "object-locator": { "schema-name": "test", "table-name": "customer" }, "target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "exclude-columns": [ "FirstName", "LastName", "HomeAddress", "HomePhone", "WorkAddress", "WorkPhone" ], "attribute-mappings": [ { "target-attribute-name": "CustomerName", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${FirstName},${LastName}" }, { "target-attribute-name": "ContactDetails", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": { "M": { "Home": { "M": { "Address": { "S": "${HomeAddress}" }, "Phone": { "S": "${HomePhone}" } } }, "Work": { "M": { "Address": { "S": "${WorkAddress}" }, "Phone": { "S": "${WorkPhone}" } } } } } } ] } } ] }

rule-actionパラメータ map-record-to-record を使用することでNickName収益はDynamoDBターゲットの同じ名前の項目にマッピングされます。


                    AWS DMS の開始方法

ただし、同じルールを使用しますが rule-action パラメータを map-record-to-document に変更するとします。この場合、exclude-columnsパラメータにリストされていない列NickName収益は_doc 項目にマッピングされます。


                    AWS DMS の開始方法

オブジェクトマッピングでのカスタム条件式の使用

DynamoDB テーブルに書き込まれているデータを操作するための条件式と呼ばれる DynamoDB の機能を使用することができます。DynamoDB の条件式の詳細については、「条件式」を参照してください。

条件式のメンバーは次から構成されます。

  • 式 (必須)

  • 式の属性値 (オプション) 属性値の DynamoDB json 構造を指定します

  • 式の属性名 (オプション)

  • 条件式をいつ使用するかを選ぶオプション (オプション) デフォルトは apply-during-cdc = false および apply-during-full-load = true

ルールの構造は次のとおりです。

"target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "condition-expression": { "expression":"<conditional expression>", "expression-attribute-values": [ { "name":"<attribute name>", "value":<attribute value> } ], "apply-during-cdc":<optional Boolean value>, "apply-during-full-load": <optional Boolean value> }

次のサンプルは、条件式に使用されるセクションを主に示しています。


                        AWS DMS の開始方法

オブジェクトマッピングで属性マッピングを使用する

属性マッピングでは、ターゲット上のデータを再編成するために、ソース列名を使用してテンプレート文字列を指定することができます。ユーザーがテンプレートで指定する場合を除き、書式設定は行われません。

次の例は、ソースデータベースの構造と、DynamoDB ターゲットの必要とされる構造を示します。最初に示すのは、ソースの構造で、この場合は Oracle データベースです。次に DynamoDB 内のデータの必要とされる構造を示します。この例では最後に、必要なターゲット構造を作成するのに使用される JSON を示します。

Oracle データの構造は次のとおりです。

FirstName LastName StoreId HomeAddress HomePhone WorkAddress WorkPhone DateOfBirth
プライマリキー 該当なし
Randy Marsh 5 221B Baker Street 1234567890 31 Spooner Street, Quahog 9876543210 02/29/1988

DynamoDB データは以下のような構造になっています。

CustomerName StoreId ContactDetails DateOfBirth
パーティションキー ソートキー 該当なし
Randy,Marsh
5
{ "Name": "Randy", "Home": { "Address": "221B Baker Street", "Phone": 1234567890 }, "Work": { "Address": "31 Spooner Street, Quahog", "Phone": 9876541230 } }
02/29/1988

次の JSON は、DynamoDB 構造を達成するために使用されるオブジェクトマッピングと列マッピングを示します。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "object-mapping", "rule-id": "2", "rule-name": "TransformToDDB", "rule-action": "map-record-to-record", "object-locator": { "schema-name": "test", "table-name": "customer" }, "target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "sort-key-name": "StoreId", "exclude-columns": [ "FirstName", "LastName", "HomeAddress", "HomePhone", "WorkAddress", "WorkPhone" ], "attribute-mappings": [ { "target-attribute-name": "CustomerName", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${FirstName},${LastName}" }, { "target-attribute-name": "StoreId", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${StoreId}" }, { "target-attribute-name": "ContactDetails", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "{\"Name\":\"${FirstName}\",\"Home\":{\"Address\":\"${HomeAddress}\",\"Phone\":\"${HomePhone}\"}, \"Work\":{\"Address\":\"${WorkAddress}\",\"Phone\":\"${WorkPhone}\"}}" } ] } } ] }

列マッピングを使用するもう 1 つの方法は、ドキュメントタイプとして DynamoDB 形式を使用することです。次のコード例では、属性マッピングの attribute-sub-type としてdynamodb-map を使用します。

{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "test", "table-name": "%" }, "rule-action": "include" }, { "rule-type": "object-mapping", "rule-id": "2", "rule-name": "TransformToDDB", "rule-action": "map-record-to-record", "object-locator": { "schema-name": "test", "table-name": "customer" }, "target-table-name": "customer_t", "mapping-parameters": { "partition-key-name": "CustomerName", "sort-key-name": "StoreId", "exclude-columns": [ "FirstName", "LastName", "HomeAddress", "HomePhone", "WorkAddress", "WorkPhone" ], "attribute-mappings": [ { "target-attribute-name": "CustomerName", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${FirstName},${LastName}" }, { "target-attribute-name": "StoreId", "attribute-type": "scalar", "attribute-sub-type": "string", "value": "${StoreId}" }, { "target-attribute-name": "ContactDetails", "attribute-type": "document", "attribute-sub-type": "dynamodb-map", "value": { "M": { "Name": { "S": "${FirstName}" }, "Home": { "M": { "Address": { "S": "${HomeAddress}" }, "Phone": { "S": "${HomePhone}" } } }, "Work": { "M": { "Address": { "S": "${WorkAddress}" }, "Phone": { "S": "${WorkPhone}" } } } } } } ] } } ] }

例 1: オブジェクトマッピングで属性マッピングを使用する

次の例では、MySQLnfl_data sport_team という 2 つのデータベーステーブルから、 DynamoDBNFLTeamsおよび という 2 つのテーブルにデータを移行SportTeamsします。 テーブルの構造、およびMySQLデータベーステーブルからDynamoDBテーブルへのデータのマッピングに使用される JSON を以下に示します。

MySQLデータベーステーブル nfl_data の構造は次のとおりです。

mysql> desc nfl_data; +---------------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+-------------+------+-----+---------+-------+ | Position | varchar(5) | YES | | NULL | | | player_number | smallint(6) | YES | | NULL | | | Name | varchar(40) | YES | | NULL | | | status | varchar(10) | YES | | NULL | | | stat1 | varchar(10) | YES | | NULL | | | stat1_val | varchar(10) | YES | | NULL | | | stat2 | varchar(10) | YES | | NULL | | | stat2_val | varchar(10) | YES | | NULL | | | stat3 | varchar(10) | YES | | NULL | | | stat3_val | varchar(10) | YES | | NULL | | | stat4 | varchar(10) | YES | | NULL | | | stat4_val | varchar(10) | YES | | NULL | | | team | varchar(10) | YES | | NULL | | +---------------+-------------+------+-----+---------+-------+

MySQLデータベーステーブル sport_team の構造は次のとおりです。

mysql> desc sport_team; +---------------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------------+--------------+------+-----+---------+----------------+ | id | mediumint(9) | NO | PRI | NULL | auto_increment | | name | varchar(30) | NO | | NULL | | | abbreviated_name | varchar(10) | YES | | NULL | | | home_field_id | smallint(6) | YES | MUL | NULL | | | sport_type_name | varchar(15) | NO | MUL | NULL | | | sport_league_short_name | varchar(10) | NO | | NULL | | | sport_division_short_name | varchar(10) | YES | | NULL | |

2 つのテーブルを 2 つの DynamoDB テーブルにマッピングするために使用されるテーブルマッピングルールは次のとおりです。

{ "rules":[ { "rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": { "schema-name": "dms_sample", "table-name": "nfl_data" }, "rule-action": "include" }, { "rule-type": "selection", "rule-id": "2", "rule-name": "2", "object-locator": { "schema-name": "dms_sample", "table-name": "sport_team" }, "rule-action": "include" }, { "rule-type":"object-mapping", "rule-id":"3", "rule-name":"MapNFLData", "rule-action":"map-record-to-record", "object-locator":{ "schema-name":"dms_sample", "table-name":"nfl_data" }, "target-table-name":"NFLTeams", "mapping-parameters":{ "partition-key-name":"Team", "sort-key-name":"PlayerName", "exclude-columns": [ "player_number", "team", "Name" ], "attribute-mappings":[ { "target-attribute-name":"Team", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"${team}" }, { "target-attribute-name":"PlayerName", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"${Name}" }, { "target-attribute-name":"PlayerInfo", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"{\"Number\": \"${player_number}\",\"Position\": \"${Position}\",\"Status\": \"${status}\",\"Stats\": {\"Stat1\": \"${stat1}:${stat1_val}\",\"Stat2\": \"${stat2}:${stat2_val}\",\"Stat3\": \"${stat3}:${ stat3_val}\",\"Stat4\": \"${stat4}:${stat4_val}\"}" } ] } }, { "rule-type":"object-mapping", "rule-id":"4", "rule-name":"MapSportTeam", "rule-action":"map-record-to-record", "object-locator":{ "schema-name":"dms_sample", "table-name":"sport_team" }, "target-table-name":"SportTeams", "mapping-parameters":{ "partition-key-name":"TeamName", "exclude-columns": [ "name", "id" ], "attribute-mappings":[ { "target-attribute-name":"TeamName", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"${name}" }, { "target-attribute-name":"TeamInfo", "attribute-type":"scalar", "attribute-sub-type":"string", "value":"{\"League\": \"${sport_league_short_name}\",\"Division\": \"${sport_division_short_name}\"}" } ] } } ] }

表のサンプル出力を次に示します。NFLTeamsDynamoDB

"PlayerInfo": "{\"Number\": \"6\",\"Position\": \"P\",\"Status\": \"ACT\",\"Stats\": {\"Stat1\": \"PUNTS:73\",\"Stat2\": \"AVG:46\",\"Stat3\": \"LNG:67\",\"Stat4\": \"IN 20:31\"}", "PlayerName": "Allen, Ryan", "Position": "P", "stat1": "PUNTS", "stat1_val": "73", "stat2": "AVG", "stat2_val": "46", "stat3": "LNG", "stat3_val": "67", "stat4": "IN 20", "stat4_val": "31", "status": "ACT", "Team": "NE" }

表のサンプル出力を次に示します。SportsTeamsDynamoDB

{ "abbreviated_name": "IND", "home_field_id": 53, "sport_division_short_name": "AFC South", "sport_league_short_name": "NFL", "sport_type_name": "football", "TeamInfo": "{\"League\": \"NFL\",\"Division\": \"AFC South\"}", "TeamName": "Indianapolis Colts" }

DynamoDB のターゲットデータ型

AWS DMS の DynamoDB エンドポイントでは、DynamoDB のほとんどのデータ型がサポートされています。以下の表に、AWS DMS を使用する場合にサポートされる Amazon AWS DMS のターゲットデータ型と、AWS DMS のデータ型からのデフォルトマッピングを示します。

AWS DMS のデータ型の詳細については、「AWS Database Migration Service のデータ型」を参照してください。

AWS DMS が異なるデータベースからデータを移行するときは、ソースデータベースからのデータ型を、AWS DMS データ型という中間のデータ型にマッピングします。その後、中間データ型をターゲットデータ型にマッピングします。以下の表は、各 AWS DMS データ型と DynamoDB でのマッピング先のデータ型を示しています。

AWS DMS データ型 DynamoDB データ型

文字列

文字列

WString

文字列

Boolean

Boolean

日付

文字列

DateTime

文字列

INT1

数値

INT2

数値

INT4

数値

INT8

数値

数値

数値

Real4

数値

Real8

数値

UINT1

数値

UINT2

数値

UINT4

数値

UINT8 数値
CLOB 文字列