ubuntu/LinuxMintでmariadbへデータロードを試して悩みました

1.概要

csvをmariadbにimportするload dataを試して、ハマったので、その内容を記述します。insert処理をcsvからload dataを利用してimportしてみました。結果的に作成したcsvの形式が悪く、timestampフィールドがゼロになる問題が発生して、悩みました。

2.詳細

(1)環境構築

(a) docker, docker-composeの導入
$ sudo apt -y install docker.io
$ sudo apt -y install docker-compose
$ sudo usermod -aG docker $(whoami)
$ docker --version
$ docker-compose --version
PCを1度再起動します

(b) docker-compose.ymlの作成
Docker hubの記述を参考にして、docker-compose.yml を作成します。

services:
    db:
        image: mariadb:10
        ports:
            - 3306:3306
        environment:
            MYSQL_DATABASE: redmine
            MYSQL_ROOT_PASSWORD: example

(c) container起動と停止
起動
$ docker-compose up -d
停止
$ docker-compose stop

(2) データロード

(a) insertのsqlからcsvを作成( copy_data.csv )

'1001','2023-10-01 00:00:00',1000
'1001','2023-10-01 01:00:00',1010
'1001','2023-10-01 02:00:00',1020
'1001','2023-10-01 03:00:00',1030
'1001','2023-10-01 04:00:00',1040
'1001','2023-10-01 05:00:00',1050
'1001','2023-10-01 06:00:00',1060
'1001','2023-10-01 07:00:00',1070
'1001','2023-10-01 08:00:00',1080
'1001','2023-10-01 09:00:00',1090
'1001','2023-10-01 10:00:00',1100
'1001','2023-10-01 11:00:00',1110
'1001','2023-10-01 12:00:00',1120
'1002','2023-10-01 00:00:00',1120
'1002','2023-10-01 01:00:00',1110
'1002','2023-10-01 02:00:00',1100
'1002','2023-10-01 03:00:00',1090
'1002','2023-10-01 04:00:00',1080
'1002','2023-10-01 05:00:00',1070
'1002','2023-10-01 06:00:00',1060
'1002','2023-10-01 07:00:00',1050
'1002','2023-10-01 08:00:00',1040
'1002','2023-10-01 09:00:00',1030
'1002','2023-10-01 10:00:00',1020
'1002','2023-10-01 11:00:00',1010
'1002','2023-10-01 12:00:00',1000

結果的には、このcsvが誤りでしたが、説明を続けます。

(b) dockerコンテナ内にCopy

docker ps でmariadbコンテナのIDを調べます。ここでは、1234567890abとします。

docker cp copy_data.csv 1234567890ab:/home/username/copy_data.csv

(c) load data

load data local infile 'copy_data.csv'
    into table sample_table
    fields terminated by ','
    enclosed by "'";
    
実行するとtimestampがゼロとなり、エラーです。

Query OK, 2 rows affected, 50 warnings (0.013 sec)   
Records: 26  Deleted: 0  Skipped: 24  Warnings: 50

MariaDB> select * from sample_table;
+------+---------------------+------------+
| id   | data_time           | data_value |
+------+---------------------+------------+
| 1001 | 0000-00-00 00:00:00 |       1000 |
| 1002 | 0000-00-00 00:00:00 |       1120 |
+------+---------------------+------------+
2 rows in set (0.000 sec)

ここで原因がわからずに悩みました。

(d) csvを修正( copy_data.csv )

csvはカンマ区切りで分かれているので、シングルクォートを削除しました。

1001,2023-10-01 00:00:00,1000
1001,2023-10-01 01:00:00,1010
1001,2023-10-01 02:00:00,1020
1001,2023-10-01 03:00:00,1030
1001,2023-10-01 04:00:00,1040
1001,2023-10-01 05:00:00,1050
1001,2023-10-01 06:00:00,1060
1001,2023-10-01 07:00:00,1070
1001,2023-10-01 08:00:00,1080
1001,2023-10-01 09:00:00,1090
1001,2023-10-01 10:00:00,1100
1001,2023-10-01 11:00:00,1110
1001,2023-10-01 12:00:00,1120
1002,2023-10-01 00:00:00,1120
1002,2023-10-01 01:00:00,1110
1002,2023-10-01 02:00:00,1100
1002,2023-10-01 03:00:00,1090
1002,2023-10-01 04:00:00,1080
1002,2023-10-01 05:00:00,1070
1002,2023-10-01 06:00:00,1060
1002,2023-10-01 07:00:00,1050
1002,2023-10-01 08:00:00,1040
1002,2023-10-01 09:00:00,1030
1002,2023-10-01 10:00:00,1020
1002,2023-10-01 11:00:00,1010
1002,2023-10-01 12:00:00,1000

再度、docker cpでコンテナにコピー

(e) load data

load data local infile 'copy_data.csv'
    into table sample_table
    fields terminated by ',';

Query OK, 26 rows affected (0.017 sec)               
Records: 26  Deleted: 0  Skipped: 0  Warnings: 0

enclosed by "'"も削除して、問題解決です。

MariaDB > select * from sample_table;
+------+---------------------+------------+
| id   | data_time           | data_value |
+------+---------------------+------------+
| 1001 | 2023-10-01 00:00:00 |       1000 |
| 1001 | 2023-10-01 01:00:00 |       1010 |
| 1001 | 2023-10-01 02:00:00 |       1020 |
| 1001 | 2023-10-01 03:00:00 |       1030 |
| 1001 | 2023-10-01 04:00:00 |       1040 |
| 1001 | 2023-10-01 05:00:00 |       1050 |
| 1001 | 2023-10-01 06:00:00 |       1060 |
| 1001 | 2023-10-01 07:00:00 |       1070 |
| 1001 | 2023-10-01 08:00:00 |       1080 |
| 1001 | 2023-10-01 09:00:00 |       1090 |
| 1001 | 2023-10-01 10:00:00 |       1100 |
| 1001 | 2023-10-01 11:00:00 |       1110 |
| 1001 | 2023-10-01 12:00:00 |       1120 |
| 1002 | 2023-10-01 00:00:00 |       1120 |
| 1002 | 2023-10-01 01:00:00 |       1110 |
| 1002 | 2023-10-01 02:00:00 |       1100 |
| 1002 | 2023-10-01 03:00:00 |       1090 |
| 1002 | 2023-10-01 04:00:00 |       1080 |
| 1002 | 2023-10-01 05:00:00 |       1070 |
| 1002 | 2023-10-01 06:00:00 |       1060 |
| 1002 | 2023-10-01 07:00:00 |       1050 |
| 1002 | 2023-10-01 08:00:00 |       1040 |
| 1002 | 2023-10-01 09:00:00 |       1030 |
| 1002 | 2023-10-01 10:00:00 |       1020 |
| 1002 | 2023-10-01 11:00:00 |       1010 |
| 1002 | 2023-10-01 12:00:00 |       1000 |
+------+---------------------+------------+
26 rows in set (0.001 sec)

3.所見

csvによるデータロードですが、簡単そうに見えて思ったようには進まないものです。
本検証はubuntu 20.04で実行しました。LinuxMint 22.3では 、image: mariadb:12に返納してコンテナが起動することを確認しました。

参考

コメント

過去30日間に良く読まれた記事

miniPCのBMAXでWindows11のsecure boot設定漏れでトラブル発生

Windows95/98のPCゲームをUbuntu/LinuxMintの最新PCで楽しむ方法 ( KVM / Wine / dosbox-x / midi )

LinuxMint/ubuntuにWine 11導入を試しました ( LinuxMint 21.3 / 22.3 ubuntu 22.04 / 26.04 Wine 11.0 / 11.6 / 11.8 / 11.13 )