データをロード

+7
d
O
l
q

LOAD DATAステートメント バッチは、データを TiDB テーブルにロードします。

TiDB v7.0.0 以降、 LOAD DATA SQL ステートメントは次の機能をサポートします。

  • S3およびGCSからのデータのインポートをサポート
  • 新しいパラメータFIELDS DEFINED NULL BYを追加する

概要

LoadDataStmt
LOADDATALocalOptINFILEstringLitDuplicateOptINTOTABLETableNameCharsetOptFieldsLinesIgnoreLinesColumnNameOrUserVarListOptWithBracketsLoadDataSetSpecOpt
LocalOpt
LOCAL
Fields
TERMINATEDBYstringLitOPTIONALLYENCLOSEDBYstringLitESCAPEDBYstringLitDEFINEDNULLBYstringLitOPTIONALLYENCLOSED

パラメータ

LOCAL

LOCAL使用して、インポートするクライアント上のデータ ファイルを指定できます。ファイル パラメーターは、クライアント上のファイル システム パスである必要があります。

TiDB Cloudを使用している場合、 LOAD DATAステートメントを使用してローカル データ ファイルをロードするには、 TiDB Cloudに接続するときに接続文字列に--local-infileオプションを追加する必要があります。

  • 以下は、 TiDB Cloud Serverless の接続文字列の例です。

    mysql --connect-timeout 15 -u '<user_name>' -h <host_name> -P 4000 -D test --ssl-mode=VERIFY_IDENTITY --ssl-ca=/etc/ssl/cert.pem -p<your_password> --local-infile
  • 以下は、 TiDB Cloud Dedicated の接続文字列の例です。

    mysql --connect-timeout 15 --ssl-mode=VERIFY_IDENTITY --ssl-ca=<CA_path> --tls-version="TLSv1.2" -u root -h <host_name> -P 4000 -D test -p<your_password> --local-infile

S3とGCSstorage

LOCAL指定しない場合は、 外部storageで詳述されているように、ファイル パラメータは有効な S3 または GCS パスである必要があります。

データファイルがS3またはGCSに保存されている場合、個々のファイルをインポートすることも、ワイルドカード文字*を使用して複数のファイルをインポートすることもできます。ワイルドカードはサブディレクトリ内のファイルを再帰的に処理しないことに注意してください。以下に例を示します。

  • 1つのファイルをインポートする: s3://<bucket-name>/path/to/data/foo.csv
  • 指定されたパス内のすべてのファイルをインポート: s3://<bucket-name>/path/to/data/*
  • 指定されたパスの下にある.csvで終わるすべてのファイルをインポートします: s3://<bucket-name>/path/to/data/*.csv
  • 指定されたパスの下にあるfooで始まるすべてのファイルをインポートします: s3://<bucket-name>/path/to/data/foo*
  • 指定されたパスの下にある、先頭がfooで末尾が.csvすべてのファイルをインポートします: s3://<bucket-name>/path/to/data/foo*.csv

FieldsLinesIgnore Lines

FieldsおよびLinesパラメータを使用して、データ形式の処理方法を指定できます。

  • FIELDS TERMINATED BY : データ区切り文字を指定します。
  • FIELDS ENCLOSED BY : データの囲み文字を指定します。
  • LINES TERMINATED BY : 特定の文字で行を終了する場合に、行末文字を指定します。

DEFINED NULL BY使用すると、データ ファイル内で NULL 値をどのように表現するかを指定できます。

  • MySQL の動作と一致して、 ESCAPED BY NULL でない場合、たとえばデフォルト値\使用されている場合、 \N NULL 値と見なされます。
  • DEFINED NULL BY 'my-null'などのようにDEFINED NULL BY使用すると、 my-null NULL 値と見なされます。
  • DEFINED NULL BY ... OPTIONALLY ENCLOSED使用する場合、 DEFINED NULL BY 'my-null' OPTIONALLY ENCLOSEDmy-null"my-null" ( ENCLOSED BY '"と想定) は NULL 値と見なされます。
  • DEFINED NULL BYDEFINED NULL BY ... OPTIONALLY ENCLOSEDではなくENCLOSED BY (例えばENCLOSED BY '"'を使用した場合、 NULL NULL 値とみなされます。この動作はMySQLと一致しています。
  • それ以外の場合は、NULL 値とはみなされません。

次のデータ形式を例に挙げます。

"bob","20","street 1"\r\n "alice","33","street 1"\r\n

bob20street 1抽出する場合は、フィールド区切り文字を',' 、囲み文字を'\"'に指定します。

FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n'

上記のパラメータを指定しない場合、インポートされたデータはデフォルトで次のように処理されます。

FIELDS TERMINATED BY '\t' ENCLOSED BY '' ESCAPED BY '\\' LINES TERMINATED BY '\n' STARTING BY ''

IGNORE <number> LINESパラメータを設定すると、ファイルの最初のnumber行を無視できます。例えば、 IGNORE 1 LINES設定すると、ファイルの最初の行が無視されます。

次の例では、 LOAD DATAを使用してデータをインポートします。フィールド区切り文字としてカンマが指定されています。データを囲む二重引用符は無視されます。ファイルの最初の行は無視されます。

ERROR 1148 (42000): the used command is not allowed with this TiDB version表示された場合は、トラブルシューティングについてはエラー 1148 (42000): 使用されたコマンドはこの TiDB バージョンでは許可されていませんを参照してください。

LOAD DATA LOCAL INFILE '/mnt/evo970/data-sets/bikeshare-data/2017Q4-capitalbikeshare-tripdata.csv' INTO TABLE trips FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (duration, start_date, end_date, start_station_number, start_station, end_station_number, end_station, bike_number, member_type);
Query OK, 815264 rows affected (39.63 sec) Records: 815264 Deleted: 0 Skipped: 0 Warnings: 0

LOAD DATAFIELDS ENCLOSED BYおよびFIELDS TERMINATED BYパラメータとして、16進ASCII文字式または2進ASCII文字式の使用もサポートしています。次の例を参照してください。

LOAD DATA LOCAL INFILE '/mnt/evo970/data-sets/bikeshare-data/2017Q4-capitalbikeshare-tripdata.csv' INTO TABLE trips FIELDS TERMINATED BY x'2c' ENCLOSED BY b'100010' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (duration, start_date, end_date, start_station_number, start_station, end_station_number, end_station, bike_number, member_type);

上記の例では、 x'2c' ,文字の 16 進表現であり、 b'100010' "文字の 2 進表現です。

MySQLの互換性

LOAD DATA文の構文はMySQLと互換性がありますが、文字セットオプションは解析されますが無視されます。構文の互換性に違いが見つかった場合は、 バグを報告する参照してください。

注記:

  • TiDB v4.0.0 より前のバージョンでは、20000 行ごとにLOAD DATAコミットが実行され、これは構成できません。
  • TiDB v4.0.0 から v6.6.0 までのバージョンでは、TiDB はデフォルトですべての行を 1 つのトランザクションでコミットします。ただし、 LOAD DATAステートメントで一定数の行をコミットする必要がある場合は、必要な行数をtidb_dml_batch_sizeに設定できます。
  • TiDB v7.0.0 以降、 tidb_dml_batch_size LOAD DATAには影響しなくなり、TiDB は 1 つのトランザクションですべての行をコミットします。
  • TiDB v4.0.0以前のバージョンからアップグレードすると、 ERROR 8004 (HY000) at line 1: Transaction is too large, size: 100000058発生する場合があります。このエラーを解決するには、 tidb.tomlファイルのtxn-total-size-limit値を増やすことをお勧めします。
  • TiDB v7.6.0 より前のバージョンでは、トランザクションでコミットされる行数に関係なく、明示的なトランザクションのROLLBACKステートメントによってLOAD DATAロールバックされることはありません。
  • TiDB v7.6.0 より前のバージョンでは、TiDB トランザクション モードの構成に関係なく、 LOAD DATAステートメントは常に楽観的トランザクション モードで実行されます。
  • v7.6.0 以降、TiDB は他の DML ステートメントと同じ方法でLOAD DATA in トランザクションを処理します。
    • LOAD DATAステートメントは、現在のトランザクションをコミットせず、新しいトランザクションも開始しません。
    • LOAD DATAステートメントは、TiDB トランザクション モード設定 (楽観的または悲観的トランザクション) の影響を受けます。
    • トランザクション内のLOAD DATAのステートメントは、トランザクション内のROLLBACKのステートメントによってロールバックできます。

参照

このページは役に立ちましたか?