docker環境でのMysql dumpのやり方

## はじめに
mysqlのdumpをやったことがなく、前からやってみたいと思っていたので、今回試してみることにしました。

## 環境
簡単に環境は以下です。webコンテナとdbコンテナをdocker-compose.ymlで作成しています。
- docker
- rails7
- mysql 8.0

## dumpのやり方
### userテーブルの作成とseedでデータを入れる
userテーブルを作成し、以下のようにseedでデータを入れます。
```rb:db > seeds.rb
100.times do |n|
  User.create!(
    name: "テスト太郎#{n + 1}",
    email: "test#{n + 1}@test.com",
    age: n + 1
  )
end
```

### テーブルデータの確認
dbコンテナに入ります。
```sh
$ docker compose exec db bash
```
mysqlにpasswordを入力してログインします。
```bash
bash-5.1# mysql -u root -p
Enter password: 
```

app_developmentデータベースを使用し、usersテーブルを表示します。
100件のレコードが表示されるはずです。
```bash
mysql> use app_development;
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
mysql> SELECT * FROM users;

+-----+----------+------------------+------+----------------------------+----------------------------+
| id  | name     | email            | age  | created_at                 | updated_at                 |
+-----+----------+------------------+------+----------------------------+----------------------------+
|   1 | ?????1   | test1@test.com   |    1 | 2024-07-08 13:20:59.774423 | 2024-07-08 13:20:59.774423 |
|   2 | ?????2   | test2@test.com   |    2 | 2024-07-08 13:20:59.786474 | 2024-07-08 13:20:59.786474 |
|   3 | ?????3   | test3@test.com   |    3 | 2024-07-08 13:20:59.792206 | 2024-07-08 13:20:59.792206 |
|   4 | ?????4   | test4@test.com   |    4 | 2024-07-08 13:20:59.797279 | 2024-07-08 13:20:59.797279 |
...省略
```

### dumpファイルの作成
それでは、データの準備が終わったのでdumpをやっていきたいと思います。

データベースを指定して、mysqlのdumpファイルを作成します。
dbはデータベースのコンテナ名、app_developmentはデータベース名です。
dump.sqlというファイルを作成します。
コマンドを実行すると、passwordが求められるので、入力しファイルを作成します。
```sh
$ docker compose exec db mysqldump -u root -p --databases app_development > dump.sql;

Enter password: password
```

### dumpファイルが作成されていることを確認
以下のように、現在のディレクトリの配下に、dump.sqlファイルが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/5a671dd1-8b5a-9235-24dd-c4c5b2b1b531.png)

中身はこんな感じのが記載されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1328154/1b4dd144-f2e0-7263-e545-353e29666e90.png)

### データベースを削除
コンテナに入り、mysqlにログインし、データベースをdropして削除します。
```sh
$ docker compose exec db bash

bash-5.1# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 43
Server version: 8.0.37 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> drop database app_development;
Query OK, 3 rows affected (0.03 sec)
```
### データベースが削除されていることを確認
```sh
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| app_test           |
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.02 sec)
```

### dumpファイルをコピー
dumpファイルをdbコンテナにコピーします。
```sh
$ docker compose cp dump.sql db:/tmp/dump.sql
```

### dumpをインポートする
dumpのインポートを行うために、dbコンテナに入ります。
`mysql -u root -p  < /tmp/dump.sql;`コマンドを実行し、tmpは以下にあるdump.sqlをインポートします。
この際、dump.sqlにはデータベースを作成するSQLも含まれるので、データベースを作成、usersテーブルを作成、データをインポートしてくれます。
```sh
$ docker compose exec db bash

bash-5.1# mysql -u root -p  < /tmp/dump.sql;
Enter password:
```

### データができているか確認
mysqlにログインし、`show databases;`でデータベースを確認します。
app_developmentがインポートされています。
実際に、usersテーブルの中身も確認するとデータが入っていることが確認できると思います。
```sh
bash-5.1# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 48
Server version: 8.0.37 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| app_development    |
| app_test           |
| information_schema |
| mydatabase         |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
7 rows in set (0.00 sec)
```

## 終わりに
dumpはやったことがなかったので、実際にやれてよかったです。
意外と簡単な手順でできるので、良かったらやってみてください。