RDSへCSVファイルをインポート/エクスポートする方法

EC2にMySQLクライアントを入れている必要がある。
MySQLクライアントをインストールする作業はここでは割愛する。

```
ssh -i /Users/<ユーザーネーム>/Desktop/<キーペアファイル名>.pem ec2-user@<パブリックIPアドレス>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/9a47a521-7bfe-3248-8946-f403723fa12a.png)


RDSに接続します。RDSのエンドポイントはAWSのコンソールからRDSの「接続とセキュリティ」タブから取得する。
```
mysql -u admin -p -h <RDSのエンドポイント>
```
パスワードを要求されるので予め設定したパスワードを入力する。
パスワードが正しければ接続する。

続いてデータベースを構築する。
```
mysql> create database <DB名>;
```

構築したデータベースを確認する。
```
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sample_db          |
| sys                |
| test               |
| transfer_dbinfo    |
+--------------------+
7 rows in set (0.00 sec)

```
今までテスト用で作成したデータベースが表示される。
次に使用するデータベースを指定する。
今回使用するデータベースはtransfer_dbinfoを使用する。
```
mysql> use transfer_dbinfo;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
```
Database changedの表示が出る。
```
テーブルを確認する。
mysql> show tables;
+---------------------------+
| Tables_in_transfer_dbinfo |
+---------------------------+
| sample                    |
| sample01                  |
| sample02                  |
| sample03                  |
| sample04                  |
| sample05                  |
| samplelist                |
| transfer                  |
| user                      |
| users                     |
+---------------------------+
10 rows in set (0.00 sec)
```
①作成されているsample01を削除
②新規テーブルを作成
③CSVファイルをインポートする
```
mysql> drop table sample01;
mysql> show tables;
+---------------------------+
| Tables_in_transfer_dbinfo |
+---------------------------+
| sample                    |
| sample02                  |
| sample03                  |
| sample04                  |
| sample05                  |
| samplelist                |
| transfer                  |
| user                      |
| users                     |
+---------------------------+
9 rows in set (0.00 sec)
mysql> TRUNCATE TABLE sample01;
Query OK, 0 rows affected (0.04 sec)
# ちなみにテーブルに登録されている値を全削除する場合はTRUNCATE TABLE文を使用する。
```
もう一度、新しいテーブルを作成する
```
mysql> create table sample01(
    -> NAME varchar(50),
    -> DB_NAME varchar(255),
    -> passward varchar(255),
    -> Function_ON_OFF char(30)
    -> );
Query OK, 0 rows affected (0.03 sec)
```
カラムにはvarcharなどの必ずデータ型を指定しないといけない。

https://dev.mysql.com/doc/refman/8.0/ja/data-types.html

参考にした簡易的なデータ型の一覧

https://qiita.com/onishi_820/items/54158d97bbd900a311d3

テーブル定義の作成例

https://proengineer.internous.co.jp/content/columnfeature/6728#section200

テーブルの中身を確認する。
カラムを入れただけで値は何も入っていない。
```
mysql> SELECT * FROM sample01;
Empty set (0.00 sec)
```


そこでCSVファイルをインポートする
```
mysql> LOAD DATA LOCAL INFILE 'transfer_dbinfo.csv'
    -> INTO TABLE `sample01`
    -> FIELDS TERMINATED BY '\t'
    -> IGNORE 1 LINES;
Query OK, 18 rows affected, 54 warnings (0.02 sec)
Records: 18  Deleted: 0  Skipped: 0  Warnings: 54
# クエリは一行ずつ入れること。
```

今回インポートしたCSVのデータがこちら。
![スクリーンショット 2024-07-28 16.10.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/fcc8b103-1d4a-2e00-e464-5bd6d7c9c1ea.png)


select文を使ってインポートされているかを確認する。
```
mysql> SELECT * FROM sample01;
+--------------------------------+---------+----------+-----------------+
| NAME                           | DB_NAME | passward | Function_ON_OFF |
+--------------------------------+---------+----------+-----------------+
| 株式会社〇〇                   | DB_01   | Pass_01  | 0               |
| （株）〇〇カンパニー           | DB_02   | Pass_02  | 1               |
| 株式会社〇〇                   | DB_03   | Pass_03  | 0               |
| （株）〇〇カンパニー           | DB_04   | Pass_04  | 1               |
| 株式会社〇〇                   | DB_05   | Pass_05  | 0               |
| （株）〇〇カンパニー           | DB_06   | Pass_06  | 1               |
| 株式会社〇〇                   | DB_07   | Pass_07  | 0               |
| （株）〇〇カンパニー           | DB_08   | Pass_08  | 1               |
| 株式会社〇〇                   | DB_09   | Pass_09  | 0               |
| （株）〇〇カンパニー           | DB_10   | Pass_10  | 1               |
| 株式会社〇〇                   | DB_11   | Pass_11  | 0               |
| （株）〇〇カンパニー           | DB_12   | Pass_12  | 1               |
| 株式会社〇〇                   | DB_13   | Pass_13  | 0               |
| （株）〇〇カンパニー           | DB_14   | Pass_14  | 1               |
| 株式会社〇〇                   | DB_15   | Pass_15  | 0               |
| （株）〇〇カンパニー           | DB_16   | Pass_16  | 1               |
| 株式会社〇〇                   | DB_17   | Pass_17  | 0               |
| （株）〇〇カンパニー           | DB_18   | Pass_18  | 1               |
+--------------------------------+---------+----------+-----------------+
18 rows in set (0.00 sec)
```

## RDSからCSVファイルをエクスポートする。

AWSのRDSに登録しているテーブルをエクスポートするのは通常のやり方が違うらしい。下記ドキュメント参考にしmysqldump_to_csv.pyをインストールする必要がある。

https://dev.classmethod.jp/articles/how-to-export-csv-from-rds-mysql/

https://qiita.com/saicologic/items/b12e2f7ff7b3115911f5

またただインストールするだけでは使用することはできない。
bashの設定ファイルにエイリアスに'python3'を設定しパスが通っているかを確認する。

参考にしたドキュメント

https://qiita.com/m0chim0chi/items/bc51bf5e5165ac646857
```
$ vi ~/.bashrc
alias python='python3'
export PATH="/usr/bin/$PATH"
$ source ~/.bashrc
$ python --version
Python 3.9.16
```
（ここに辿り着くのに時間がかかった・・）
```
$ mysqldump -u admin -p --host=<RDSのエンドポイント>.ap-northeast-1.rds.amazonaws.com --set-gtid-purged=OFF transfer_dbinfo sample01 | python mysqldump_to_csv.py > /home/ec2-user/table01.csv
Enter password: 
# ユーザーを作成した時のパスワードを入力する。
$ ls
10_alter_user    TEST01.txt              data.txt      mysqldump              sample01.csv  table01.csv
20_create_table  backup.sql              dbaccess.cnf  mysqldump_to_csv.py    sample01.txt  transfer_dbinfo.csv
30_insert_data   data.tar.gz             dbassess.cnf  mysqldump_to_csv.py.1  table.csv
[ec2-user@ip-10-0-0-9 ~]$ cat table01.csv
```
table01.csvがEC2に存在していることが確認できる。
```
$ cat table01.csv
'株式会社〇〇',DB_01,Pass_01,0
'（株）〇〇カンパニー',DB_02,Pass_02,1
'株式会社〇〇',DB_03,Pass_03,0
'（株）〇〇カンパニー',DB_04,Pass_04,1
'株式会社〇〇',DB_05,Pass_05,0
'（株）〇〇カンパニー',DB_06,Pass_06,1
'株式会社〇〇',DB_07,Pass_07,0
'（株）〇〇カンパニー',DB_08,Pass_08,1
'株式会社〇〇',DB_09,Pass_09,0
'（株）〇〇カンパニー',DB_10,Pass_10,1
'株式会社〇〇',DB_11,Pass_11,0
'（株）〇〇カンパニー',DB_12,Pass_12,1
'株式会社〇〇',DB_13,Pass_13,0
'（株）〇〇カンパニー',DB_14,Pass_14,1
'株式会社〇〇',DB_15,Pass_15,0
'（株）〇〇カンパニー',DB_16,Pass_16,1
'株式会社〇〇',DB_17,Pass_17,0
'（株）〇〇カンパニー',DB_18,Pass_18,1
```
中身も確認できる。exitで抜けてローカルのデスクトップに戻りscpコマンドを実行する
```
sh-3.2# scp -i /Users/<ユーザーネーム>/Desktop/TEST.pem ec2-user@3.114.235.30:/home/ec2-user/table01.csv /Users/<ユーザー名>/Desktop/
table01.csv                                   100%  792    53.2KB/s   00:00  
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/daa5d6a9-448d-981a-0e56-b132378f1585.png)

ファイルを開いてみると文字化けしている。
右クリックして「このアプリケーションを開く」を選択する
テキストエディットで開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/22117fd6-9128-0070-c32c-d3aaaa0e025a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/bb472b18-8ea4-92ec-798f-28fcfb35902f.png)
保存するときに「標準テキストのエンコーディングを日本（Shift JIS）」に変更して保存する。

もう一度開き直すと通常の文字列で表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1828177/07c00fca-9d04-58ed-d871-3b2cc02b9c7b.png)

## 他にもこんな記事を書いています。

https://qiita.com/mmurm/items/9e225a6e471516101023

https://qiita.com/mmurm/items/0b763a5168159934b778

https://qiita.com/mmurm/items/c66860e79e1643015c12