説明
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]オプションを追加して、ローカルファイルシステムからのデータロード機能を有効にする必要があります。
指定したパーティションのダイレクトロードを使用する場合は、ターゲットテーブルがレプリケーションテーブルであってはならず、自動インクリメント列、識別列、グローバルインデックスを含むことはできません。
外部ファイルからデータをインポートするには、FILE 権限が必要です。GRANT FILE ON *.* TO $user_name; ステートメントを使用して権限を付与できます。ここで、$user_name は LOAD DATA コマンドを実行するユーザーです。
構文
-- 通常ファイルのインポート
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上のファイルをインポートする際は、以下の情報を確認する必要があります:
|
| 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:// | sfile://] local_file_path'です。file://:このプロトコルヘッダーは、複数の OBServer ノードで同じ論理パスのファイルに遭遇した場合、それぞれ異なるファイルとして扱われ、個別に処理されることを示します。各ノードはローカルパス下のファイルを独立して読み取ります。sfile://:このプロトコルヘッダーは、複数の OBServer ノードで同じ論理パスのファイルに遭遇した場合、システムが論理パスに基づいて重複処理を行い、データを一度だけ読み取ることを保証します(マルチサーバーロードバランシングをサポート)。注意
sfile://を使用する場合、システムはファイルサイズの一貫性検証を行います。同一の論理パス下のファイルが異なる OBServer ノードでサイズが一致しない場合、システムはOB_INVALID_EXTERNAL_FILEエラーを返します。これは、データの不整合による結果の誤りを防ぐためです。- V4.4.2 では、V4.4.2 BP2 から
LOAD DATA構文のローカル Location パス形式にsfile://プロトコルヘッダーのサポートが追加されました。
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パスのサブパスである必要があります。エラー情報をリモートに保存する場合(外部テーブル作成構文の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 を返します。
ファイル名のワイルドカードは * と ? のみをサポートします。他のワイルドカードは入力は可能ですが、マッチする結果は得られません。
例
サーバー側(OBServerノード)のファイルからデータをインポートする
例1:サーバー側ファイルからデータをインポートします。
グローバルセキュリティパスを設定します。
注意
セキュリティ上の理由により、システム変数 secure_file_priv を設定する際は、ローカルソケット接続でデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。詳細については、secure_file_privを参照してください。
obclient> SET GLOBAL secure_file_priv = "/";
ログアウトします。
説明
secure_file_priv は GLOBAL 変数であるため、\q を実行してログアウトすることで変更が有効になります。
obclinet> \q
実行結果は次のとおりです:
Bye
データベースに再接続した後、LOAD DATA ステートメントを使用してデータをインポートします。
通常インポート。
obclient> LOAD DATA INFILE '/home/admin/test.csv' INTO TABLE t1;
APPEND ヒントを使用してダイレクトロードを有効化します。
LOAD DATA /*+ PARALLEL(4) APPEND */ INFILE '/home/admin/test.csv' INTO TABLE t1;
例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;
例6: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 -usys@oracle001 -p******
結果は次のとおりです:
Welcome to the OceanBase. Commands end with ; or \g.
Your OceanBase connection id is 3221548006
Server version: OceanBase 4.2.2.0 (r100000032024010510-75c47d4be18a399e13c5309de1a81da5caf4e7c0) (Built Jan 5 2024 10:17:55)
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 [SYS]>
注意
LOAD DATA LOCAL INFILE機能を使用するには、V2.2.4以降のバージョンのOBClientクライアントを使用してください。
クライアントでLOAD DATA LOCAL INFILEステートメントを実行し、ローカルのデータファイルを読み込みます。
obclient [SYS]> 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 /*+ direct(true,1024) parallel(16) */ REMOTE_OSS INFILE 'oss://antsys-oceanbasebackup/backup_rd/xiaotao.ht/lineitem2.tbl?host=***.oss-cdn.***&access_id=***&access_key=***' INTO TABLE tbl1 FIELDS TERMINATED BY ',';
サーバー側ファイルからURL外部テーブル方式でデータをインポートする
注意
例に含まれるIPアドレスに関するコマンドはマスキング処理されています。検証時にはご自身のマシンの実際のIPアドレスを記入してください。
以下では、外部ファイルの場所がサーバー(OBServerノード)上およびOceanBaseデータベースのOracleモードの場合を例に、手順を説明します。
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ソケット接続方式でテナント oracle001 に接続します。
obclient -S /home/admin/oceanbase/run/sql.sock -usys@oracle001 -p******
以下のSQLコマンドを実行して、インポート・エクスポートを無制限に設定します。
SET GLOBAL secure_file_priv = "/";
テナント oracle001 に再接続します。
例:
obclient -h10.10.10.1 -P2881 -usys@oracle001 -p****** -A
テーブル 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: 4
read_error_log ステートメントを使用してエラーログの内容を確認します。
SELECT * FROM READ_ERROR_LOG('/home/admin/test_into');
実行結果は次のとおりです:
+------------+---------------+-------------+-------------------------------------------------------------------------------------------------------+
| ERROR CODE | FILE NAME | LINE NUMBER | ERROR MESSAGE |
+------------+---------------+-------------+-------------------------------------------------------------------------------------------------------+
| -5114 | type_cast.csv | 4 | fail to scan file type_cast.csv at line 4 for column "SYS"."TEST_TBL1"."COL1", error: Invalid numeric |
| -5114 | type_cast.csv | 9 | fail to scan file type_cast.csv at line 9 for column "SYS"."TEST_TBL1"."COL1", error: Invalid numeric |
| -5114 | type_cast.csv | 7 | fail to scan file type_cast.csv at line 7 for column "SYS"."TEST_TBL1"."COL2", error: Invalid numeric |
| -5114 | type_cast.csv | 2 | fail to scan file type_cast.csv at line 2 for column "SYS"."TEST_TBL1"."COL3", error: Invalid numeric |
+------------+---------------+-------------+-------------------------------------------------------------------------------------------------------+
4 rows in set
test_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 set
URL外部テーブルを使用して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
関連ドキュメント
LOAD DATA ステートメントの使用例については、LOAD DATAステートメントを使用したデータのインポートを参照してください。
LOAD DATA ダイレクトロードの使用例については、LOAD DATAステートメントを使用したデータのダイレクトロードを参照してください。