SQL形式のデータファイルをOceanBaseデータベースにインポートするには、コマンドラインインターフェースとツールによるインポートの2つの方法があります。OceanBaseデータベースは、MySQLDumper、obloader、OceanBase開発者ツール(以下、ODCと略称)など、さまざまなツールを使用してSQL形式のデータファイルをインポートできます。
本記事では、主にコマンドラインインターフェース、obloader、およびODCを使用して、SQLファイルからOceanBaseデータベースへデータをインポートする方法について説明します。
SQLファイル情報の設定
OceanBaseデータベースにインポートするSQLファイル内のSQL構文は、OceanBaseデータベースの要件を満たしていなければなりません。
OceanBaseデータベースのSQL構文の詳細については、SQL構文(MySQLモード)およびSQL構文(Oracleモード)を参照してください。
例で使用されるSQLファイル情報は以下のとおりです:
[xxx@xxx /home/admin/test_sql]# cat test_tbl1.sql
DROP TABLE IF EXISTS test_data.test_tbl1;
CREATE TABLE IF NOT EXISTS test_data.test_tbl1(col1 INT,col2 VARCHAR(50),PRIMARY KEY (col1));
INSERT INTO test_data.test_tbl1 VALUES(1,'test1');
INSERT INTO test_data.test_tbl1 VALUES(2,'test2');
INSERT INTO test_data.test_tbl1 VALUES(3,'test3');
INSERT INTO test_data.test_tbl1 VALUES(4,'test4');
INSERT INTO test_data.test_tbl1 VALUES(5,'test5');
コマンドラインインターフェースを使用したデータのインポート
SQLファイルが保存されているマシンからOceanBaseデータベースにログインします。
[xxx@xxx /home/admin]# obclient -hxxx.xxx.xxx.1 -P2881 -uroot@mysql001 -p -A Enter password: Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3221709595 Server version: OceanBase 4.0.0.0 (r100000302022111120-7cef93737c5cd03331b5f29130c6e80ac950d33b) (Built Nov 11 2022 20:38:33) 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 [(none)]>Schemaデータベース
test_dataを作成します。obclient [(none)]> CREATE DATABASE test_data; Query OK, 1 row affectedSOURCEコマンドを使用して、SQLファイルのデータをインポートします。obclient [(none)]> SOURCE /home/admin/test_tbl1.sql Query OK, 0 rows affected, 1 warning Query OK, 0 rows affected Query OK, 1 row affected Query OK, 1 row affected Query OK, 1 row affected Query OK, 1 row affected Query OK, 1 row affectedインポートされたデータ情報を確認します。
obclient [test_data]> use test_data; Database changed obclient [test_data]> SHOW TABLES; +---------------------+ | Tables_in_test_data | +---------------------+ | test_tbl1 | +---------------------+ 1 row in set obclient [test_data]> SELECT * FROM test_tbl1; +------+-------+ | col1 | col2 | +------+-------+ | 1 | test1 | | 2 | test2 | | 3 | test3 | | 4 | test4 | | 5 | test5 | +------+-------+ 5 rows in set
ODCを使用したデータのインポート
ODCは、アップロードされたファイルから最大2GBまでのデータ(圧縮後)のインポートをサポートしており、それを超える部分はアップロードできません。大量のデータをインポートする必要がある場合は、データインポートツールobloaderを使用してください。
以下の内容では、Web版ODCを使用したデータのインポート方法について説明します。
ODC環境を準備します。
ODCにはWeb版とクライアント版があります。詳細については、Web版デプロイの概要およびクライアント版ODCのインストールを参照してください。
OceanBaseデータベースに接続します。
OceanBaseデータベースへの接続の詳細については、個人接続の作成を参照してください。
インポート設定パネルに移動します。
データベースに接続した後、上部のナビゲーションバーのツールタブをクリックし、表示されるドロップダウンメニューからインポートタブをクリックしてインポート設定パネルに移動します。
SQLファイルをアップロードします。
以下の図のとおりです:
- インポートファイル形式を選択します:SQLファイルを選択します。
- インポートファイルをアップロードします:ファイルプールをクリックしてファイルエクスプローラーに移動し、インポートするファイルを選択するか、ファイルを直接ファイルプールにドラッグしてアップロードします。アップロードするファイルの形式は、選択したインポートファイル形式と同じでなければなりません。SQLファイルは
.sqlファイルのアップロードをサポートしています。 - ファイルエンコーディングを選択します:ODCは現在、ASCII、ISO-8859-1、GB2312、GBK、GB18030、Unicode(UTF-8)、Unicode(UTF-16)、Unicode(UTF-32)およびBIG5などのエンコーディング形式をサポートしています。ファイルエンコーディングドロップダウンボックスから必要なエンコーディング形式を選択できます。
- 上記の設定が完了したら、次のステップ:インポート設定をクリックします。
インポート設定を行います。
以下の図のとおりです:
所属データベースを選択します:インポート対象が存在するデータベースを選択します。この項目には、ターゲットタスクが存在するデータベースの接続名も表示されます。
タスク設定で、実行方法を選択します:即時実行とスケジュール実行を選択できます。
sysテナントアカウント設定:アカウントとパスワード情報を入力した後、パスワードボックスの後ろにある接続テストボタンをクリックして、アカウント情報が正しいかどうかをテストします。デフォルトでは、接続設定のアカウントが自動的に入力されます。接続に失敗した場合は、今回のインポート用にパスワードを変更することを推奨します。
注意
sysテナントのアカウントとパスワードは、クラスタテナントのユーザーのアカウントとパスワードです(アカウントに「@sys#クラスタ」と入力しないでください)。
上記の設定が完了したら、送信をクリックします。
インポートタスクを確認します。
タスクが生成されると、自動的にタスクセンターパネルが表示されます。タスクセンターではタスク情報を確認できます。詳細については、インポートタスクを参照してください。
obloaderを使用したデータのインポート
操作手順
SQLファイルを設定します。
obloaderの実行環境を準備します。環境の準備およびツールのダウンロードを参照してください。
データをインポートします。
[xxx@xxx /ob-loader-dumper-3.3.2-SNAPSHOT/bin] $./obloader -h <ホストIP> -P <ポート> -u <ユーザー> -p <パスワード> --sys-user <sysテナントのrootユーザーまたはproxyroユーザー> --sys-password <sysテナントのアカウントパスワード> -c <クラスタ> -t <テナント> -D <スキーマ名> [--ddl] [--csv|--sql] [--all|--table 'テーブル名'] -f <データファイルまたはディレクトリ>説明
OceanBase物理ノードのホストアドレスとポートを使用してデータをインポートする場合、
-cオプションを指定する必要はありません。obloaderコマンドラインオプションの詳細については、コマンドラインオプションを参照してください。
SQLファイルデータのインポート例
以下の表は、例で使用されるデータベース情報です。
| データベース情報 | サンプル値 |
|---|---|
| クラスタ名 | test4000 |
| OceanBase DataBase Proxy (ODP) ホストアドレス | xxx.xxx.xxx.1 |
| OceanBase DataBase Proxy (ODP) ポート番号 | 2883 |
| 業務テナント名 | mysql001 |
| sysテナントのrootユーザーのパスワード | ****** |
| 業務テナントのユーザーアカウント(読み書き権限が必要) | obloader_user01 |
| 業務テナントのユーザーパスワード | ****** |
| スキーマデータベース名 | test_data |
テーブル構造のインポート
注意
- テーブル構造をインポートする際、SQL内容はDDLであり、
--ddlオプションを使用します。SQLにはコメントやSETスイッチ文などが含まれていないことが求められます。 - SQLファイルのディレクトリは、
-fオプションの/data/TABLE以下に設定します。例:/home/admin/test_sql/data/TABLE/test_tbl1-schema.sql。 - SQLファイルの名前形式:
テーブル名-schema.sql。 - データをインポートする際には、
--sys-userおよび--sys-passwordオプションを指定する必要があります。これにより、obloaderはテーブル構造のメタデータ情報を取得します。
シナリオの説明:/home/admin/test_sql/data/TABLE ディレクトリ下のSQLデータファイルを、クラスタ test4000 内のテナント mysql001 のスキーマ test_data にインポートします。
サンプルステートメントは以下のとおりです:
SQLファイルを作成します。
[root@xxx /home/admin]# mkdir -p /home/admin/test_sql/data/TABLE [root@xxx /home/admin]# cd /home/admin/test_sql/data/TABLE [root@xxx /home/admin/test_sql/data/TABLE]# vi test_tbl1-schema.sql [root@xxx /home/admin/test_sql/data/TABLE]# cat test_tbl1-schema.sql CREATE TABLE IF NOT EXISTS test_tbl1(col1 INT,col2 VARCHAR(50),PRIMARY KEY (col1));obloaderの実行環境を準備します。環境の準備およびツールのダウンロードを参照してください。
テーブル構造をインポートします。
[root@xxx /home/admin/ob-loader-dumper-3.3.2-SNAPSHOT/bin] $./obloader -h xxx.xxx.xxx.1 -P 2883 -u obloader_user01 -p ****** --sys-user root --sys-password ****** -c test4000 -t mysql001 -D test_data --ddl --all -f /home/admin/test_sql 2022-12-01 07:11:32 [INFO] Parsed args: [--host] xxx.xxx.xxx.1 [--port] 2883 [--user] obloader_user01 [--tenant] mysql001 [--cluster] test4000 [--password] ****** [--database] test_data [--sys-user] root [--sys-password] ****** [--ddl] true [--file-path] /home/admin/test_sql [--all] true 2022-12-01 07:11:32 [INFO] Load jdbc driver class: "com.oceanbase.jdbc.Driver" finished 2022-12-01 07:11:33 [INFO] The manifest file: "/home/admin/test_sql/data/MANIFEST.bin" has been saved 2022-12-01 07:11:33 [INFO] Init writer thread pool finished 2022-12-01 07:11:33 [WARN] The object type : "SEQUENCE" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "TABLE_GROUP" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [INFO] Start 128 schema file loader threads successed 2022-12-01 07:11:33 [INFO] No.1 sql of the file: "/home/admin/test_sql/data/TABLE/test_tbl1-schema.sql" exec success . Elapsed: 36.94 ms 2022-12-01 07:11:33 [INFO] Load file: "test_tbl1-schema.sql" succeeded 2022-12-01 07:11:33 [WARN] The object type : "VIEW" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "FUNCTION" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "PROCEDURE" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "TRIGGER" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "PACKAGE" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "TYPE" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "PACKAGE_BODY" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "TYPE_BODY" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "SYNONYM" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "PUBLIC_SYNONYM" doesn't exist in the -schema.sql files 2022-12-01 07:11:33 [WARN] The object type : "FILE" doesn't exist in the -schema.sql files 2022-12-01 07:11:34 [INFO] Close connection count: 1 of the DataSource. Key: xxx.xxx.xxx.1_11532_332378361_test_data 2022-12-01 07:11:34 [INFO] Shutdown task context finished 2022-12-01 07:11:34 [INFO] Finished Tasks: 1 Running Tasks: 0 Progress: 100.00% 2022-12-01 07:11:34 [INFO] All Load Tasks Finished: ---------------------------------------------------------------------------------------------------------------------------- No.# | Type | Name | Count | Status ---------------------------------------------------------------------------------------------------------------------------- 1 | TABLE | test_tbl1 | 1 -> 1 | SUCCESS ---------------------------------------------------------------------------------------------------------------------------- Total Count: 1 End Time: 2022-12-01 07:11:34 2022-12-01 07:11:34 [INFO] Load schema finished. Total Elapsed: 1.061 s 2022-12-01 07:11:34 [INFO] System exit 0
テーブルデータのインポート
注意
- テーブルデータをインポートする際、SQL内容はDMLであり、
--sqlオプションを使用します。SQLファイルの内容にはINSERTステートメントのみが含まれ、データは改行されません。 - SQLファイルのディレクトリは、
-fオプションのdata内にある必要があります。例:/home/admin/test_sql/data/test_tbl1.sql。 - SQLファイルの名前形式:
テーブル名.sql。 - データベース(スキーマ)には、SQLファイルに対応するテーブル名が存在していなければなりません。
シナリオの説明:/home/admin/test_sql/data/ のSQLデータファイルを、クラスタ test4000 内のテナント mysql001 のスキーマ test_data にインポートします。
サンプルステートメントは以下のとおりです:
SQLファイルを作成します。
[root@xxx /home/admin]# mkdir -p /home/admin/test_sql/data [root@xxx /home/admin]# cd /home/admin/test_sql/data [root@xxx /home/admin/test_sql/data]# vi test_tbl1.sql [root@xxx /home/admin/test_sql/data/TABLE]# cat test_tbl1.sql INSERT INTO test_tbl1 VALUES(1,'test1'); INSERT INTO test_tbl1 VALUES(2,'test2'); INSERT INTO test_tbl1 VALUES(3,'test3'); INSERT INTO test_tbl1 VALUES(4,'test4'); INSERT INTO test_tbl1 VALUES(5,'test5');obloaderの実行環境を準備します。環境の準備およびツールのダウンロードを参照してください。
テーブルデータをインポートします。
[root@xxx /home/admin/ob-loader-dumper-3.3.2-SNAPSHOT/bin] $./obloader -h xxx.xxx.xxx.1 -P 2883 -u obloader_user01 -p ****** --sys-user root --sys-password ****** -c test4000 -t mysql001 -D test_data --sql --all -f /home/admin/test_sql 2022-12-01 07:17:39 [INFO] Parsed args: [--host] xxx.xxx.xxx.1 [--port] 2883 [--user] obloader_user01 [--tenant] mysql001 [--cluster] test4000 [--password] ****** [--database] test_data [--sys-user] root [--sys-password] ****** [--sql] true [--file-path] /home/admin/test_sql [--all] true 2022-12-01 07:17:39 [INFO] Load jdbc driver class: "com.oceanbase.jdbc.Driver" finished 2022-12-01 07:17:40 [INFO] The manifest file: "/home/admin/test_sql/data/MANIFEST.bin" has been saved 2022-12-01 07:17:40 [INFO] Query the column metadata for the table: "test_tbl1" finished 2022-12-01 07:17:40 [WARN] File: "/home/admin/test_sql/data/TABLE/test_tbl1-schema.sql" is unmatched on the suffix[.sql], ignore it 2022-12-01 07:17:40 [WARN] File: "/home/admin/test_sql/data/MANIFEST.bin" is unmatched on the suffix[.sql], ignore it 2022-12-01 07:17:40 [INFO] Binding table: "test_tbl1" to the file: "/home/admin/test_sql/data/test_tbl1.sql" finished 2022-12-01 07:17:40 [INFO] File: "/home/admin/test_sql/data/test_tbl1.sql" has not been splitted. 205 < 67108864 2022-12-01 07:17:40 [INFO] Splitted 1 sql subfiles by 64.0 MB. Elapsed: 15.64 ms 2022-12-01 07:17:40 [INFO] Generate 1 subfiles finished 2022-12-01 07:17:40 [INFO] Ignore to clean any tables as --truncate-table or --delete-from-table is not specified 2022-12-01 07:17:40 [ERROR] Invalid table entry: TableEntryKey [ cluster: test4000, tenant: mysql001, database: test_data, table: test_tbl1 ], TableId: -9223372036854775808, PartitionNum: 1, ReplicaNum: -9223372036854775808, SchemaVersion: null, PartitionInfo: null 2022-12-01 07:17:40 [INFO] Query table entry and primary key for table: "test_tbl1" finished. Remain: 0 2022-12-01 07:17:40 [INFO] Calculate leader: null of table: "test_tbl1", part: 0. Remain: 0 2022-12-01 07:17:40 [INFO] Waiting to refresh observer load status ...... 2022-12-01 07:17:40 [INFO] Refresh the observer load status success. Table: "test_tbl1". Remain: 0 2022-12-01 07:17:40 [INFO] Refresh observer load status finished. Elapsed: 1.203 ms 2022-12-01 07:17:40 [INFO] Use c.l.d.PhasedBackoffWaitStrategy as available cpu(s) is 64 2022-12-01 07:17:40 [INFO] Create 4096 slots for ring buffer finished. [0.0.0.0] 2022-12-01 07:17:40 [INFO] Start 128 database writer threads finished. [0.0.0.0] 2022-12-01 07:17:40 [INFO] Start 128 sql file reader threads successed 2022-12-01 07:17:40 [INFO] File: "/home/admin/test_sql/data/test_tbl1.sql" has been parsed finished 2022-12-01 07:17:42 [INFO] Wait for the all the workers to drain of published events then halt the workers 2022-12-01 07:17:42 [INFO] Close connection count: 4 of the DataSource. Key: xxx.xxx.xxx.1_11532_332378361_test_data 2022-12-01 07:17:42 [INFO] Shutdown task context finished 2022-12-01 07:17:42 [INFO] Finished Tasks: 1 Running Tasks: 0 Progress: 100.00% 2022-12-01 07:17:42 [INFO] All Load Tasks Finished: ---------------------------------------------------------------------------------------------------------------------------- No.# | Type | Name | Count | Status ---------------------------------------------------------------------------------------------------------------------------- 1 | TABLE | test_tbl1 | 5 -> 5 | SUCCESS ---------------------------------------------------------------------------------------------------------------------------- Total Count: 5 End Time: 2022-12-01 07:17:42 2022-12-01 07:17:42 [INFO] Load record finished. Total Elapsed: 2.296 s 2022-12-01 07:17:42 [INFO] System exit 0