RedHat系のLinuxにMySQL8.0をYumでインストール

yumコマンドを使用して、「MySQL8.0」をLinux(RedHat系のCentOS7、RockyLinux、AlmaLinuxなど)にインストールから初期設定、データベース作成、アクセスユーザーの作成、権限設定までの手順を記載。

インストール準備

MySQL Yumリポジトリをシステムのリポジトリリストに追加します。この操作は一度だけ必要です。

Rocky、AlimaLinux、CentOSへは、「Red Hat Enterprise Linux ○」のRPM PackageをダウンロードしてMySQL用のパッケージをインストールします。

MySQL8.0のMySQLコミュニティダウンロードサイト

MySQL8.0については、「Red Hat Enterprise Linux 7/ Oracle Linux 7 (アーキテクチャに依存しない)、RPM パッケージ」に含まれています。CentOSやRockyLinux、AlimaLinux等、どのバージョンのパッケージのリポジトリを使用してよいかは、「uname -r」コマンドでLinuxカーネルバージョンを確認することでわかる。

uname -r
[rin@localhost ~]$ uname -r
4.18.0-372.32.1.el8_6.x86_64
[rin@localhost ~]$ 

上記例は、「4.18.0-372.32.1.el8_6.x86_64」と表示されているのでカーネルバージョンは、先頭3桁の「4.18.0」となる、それを下記のLinuxバージョンに照らしわせると、「RHEL 8.0 ~ RHEL 8.6」となっているため、使用するリポジトリは、「Red Hat Enterprise Linux 8」となる。

対応していないカーネルバージョンを使用すると、インストール時にライブラリエラーを出力することがある。

バージョンカーネルバージョンパッケージ名
Red Hat Enterprise Linux 2.1RHEL 2.1 Update1~72.4.9
Red Hat Enterprise Linux 3RHEL 3 Update1~8 or RHEL 3.92.4.21
Red Hat Enterprise Linux 4RHEL 4 Update 1~4 or RHEL 4.5~RHEL 4.92.6.9
Red Hat Enterprise Linux 5RHEL 5.1 ~ RHEL 5.112.6.18
Red Hat Enterprise Linux 6RHEL 6.1 ~ RHEL 6.102.6.32Red Hat Enterprise Linux 6 / Oracle Linux 6 (Architecture Independent), RPM Package
Red Hat Enterprise Linux 7RHEL 7.1 ~ RHEL 7.93.10.0Red Hat Enterprise Linux 7 / Oracle Linux 7 (Architecture Independent), RPM Package
Red Hat Enterprise Linux 8RHEL 8.0 ~ RHEL 8.64.18
Red Hat Enterprise Linux 8 / Oracle Linux 8 (Architecture Independent), RPM Package
Red Hat Enterprise Linux 9RHEL 9.05.14Red Hat Enterprise Linux 9 / Oracle Linux 9 (Architecture Independent), RPM Package

2022/11/16時点のリンク先

wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
wget https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
wget https://dev.mysql.com/get/mysql80-community-release-el6-7.noarch.rpm

※ここでwgetでダウンロードは不要

yumリポジトリ追加

yumリポジトリをダウンロードしてインストールします。

 $ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm

実行例

[rin@localhost ~]$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
メタデータの期限切れの最終確認: 1:49:59 時間前の 2022年11月17日 07時57分42秒 に実施しました。
mysql80-community-release-el8-4.noarch.rpm                                                               37 kB/s |  14 kB     00:00    
依存関係が解決しました。
========================================================================================================================================
 パッケージ                                   アーキテクチャー          バージョン                リポジトリー                    サイズ
========================================================================================================================================
インストール:
 mysql80-community-release                    noarch                    el8-4                     @commandline                     14 k
トランザクションの概要
========================================================================================================================================
インストール  1 パッケージ
合計サイズ: 14 k
インストール後のサイズ: 8.6 k
これでよろしいですか? [y/N]: y
パッケージのダウンロード:
トランザクションの確認を実行中
トランザクションの確認に成功しました。
トランザクションのテストを実行中
トランザクションのテストに成功しました。
トランザクションを実行中
  準備             :                                                                                                                1/1 
  インストール中   : mysql80-community-release-el8-4.noarch                                                                         1/1 
  検証             : mysql80-community-release-el8-4.noarch                                                                         1/1 
インストール済み:
  mysql80-community-release-el8-4.noarch                                                                                                
完了しました!
[rin@localhost ~]$ 

MySQL8.0がインストール可能か「yum repolist」コマンドで確認します。

$ sudo yum repolist all | grep mysql

実行例

[rin@localhost ~]$ sudo yum repolist all | grep mysql
mysql-cluster-8.0-community           MySQL Cluster 8.0 Community         無効化
mysql-cluster-8.0-community-debuginfo MySQL Cluster 8.0 Community - Debug 無効化
mysql-cluster-8.0-community-source    MySQL Cluster 8.0 Community - Sourc 無効化
mysql-connectors-community            MySQL Connectors Community          有効化
mysql-connectors-community-debuginfo  MySQL Connectors Community - Debugi 無効化
mysql-connectors-community-source     MySQL Connectors Community - Source 無効化
mysql-tools-community                 MySQL Tools Community               有効化
mysql-tools-community-debuginfo       MySQL Tools Community - Debuginfo   無効化
mysql-tools-community-source          MySQL Tools Community - Source      無効化
mysql-tools-preview                   MySQL Tools Preview                 無効化
mysql-tools-preview-source            MySQL Tools Preview - Source        無効化
mysql80-community                     MySQL 8.0 Community Server          有効化
mysql80-community-debuginfo           MySQL 8.0 Community Server - Debugi 無効化
mysql80-community-source              MySQL 8.0 Community Server - Source 無効化
[rin@localhost ~]$ 

現在の状態は、「mysql80-community」が有効となっているので、「yum install mysql」コマンドを実行した場合、MySQL8.0が自動でインストールされます。

MySQL8.0 yum repolist all | grep mysql実行結果

MySQL8.0が有効になっていない場合

もし、MySQL8.0が無効となっており別のMySQLが有効になっている場合は、「yum-config-manager」を使用してMySQL8.0を有効にしMySQL8.0以外を無効にします。

$ sudo yum -y install yum-utils
$ sudo yum-config-manager --disable mysql57-community
$ sudo yum-config-manager --enable mysql80-community

「/etc/yum.repos.d/mysql-community.repo」ファイルを書き換えることでも、インストールするパッケージを変更することができます。

パッケージ変更

MySQL5.7(❶)がenabled=1となっているため有効。MySQL8.0(❷)はenabled=0のため無効となっています。viエディタで直接修正することもできます。

次のコマンドで、正しいサブリポジトリが有効化及び無効化されていることを確認します。

 $ sudo yum repolist enabled | grep mysql
[rin@localhost ~]$  sudo yum repolist enabled | grep mysql
mysql-connectors-community              MySQL Connectors Community
mysql-tools-community                   MySQL Tools Community
mysql80-community                       MySQL 8.0 Community Server
[rin@localhost ~]$ 

もしも、MySQL8.0以外の表示されたら、以下の手順を試してみる

(EL8 システムのみ) RHEL8 や Oracle Linux 8 などの EL8 ベースのシステムには、デフォルトで有効になっている MySQL モジュールが含まれています。このモジュールが無効にされていない限り、MySQL リポジトリによって提供されるパッケージがマスクされます。

$ sudo yum module disable mysql

MySQL8.0のインストール

$ sudo yum install mysql-community-server
もしくは
$ sudo yum install mysql-server

正常にインストールされることを確認

MySQL8.0  yum install mysql-community-server実行結果

MySQL8.0サーバーを起動する

$ sudo systemctl start  mysqld

MySQLサービスが起動されているか、起動状態を確認する。

$ sudo systemctl status  mysqld

以下の状態であれば、正常に起動している。

[rin@localhost ~]$ sudo systemctl status  mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 2022-11-17 10:05:44 JST; 7s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 13063 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 13141 (mysqld)
   Status: "Server is operational"
    Tasks: 39 (limit: 10822)
   Memory: 485.1M
   CGroup: /system.slice/mysqld.service
           └─13141 /usr/sbin/mysqld

11月 17 10:05:37 localhost.localdomain systemd[1]: Starting MySQL Server...
11月 17 10:05:44 localhost.localdomain systemd[1]: Started MySQL Server.
[rin@localhost ~]$ 

サーバーの最初の起動時に、サーバーのデータディレクトリが空の場合、次のことが起きます。

  • サーバーが初期化されます。
  • SSL 証明書とキー ファイルはデータ ディレクトリに生成されます。
  • validate_password インストールされ有効になっています。
  • スーパーユーザー アカウント'root'@'localhostが作成されます。スーパーユーザーのパスワードが設定され、エラー ログ ファイルに保存されます。

データベースファイルと設定ファイル(RPM系)

項目ファイルまたはディレクトリ
データベースディレクトリ/var/lib/mysql/
設定ファイル/etc/my.cnf
※最優先される設定ファイル

MySQL8.0の初期設定

方法1:mysql_secure_installation使用しない

MySQLのrootパスワードを変更する

MySQLのroot(スーパーユーザー)パスワードは、初期はmysqld.logに格納されています。

$ sudo grep 'temporary password' /var/log/mysqld.log
[rin@localhost ~]$ sudo grep 'temporary password' /var/log/mysqld.log
2022-11-17T01:05:40.726912Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: j4N*&/;sNtd9
[rin@localhost ~]$ 

以下のコマンドでrootのパスワードを変更する

$> mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';

validate_password がデフォルトでインストールされており、以下のルールでパスワードを設定する必要があります。

  • パスワード長:8文字以上
  • 大文字小文字:それぞれ1文字以上
  • 数字:1文字以上
  • 記号:1文字以上

方法2:mysql_secure_installation使用する

「mysql_secure_installation」コマンドを使用すると、MySQLセキュリティを向上させることができます。

  • rootアカウントのパスワードを設定
  • rootを外部アクセスできないようにアカウントを削除します。(ローカルのみアクセス可)
  • 匿名ユーザーアカウントを削除します。
  • testデータベースを削除できます、
$ mysql_secure_installation
MySQL8.0のmysql_secure_installation実行例

MySQL8.0Serverの自動起動設定をする

以下のコマンドで自動起動設定をする

$ sudo systemctl enable mysqld

システムを再起動して自動起動するか確認をする

$ sudo reboot
$ sudo systemctl status mysqld

設定ファイルの変更

「MySQL8.0」のメインの設定ファイルの「/etc/my.ini」及び「/etc/my.cnf」を設定します。

初期ファイル

[rin@localhost ~]$ cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[rin@localhost ~]$ 

初期時の設定例

my.cnfの設定は、データベースサイズやサーバースペック、データベース運用で問題が起き始めた場合に修正していく設定になります。下記のほかにもたくさんありますが、例えば「max_connections」パラメータでデータベース接続数に上限を設けることでデータベースパフォーマンスの安定化を図ったり、データベースが肥大化したことによるバッファ領域のサイズを調整する「innodb_buffer_pool_size」パラメータを調整したりします。また、I/Oパフォーマンスに関する「innodb_log_file_size」パラメータなどもあります。

オプショナルグループシステム変数意味

mysqld

(サーバー)

character-set-serverutf8mb4UTF-8エンコーディング。1文字が1~4バイトの可変長。※絵文字などにも対応しています。
default-storage-engineInnoDBデータベースエンジンを指定。通常はInnDB
max_allowed_packet256Mデフォルト4MB
パケットの最大許可サイズ数。小さい値を設定していると長いSQL文の発行などでエラーになることがある
transaction-isolationREAD-COMMITTED
max_connectionsシステム運用時はあまり設定しない方が無難。システム運用時にコネクション上限に達し全システム停止するケースがあった。
default_password_lifetime0パスワード自動有効期限が無効

すべてのオプショナルグループの文字コードは明示的にあわせておきます。クライアントやサーバーで扱う文字コードが異なる場合は、文字化けの要因になります。

重要なパラメータ設定(パフォーマンスに影響をあたる)は、たとえデフォルトであってもmy.cnfに記述しておくことをお勧めします。これは、my.cnfを見た時にMySQLサーバーがどのような挙動をするか認識しやすくするためです。サーバー運用時は、無効にする場合や変更する場合はコメント化と変更履歴を残すことも大事です。障害や意図しない挙動したときの原因特定にも寄与するからです。

my.cnfを編集

$ sudo vi /etc/my.cnf

変更例

[rin@localhost ~]$ cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading "# " to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It's default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8mb4
default-storage-engine=InnoDB
max_allowed_packet=256M
transaction-isolation=READ-COMMITTED
[mysql]
default-character-set = utf8mb4
[mysqlcheck]

mysqlサーバーを再起動する

$ sudo systemctl restart mysqld

my.cnfでサーバーが扱う文字コードを設定してから、データベース作成(create database)を行う。作成したデータベースに意図しない文字コードが設定されてしまったり、意図しない文字コードのデータがDBに登録されてしまうため。

データベース作成

mysqlコマンドラインクライアントでMySQLサーバーにログインします。

$ mysql -uroot -p

「show databases」コマンドで登録されているデータベースを表示します。

[rin@localhost ~]$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.31 MySQL Community Server - GPL

Copyright (c) 2000, 2022, 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           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> 

データベース作成

CREATE DATABASE データベース名;

実行例

mysql> create database mysql80db;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| mysql80db          |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> 

一般ユーザーの作成

CREATE USER ユーザー名@localhost IDENTIFIED BY 'パスワード';  #サーバー内からのみアクセス可
CREATE USER ユーザー名@'%' IDENTIFIED BY 'パスワード'; #サーバー内及びネットワークからアクセス可

実行例

mysql> CREATE USER testuser@'%' IDENTIFIED BY 'Sssss@5632';
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE USER testuser@localhost IDENTIFIED BY 'Sssss@5632';
Query OK, 0 rows affected (0.01 sec)

mysql> 

権限の設定

GRANT all ON *.* TO 'ユーザー名'@'localhost';

実行例

mysql> GRANT all ON *.* TO 'testuser'@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> 

MySQL8.0のインストールは完了