概要
本記事では、OceanBaseにおいて LOAD DATA を使用して外部データを内部テーブルに書き込み、条件を満たす場合に ダイレクトロード(APPEND / direct(...) などのヒント、またはテナントレベルのパラメータ default_load_mode)を有効にすることで、大量データのロードスループットを向上させる方法について説明します。
構文
-- FROM FILES()
LOAD DATA /*+ [APPEND | DIRECT(need_sort,max_error,{'full'|'inc'|'inc_replace'})] parallel(N) */ FROM FILES(...) INTO TABLE table_name ...;
-- サーバーファイルまたはオブジェクトストレージの単一ファイル
LOAD DATA /*+ [APPEND | DIRECT(need_sort,max_error,{'full'|'inc'|'inc_replace'})] parallel(N) */ [REMOTE_OSS] INFILE 'file_name' INTO TABLE table_name ...;
-- クライアントローカルファイル(ダイレクトロードはサポートされていません)
LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name ...;
LOAD DATAのデータ読み取り場所による分類と構文関係
パス / 構文 |
データの場所 |
典型的な適用シナリオ |
構文関係と説明 |
制限 / 設定 / 補足 |
|---|---|---|---|---|
LOAD DATA FROM FILES(...) |
FILES 句で記述されたサーバー側からアクセス可能なパス(ローカルディレクトリ、オブジェクトストレージURL、HDFSなど、マニュアルを参照) |
単一ステートメントで LOCATION / FORMAT / PATTERN を記述し、CSV / ORC / Parquetなどのバッチスキャンとエラー診断に適しています |
FROM FILES(LOCATION = ..., FORMAT = (...), [PATTERN = ...]) でスキャン対象ファイル集合を宣言し、サーバー側が形式を解析した後にターゲットテーブルに書き込みます。LOG ERRORS などの句と組み合わせてインポート時のエラー診断に利用できます |
ダイレクトロードシナリオでは、LOAD DATA キーワードの後に /*+ direct(...) parallel(N) */ などのヒントを追加できます |
LOAD DATA ... INFILE 'path'(LOCAL なし) |
OBServerプロセスが読み取り可能なサーバーファイルシステムパス | ファイルはデータベースノードに配布済みであること。secure_file_priv と併用することが多い |
LOCAL を指定せず、かつ INFILE がOBServer上のパスの場合、サーバー側がそのファイル(またはワイルドカードでマッチする一連のファイル)を直接読み取ります |
パスは secure_file_priv が許可する範囲に設定する必要があります。この変数の変更は通常、ローカルUnixソケット接続を介して実行する必要があります |
LOAD DATA REMOTE_OSS INFILE 'oss://...' / 's3://...' |
オブジェクトストレージバケット内の単一ファイルURL | オブジェクトストレージバケット内の単一ファイルURLからデータを読み取る | 構文は LOAD DATA REMOTE_OSS INFILE 'oss://...'/'s3://...' のように書きます。FROM FILES の LOCATION がオブジェクトストレージURLである場合と同様に、「外部大規模データソース」の範疇に属します |
本文の例は FROM FILES、INFILE、LOCAL INFILE の3種類で整理されています。REMOTE_OSS INFILE を使用する場合、以下の direct(...)、parallel(N) およびパーティション句の書き方をこの構文に適用できます |
LOAD DATA ... LOCAL INFILE 'path' |
接続を開始するクライアントのローカルパス | ファイルはクライアントにのみ存在する。接続時には --local-infile を有効にする必要があります |
キーワード LOCAL は、ファイルがクライアントのローカルにあることを示します。クライアントが読み取った後、サーバー側にアップロードして解析と書き込みを完了します |
接続時には obclient --local-infile(または同等のオプション)を使用してローカルロード機能を有効にしてください。LOCAL INFILE はダイレクトロードをサポートしていません |
説明
フルダイレクトロードと増分ダイレクトロードの適用範囲、違い、およびより完全なダイレクトロード機能の説明については、データインポートの概要を参照してください。
各パラメータの完全な定義と構文の詳細については、LOAD DATA構文(MySQLモード)を参照してください。
例
フルダイレクトロード(direct(..., 'full'))は、通常、空のテーブルの初回ロードや全体的なベースラインインポートに使用されます。
増分ダイレクトロード(direct(..., 'inc')または'inc_replace')は、通常、ターゲットテーブルの既存データに対する追加ロードに使用されます。
両者はDIRECT()の3番目のパラメータ、ターゲットテーブルの状態、および適用制限が異なります。フルダイレクトロードと増分ダイレクトロードの違い、適用シナリオ、および制限については、データインポートの概要を参照してください。
以下の例は主にフルダイレクトロードを中心に説明します。増分ダイレクトロードのHintの書き方は同じで、3番目のパラメータを'inc'または'inc_replace'に変更するだけです。
LOAD DATA FROM FILES
OBServerノードに接続するマシンにログインし、
/home/adminディレクトリにスキャン対象のデータファイルを準備します(LOCATIONはサーバー側からアクセス可能なパスを指し、このディレクトリ内のCSV、ORC、Parquetなどが可能です。この例ではCSVを使用します)。説明
FROM FILESのLOCATIONはOBServerがアクセス可能なパスである必要があります。ディレクトリとファイルは、secure_file_privが許可する範囲内に配置することを推奨します(LOAD DATA INFILEと同じです)。OBServerノードが存在するマシンにアクセスします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1テストデータ
tbl1.csvを作成します(上記LOAD DATA INFILEの例とファイル内容が一致しており、比較しやすいようにしています)。[admin@xxx /home/admin]# vi tbl1.csv 1,11 2,22 3,33
インポートするファイルのパスを設定します。
システム変数
secure_file_privを設定し、インポートまたはエクスポート時にアクセス可能なパスを構成します。注意
セキュリティ上の理由から、システム変数
secure_file_privを設定する際は、ローカルUnixソケット接続を介してデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。詳細については、secure_file_privを参照してください。OBServerノードに接続するマシンにログインします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1以下のコマンドを実行し、ローカルUnixソケット接続方式でテナント
mysql001に接続します。obclient -S /home/admin/oceanbase/run/sql.sock -uroot@mysql001 -p******インポートパスを
/home/adminに設定します。obclient [(none)]> SET GLOBAL secure_file_priv = "/home/admin"; Query OK, 0 rows affected
データベースに再接続した後、
LOAD DATA FROM FILESとダイレクトロードヒントを使用してデータをインポートします。テーブル
tbl2を作成します(テーブル構造は上記LOAD DATA INFILEのフルインポート例と一致します)。obclient [test]> CREATE TABLE tbl2 ( col1 INT PRIMARY KEY, col2 INT ) PARTITION BY RANGE (col1) SUBPARTITION BY RANGE (col1) ( PARTITION p0 VALUES LESS THAN (100) ( SUBPARTITION p0_1 VALUES LESS THAN (50), SUBPARTITION p0_2 VALUES LESS THAN (100) ), PARTITION p1 VALUES LESS THAN (200) ( SUBPARTITION p1_1 VALUES LESS THAN (150), SUBPARTITION p1_2 VALUES LESS THAN (200) ) ); Query OK, 0 rows affectedテーブル
tbl2にデータがあるかどうかを確認します。この時点では、テーブルは空であることが表示されます。obclient [test]> SELECT * FROM tbl2; Empty setダイレクトロードを使用して、
tbl1.csvをスキャンし、テーブルtbl2にインポートします。増分ダイレクトロードでデータをインポートする必要がある場合、構文の例は以下のとおりです:
obclient [test]> LOAD DATA /*+ direct(true,1024,'inc') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2;または:
obclient [test]> LOAD DATA /*+ direct(true,1024,'inc_replace') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2;以降の手順では、フルダイレクトロードでデータをインポートする方法の例を続けて説明します。
テーブル
tbl2のすべての列を指定してデータをインポートします。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2; Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2の指定された列を指定してデータをインポートします。例えば、col1、col2列を指定します。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2 (col1,col2); Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2のパーティションを指定してデータをインポートします。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2 partition(p0, p1);テーブル
tbl2のサブパーティションを指定してデータをインポートします。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2 partition(p0sp0_1, p1sp1_1);(オプション)
LOG ERRORSを組み合わせてインポート時のエラー診断を行います(この句をサポートしている現在のバージョンでのみ使用可能)。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2 LOG ERRORS REJECT LIMIT UNLIMITED;パラメータ
default_load_modeを使用してデータをインポートします。default_load_modeの値をFULL_DIRECT_WRITEに設定します。obclient [test]> ALTER SYSTEM SET default_load_mode ='FULL_DIRECT_WRITE';LOAD DATAステートメントのヒントを指定しません。obclient [test]> LOAD DATA FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'CSV', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2;
テーブル
tbl2にデータがインポートされているかどうかを確認します。obclient [test]> SELECT * FROM tbl2;クエリ結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | +------+------+ 3 rows in set結果は、テーブル
tbl2にデータがインポートされたことを示しています。
OBServerノードが存在するマシンにログインし、
/home/adminディレクトリにtbl1.csvを準備します(手順とデータ内容はMySQLモードと同じです)。説明
FROM FILESのLOCATIONはサーバー側のパスです。FORMATのTYPEの値と大文字小文字は、現在のテナントモードのマニュアルに従います。この例はマニュアルの例と一致して、小文字のcsvを使用しています。OBServerノードが存在するマシンにアクセスします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1テストデータ
tbl1.csvを作成します。[admin@xxx /home/admin]# vi tbl1.csv 1,11 2,22 3,33
インポートファイルのパスを設定します。
システム変数
secure_file_privを設定し、インポートまたはエクスポートファイル時にアクセス可能なパスを構成します。注意
セキュリティ上の理由から、システム変数
secure_file_privを設定する際は、ローカルUnixソケット接続を介してデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。詳細については、secure_file_privを参照してください。OBServerノードが存在するマシンにログインします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1以下のコマンドを実行し、ローカルUnixソケット接続を介してテナント
oracle001に接続します。obclient -S /home/admin/oceanbase/run/sql.sock -usys@oracle001 -p******インポートパスを
/home/adminに設定します。obclient [(none)]> SET GLOBAL secure_file_priv = "/home/admin"; Query OK, 0 rows affected
データベースに再接続した後、
LOAD DATA FROM FILESとダイレクトロードヒントを使用してデータをインポートします。テーブル
tbl2を作成します(上記のLOAD DATA INFILEフルインポート例のOracleモードのテーブル構造と一致します)。obclient [SYS]> CREATE TABLE tbl2 ( col1 INT PRIMARY KEY, col2 INT ) PARTITION BY RANGE (col1) SUBPARTITION BY RANGE (col1) ( PARTITION p0 VALUES LESS THAN (100) ( SUBPARTITION p0_1 VALUES LESS THAN (50), SUBPARTITION p0_2 VALUES LESS THAN (100) ), PARTITION p1 VALUES LESS THAN (200) ( SUBPARTITION p1_1 VALUES LESS THAN (150), SUBPARTITION p1_2 VALUES LESS THAN (200) ) ); Query OK, 0 rows affectedテーブル
tbl2にデータがあるかどうかを確認します。この時点では、テーブルが空であることが表示されます。obclient [SYS]> SELECT * FROM tbl2; Empty setダイレクトロードを使用して、
tbl1.csvをスキャンし、テーブルtbl2にインポートします。増分ダイレクトロードでデータをインポートする必要がある場合、構文の例は以下を参照してください:
obclient [SYS]> LOAD DATA /*+ direct(true,1024,'inc') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2;または:
obclient [SYS]> LOAD DATA /*+ direct(true,1024,'inc_replace') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2;以降の手順では、フルダイレクトロードでデータをインポートする方法の例を続けて説明します。
テーブル
tbl2のすべての列を指定してデータをインポートします。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2; Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2の指定した列を指定してデータをインポートします。例えば、col1、col2列を指定します。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2 (col1,col2); Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0(オプション)テーブル
tbl2のパーティションを指定してデータをインポートします。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2 partition(p0, p1);(オプション)テーブル
tbl2のサブパーティションを指定してデータをインポートします。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2 partition(p0sp0_1, p1sp1_1);パラメータ
default_load_modeを使用してデータをインポートします。default_load_modeの値をFULL_DIRECT_WRITEに設定します。obclient [SYS]> ALTER SYSTEM SET default_load_mode ='FULL_DIRECT_WRITE';LOAD DATAステートメントのヒントを指定しません。obclient [SYS]> LOAD DATA FROM FILES( LOCATION = '/home/admin', FORMAT = (TYPE = 'csv', FIELD_DELIMITER = ','), PATTERN = 'tbl1.csv' ) INTO TABLE tbl2;
テーブル
tbl2にデータがインポートされているかどうかを確認します。obclient [SYS]> SELECT * FROM tbl2;クエリ結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | +------+------+ 3 rows in set結果は、テーブル
tbl2にデータがインポートされていることを示しています。
LOAD DATA INFILE
OBServerノードに接続するマシンにログインし、
/home/adminディレクトリにテストデータを作成します。説明
OceanBaseデータベースの
LOAD DATAステートメントは、OBServerノードのローカルにある入力ファイルのみの読み込みをサポートしています。そのため、インポートする前にファイルをいずれかのOBServerにコピーする必要があります。OBServerノードが存在するマシンにアクセスします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1テストデータ
tbl1.csvを作成します。[admin@xxx /home/admin]# vi tbl1.csv 1,11 2,22 3,33
インポートファイルのパスを設定します。
システム変数
secure_file_privを設定し、インポートまたはエクスポート時にアクセス可能なパスを構成します。注意
セキュリティ上の理由から、システム変数
secure_file_privを設定する際は、ローカルUnixソケット接続を介してデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。詳細については、secure_file_privを参照してください。OBServerノードに接続するマシンにログインします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1以下のコマンドを実行し、ローカルUnixソケット接続を介してテナント
mysql001に接続します。obclient -S /home/admin/oceanbase/run/sql.sock -uroot@mysql001 -p******インポートパスを
/home/adminに設定します。obclient [(none)]> SET GLOBAL secure_file_priv = "/home/admin"; Query OK, 0 rows affected
データベースに再接続した後、
LOAD /*+ DIRECT */ DATAステートメントを使用してデータをインポートします。テーブル
tbl2を作成します。obclient [test]> CREATE TABLE tbl2 ( col1 INT PRIMARY KEY, col2 INT ) PARTITION BY RANGE (col1) SUBPARTITION BY RANGE (col1) ( PARTITION p0 VALUES LESS THAN (100) ( SUBPARTITION p0_1 VALUES LESS THAN (50), SUBPARTITION p0_2 VALUES LESS THAN (100) ), PARTITION p1 VALUES LESS THAN (200) ( SUBPARTITION p1_1 VALUES LESS THAN (150), SUBPARTITION p1_2 VALUES LESS THAN (200) ) ); Query OK, 0 rows affectedテーブル
tbl2にデータがあるかどうかを確認します。この時点では、テーブルは空で表示されます。obclient [test]> SELECT * FROM tbl2; Empty setダイレクトロードを使用して、
tbl1.csvファイルのデータをテーブルtbl2にインポートします。増分ダイレクトロードでデータをインポートする場合は、構文例を参照してください:
obclient [test]> LOAD DATA /*+ direct(true,1024,'inc') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';または:
obclient [test]> LOAD DATA /*+ direct(true,1024,'inc_replace') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';以降の手順では、フルダイレクトロードでデータをインポートする例を続けて説明します。
テーブル
tbl2のすべての列を指定してデータをインポートします。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','; Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2の任意の指定された列を指定してデータをインポートします。例えば、col1、col2列を指定します。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','(col1,col2); Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2のパーティションを指定してデータをインポートします。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 partition(p0, p1) FIELDS TERMINATED BY ',';テーブル
tbl2のサブパーティションを指定してデータをインポートします。obclient [test]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 partition(p0sp0_1, p1sp1_1) FIELDS TERMINATED BY ',';パラメータ
default_load_modeを使用してデータをインポートします。default_load_modeの値をFULL_DIRECT_WRITEに設定します。obclient [test]> ALTER SYSTEM SET default_load_mode ='FULL_DIRECT_WRITE';LOAD DATAステートメントのヒントを指定しません。obclient [test]> LOAD DATA INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';
テーブル
tbl2にデータがインポートされているか確認します。obclient [test]> SELECT * FROM tbl2;クエリ結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | +------+------+ 3 rows in set結果は、テーブル
tbl2にデータがインポートされていることを示しています。
OBServerノードに接続するマシンにログインし、
/home/adminディレクトリにテストデータtbl1を作成します。説明
OceanBaseデータベースの
LOAD DATAステートメントは、OBServerノードのローカルにある入力ファイルのみの読み込みをサポートしています。そのため、インポートする前にファイルをいずれかのOBServerにコピーする必要があります。OBServerノードが存在するマシンにアクセスします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1テストデータ
tbl1.csvを作成します。[admin@xxx /home/admin]# vi tbl1.csv 1,11 2,22 3,33
インポートファイルのパスを設定します。
システム変数
secure_file_privを設定し、インポートまたはエクスポート時にアクセス可能なパスを構成します。注意
セキュリティ上の理由から、システム変数
secure_file_privを設定する際は、ローカルUnixソケット接続を介してデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。詳細については、secure_file_privを参照してください。OBServerノードに接続するマシンにログインします。
[xxx@xxx /home/admin]# ssh admin@10.10.10.1以下のコマンドを実行し、ローカルUnixソケット接続方式でテナント
oracle001に接続します。obclient -S /home/admin/oceanbase/run/sql.sock -usys@oracle001 -p******インポートパスを
/home/adminに設定します。obclient [(none)]> SET GLOBAL secure_file_priv = "/home/admin"; Query OK, 0 rows affected
データベースに再接続した後、
LOAD /*+ DIRECT */ DATAステートメントを使用してデータをインポートします。テーブル
tbl2を作成します。obclient [SYS]> CREATE TABLE tbl2 ( col1 INT PRIMARY KEY, col2 INT ) PARTITION BY RANGE (col1) SUBPARTITION BY RANGE (col1) ( PARTITION p0 VALUES LESS THAN (100) ( SUBPARTITION p0_1 VALUES LESS THAN (50), SUBPARTITION p0_2 VALUES LESS THAN (100) ), PARTITION p1 VALUES LESS THAN (200) ( SUBPARTITION p1_1 VALUES LESS THAN (150), SUBPARTITION p1_2 VALUES LESS THAN (200) ) ); Query OK, 0 rows affectedテーブル
tbl2にデータがあるかどうかを確認します。この時点では、テーブルは空です。obclient [SYS]> SELECT * FROM tbl2; Empty setダイレクトロードを使用して、
tbl1.csvファイルのデータをテーブルtbl2にインポートします。増分ダイレクトロードを使用してデータをインポートする場合は、構文例を参考にしてください:
obclient [SYS]> LOAD DATA /*+ direct(true,1024,'inc') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';または:
obclient [SYS]> LOAD DATA /*+ direct(true,1024,'inc_replace') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';以降の手順では、フルダイレクトロード方式でデータをインポートする例を続けて説明します。
テーブル
tbl2のすべての列を指定してデータをインポートします。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','; Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2の任意の指定列を指定してデータをインポートします。例えば、col1、col2列を指定します。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','(col1,col2); Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0(オプション)テーブル
tbl2のパーティションを指定してデータをインポートします。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 partition(p0, p1) FIELDS TERMINATED BY ',';(オプション)テーブル
tbl2のサブパーティションを指定してデータをインポートします。obclient [SYS]> LOAD DATA /*+ direct(true,1024,'full') parallel(16) */ INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 partition(p0sp0_1, p1sp1_1) FIELDS TERMINATED BY ',';パラメータ
default_load_modeを使用してデータをインポートします。default_load_modeの値をFULL_DIRECT_WRITEに設定します。obclient [SYS]> ALTER SYSTEM SET default_load_mode ='FULL_DIRECT_WRITE';LOAD DATAステートメントのヒントを指定しません。obclient [SYS]> LOAD DATA INFILE '/home/admin/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';
テーブル
tbl2にデータがインポートされているか確認します。obclient [SYS]> SELECT * FROM tbl2;クエリ結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | +------+------+ 3 rows in set結果は、テーブル
tbl2にデータがインポートされたことを示しています。
LOAD DATA LOCAL INFILE
obclientを実行しているクライアントのローカルマシン にデータファイルを準備します(パスは クライアントのローカルパス で、OBServer上のパスと混同しないでください)。ファイルの内容は前述の例と同じで、引き続き
tbl1.csvという名前にします。説明
LOCAL INFILEは、クライアントがローカルファイルを読み取り、サーバー側にアップロードすることを意味します。接続コマンドには--local-infile(または同等のオプション)を指定する必要があります。LOAD DATA LOCAL INFILEはダイレクトロードをサポートしていません。そのため、APPEND/DIRECT(...)ヒントを追加しないでください。クライアントでデータファイルを作成します(例:パス
/home/admin/client_csv/tbl1.csv。実際のクライアント環境に合わせてディレクトリを調整してください)。mkdir -p /home/admin/client_csv vi /home/admin/client_csv/tbl1.csvファイルの内容は以下のとおりです:
1,11 2,22 3,33
ローカル infile機能を使用してデータベースに接続し、ターゲットデータベースに入ります(例:テナント
mysql001内のtestデータベース)。obclient --local-infile -h10.10.10.1 -P2881 -uroot@mysql001 -p****** -DtestLOAD DATA LOCAL INFILEを使用してデータをインポートします(ダイレクトロードではありません)。テーブル
tbl2を作成します(テーブル構造は前述のLOAD DATA INFILEの完全な例と同じです)。obclient [test]> CREATE TABLE tbl2 ( col1 INT PRIMARY KEY, col2 INT ) PARTITION BY RANGE (col1) SUBPARTITION BY RANGE (col1) ( PARTITION p0 VALUES LESS THAN (100) ( SUBPARTITION p0_1 VALUES LESS THAN (50), SUBPARTITION p0_2 VALUES LESS THAN (100) ), PARTITION p1 VALUES LESS THAN (200) ( SUBPARTITION p1_1 VALUES LESS THAN (150), SUBPARTITION p1_2 VALUES LESS THAN (200) ) ); Query OK, 0 rows affectedテーブル
tbl2にデータがあるかどうかを確認します。この時点ではテーブルは空です。obclient [test]> SELECT * FROM tbl2; Empty setLOAD DATA LOCAL INFILEを使用して、クライアントのtbl1.csvをテーブルtbl2にインポートします。テーブル
tbl2のすべての列を指定してデータをインポートします。obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','; Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2の指定された列を指定してデータをインポートします。例えば、col1、col2列を指定します。obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','(col1,col2); Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2のパーティションを指定してデータをインポートします。obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 partition(p0, p1) FIELDS TERMINATED BY ',';テーブル
tbl2のサブパーティションを指定してデータをインポートします。obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 partition(p0sp0_1, p1sp1_1) FIELDS TERMINATED BY ',';
LOCAL INFILE形態はdefault_load_modeのダイレクトロードモードを適用できません。直接以下のステートメントを実行できます:obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';
テーブル
tbl2にデータがインポートされているか確認します。obclient [test]> SELECT * FROM tbl2;クエリ結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | +------+------+ 3 rows in set結果は、テーブル
tbl2にデータがインポートされていることを示しています。
クライアントローカル に
tbl1.csvを準備します(パス例:/home/admin/client_csv/tbl1.csv、内容はMySQLモードと同じ)。説明
MySQLモードと同様に、
--local-infile接続オプションを使用する必要があります。INFILEパスはクライアントのローカルパスであり、ダイレクトロードヒントはサポートされていません。クライアントにディレクトリとファイルを作成します。
mkdir -p /home/admin/client_csv vi /home/admin/client_csv/tbl1.csv1,11 2,22 3,33
ローカルの INFILE 機能を使用してデータベースに接続します(テナント例
oracle001)。obclient --local-infile -h10.10.10.1 -P2881 -usys@oracle001 -p******LOAD DATA LOCAL INFILEを使用してデータをインポートします(ダイレクトロードではない)。テーブル
tbl2を作成します(上記OracleモードのLOAD DATA INFILE完全な例と一致します)。obclient [SYS]> CREATE TABLE tbl2 ( col1 INT PRIMARY KEY, col2 INT ) PARTITION BY RANGE (col1) SUBPARTITION BY RANGE (col1) ( PARTITION p0 VALUES LESS THAN (100) ( SUBPARTITION p0_1 VALUES LESS THAN (50), SUBPARTITION p0_2 VALUES LESS THAN (100) ), PARTITION p1 VALUES LESS THAN (200) ( SUBPARTITION p1_1 VALUES LESS THAN (150), SUBPARTITION p1_2 VALUES LESS THAN (200) ) ); Query OK, 0 rows affectedテーブル
tbl2にデータがあるかどうかを確認します。この時点では、テーブルは空で表示されます。obclient [SYS]> SELECT * FROM tbl2; Empty setLOAD DATA LOCAL INFILEを使用して、クライアントのtbl1.csvをテーブルtbl2にインポートします。テーブル
tbl2のすべての列を指定してデータをインポートします。obclient [SYS]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','; Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル
tbl2の指定された列からデータをインポートします。例えば、col1、col2列を指定します。obclient [SYS]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ','(col1,col2); Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0(オプション)テーブル
tbl2のパーティションを指定してデータをインポートします。obclient [SYS]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 partition(p0, p1) FIELDS TERMINATED BY ',';(オプション)テーブル
tbl2のサブパーティションを指定してデータをインポートします。obclient [SYS]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 partition(p0sp0_1, p1sp1_1) FIELDS TERMINATED BY ',';
LOCAL INFILE形式ではdefault_load_modeのダイレクトロードモードは適用されません。以下のステートメントを直接実行できます:obclient [SYS]> LOAD DATA LOCAL INFILE '/home/admin/client_csv/tbl1.csv' INTO TABLE tbl2 FIELDS TERMINATED BY ',';
テーブル
tbl2にデータがインポートされているか確認します。obclient [SYS]> SELECT * FROM tbl2;クエリ結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | +------+------+ 3 rows in set結果は、テーブル
tbl2にデータがインポートされていることを示しています。