2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TiDBAdvent Calendar 2024

Day 18

TiDBへのデータのImport 〜 IMPORT INTO

Last updated at Posted at 2024-12-17

はじめに

TiDBへのデータのImportはいくつかありますが、大きく分けて物理モードと論理モードの2つの手段があります。

  • 物理モード: TiKVに直接データを投入する。高速
  • 論理モード: INSERT文でデータを投入する。普通

この物理モードを利用できる手段は長らく TiDB Lightning のみでしたが、最近内部的にLightningを利用する IMPORT INTO 文が実装されました。

本記事ではこの IMPORT INTO 文を利用した方法について説明します。ローカルファイルをTiUPで起動したTiDB Playgroundで読み込んでみるのと、s3に出力したファイルをTiDB Cloud Dedicatedで読み込んでみるパターンの2つを試してみます。

IMPORT INTO は現在のところTiDB Cloud Dedicated, OSS版のTiDBで利用可能です。TiDB Cloud ServerlessではWebからImportメニューを利用してください。

ローカルファイルをTiDB OSSで読み込む

データの準備

こちらの記事で実施した、Dumplingでローカルファイルに出力したsql形式の出力を利用します。

tiup dumpling -h 127.0.0.1 -P 3306 -u root -p <password> \
-B employees -o output/ --filetype sql

TiDBの起動とIMPORT INTOの実施

まずはTiUPでPlaygroundを起動します。バージョンは v8.1.1 を指定しました。

> tiup playground v8.1.1

🎉 TiDB Playground Cluster is started, enjoy!

Connect TiDB:    mysql --host 127.0.0.1 --port 4000 -u root
TiDB Dashboard:  http://127.0.0.1:2379/dashboard
Grafana:         http://127.0.0.1:3000

接続できたら、出力された通りにMySQLクライアントから接続します。
IMPORT INTO では事前にテーブルを作成して置く必要があります。ここではemployeesテーブルを事前に作成しておきましょう。

mysql> source output/employees-schema-create.sql -- databaseの作成
mysql> use employees; 
mysql> source source output/employees.employees-schema.sql -- employeesテーブルの作成

ではIMPORT INTOを実施します。ファイルを直接読み込む場合、パスはTiDBと同じサーバでフルパスで指定する必要があります。ファイル名にはワイルドカードが利用できます。

mysql> IMPORT INTO employees FROM '/Users/.../output/employees.employees.*.sql' FORMAT 'sql';
+--------+--------------------------------------------------------------------------+-------------------------+----------+-------+----------+------------------+---------------+----------------+----------------------------+----------------------------+----------------------------+------------+
| Job_ID | Data_Source                                                              | Target_Table            | Table_ID | Phase | Status   | Source_File_Size | Imported_Rows | Result_Message | Create_Time                | Start_Time                 | End_Time                   | Created_By |
+--------+--------------------------------------------------------------------------+-------------------------+----------+-------+----------+------------------+---------------+----------------+----------------------------+----------------------------+----------------------------+------------+
|      1 | /Users/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/output/employees.employees.*.sql | `employees`.`employees` |      106 |       | finished | 16.9MiB          |        300024 |                | 2024-12-16 16:58:23.122401 | 2024-12-16 16:58:23.640002 | 2024-12-16 16:58:29.153543 | root@%     |
+--------+--------------------------------------------------------------------------+-------------------------+----------+-------+----------+------------------+---------------+----------------+----------------------------+----------------------------+----------------------------+------------+
1 row in set (0.01 sec)
1 row in set (6.34 sec)

このようにジョブの形で非同期で実行されますが、この例の場合はデータ量が少なかったのでもう終わっています。ジョブの実行状況は SHOW IMPORT JOBS でも確認できます。

データが入っていることを確認してみます。

select * from employees limit 5;
+--------+------------+------------+-----------+--------+------------+
| emp_no | birth_date | first_name | last_name | gender | hire_date  |
+--------+------------+------------+-----------+--------+------------+
|  10001 | 1953-09-02 | Georgi     | Facello   | M      | 1986-06-26 |
|  10002 | 1964-06-02 | Bezalel    | Simmel    | F      | 1985-11-21 |
|  10003 | 1959-12-03 | Parto      | Bamford   | M      | 1986-08-28 |
|  10004 | 1954-05-01 | Chirstian  | Koblick   | M      | 1986-12-01 |
|  10005 | 1955-01-21 | Kyoichi    | Maliniak  | M      | 1989-09-12 |
+--------+------------+------------+-----------+--------+------------+
5 rows in set (0.00 sec)

問題なさそうです。

TiDB CloudにS3からIMPORTしてみる。

今度はTiDB Cloudからcsvファイルを読み込んでみます。

準備

こちらの例を使って、DumplingでS3に出力します。

tiup dumpling -h 127.0.0.1 -P 3306 -u root -p <password> \
-B employees -o s3://<bucket>/ --filetype csv --compress gz \
-m --output-filename-template '{{.DB}}/{{.Table}}/{{.Index}}'

TiDB Cloudへの接続とIMPORT INTO

TiDB Cloudへ接続して、OSS版同様にdatabaseとtableを作成しておきます。
(ここの手順は割愛します)

その後、IMPORT INTO を実行します。


IMPORT INTO employees FROM 's3://.../employees/employees/*.csv.gz?access-key=<accesskey>&secret-access-key=<secret>&session-token=<token>' WITH skip_rows=1;

OSS版同様、s3のパスを記述します。s3へのアクセスするために必要なクレデンシャルは、クエリパラメーター形式で指定します。今回は、IAMのアクセスキーを指定しています。

アクセスキーをSSOから取得した場合は、session-token も指定する必要があるので注意してください。

おわりに

IMPORT INTO はTiDB Cloud Dedicated、およびOSS版で利用可能な、高速なインポート方法です。TiDB Cloud Serverlessでは残念ながら利用できませんが、同じデータソースから利用可能なGUIのimportがありますので、そちらを利用すると良いです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?