説明
このステートメントは、外部からデータをインポートするために使用されます。
OceanBaseデータベースの
LOAD DATAステートメントは、以下の入力ファイルの読み込みをサポートしています:サーバー側(OBServerノード)ファイル:ファイルはOceanBaseデータベースのOBServerノード上にあります。
LOAD DATA INFILEステートメントまたはLOAD DATA FROM URLステートメントを使用して、サーバー側のファイルからデータベーステーブルにデータをロードできます。クライアント側(ローカル)ファイル:ファイルはクライアントのローカルファイルシステム上にあります。
LOAD DATA LOCAL INFILEステートメントまたはLOAD DATA FROM URLステートメントを使用して、クライアントのローカルファイルからデータベーステーブルにデータをロードできます。説明
OceanBaseデータベースが
LOAD DATA LOCAL INFILEコマンドを実行すると、システムは自動的にIGNOREオプションを追加します。OSSファイル:ファイルはOSSファイルシステム上にあります。
LOAD DATA REMOTE_OSS INFILEステートメントを使用して、OSSファイルのデータをデータベーステーブルにロードできます。
LOAD DATA は現在 CSV 形式のテキストファイルのインポートをサポートしており、インポートプロセス全体は以下のフローに分けられます:
ファイルの解析:OceanBaseデータベースは、ユーザーが入力したファイル名に基づいてファイルのデータを読み取り、指定された並列度に応じて入力ファイル内のデータを並列または直列に解析します。
データの配分:OceanBaseは分散データベースであるため、各パーティションのデータは異なるOBServerノードに分散している可能性があります。
LOAD DATAは解析されたデータを計算し、データを送信するOBServerノードを決定します。データの挿入:ターゲットとなるOBServerノードがデータを受信すると、ローカルで
INSERT操作を実行し、データを対応するパーティションに挿入します。
注意点
トリガー(Trigger)を持つテーブルでは、
LOAD DATAステートメントの使用は禁止されています。外部ファイルからデータをインポートするには、
FILE権限と以下の設定が必要です:- サーバー側のファイルをロードする場合は、システム変数 secure_file_priv を事前に設定し、インポートまたはエクスポートファイルにアクセスできるパスを構成する必要があります。
- クライアント側のローカルファイルをロードする場合は、MySQL/OBClient クライアントを起動する際に
--local-infile[=1]オプションを追加して、ローカルファイルシステムからデータをロードする機能を有効にする必要があります。
指定したパーティションのダイレクトロードを使用する場合は、ターゲットテーブルがレプリケーションテーブルであってはならず、自動インクリメント列、識別列、グローバルインデックスを含むことはできません。
構文
-- 通常ファイルのインポート
LOAD DATA
[/*+ PARALLEL(N) [load_batch_size(M)] [APPEND | direct(bool, int, [load_mode])] | NO_DIRECT */]
[REMOTE_OSS | LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE table_name [PARTITION(PARTITION_OPTION)]
[COMPRESSION [=] {AUTO|NONE|GZIP|DEFLATE|ZSTD}]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(column_name_var
[, column_name_var] ...)]
load_mode:
'full'
| 'inc_replace'
PARTITION_OPTION:
partition_option_list
| subpartition_option_list
-- URLファイルのインポート
LOAD DATA
[/*+ PARALLEL(N) [load_batch_size(M)] [APPEND | direct(bool, int, [load_mode])] | NO_DIRECT */]
[REPLACE | IGNORE]
FROM { url_table_function_expr |
( SELECT expression_list FROM url_table_function_expr ) }
INTO TABLE table_name
[PARTITION(PARTITION_OPTION)]
[(column_name_var [, column_name_var] ...)]
[LOG ERRORS
[INTO 'logfile_string']
[REJECT LIMIT {integer | UNLIMITED}]
[BADFILE 'badfile_string']]
load_mode:
'full'
| 'inc_replace'
url_table_function_expr:
FILES (
LOCATION = '<string>',
{
FORMAT = (
TYPE = 'CSV',
LINE_DELIMITER = '<string>' | <expr>,
FIELD_DELIMITER = '<string>' | <expr>,
PARSE_HEADER = { TRUE | FALSE },
ESCAPE = '<character>' | <expr>,
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>,
ENCODING = 'charset',
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...),
SKIP_HEADER = <int>,
SKIP_BLANK_LINES = { TRUE | FALSE },
TRIM_SPACE = { TRUE | FALSE },
EMPTY_FIELD_AS_NULL = { TRUE | FALSE }
)
| FORMAT = ( TYPE = 'PARQUET' | 'ORC' )
},
[PATTERN = '<regex_pattern>']
)
| SOURCE (
TYPE = 'ODPS',
ACCESSID = '<string>',
ACCESSKEY = '<string>',
ENDPOINT = '<string>',
TUNNEL_ENDPOINT = '<string>',
PROJECT_NAME = '<string>',
SCHEMA_NAME = '<string>',
TABLE_NAME = '<string>',
QUOTA_NAME = '<string>',
COMPRESSION_CODE = '<string>'
)
PARTITION_OPTION:
partition_option_list
| subpartition_option_list
パラメータの説明
パラメータ |
説明 |
|---|---|
| parallel(N) | データの並列度。デフォルトは4。 |
| load_batch_size(M) | 1回の挿入バッチサイズを指定します。M のデフォルト値は 100 です。推奨値の範囲は [100,1000] です。 |
| APPEND | direct() |NO_DIRECT | ヒントを使用してダイレクトロード機能を有効にします。
注意ダイレクトロードタスクの実行中は、OceanBaseデータベースのアップグレード操作を同時に行うことは推奨されません。これにより、ダイレクトロードタスクが失敗する可能性があります。
LOAD DATA ダイレクトロードの詳細については、LOAD DATAステートメントを使用したデータ/ファイルのダイレクトロードを参照してください。 |
| REMOTE_OSS | LOCAL | オプション。
|
| file_name | 入力ファイルのパスとファイル名を指定します。file_nameの形式は以下のとおりです:
説明OSS上のファイルをインポートする際は、以下の情報を確認する必要があります:
|
| REPLACE | IGNORE | 一意キーの競合に遭遇した場合、REPLACE は競合行を上書きし、IGNORE は競合行を無視します。LOAD DATA はテーブルの主キーによってデータが重複しているかどうかを判断します。テーブルに主キーが存在しない場合、REPLACE オプションと IGNORE オプションの違いはありません。デフォルトでは、重複データに遭遇すると、LOAD DATA はエラーが発生したデータをログファイルに記録します。
注意
|
| url_table_function_expr | オプションです。FILESとSOURCEの2つのキーワードを使用して、ファイルシステムまたはデータソースからデータを読み取ります。 |
| table_name | データをインポートするテーブル名。
|
| PARTITION_OPTION | パーティションダイレクトロード時のパーティション名を指定します:
説明指定パーティションはダイレクトロードのみをサポートし、通常のLOAD DATAはサポートしません。つまり、ダイレクトロードのヒントを追加しない場合や、ダイレクトロードのパラメータを設定しない場合にLOAD DATAを実行しても、指定パーティションは有効になりません。 |
| COMPRESSION | 圧縮ファイル形式を指定します。ここでは
|
| FIELDS | COLUMNS | フィールドの書式を指定します。
|
| LINES STARTING BY | 行の開始文字を指定します。 |
| LINES TERMINATED BY | 行の終端文字を指定します。 |
| IGNORE number { LINES | ROWS } | 最初の数行を無視します。LINESはファイルの最初の数行を、ROWSはフィールド区切り文字で指定された最初の数行のデータを意味します。デフォルトでは、入力ファイル内の各フィールドがテーブルの列に1対1で対応します。入力ファイルにすべての列が含まれていない場合、欠けている列は以下のルールでデフォルト値が入力されます:
説明複数ファイルをインポートする場合も、単一ファイルをインポートする場合と動作は同じです。 |
| column_name_var | オプションです。インポートする列名を指定します。 |
| LOG ERRORS | オプションです。URL外部テーブルのインポート処理中のエラー診断を有効にするために使用します。詳細については、以下の log_errors を参照してください。 |
FILES
FILES キーワードは、LOCATION 句、FORMAT 句、および PATTERN 句で構成されます。
LOCATION句は、外部テーブルファイルの保存先パスを指定するために使用します。通常、外部テーブルのデータファイルは単独のディレクトリに保存され、そのフォルダ内にはサブディレクトリを含むことができます。テーブル作成時、外部テーブルはそのディレクトリ内のすべてのファイルを自動的に収集します。ローカル LOCATION の形式は
LOCATION = '[file://] local_file_path'で、local_file_pathは相対パスまたは絶対パスにすることができます。相対パスを指定する場合、現在のディレクトリは OceanBase データベースのインストールディレクトリである必要があります。secure_file_privは OBServer ノードがアクセス権限を持つファイルパスを設定するために使用されます。local_file_pathはsecure_file_privパスのサブパスである必要があります。リモート Location の形式は以下のとおりです:
LOCATION = '{oss|S3}://$ACCESS_ID:$ACCESS_KEY@$HOST:s3_region/remote_file_path'。ここで、$ACCESS_ID、$ACCESS_KEY、および$HOSTは OSS および S3 アクセスに必要なアクセス情報であり、s3_regionは S3 使用時に選択するリージョン情報です。これらの機密アクセス情報は暗号化されてデータベースのシステムテーブルに保存されます。LOCATION = 'hdfs://$ {hdfs_namenode_address}:${port}/PATH.localhost'。portは HDFS のポート番号を指し、PATHは HDFS 内のディレクトリパスを指します。- Kerberos 認証を使用する場合:
LOCATION = 'hdfs://localhost:port/user?principal=xxx&keytab=xxx&krb5conf=xxx&configs=xxx'。 ここで:principal: ログイン認証ユーザーを指します。keytab: ユーザー認証のキータブファイルのパスを指定します。krb5conf: ユーザーが使用する Kerberos 環境の設定ファイルのパスを指定します。configs: 追加の HDFS 構成パラメータを指定します。デフォルトは空ですが、Kerberos 環境の場合、このパラメータには通常値があり、設定が必要です。例:dfs.data.transfer.protection=authentication,privacyは、データ転送の保護レベルをauthenticationとprivacyに指定します。
- Kerberos 認証を使用する場合:
注意
オブジェクトストレージパスを使用する場合、オブジェクトストレージパスの各パラメータは
&記号で区切られます。入力するパラメータ値には、英字の大文字と小文字、数字、\/-_$+=およびワイルドカードのみ含まれていることを確認してください。上記以外の文字を入力した場合、設定が失敗する可能性があります。
FORMAT句は、ファイル読み取り形式に関連するプロパティを指定するために使用され、CSV、PARQUET、ORC の 3 種類のファイル形式をサポートしています。TYPE = 'CSV' の場合、以下のフィールドが含まれます:
LINE_DELIMITER:CSV ファイルの行区切り文字を指定します。デフォルトはLINE_DELIMITER='\n'です。FIELD_DELIMITER:オプションです。CSV ファイルの列区切り文字を指定します。デフォルトはFIELD_DELIMITER='\t'です。PARSE_HEADER:オプションです。CSV ファイルの最初の行が各列の列名かどうかを指定します。デフォルトはFALSEで、CSV ファイルの最初の行を各列の列名として指定しないことを意味します。ESCAPE:CSV ファイルのエスケープ文字を指定します。1 バイトのみ指定できます。デフォルトはESCAPE ='\'です。FIELD_OPTIONALLY_ENCLOSED_BY:オプションです。CSV ファイルでフィールド値を囲む記号を指定します。デフォルトは空です。このオプションを使用すると、一部の型のフィールド(CHAR、VARCHAR、TEXT、JSON など)にのみ囲み文字が付加されます。ENCODING:ファイルの文字セットエンコーディング形式を指定します。指定しない場合、デフォルト値はUTF8MB4です。NULL_IF:NULLとして処理される文字列を指定します。デフォルト値は空です。SKIP_HEADER:ファイルヘッダーをスキップし、スキップする行数を指定します。SKIP_BLANK_LINES:空白行をスキップするかどうかを指定します。デフォルト値はFALSEで、空白行をスキップしないことを意味します。TRIM_SPACE:ファイル内のフィールドの先頭と末尾のスペースを削除するかどうかを指定します。デフォルト値はFALSEで、ファイル内のフィールドの先頭と末尾のスペースを削除しないことを意味します。EMPTY_FIELD_AS_NULL:空文字列をNULLとして処理するかどうかを指定します。デフォルト値はFALSEで、空文字列をNULLとして処理しないことを意味します。
TYPE = 'PARQUET/ORC' の場合、他の追加フィールドはありません。
PATTERN句は、正規表現パターン文字列を指定し、LOCATIONディレクトリ下のファイルをフィルタリングするために使用します。各 LOCATION ディレクトリ下のファイルパスがこのパターン文字列に一致する場合、外部テーブルはそのファイルにアクセスします。一致しない場合、外部テーブルはそのファイルをスキップします。このパラメータを指定しない場合、デフォルトではLOCATIONディレクトリ下のすべてのファイルにアクセスできます。
SOURCE
SOURCE キーワードには他の句が含まれていない場合、TYPE = 'ODPS' となり、以下のフィールドが必要です。
ACCESSID:ODPSユーザーのIDを指定します。ACCESSKEY:ODPSユーザーのパスワードを指定します。ENDPOINT:ODPSサービスの接続アドレスを指定します。TUNNEL_ENDPOINT:Tunnelデータ転送サービスの接続アドレスを指定します。PROJECT_NAME:クエリ対象のテーブルが存在するProjectを指定します。SCHEMA_NAME:オプションです。クエリ対象のテーブルのSCHEMAを指定します。TABLE_NAME:クエリ対象のテーブル名を指定します。QUOTA_NAME:オプションです。指定されたQuotaを使用するかどうかを選択します。COMPRESSION_CODE:オプションです。データソースの圧縮形式を指定します。ZLIB、ZSTD、LZ4、ODPS_LZ4の4種類の圧縮形式をサポートしています。設定しない場合は、圧縮は有効になりません。
log_errors
LOG ERRORS:インポートプロセス中のエラー診断を有効にし、最初のエラーで操作が終了する代わりに失敗した行を記録することを許可します。REJECT LIMIT句と組み合わせることで、許容される誤り行数を制御できます。INTO 'logfile_string':オプションです。エラーメッセージがターゲットディレクトリ内のファイルにも書き込まれるように設定します。INTO 'logfile_string'を指定しない場合、エラーメッセージはwarning bufferにのみ記録され、show warningsコマンドで確認できます。logfile_stringはエラーメッセージを保存するディレクトリを表し、形式は以下のとおりです:説明
INTO 'logfile_string'パラメータはV4.4.0バージョンからサポートされています。エラーメッセージをローカルに保存する場合、
logfile_stringの形式は[file://] local_file_pathです。local_file_pathは相対パスまたは絶対パスにすることができます。相対パスを指定する場合、現在のディレクトリはOceanBaseデータベースのインストールディレクトリである必要があります。secure_file_privはOBServerノードがアクセス権限を持つファイルパスを設定するために使用されます。local_file_pathはsecure_file_privパスのサブパスである必要があります。エラーメッセージをリモートに保存する場合(
CREATE EXTERNAL TABLE構文のLocationセクションを参照)、logfile_stringの形式は以下のとおりです:{oss\|s3}://$ACCESS_ID:$ACCESS_KEY@$HOST:s3_region/remote_file_path。ここで、$ACCESS_ID、$ACCESS_KEY、$HOSTはAlibaba Cloud OSS、AWS S3、およびS3プロトコル互換のオブジェクトストレージにアクセスするために必要なアクセス情報です。s3_regionはS3使用時に選択するリージョン情報です。これらの機密アクセス情報は暗号化されてデータベースのシステムテーブルに保存されます。hdfs://localhost:port/PATH。ここで、localhostはHDFSのアドレスを指し、portはHDFSのポート番号を指し、PATHはHDFS内のディレクトリパスを指します。Kerberos認証を使用するアドレスは次のとおりです:hdfs://localhost:port/user?principal=xxx&keytab=xxx&krb5conf=xxx&configs=xxx。
OceanBaseデータベースでは、テナント構成パラメータを使用して診断ログの圧縮アルゴリズムと単一診断ログファイルのサイズを設定できます。詳細については、load_data_diagnosis_log_compressionおよびload_data_diagnosis_log_max_sizeを参照してください。
REJECT LIMIT: オプションです。許容される最大誤り行数を設定します:- デフォルト値は0です。これはいかなる誤り行も許可されないことを意味し、最初のエラーに遭遇すると操作は失敗します。
integer:単一マシンで許容される最大誤り行数。例えば、10は1台のマシンで遭遇するエラーが最大10行であることを意味します。UNLIMITED: 無制限の誤り行を許可します。
BADFILE 'badfile_string':誤ったデータファイルを保存するパスを指定します。badfile_stringの値の形式はlogfile_stringの形式と同じです。説明
BADFILE 'badfile_string'パラメータはV4.4.0バージョンからサポートされています。
注意
LOG ERRORS句を指定しない場合、通常のインポート動作となり、最初のエラーに遭遇すると直ちにエラーが報告されます。LOG ERRORS句を指定したもののREJECT LIMIT句を指定しなかった場合、LIMITを0に設定した診断と同等になり、最初のエラーに遭遇すると操作は失敗します。ただし、最初に遭遇したエラーは記録され、エラーコードも診断関連のエラー、すなわち「reject limit reached」となります。エラーログの確認
OceanBaseデータベースは、エクスポートされたエラーログ情報を確認するための以下のSQLステートメントをサポートしています:
SELECT * FROM READ_ERROR_LOG('diagnosis_log_path');ここで、
diagnosis_log_pathはエラーログのパスを表します。このSQLステートメントは実行時に、以下のURL外部テーブルステートメントと同等です:SELECT * FROM FILES ( LOCATION = 'diagnosis_log_path/' FORMAT( TYPE = 'csv' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY = '\', PARSE_HEADER = true ) [, PATTERN = 'filename'] );例:
指定されたログパスがファイル名の場合(
/で終わらない)。SELECT * FROM READ_ERROR_LOG('diagnosis/log/path/filename');このSQLステートメントに対応するURL外部テーブルステートメントは次のとおりです(ファイル名はpatternとして使用され、ファイルがフィルタリングされます):
SELECT * FROM FILES ( LOCATION = 'diagnosis/log/path/', FORMAT ( TYPE = 'csv' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY = '\', PARSE_HEADER = true ), PATTERN = 'filename' );指定されたログパスがフォルダの場合(
/で終わる)。SELECT * FROM READ_ERROR_LOG('diagnosis/log/path/');このSQLステートメントに対応するURL外部テーブルステートメントは次のとおりです(patternは使用されません):
SELECT * FROM FILES ( LOCATION = 'diagnosis/log/path/', FORMAT ( TYPE = 'csv' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY = '\', PARSE_HEADER = true ) );
複数ファイルダイレクトロード時のワイルドカードのルール
複数ファイルのインポートを容易にするため、ファイルワイルドカード機能が導入されました。これはサーバーサイドおよびOSSファイルのインポートに適用されますが、クライアント側からのファイルインポートには適用されません。
サーバーサイドでのワイルドカードの使用
マッチングルール:
ファイル名のマッチング:
load data /*+ parallel(20) direct(true, 0) */ infile '/xxx/test.*.csv' replace into table t1 fields terminated by '|';ディレクトリのマッチング:
load data /*+ parallel(20) direct(true, 0) */ infile '/aaa*bb/test.1.csv' replace into table t1 fields terminated by '|';ディレクトリとファイル名の同時マッチング:
load data /*+ parallel(20) direct(true, 0) */ infile '/aaa*bb/test.*.csv' replace into table t1 fields terminated by '|';
注意事項:
マッチするファイルが少なくとも1つ存在しなければなりません。存在しない場合、エラーコード4027が返されます。
load data /*+ parallel(20) direct(true, 0) */ infile '/xxx/test.1*.csv,/xxx/test.6*.csv' replace into table t1 fields terminated by '|';の入力に対して、/xxx/test.1*.csv,/xxx/test.6*.csvは全体一致と見なされます。マッチしない場合、エラー4027が報告されます。POSIXのGLOB関数がサポートするワイルドカードのみがサポートされます。例えば、
test.6*(6|0).csvやtest.6*({0.csv,6.csv}|.csv)はlsコマンドでは検索できますが、GLOB関数ではマッチせず、エラー4027が報告されます。
クラウドオブジェクトストレージサービス(
OSS)でのワイルドカードの使用マッチングルール:
ファイル名のマッチング:
load data /*+ parallel(20) direct(true, 0) */ remote_oss infile 'oss://xxx/test.*.csv?host=xxx&access_id=xxx&access_key=xxx' replace into table t1 fields terminated by '|';注意事項:
ディレクトリのマッチングはサポートされていません。例えば、
load data /*+ parallel(20) direct(true, 0) */ remote_oss infile 'oss://aa*bb/test.*.csv?host=xxx&access_id=xxx&access_key=xxx' replace into table t1 fields terminated by '|';はOB_NOT_SUPPORTEDを返します。ファイル名のワイルドカードは
*と?のみをサポートします。他のワイルドカードは入力は可能ですが、結果とマッチしません。
例
説明
LOAD DATAでデータをロードする際、\Nを使用してNULLを表現できます。サーバー側ファイルからのデータインポート
例1:サーバー側ファイルからデータをインポートします。
グローバルセキュリティパスを設定します。
obclient> SET GLOBAL secure_file_priv = "/" Query OK, 0 rows affected obclinet> \q Bye説明
secure_file_privはGLOBAL変数であるため、\qを実行して終了し、変更を有効にする必要があります。データベースに再接続した後、外部ファイルからデータをインポートします。
obclient> LOAD DATA INFILE 'test.sql' INTO TABLE t1; Query OK, 0 rows affected
例2:
APPENDヒントを使用してダイレクトロード機能を有効にします。LOAD DATA /*+ PARALLEL(4) APPEND */ INFILE '/home/admin/a.csv' INTO TABLE t;例3:CSV形式ファイルをインポートします。
test1.csvファイルのすべての列をインポートします。load data /*+ direct(true,0) parallel(2)*/ from files( location = "data/csv", format = ( type = 'csv', field_delimiter = ',', parse_header = true, skip_blank_lines = true ), pattern = 'test1.csv') into table t1;data/csvパス下のtest1.csvファイルのc1、c2列を読み取り、それらをテーブルt1のcol1、col2列にインポートします。load data /*+ direct(true,0) parallel(2)*/ from ( select c1, c2 from files( location = 'data/csv' format = ( type = 'csv', field_delimiter = ',', parse_header = true, skip_blank_lines = true ), pattern = 'test1.csv')) into table t1 (col1, col2);
例4:PARQUET形式ファイルをインポートします。
load data /*+ direct(true,0) parallel(2)*/ from files( location = "data/parquet", format = ( type = 'PARQUET'), pattern = 'test1.parquet') into table t1;例5:ORC形式ファイルをインポートします。
load data /*+ direct(true,0) parallel(2)*/ from files( location = "data/orc", format = ( type = 'ORC'), pattern = 'test1.orc') into table t1;例5:ODPS形式ファイルをインポートします。
load data /*+ direct(true,0) parallel(2)*/ from source ( type = 'ODPS', accessid = '$ODPS_ACCESSID', accesskey = '******', endpoint= '$ODPS_ENDPOINT', project_name = 'example_project', schema_name = '', table_name = 'example_table', quota_name = '', compression_code = '') into table t1;クライアント(ローカル)ファイルからデータをインポートする
例1:ローカルファイルからOceanBaseデータベースのテーブルにデータをインポートします。
ターミナルまたはコマンドプロンプトウィンドウを開き、以下のコマンドを入力してクライアントを起動します。
obclient --local-infile -hxxx.xxx.xxx.xxx -P2881 -uroot@mysql001 -p****** -A -Dtest結果は次のとおりです:
Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221719526 Server version: OceanBase 4.2.2.0 (r100000022023121309-f536833402c6efe9364d5a4b61830a858ef24d82) (Built Dec 13 2023 09:58:18) Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. obclient [test]>注意
LOAD DATA LOCAL INFILE機能を使用するには、V2.2.4以降のバージョンのOBClientクライアントを使用してください。指定バージョンのOBClientクライアントがない場合は、MySQLクライアントを使用してデータベースに接続することもできます。クライアントで
LOAD DATA LOCAL INFILEステートメントを実行し、ローカルのデータファイルを読み込みます。obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/test_data/tbl1.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',';結果は次のとおりです:
Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0
例2:COMPRESSIONを設定して圧縮ファイルを直接インポートします。
LOAD DATA LOCAL INFILE '/your/file/lineitem.tbl.gz' INTO TABLE lineitem COMPRESSION GZIP FIELDS TERMINATED BY '|';例3:PARTITIONを指定してパーティションダイレクトロードを実行します。
- パーティションダイレクトロードの指定
load data /*+ direct(true,0) parallel(2) load_batch_size(100) */ infile "$FILE_PATH" into table t1 partition(p0, p1) fields terminated by '|' enclosed by '' lines starting by '' terminated by '\n';- サブパーティションダイレクトロードの指定
load data /*+ direct(true,0) parallel(2) load_batch_size(100) */ infile "$FILE_PATH" into table t1 partition(p0sp0, p1sp1) fields terminated by '|' enclosed by '' lines starting by '' terminated by '\n';OSSファイルからデータをインポートする
例1:
direct(bool, int)ヒントを使用してダイレクトロード機能を有効にします。ダイレクトロードファイルはOSS上に配置できます。load data /*+ parallel(1) direct(false,0)*/ remote_oss infile 'oss://antsys-oceanbasebackup/backup_rd/xiaotao.ht/lineitem2.tbl?host=***.oss-cdn.***&access_id=***&access_key=***' into table lineitem fields terminated by '|' enclosed by '' lines starting by '' terminated by '\n';サーバー側ファイルからURL外部テーブル方式でデータをインポートする
注意
例に含まれるIPアドレスに関するコマンドはマスキングされています。検証時には、ご自身のマシンの実際のIPアドレスを記入してください。
以下では、外部ファイルの場所がサーバー(OBServerノード)上およびOceanBaseデータベースのMySQLモード上にある場合の外部テーブル作成例を示します。手順は以下のとおりです:
OBServerノードにディレクトリを作成します。
/home/admin/test_csvディレクトリに外部データを、/home/admin/test_intoディレクトリにエラー情報を、/home/admin/test_badfileディレクトリに誤ったデータファイルを格納します。[admin@xxx /home/admin]# mkdir -p /home/admin/{test_csv,test_into,test_badfile}外部ファイルを準備します。
/home/admin/test_csvディレクトリ内にファイルtype_cast.csvを作成します。[admin@xxx /home/admin/test_csv]# vi type_cast.csvファイルの内容は以下のとおりです:
1,2,3 2,4,af 3,4,5 ds,6,32 4,5,6 5,2,3 6,v4,af 7,4,5 kj,a6,32 8,5,6インポートファイルのパスを設定します。
注意
セキュリティ上の理由により、システム変数
secure_file_privを設定する際は、ローカルソケット接続を介してデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。詳細については、secure_file_privを参照してください。以下のコマンドを実行して、OBServerノードが配置されているマシンにログインします。
ssh admin@10.10.10.1以下のコマンドを実行して、ローカルUnixソケット接続を介してテナント
mysql001に接続します。obclient -S /home/admin/oceanbase/run/sql.sock -uroot@mysql001 -p******以下のSQLコマンドを実行して、インポート・エクスポートを無制限に設定します。
SET GLOBAL secure_file_priv = "/";
テナント
mysql001に再接続します。例:
obclient -h10.10.10.1 -P2881 -uroot@mysql001 -p****** -A -Ddb_testテーブル
test_tbl1を作成します。CREATE TABLE test_tbl1(col1 INT, col2 INT, col3 INT);診断ログで使用する圧縮アルゴリズムを
AUTOに設定します。ALTER SYSTEM SET load_data_diagnosis_log_compression = 'AUTO';診断ログで使用する圧縮アルゴリズムの設定方法の詳細については、load_data_diagnosis_log_compressionを参照してください。
最大ログファイルサイズを1KBに設定します。エクスポートするログのサイズが1KBを超えると、自動的に2番目のファイルが生成され、エクスポートが継続されます。
ALTER SYSTEM SET load_data_diagnosis_log_max_size = '1K';単一診断ログファイルのサイズ設定方法の詳細については、load_data_diagnosis_log_max_sizeを参照してください。
LOAD DATAステートメントのURL外部テーブルインポート構文を使用して、テーブルtest_tbl1にデータをインポートします。エラー診断を指定し、エラーログを格納するディレクトリを/home/admin/test_into/、誤ったデータファイルを格納するディレクトリを/home/admin/test_badfile/と指定します。LOAD DATA FROM FILES( LOCATION = '/home/admin/test_csv/', FORMAT = ( TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'type_cast.csv') INTO TABLE test_tbl1 LOG ERRORS INTO '/home/admin/test_into/' REJECT LIMIT UNLIMITED BADFILE '/home/admin/test_badfile/';実行結果は次のとおりです:
Query OK, 6 rows affected, 4 warnings Records: 6 Deleted: 0 Skipped: 0 Warnings: 4read_error_logステートメントを使用して、エラーログの内容を確認します。SELECT * FROM READ_ERROR_LOG('/home/admin/test_into/');実行結果は次のとおりです:
+------------+---------------+-------------+-------------------------------------------------------------------------------------------------------------------+ | ERROR CODE | FILE NAME | LINE NUMBER | ERROR MESSAGE | +------------+---------------+-------------+-------------------------------------------------------------------------------------------------------------------+ | -4226 | type_cast.csv | 4 | fail to scan file type_cast.csv at line 4 for column "db_test"."test_tbl1"."col1", error: Incorrect integer value | | -4226 | type_cast.csv | 9 | fail to scan file type_cast.csv at line 9 for column "db_test"."test_tbl1"."col1", error: Incorrect integer value | | -4226 | type_cast.csv | 7 | fail to scan file type_cast.csv at line 7 for column "db_test"."test_tbl1"."col2", error: Incorrect integer value | | -4226 | type_cast.csv | 2 | fail to scan file type_cast.csv at line 2 for column "db_test"."test_tbl1"."col3", error: Incorrect integer value | +------------+---------------+-------------+-------------------------------------------------------------------------------------------------------------------+ 4 rows in settest_tbl1のデータを確認します。SELECT * FROM test_tbl1;実行結果は次のとおりです:
+------+------+------+ | col1 | col2 | col3 | +------+------+------+ | 1 | 2 | 3 | | 3 | 4 | 5 | | 4 | 5 | 6 | | 5 | 2 | 3 | | 7 | 4 | 5 | | 8 | 5 | 6 | +------+------+------+ 6 rows in setURL外部テーブルを使用して、badファイルの内容を確認します。
SELECT * FROM FILES ( LOCATION = '/home/admin/test_badfile/', FORMAT ( TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'data.bad');実行結果は次のとおりです:
+------+------+------+ | c1 | c2 | c3 | +------+------+------+ | ds | 6 | 32 | | kj | a6 | 32 | | 6 | v4 | af | | 2 | 4 | af | +------+------+------+ 4 rows in set
関連ドキュメント
- OceanBaseデータベースへの接続方法の詳細については、接続方法の概要を参照してください。
LOAD DATAステートメントの使用例については、LOAD DATAステートメントを使用したデータのインポートを参照してください。LOAD DATAダイレクトロードの使用例については、LOAD DATAステートメントを使用したデータのダイレクトロードを参照してください。