MySQL 8.0 を Ubuntu 22.04 にインストールする

# MySQL 8.0 を Ubuntu 22.04 にインストールする

こんにちは、@studio_meowtoon です。今回は、WSL の Ubuntu 22.04 に MySQL 8.0 をインストールする手順を紹介します。
![mysql_on_ubuntu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3206449/f80e3801-07d5-f284-4d94-7942e880b1fd.png)

:::note warn
新しい Ubuntu のバージョンに対応した記事があります。
:::

https://qiita.com/studio_meowtoon/items/8905a84534b8f4cc680a

## 目的

Windows 11 の Linux でクラウド開発します。

こちらから記事の一覧がご覧いただけます。

https://qiita.com/studio_meowtoon/items/6119ab05d8b13527efd8 

## 実現すること

Ubuntu 22.04 に MySQL 8.0 をインストールします。

:::note alert
プロジェクトにより**古いバージョン**の **MySQL** が使用されていることもあります。 以下の記事では **MySQL 5.7** をインストールする方法を紹介しています。
:::

https://qiita.com/studio_meowtoon/items/43e99c2f92375d193a49

## 技術トピック

### MySQL とは？  

<details>
<summary>こちらを展開してご覧いただけます。</summary>

### [MySQL](https://dev.mysql.com/doc/refman/8.0/ja/what-is-mysql.html)

:::note info
MySQL は、オープンソースのリレーショナルデータベース管理システム (RDBMS) で、世界中で広く利用されているデータベースソフトウェアです。

|特徴|
|:--|
|MySQL は、高いパフォーマンス、拡張性、信頼性、および簡単な使用と管理性が特徴であり、Web アプリケーションや企業アプリケーションなど、さまざまな用途で使用されています。|
|MySQL は、クライアント/サーバーシステムとして動作し、多くのプログラムやWebアプリケーションから利用できます。|
|また、MySQL はオープンソースであるため、コミュニティによって開発されており、多くの開発者やユーザーが貢献しています。|
|MySQL は現在、Oracle Corporation が所有しており、Oracle Corporation から商用ライセンスも提供されています。|

:::

</details>

## 開発環境

+ Windows 11 Home 22H2 を使用しています。  

:::note info
[WSL](https://learn.microsoft.com/ja-jp/windows/wsl/about) の Ubuntu を操作しますので macOS の方も参考にして頂けます。  
:::

<details>

WSL (Microsoft Store アプリ版) [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
> wsl --version
WSL バージョン: 1.0.3.0
カーネル バージョン: 5.15.79.1
WSLg バージョン: 1.0.47
```

Ubuntu [※ こちらの関連記事からインストール方法をご確認いただけます](https://qiita.com/studio_meowtoon/items/2aaa6579cb8e4fa1d874)

```sh
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
```

</details>

:::note warn
この記事では基本的に **Ubuntu のターミナルで操作**を行います。**Vim を使用してコピペする方法**をはじめて学ぶ人のために、以下の記事で手順を紹介しています。ぜひ挑戦してみてください。
:::

https://qiita.com/studio_meowtoon/items/7771ad48676926e41463

## MySQL のインストール

MySQL の存在を確認します。

```sh
$ mysql --version
-bash: /usr/bin/mysql: そのようなファイルやディレクトリはありません
```

インストールします。

```sh
$ sudo apt update
$ sudo apt install mysql-server-8.0 -f
```

MySQL のバージョンを確認します。

```sh
$ mysql --version
mysql  Ver 8.0.32-0ubuntu0.22.04.2 for Linux on x86_64 ((Ubuntu))
```

:::note info
ここまでの手順で、**MySQL 8.0** を **Ubuntu 22.04** にインストールすることができました。
:::

### データベースとテーブルを作成

:::note info
ここでは例として **The Beatles** の**メンバー**を登録するデータベースを作成します。
:::

MySQL を起動します。

```sh
$ sudo service mysql start
```

MySQL にログインします。

:::note warn
この記事ではとくに **root パスワード**を**設定しません**。
:::

```sh
$ sudo mysql -u root
```

データベースを作成して選択します。

```sql
> CREATE DATABASE music;
> USE music;
```

テーブルを作成します。

```sql
> CREATE TABLE musician (
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    birthdate DATE NOT NULL,
    instrument VARCHAR(255) NOT NULL,
    PRIMARY KEY (id)
);
```

データベースの一覧表示をします。

```sh
> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| music              |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)
```

テーブルを確認をします。

```sh
> SHOW TABLES;
+-----------------+
| Tables_in_music |
+-----------------+
| musician        |
+-----------------+
1 row in set (0.00 sec)
```

:::note warn
以下は、テーブルを**削除**するコマンドです。
:::

```sql
> DROP TABLE <table_name>;
```

:::note warn
以下は、データベースを**削除**するコマンドです。
:::

```sql
> DROP DATABASE <database_name>;
```

MySQL からログアウトします。

```sql
> exit;
Bye
```

:::note info
ここまでの手順で、MySQL に**データベース**と**テーブル**を**作成**することができました。
:::

### テーブルにデータを挿入

musician.sql を作成します。

```sh
$ cd ~/tmp
$ vim musician.sql
```

ファイルの内容

```sql:musician.sql
USE music;
INSERT INTO musician (id, name, birthdate, instrument) VALUES
  (1, 'John Lennon', '1940-10-09', 'Vocal, Guitar'),
  (2, 'Paul McCartney', '1942-06-18', 'Vocal, Bass'),
  (3, 'George Harrison', '1943-02-25', 'Vocal, Guitar'),
  (4, 'Ringo Starr', '1940-07-07', 'Vocal, Drums');
```

MySQL にログインします。

```sh
$ sudo mysql -u root
```

データベースを選択します。

```sql
> USE music;
```

SQL ファイルをインポートします。

```sql
> SOURCE musician.sql;
```

テーブルの内容を表示します。

```sql
> SELECT * FROM musician;
+----+-----------------+------------+---------------+
| id | name            | birthdate  | instrument    |
+----+-----------------+------------+---------------+
|  1 | John Lennon     | 1940-10-09 | Vocal, Guitar |
|  2 | Paul McCartney  | 1942-06-18 | Vocal, Bass   |
|  3 | George Harrison | 1943-02-25 | Vocal, Guitar |
|  4 | Ringo Starr     | 1940-07-07 | Vocal, Drums  |
+----+-----------------+------------+---------------+
4 rows in set (0.00 sec)
```

MySQL からログアウトします。

```sql
> exit;
Bye
```

:::note info
ここまでの手順で、MySQL のテーブルに **SQL ファイル**からデータを**インポート**することができました。
:::

### データベースをダンプする

データベースのテーブルスキーマとデータをファイルにダンプします。

作業ディレクトリに移動します。
※ ~/tmp を作業ディレクトリとしています。

```sh
$ cd ~/tmp
```

データベースをダンプします。

```sql
$ sudo mysqldump -u root music > music_dump.sql
```

ダンプされたファイルを確認します。

```sh
$ cat ~/tmp/music_dump.sql
```

<details>
<summary>ファイルの内容を確認します。</summary>

```sql:tmp/music_dump.sql
-- MySQL dump 10.13  Distrib 8.0.32, for Linux (x86_64)
--
-- Host: localhost    Database: music
-- ------------------------------------------------------
-- Server version       8.0.32-0ubuntu0.22.04.2

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `musician`
--

DROP TABLE IF EXISTS `musician`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `musician` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `birthdate` date NOT NULL,
  `instrument` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `musician`
--

LOCK TABLES `musician` WRITE;
/*!40000 ALTER TABLE `musician` DISABLE KEYS */;
INSERT INTO `musician` VALUES (1,'John Lennon','1940-10-09','Vocal, Guitar'),(2,'Paul McCartney','1942-06-18','Vocal, Bass'),(3,'George Harrison','1943-02-25','Vocal, Guitar'),(4,'Ringo Starr','1940-07-07','Vocal, Drums');
/*!40000 ALTER TABLE `musician` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2023-04-11 15:24:02
```

</details>

:::note info
ここまでの手順で、データベースのテーブルスキーマ、データを含む**内容**を **music_dump.sql** ファイルにダンプすることができました。
:::
:::note warn
このでの手順では、**music_dump.sql** ダンプファイルに **CREATE DATABASE music;** 文が**含まれない**ことに注意してください。
:::

### データベースをリストアする

データベースのテーブルスキーマとデータをファイルからリストアします。

:::note warn
この記事の例では、データベースを**いったん削除**しています。
:::

作業ディレクトリに移動します。
※ ~/tmp を作業ディレクトリとしています。

```sh
$ cd ~/tmp
```

MySQL にログインします。

```sh
$ sudo mysql -u root
```

データベースを作成して選択します。

```sql
> CREATE DATABASE music;
> USE music;
```

データベースをリストアします。

```sql
> source music_dump.sql;
```

テーブルの内容を表示します。

```sql
> SELECT * FROM musician;
```

MySQL からログアウトします。

```sql
> exit;
Bye
```

:::note info
ここまでの手順で、データベースのテーブルスキーマ、データを含む **music_dump.sql** ダンプファイルを、**新しく作成**した **music** データベースにリストアすることができました。
:::

### アンインストール

MySQL を停止します。

```sh
$ sudo service mysql stop
```

MySQL パッケージを削除します。

```sh
$ sudo apt purge mysql-server mysql-client mysql-common \
    mysql-server-core-* mysql-client-core-*
```

MySQL の設定ファイルとデータベースを削除します。

```sh
$ sudo rm -rf /etc/mysql /var/lib/mysql /var/log/mysql
```

:::note info
ここまでの手順で、**MySQL 8.0** をシステムから完全に**アンインストール**できます。
:::

## トラブルシューティング

ポート 3306 を使用しているプロセスを確認するコマンドです。

```sh
$ sudo lsof -i :3306
```

もしポートが占有されている場合は、以下のコマンドでそのプロセスを終了します。

```sh
$ sudo kill -9 <nnnnn>
```

MySQL のソケットファイルを削除するコマンドです。

```sh
$ sudo rm /var/run/mysqld/mysqld.sock
```

## まとめ

Ubuntu 22.04 に MySQL 8.0 をインストールして、データベースを使用する開発環境を構築することができました。

:::note warn
**Ubuntu** を使うと **Linux の知識**も身に付きます。最初は難しく感じるかもしれませんが、徐々に進めていけば自信を持って書けるようになります。
:::

どうでしたか？　MySQL の操作には、この他にもたくさんのコマンドがあります。みなさんも少しづつ試してみてください。今後も開発環境などを紹介しますので、ぜひお楽しみにしてください。