MySQLの移行ってどうやるのかいまいち分かってなかったので
サーバ内にコンテナで建てられているMySQLデータベースをOracle CloudのMDSに移行してみた
用意した環境
環境は下記の通り
・Oracle Linux8.7
・aarch64
・docker 20.10.22
・docker compose v2.15.1
コンテナ情報
- DockerFile
FROM arm64v8/mysql
COPY ./my.cnf /etc/mysql/conf.d/my.cnf
- compose.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
[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
対象のデータベース情報
データベース
mysql> CREATE DATABASE testdb;
テーブル
### 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');
用意したテーブル
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 |
+----+-------------+------------------------+-------------+
(環境用意するのにも1時間以上かかった。。。)
移行の手順を追っていく
今回は下記記事を参考にやってみる
https://kosuke-space.com/mysql-db-migration
dumpを取得する
コマンドを実行してダンプファイルを作ってみる。
コンテナなので、サーバからコマンドを実行する。
※コマンドライン上にパスワード書くなって怒られた
-p
のあとはスペースを入れたいところだけど、スペースを入れたら実行できないので注意
$ [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にファイルがあることを確認
[opc@docker ~]$ ls /tmp/
mysql-backup.sql
MDSにダンプファイルを当て込む
MDSへの接続はNLBを使ってパブリック経由で実施する
本当はサーバからやりたかったけど、mysql-clientがaarch64で見つからなかったので、コンテナの中から実施
※コンテナ内の/tmpにもダンプファイルを置いておく
空のデータベースを作成する。
### 作成前
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-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の違いで〜とかあるような気がするので
そこらへんはもっと調べておきたいと思いました。