TiDB Lightningデータソース
TiDB Lightning は、CSV、SQL、Parquet ファイルなど、複数のデータ ソースから TiDB クラスターへのデータのインポートをサポートしています。
TiDB Lightningのデータ ソースを指定するには、次の構成を使用します。
[mydumper]
# Local source data directory or the URL of the external storage such as S3.
data-source-dir = "/data/my_database"
TiDB Lightningの実行中は、パターンdata-source-dirに一致するすべてのファイルが検索されます。
| ファイル | タイプ | パターン |
|---|---|---|
| スキーマ ファイル | CREATE TABLE DDL ステートメントを含む | ${db_name}.${table_name}-schema.sql |
| スキーマ ファイル | CREATE DATABASE DDL ステートメントを含む | ${db_name}-schema-create.sql |
| データファイル | データ ファイルにテーブル全体のデータが含まれている場合、ファイルは${db_name}.${table_name}という名前のテーブルにインポートされます。 | `{table_name}.${csv |
| データファイル | テーブルのデータが複数のデータ ファイルに分割されている場合は、各データ ファイルのファイル名の末尾に数字を付ける必要があります。 | `{table_name}.001.${csv |
| 圧縮ファイル | ファイルにgzip 、 snappy 、またはzstdなどの圧縮接尾辞が含まれている場合、 TiDB Lightning はファイルをインポートする前に解凍します。 | `{table_name}.${csv |
TiDB Lightning はデータを可能な限り並行して処理します。ファイルは順番に読み取る必要があるため、データ処理の同時実行性はファイル レベル ( region-concurrencyで制御) になります。そのため、インポートしたファイルが大きい場合、インポートのパフォーマンスが低下します。最高のパフォーマンスを実現するには、インポートするファイルのサイズを 256 MiB 以下に制限することをお勧めします。
CSV
スキーマ
CSV ファイルはスキーマレスです。 CSV ファイルを TiDB にインポートするには、テーブル スキーマを提供する必要があります。次のいずれかの方法でスキーマを提供できます。
- DDL ステートメントを含む
${db_name}.${table_name}-schema.sqlおよび${db_name}-schema-create.sqlという名前のファイルを作成します。 - TiDB でテーブル スキーマを手動で作成します。
コンフィグレーション
tidb-lightning.tomlファイルの[mydumper.csv]セクションで CSV 形式を設定できます。ほとんどの設定には、MySQL のLOAD DATAステートメントに対応するオプションがあります。
[mydumper.csv]
# The field separator. Can be one or multiple characters. The default is ','.
# If the data might contain commas, it is recommended to use '|+|' or other uncommon
# character combinations as a separator.
separator = ','
# Quoting delimiter. Empty value means no quoting.
delimiter = '"'
# Line terminator. Can be one or multiple characters. Empty value (default) means
# both "\n" (LF) and "\r\n" (CRLF) are line terminators.
terminator = ''
# Whether the CSV file contains a header.
# If `header` is true, the first line is skipped and mapped
# to the table columns.
header = true
# Whether the CSV file contains any NULL value.
# If `not-null` is true, all columns from CSV cannot be parsed as NULL.
not-null = false
# When `not-null` is false (that is, CSV can contain NULL),
# fields equal to this value will be treated as NULL.
null = '\N'
# Whether to parse backslash as escape character.
backslash-escape = true
# Whether to treat `separator` as the line terminator and trim all trailing separators.
trim-last-separator = false
separator 、 delimiter 、またはterminatorなどの文字列フィールドの入力に特殊文字が含まれる場合、バックスラッシュを使用して特殊文字をエスケープできます。エスケープ シーケンスは、二重引用符で囲まれた文字列 ( "…" ) である必要があります。たとえば、 separator = "\u001f" ASCII 文字0X1Fセパレータとして使用することを意味します。
単一引用符で囲まれた文字列 ( '…' ) を使用して、バックスラッシュのエスケープを抑制することができます。たとえば、 terminator = '\n' 、LF \nではなく、バックスラッシュ ( \ ) の後に文字nが続く 2 文字の文字列をターミネータとして使用することを意味します。
詳細については、 TOML v1.0.0 仕様参照してください。
separator
フィールド区切りを定義します。
1 つまたは複数の文字を指定できますが、空にすることはできません。
一般的な値:
- CSV (コンマ区切り値) の場合は
','。 - TSV (タブ区切り値) の場合は
"\t"。 "\u0001"は ASCII 文字を使用します0x01.
- CSV (コンマ区切り値) の場合は
LOAD DATA ステートメントの
FIELDS TERMINATED BYオプションに対応します。
delimiter
引用に使用する区切り文字を定義します。
delimiterが空の場合、すべてのフィールドは引用符で囲まれていません。一般的な値:
'"'二重引用符でフィールドを引用します。 RFC4180と同じ。''引用を無効にします。
LOAD DATAステートメントのFIELDS ENCLOSED BYオプションに対応します。
terminator
- 行末記号を定義します。
terminatorが空の場合、"\n"(ライン フィード) と"\r\n"(キャリッジ リターン + ライン フィード) の両方が行末記号として使用されます。LOAD DATAステートメントのLINES TERMINATED BYオプションに対応します。
header
- すべてのCSV ファイルにヘッダー行が含まれているかどうか。
headerがtrueの場合、最初の行が列名として使用されます。headerがfalseの場合、最初の行は通常のデータ行として扱われます。
not-nullおよびnull
not-null設定は、すべてのフィールドが null 非許容であるかどうかを制御します。not-nullがfalseの場合、nullで指定された文字列は、特定の値ではなく SQL NULL に変換されます。引用符は、フィールドが null であるかどうかには影響しません。
たとえば、次の CSV ファイルでは次のようになります。
A,B,C \N,"\N",デフォルト設定 (
not-null = false; null = '\N') では、列AとBは両方とも、TiDB にインポートされた後に NULL に変換されます。列Cは空の文字列''ですが、NULL ではありません。
backslash-escape
フィールド内のバックスラッシュをエスケープ文字として解析するかどうか。
backslash-escapeが true の場合、次のシーケンスが認識され、変換されます。シーケンス に変換 \0空文字 ( U+0000)\bバックスペース ( U+0008)\n改行 ( U+000A)\rキャリッジリターン ( U+000D)\tタブ ( U+0009)\ZWindows EOF ( U+001A)他のすべての場合 (たとえば、
\") では、バックスラッシュが取り除かれ、フィールドに次の文字 (") が残ります。左の文字には特別な役割 (区切り文字など) はなく、単なる通常の文字です。引用符は、バックスラッシュがエスケープ文字として解析されるかどうかには影響しません。
LOAD DATAステートメントのFIELDS ESCAPED BY '\'オプションに対応します。
trim-last-separator
separator行終端記号として扱い、末尾の区切り文字をすべて削除するかどうか。たとえば、次の CSV ファイルでは次のようになります。
A,,B,,trim-last-separator = falseの場合、これは 5 つのフィールド('A', '', 'B', '', '')の行として解釈されます。trim-last-separator = trueの場合、これは 3 つのフィールド('A', '', 'B')の行として解釈されます。
このオプションは非推奨です。代わりに
terminatorオプションを使用してください。既存の構成が次の場合:
separator = ',' trim-last-separator = true構成を次のように変更することをお勧めします。
separator = ',' terminator = ",\n" # Use ",\n" or ",'\r\n" according to your actual file.
構成不可能なオプション
TiDB Lightning は、 LOAD DATAステートメントでサポートされているすべてのオプションをサポートしているわけではありません。例えば:
- 行のプレフィックス (
LINES STARTING BY) は使用できません。 - ヘッダーはスキップできず (
IGNORE n LINES)、有効な列名でなければなりません。
厳密な形式
TiDB Lightning は、入力ファイルが約 256 MiB の均一なサイズである場合に最適に機能します。入力が単一の巨大な CSV ファイルの場合、 TiDB Lightning は1 つのスレッドでしかファイルを処理できないため、インポート速度が遅くなります。
これは、最初に CSV を複数のファイルに分割することで修正できます。一般的な CSV 形式の場合、ファイル全体を読み取らずに行の開始位置と終了位置をすばやく特定する方法はありません。したがって、デフォルトでは、 TiDB Lightning はCSV ファイルを自動的に分割しません。ただし、CSV 入力が特定の制限に準拠していることが確実な場合は、 strict-format設定を有効にして、 TiDB Lightning がファイルを複数の 256 MiB サイズのチャンクに分割して並列処理できるようにすることができます。
[mydumper]
strict-format = true
厳密な CSV ファイルでは、すべてのフィールドが 1 行だけを占めます。つまり、次のいずれかに該当する必要があります。
- 区切り文字が空です。
- すべてのフィールドにターミネータ自体が含まれているわけではありません。デフォルトの構成では、これはすべてのフィールドに CR (
\r) または LF (\n) が含まれていないことを意味します。
CSV ファイルが厳密ではなく、 strict-format誤ってtrueに設定されている場合、複数行にまたがるフィールドが半分に分割されて 2 つのチャンクになり、解析が失敗したり、破損したデータが静かにインポートされたりすることさえあります。
一般的な構成例
CSV
デフォルト設定は、RFC 4180 に従って CSV 用に調整済みです。
[mydumper.csv]
separator = ',' # If the data might contain a comma (','), it is recommended to use '|+|' or other uncommon character combinations as the separator.
delimiter = '"'
header = true
not-null = false
null = '\N'
backslash-escape = true
コンテンツの例:
ID,Region,Count
1,"East",32
2,"South",\N
3,"West",10
4,"North",39
TSV
[mydumper.csv]
separator = "\t"
delimiter = ''
header = true
not-null = false
null = 'NULL'
backslash-escape = false
コンテンツの例:
ID Region Count
1 East 32
2 South NULL
3 West 10
4 North 39
TPC-H DBGEN
[mydumper.csv]
separator = '|'
delimiter = ''
terminator = "|\n"
header = false
not-null = true
backslash-escape = false
コンテンツの例:
1|East|32|
2|South|0|
3|West|10|
4|North|39|
SQL
TiDB Lightning がSQL ファイルを処理するとき、 TiDB Lightning は単一の SQL ファイルをすばやく分割できないため、同時実行性を高めて単一ファイルのインポート速度を向上させることはできません。したがって、SQL ファイルからデータをインポートする場合は、単一の巨大な SQL ファイルを避けてください。 TiDB Lightning は、入力ファイルが約 256 MiB の均一なサイズである場合に最適に機能します。
寄木細工
TiDB Lightning は現在、Amazon Auroraまたは Apache Hive によって生成された Parquet ファイルのみをサポートしています。 S3 のファイル構造を識別するには、次の構成を使用してすべてのデータ ファイルを照合します。
[[mydumper.files]]
# The expression needed for parsing Amazon Aurora parquet files
pattern = '(?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$'
schema = '$1'
table = '$2'
type = '$3'
この設定は、 Auroraスナップショットによってエクスポートされた寄木細工のファイルを一致させる方法のみを示していることに注意してください。スキーマ ファイルを個別にエクスポートして処理する必要があります。
mydumper.filesの詳細については、 カスタマイズされたファイルに一致を参照してください。
圧縮ファイル
TiDB Lightning は現在、 Dumplingによってエクスポートされた圧縮ファイル、または命名規則に従う圧縮ファイルをサポートしています。現在、 TiDB Lightning は次の圧縮アルゴリズムをサポートしています: gzip 、 snappy 、およびzstd 。ファイル名が命名規則に従っている場合、 TiDB Lightning は圧縮アルゴリズムを自動的に識別し、追加の構成を行わなくても、ストリーミング解凍後にファイルをインポートします。
ノート:
- TiDB Lightning は単一の大きな圧縮ファイルを同時に解凍できないため、圧縮ファイルのサイズはインポート速度に影響します。ソース ファイルは、解凍後に 256 MiB を超えないようにすることをお勧めします。
- TiDB Lightning は個別に圧縮されたデータ ファイルのみをインポートし、複数のデータ ファイルが含まれる単一の圧縮ファイルのインポートはサポートしていません。
- TiDB Lightning は、
db.table.parquet.snappyなどの別の圧縮ツールで圧縮されたparquetファイルをサポートしていません。parquetファイルを圧縮する場合は、parquetファイル ライターの圧縮形式を構成できます。- TiDB Lightning v6.4.0 以降のバージョンでは、
.bakファイルと次の圧縮データ ファイルのみがサポートされます:gzip、snappy、およびzstd。他のタイプのファイルはエラーの原因になります。サポートされていないファイルについては、事前にファイル名を変更するか、これらのファイルをインポート データ ディレクトリから移動して、このようなエラーを回避する必要があります。
カスタマイズされたファイルを一致させる
TiDB Lightning は、命名パターンに従うデータ ファイルのみを認識します。場合によっては、データ ファイルが命名パターンに従っていない可能性があるため、データ インポートはファイルをインポートせずに短時間で完了します。
この問題を解決するには、 [[mydumper.files]]を使用して、カスタマイズした式でデータ ファイルを一致させることができます。
例として、S3 にエクスポートされたAuroraスナップショットを取り上げます。 Parquet ファイルの完全なパスはS3://some-bucket/some-subdir/some-database/some-database.some-table/part-00000-c5a881bb-58ff-4ee6-1111-b41ecff340a3-c000.gz.parquetです。
通常、 some-databaseデータベースをインポートするには、 data-source-dirをS3://some-bucket/some-subdir/some-database/に設定します。
前述の Parquet ファイル パスに基づいて、 (?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$のような正規表現を記述してファイルを一致させることができます。一致グループでは、 index=1はsome-database 、 index=2はsome-table 、 index=3はparquetです。
デフォルトの命名規則に従わないデータ ファイルをTiDB Lightning が認識できるように、正規表現と対応するインデックスに従って構成ファイルを作成できます。例えば:
[[mydumper.files]]
# The expression needed for parsing the Amazon Aurora parquet file
pattern = '(?i)^(?:[^/]*/)*([a-z0-9_]+)\.([a-z0-9_]+)/(?:[^/]*/)*(?:[a-z0-9\-_.]+\.(parquet))$'
schema = '$1'
table = '$2'
type = '$3'
- schema : ターゲット データベースの名前。値は次のとおりです。
$1などの正規表現を使用して取得したグループ インデックス。db1など、インポートするデータベースの名前。一致したすべてのファイルがdb1にインポートされます。
- table : ターゲット テーブルの名前。値は次のとおりです。
$2などの正規表現を使用して取得したグループ インデックス。table1など、インポートするテーブルの名前。一致したすべてのファイルがtable1にインポートされます。
- type : ファイルの種類。
sql、parquet、およびcsvをサポートします。値は次のとおりです。$3などの正規表現を使用して取得したグループ インデックス。
- key :
001in${db_name}.${table_name}.001.csvなどのファイル番号。$4などの正規表現を使用して取得したグループ インデックス。
Amazon S3 からデータをインポートする
次の例は、 TiDB Lightningを使用して Amazon S3 からデータをインポートする方法を示しています。その他のパラメーター構成については、 外部storageURLを参照してください。
TiDB Lightning を使用して S3 からデータをインポートします。
./tidb-lightning --tidb-port=4000 --pd-urls=127.0.0.1:2379 --backend=local --sorted-kv-dir=/tmp/sorted-kvs \ -d 's3://my-bucket/sql-backup'TiDB Lightningを使用して S3 からデータをインポートします (パス スタイルのリクエストを使用)。
./tidb-lightning --tidb-port=4000 --pd-urls=127.0.0.1:2379 --backend=local --sorted-kv-dir=/tmp/sorted-kvs \ -d 's3://my-bucket/sql-backup?force-path-style=true&endpoint=http://10.154.10.132:8088'TiDB Lightningを使用して S3 からデータをインポートします (特定のIAMロールを使用して S3 データにアクセスします)。
./tidb-lightning --tidb-port=4000 --pd-urls=127.0.0.1:2379 --backend=local --sorted-kv-dir=/tmp/sorted-kvs \ -d 's3://my-bucket/test-data?role-arn=arn:aws:iam::888888888888:role/my-role'