遂にLinuxにMySQLを導入完了！

## 概要
この記事では、Linux環境にMySQLを導入する手順について詳しく説明します。MySQLは、Webアプリケーションやサーバー環境で広く使用されるオープンソースのリレーショナルデータベース管理システム(RDBMS)です。初めてMySQLをインストールする場合、いくつかのステップを踏む必要がありますが、本記事を参考にすることで、LinuxにMySQLを簡単に導入することができます。インストールからセキュリティ設定、サービスの起動までをカバーしています。これにより、LinuxでMySQLを使用する準備が整います。

以下の手順は、CentOS 7およびAlmaLinux 8で検証済みです。

## 1. 事前確認
### MySQLがインストールされているかの確認
```sh
rpm -qa | grep mysql
```
### インストール済の古いバージョンの削除
```sh
rpm -e --nodeps {mysqlのバージョン}
```

### OSのビット数の確認
```sh
getconf LONG_BIT
```

## 2. インストーラのダウンロード
以下のページからインストーラをダウンロードします。
[MySQLインストーラ](https://downloads.mysql.com/archives/community/)
私がインストールしたバージョンの設定情報は以下の通りです。
![MySQLインストーラの設定情報のスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2625874/6787dbb2-06a5-dbdd-4fb7-1200f8924968.png)

## 3. 圧縮解凍
```sh
cd /usr/local/
tar -xvf /tmp/mysql-8.0.25-linux-glibc2.17-x86_64.tar.xz
mv mysql-8.0.25-linux-glibc2.17-x86_64 mysql
```

## 4. MySQL用データディレクトリの作成
```sh
mkdir /usr/local/mysql/data
```

## 5. MySQL用グループとユーザの作成
```sh
cd /usr/local/mysql
groupadd mysql
useradd -g mysql mysql
chown -R mysql:mysql /usr/local/mysql
```

## 6. 設定情報の変更
`/etc/my.cnf`ファイルを開き、既存の設定情報を全て削除し、以下の設定情報を追加します。
```ini
[mysql]
default-character-set=utf8
[mysqld]
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=200
character-set-server=utf8
default-storage-engine=INNODB
lower_case_table_names=1
max_allowed_packet=16M
socket=/usr/local/mysql/mysql.sock
symbolic-links=0
[client]
port=3306
socket=/usr/local/mysql/mysql.sock
!includedir /etc/my.cnf.d
```

## 7. 初期化
```sh
cd /usr/local/mysql/bin/
./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql --initialize
```
初期化後、rootユーザのパスワードが生成されます。このパスワードをメモしてください。

## 8. サービスの有効化
サービスを起動時に自動的に起動するように設定します。
```sh
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
chkconfig --add mysql
```

## 9. MySQLの起動とrootユーザのパスワード変更
```sh
# MySQLの起動
service mysql start
# MySQLに接続
cd /usr/local/mysql/bin/
./mysql -u root -p
# rootユーザのパスワード変更
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
flush privileges;
```

## 10. リモートアクセス設定
MySQLデータベースに対してusernameユーザを使用してリモートアクセスできるように設定します。
```sql
mysql> use mysql;
mysql> select user,host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| username         | localhost         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
mysql> update user set host = '%' where user = 'username';
mysql> select user,host from user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| username         | %         |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)

```

## セキュリティ対策
### Rootユーザのパスワード設定
MySQLのrootユーザに強力なパスワードを設定して、不正アクセスを防ぎます。
```sql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新しいパスワード';
```
### 不要なユーザと権限の削除
不要なユーザアカウントや不必要な権限を削除して、攻撃者の侵入経路を制限します。
```sql
DROP USER 'username'@'localhost';
```
### アクセス制御の設定
MySQLのアクセス制御機能を使用して、許可されたホストからのみ接続を許可します。
```sql
GRANT ALL PRIVILEGES ON *.* TO 'username'@'hostname' IDENTIFIED BY 'password' WITH GRANT OPTION;
```
### 暗号化の有効化
MySQLの通信を暗号化して、データの盗聴や改ざんを防ぎます。
```sql
SET GLOBAL require_secure_transport = ON;
```
### ログの設定
MySQLのログを適切に設定して、セキュリティイベントを追跡し、潜在的な脆弱性を検出します。
```ini
[mysqld]
log_error = /var/log/mysql/error.log
```