OceanBaseデータベースは、LOAD DATAコマンドを使用して、外部ファイルのデータをデータベーステーブルにロードすることをサポートしています。
使用上の制限
トリガー(Trigger)を持つテーブルでは、LOAD DATAステートメントの使用は禁止されています。
注意点
OceanBaseデータベースは、パラレル処理技術によりLOAD DATAのデータインポートレートを最適化します。この操作では、データを複数のサブタスクに分割して並列実行し、各サブタスクは独立したトランザクションとして扱われ、実行順序は固定されていません。そのため:
- データインポートプロセスのグローバルな原子性は保証されません。
- 主キーがないテーブルでは、データの書き込み順序が元のファイルの順序と異なる場合があります。
適用シナリオ
LOAD DATA は現在、CSV形式のテキストファイルをインポートすることができます。インポートのプロセスは以下の通りです:
説明
OceanBaseデータベースは、OSS、サーバー側(OBServerノード)、クライアント側(ローカル)に配置されたデータファイルの読み込みをサポートしています。
ファイルの解析。
OceanBaseは、ユーザーが入力したファイル名に基づいてファイル内のデータを読み取り、ユーザーが指定した並列度に応じて、入力ファイル内のデータを並列または直列で解析します。
データの配分。
OceanBaseは分散データベースシステムであるため、各パーティションのデータは異なるOBServerノードに分散している可能性があります。
LOAD DATAは解析されたデータに対して計算を行い、データを送信すべきOBServerノードを決定します。データの挿入。
対象となるOBServerノードが送信されたデータを受信すると、ローカルで
INSERT操作を実行し、データを対応するパーティションに挿入します。
LOAD DATA構文
LOAD DATA構文の詳細については、LOAD DATA(MySQLモード)およびLOAD DATA(Oracleモード)を参照してください。
LOAD DATA実行権限の取得
LOAD DATAステートメントを実行する前に、対応する権限を取得する必要があります。実行権限を付与する操作手順は以下のとおりです:
ユーザーに
FILE権限を付与します。例:
ユーザーに
FILE権限を付与するには、以下のコマンドを使用できます:GRANT FILE ON *.* TO user_name;ここで、
user_nameはLOAD DATAコマンドを実行するユーザーです。その他の必要な権限を付与します。
MySQLモードでは、対応するテーブルの
INSERT権限が必要です。例:
ユーザーに
INSERT権限を付与するには、以下のコマンド形式を使用できます:GRANT INSERT ON database_name.tbl_name TO user_name;ここで、
database_nameはデータベース名、tbl_nameはテーブル名、user_nameはLOAD DATAコマンドを実行するユーザーです。Oracleモードでは、
CREATE SESSION権限が必要です。例:
ユーザーに
CREATE SESSION権限を付与するには、以下のコマンド形式を使用できます:GRANT CREATE SESSION TO user_name;ここで、
user_nameは権限を付与するユーザー名です。
例
説明
OceanBaseデータベースは、OracleモードとMySQLモードの2つのモードをサポートしています。以下の例は、MySQLモードで LOAD DATA ステートメントの使用方法を示したものです。
サーバー側ファイルからのデータインポート
OBServerノードが存在するマシンにログインします。
例:
ssh admin@10.10.10.1/home/admin/test_dataディレクトリにテストデータを作成します。例:
以下のコマンドを実行して、
student.sqlという名前のスクリプトを作成します。vi student.sql編集モードに入り、テストデータを追加します。
例:
i キーまたは Insert キーを押して
viエディタの挿入モードに入り、挿入モードで以下の内容を追加します。1,"lin",98 2,"hei",90 3,"ali",95インポートファイルのパスを設定します。
注意
セキュリティ上の理由から、システム変数
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******ファイルがあるディレクトリを
/に設定します。これは制限がなく、任意のパスにアクセス可能であることを意味します。SET GLOBAL SECURE_FILE_PRIV = "/";
データベースに再接続します。
例:
obclient -h127.0.0.1 -P2881 -utest_user001@mysql001 -p****** -Aテストテーブルを作成します。
例:
以下のSQLステートメントを実行して、テストテーブル
studentを作成します。obclient [test]> CREATE TABLE student (id INT, name VARCHAR(50), score INT);LOAD DATAステートメントを使用してデータをインポートします。例:
以下の
LOAD DATAステートメントを使用して、ファイルからデータベーステーブルにデータをロードします。ここでは以下を指定します:- ロードするファイルのパスとファイル名を
/home/admin/test_data/student.sqlと指定します。 - データをロードする対象テーブル名を
studentと指定します。 - データファイル内のフィールド区切り文字をカンマと指定します。
- データファイル内のフィールド(文字型)は二重引用符で囲むことを指定します。
- データファイル内の行は改行文字を終端文字として使用することを指定します。
- ロードするデータファイル内の列と対象テーブル内の列のマッピング関係を指定します。データファイルの最初の列は対象テーブルの
id列に、2番目の列はname列に、3番目の列はscore列にマッピングされます。
obclient [test]> LOAD DATA INFILE '/home/admin/test_data/student.sql' INTO TABLE student FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (id,name,score);戻り値は次のとおりです:
Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0- ロードするファイルのパスとファイル名を
テーブル情報を確認します。
例:
obclient [test]> SELECT * FROM student;戻り値は次のとおりです:
+------+------+-------+ | id | name | score | +------+------+-------+ | 1 | lin | 98 | | 2 | hei | 90 | | 3 | ali | 95 | +------+------+-------+ 3 rows in set
クライアント(ローカル)ファイルからデータをインポートする
以下のステートメントを使用して、ローカルファイルからOceanBaseデータベースのテーブルにデータをインポートします。
ローカルの
/home/admin/test_dataディレクトリにテストデータを作成します。例:
以下のコマンドを実行して、
test_tbl1.csvという名前のスクリプトを作成します。vi test_tbl1.csv編集モードに入り、テストデータを追加します。
例:
i キーまたは Insert キーを押して
viエディタの挿入モードに入り、挿入モードで以下の内容を追加します。1,11 2,22 3,33クライアントを起動します。
例:
以下のステートメントを実行して、OBClientコマンドラインツールを使用してOceanBaseデータベースに接続します。
--local-infileパラメータを追加して、ローカルファイルからのデータ読み込み機能を有効にします。obclient --local-infile -hxxx.xxx.xxx.xxx -P2881 -uroot@mysql001 -p****** -Dtest注意
LOAD DATA LOCAL INFILE機能を使用するには、V2.2.4以降のバージョンのOBClientクライアントを使用してください。指定バージョンのOBClientクライアントがない場合でも、MySQLクライアントを使用してデータベースに接続できます。テストテーブルを作成します。
例:
CREATE TABLE test_tbl1(col1 INT,col2 INT);クライアントで
LOAD DATA LOCAL INFILEステートメントを実行し、ローカルのデータファイルを読み込みます。例:
obclient [test]> LOAD DATA LOCAL INFILE '/home/admin/test_data/test_tbl1.csv' INTO TABLE test_tbl1 FIELDS TERMINATED BY ',';実行結果は次のとおりです:
Query OK, 3 rows affected Records: 3 Deleted: 0 Skipped: 0 Warnings: 0テーブル情報を確認します。
例:
obclient [test]> SELECT * FROM test_tbl1;実行結果は次のとおりです:
+------+------+ | col1 | col2 | +------+------+ | 1 | 11 | | 2 | 22 | | 3 | 33 | +------+------+ 3 rows in set
例外処理
ログファイル
インポート中にエラーが発生した場合、エラーが発生した INSERT ステートメントはロールバックされ、LOAD DATA ステートメントはobserverプロセスのインストールパスにある log サブディレクトリに obloaddata.log.<XXXXXX> という名前のログファイルを生成します。以下はログファイルの内容例です。ログには LOAD DATA が生成したタスクの基本情報(テナント名、入力ファイル名、ターゲットテーブル名、並列度、使用した LOAD DATA コマンド)が含まれ、各行ごとに具体的なエラー情報が記載されます。
Tenant name: mysql
File name: /home/admin/a.csv
Into table: `test`.`t`
Parallel: 1
Batch size: 1000
SQL trace: YD7A20BA65670-0005AADAAA3C****
Start time: 2020-07-29 21:08:13.073741
Load query:
load data infile '/home/admin/test.csv' into table t fields terminated by ',' lines terminated by '\n'
Row ErrCode ErrMsg
1 1062 Duplicated primary key
2 1062 Duplicated primary key
例外診断
OceanBaseデータベースの LOAD DATA ステートメントによるURL外部テーブルインポート構文では、エラー診断モードの指定が可能になりました。最初のエラーで操作全体が終了する代わりに、失敗した行を記録することが許可されます。REJECT LIMIT 句を組み合わせることで、許容されるエラー行数を制御できます。
LOAD DATA ステートメントによるURL外部テーブルインポート構文でのエラー診断モードの指定に関する詳細は、LOAD DATA(MySQLモード)またはLOAD DATA(Oracleモード)を参照してください。