ただただコンテナMySQLからMDSにテーブルを移行してみた

MySQLの移行ってどうやるのかいまいち分かってなかったので
サーバ内にコンテナで建てられているMySQLデータベースをOracle CloudのMDSに移行してみた

## 用意した環境
環境は下記の通り
・Oracle Linux8.7
・aarch64
・docker 20.10.22
・docker compose v2.15.1

### コンテナ情報
* DockerFile
```Dockerfile
FROM arm64v8/mysql

COPY ./my.cnf /etc/mysql/conf.d/my.cnf
```

* compose.yaml
```yaml
version: "3.9"

services:
  mysql:
    image: mysql-aarch:latest
    platform: linux/arm64/v8
    container_name: mysql-container
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
    ports:
      - "3306:3306"
    volumes:
      - ./my.cnf:/etc/mysql/conf.d/my.cnf
```
* my.cnf
```conf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
max_allowed_packet=256M
innodb_file_per_table=ON
default-authentication-plugin=mysql_native_password
```

### 対象のデータベース情報
データベース
```sql
mysql> CREATE DATABASE testdb;
```

テーブル
```sql
### CREATE
mysql> CREATE TABLE user (
    -> id INT(11) NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(255) NOT NULL,
    -> email VARCHAR(255) NOT NULL,
    -> password VARCHAR(255) NOT NULL,
    -> PRIMARY KEY (id)
    -> );

### INSERT
mysql> INSERT INTO user (name, email, password)
VALUES ('John Doe', 'johndoe@example.com', 'password123'),
       ('Jane Smith', 'janesmith@example.com', 'password456'),
       ('Bob Johnson', 'bobjohnson@example.com', 'password789');
```

用意したテーブル
```sql
mysql> select * from user;
+----+-------------+------------------------+-------------+
| id | name        | email                  | password    |
+----+-------------+------------------------+-------------+
|  1 | John Doe    | johndoe@example.com    | password123 |
|  2 | Jane Smith  | janesmith@example.com  | password456 |
|  3 | Bob Johnson | bobjohnson@example.com | password789 |
+----+-------------+------------------------+-------------+
```

（環境用意するのにも１時間以上かかった。。。）

## 移行の手順を追っていく
今回は下記記事を参考にやってみる
https://kosuke-space.com/mysql-db-migration

### dumpを取得する
コマンドを実行してダンプファイルを作ってみる。
コンテナなので、サーバからコマンドを実行する。
　※コマンドライン上にパスワード書くなって怒られた
`-p`のあとはスペースを入れたいところだけど、スペースを入れたら実行できないので注意
```bash
$ [opc@docker ~]$ docker exec mysql-container mysqldump -u root -p'root' testdb > /tmp/mysql-backup.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[opc@docker ~]$ 
```

サーバの/tmpにファイルがあることを確認
```bash
[opc@docker ~]$ ls /tmp/
mysql-backup.sql
```

### MDSにダンプファイルを当て込む
MDSへの接続はNLBを使ってパブリック経由で実施する
本当はサーバからやりたかったけど、mysql-clientがaarch64で見つからなかったので、コンテナの中から実施
　※コンテナ内の/tmpにもダンプファイルを置いておく

空のデータベースを作成する。
```mysql
### 作成前
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

### 作成後
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
```

MDSのデータベースにダンプファイルを当て込む。
びっくりするほどあっさり完了。
```bash
bash-4.4# mysql -h 140.***.***.*** -u admin -p testdb < /tmp/mysql-backup.sql
```

確認してみたら本当にあった
```
mysql> select * from user;
+----+-------------+------------------------+-------------+
| id | name        | email                  | password    |
+----+-------------+------------------------+-------------+
|  1 | John Doe    | johndoe@example.com    | password123 |
|  2 | Jane Smith  | janesmith@example.com  | password456 |
|  3 | Bob Johnson | bobjohnson@example.com | password789 |
+----+-------------+------------------------+-------------+
```

え？終わり？
あと何を考慮すれば良いんだろう。my.cnfのチューニングとかでしょうか。

## 一旦おわり
OracleDatabaseと比べてMySQLの移行はかなりあっさりしていて拍子抜けしました。
環境準備のほうが時間かかった気がする。
稼働中に〜とか、CPUの違いで〜とかあるような気がするので
そこらへんはもっと調べておきたいと思いました。