RedHat系LinuxにMySQL5.7をYumでインストール

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

インストール前の準備

CentOS7には、 mariaDBというMySQL互換のデータベースサーバーがデフォルトでインストールされている場合があるので、MySQLと競合を起こさないように以下のコマンドを実行して削除しておきます。インストールされていない場合は、この手順は無視する。

$ sudo yum remove mariadb-libs
$ sudo rm -rf /var/lib/mysql/

コマンドはすべて管理者権限で行う必要があります。rootユーザーか一般ユーザーの場合は、sudoコマンドを使用します。また、su – などrootにスィッチしている場合は、sudoは不要です。

MySQLのyumリポジトリを追加

yumリポジトリパッケージを取得

CentOS7から標準リポジトリでMySQLが提供されなくなりました。代わりにMySQLと互換のある「MariaDB」が提供されるようになりました。yumのリポジトリのURLはMySQL更新サイトから入手することができます。

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

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

[suna@localhost ~]$ uname -r
3.10.0-1160.80.1.el7.x86_64
[suna@localhost ~]$ 

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

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

カーネルバージョンに対応したリポジトリをダウンロード

バージョンカーネルバージョンパッケージ名
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時点のリンク先

#Red Hat Enterprise Linux 9
https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
#Red Hat Enterprise Linux 8
wget https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
#Red Hat Enterprise Linux 7
wget https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
#Red Hat Enterprise Linux 6
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-el7-7.noarch.rpm

実行例

[suna@localhost ~]$ sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm
読み込んだプラグイン:fastestmirror, langpacks
mysql80-community-release-el7-7.noarch.rpm                                                   |  11 kB  00:00:00     
/var/tmp/yum-root-1R6qJ2/mysql80-community-release-el7-7.noarch.rpm を調べています: mysql80-community-release-el7-7.noarch
/var/tmp/yum-root-1R6qJ2/mysql80-community-release-el7-7.noarch.rpm をインストール済みとして設定しています
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ mysql80-community-release.noarch 0:el7-7 を インストール
--> 依存性解決を終了しました。
依存性を解決しました
====================================================================================================================
 Package                          アーキテクチャー
                                                バージョン     リポジトリー                                    容量
====================================================================================================================
インストール中:
 mysql80-community-release        noarch        el7-7          /mysql80-community-release-el7-7.noarch         10 k
トランザクションの要約
====================================================================================================================
インストール  1 パッケージ
合計容量: 10 k
インストール容量: 10 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
警告: RPMDB は yum 以外で変更されました。
  インストール中          : mysql80-community-release-el7-7.noarch                                              1/1 
  検証中                  : mysql80-community-release-el7-7.noarch                                              1/1 
インストール:
  mysql80-community-release.noarch 0:el7-7                                                                          
完了しました!
[suna@localhost ~]$ 

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

$ sudo yum repolist all | grep mysql

実行例

[suna@localhost ~]$ sudo yum repolist all | grep mysql
mysql-cluster-7.5-community/x86_64           MySQL Cluster 7.5 Comm 無効
mysql-cluster-7.5-community-source           MySQL Cluster 7.5 Comm 無効
mysql-cluster-7.6-community/x86_64           MySQL Cluster 7.6 Comm 無効
mysql-cluster-7.6-community-source           MySQL Cluster 7.6 Comm 無効
mysql-cluster-8.0-community/x86_64           MySQL Cluster 8.0 Comm 無効
mysql-cluster-8.0-community-debuginfo/x86_64 MySQL Cluster 8.0 Comm 無効
mysql-cluster-8.0-community-source           MySQL Cluster 8.0 Comm 無効
mysql-connectors-community/x86_64            MySQL Connectors Commu 有効:    206
mysql-connectors-community-debuginfo/x86_64  MySQL Connectors Commu 無効
mysql-connectors-community-source            MySQL Connectors Commu 無効
mysql-tools-community/x86_64                 MySQL Tools Community  有効:     94
mysql-tools-community-debuginfo/x86_64       MySQL Tools Community  無効
mysql-tools-community-source                 MySQL Tools Community  無効
mysql-tools-preview/x86_64                   MySQL Tools Preview    無効
mysql-tools-preview-source                   MySQL Tools Preview -  無効
mysql57-community/x86_64                     MySQL 5.7 Community Se 無効
mysql57-community-source                     MySQL 5.7 Community Se 無効
mysql80-community/x86_64                     MySQL 8.0 Community Se 有効:    367
mysql80-community-debuginfo/x86_64           MySQL 8.0 Community Se 無効
mysql80-community-source                     MySQL 8.0 Community Se 無効
[suna@localhost ~]$ 

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

MySQL5.7の yum repolist all | grep mysql実行結果

MySQL5.7をインストールする場合は、「yum-config-manager」コマンドを実行して、MySQL8.0→MySQL5.7にスィッチします。

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

実行例

[suna@localhost ~]$ sudo yum-config-manager --disable mysql80-community
読み込んだプラグイン:fastestmirror, langpacks
============================================= repo: mysql80-community ==============================================
[mysql80-community]
async = True
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7
baseurl = http://repo.mysql.com/yum/mysql-8.0-community/el/7/x86_64
cache = 0
cachedir = /var/cache/yum/x86_64/7/mysql80-community
check_config_file_age = True
compare_providers_priority = 80
cost = 1000
deltarpm_metadata_percentage = 100
deltarpm_percentage = 
enabled = 0
enablegroups = True
exclude = 
failovermethod = priority
ftp_disable_epsv = False
gpgcadir = /var/lib/yum/repos/x86_64/7/mysql80-community/gpgcadir
gpgcakey = 
gpgcheck = True
gpgdir = /var/lib/yum/repos/x86_64/7/mysql80-community/gpgdir
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022,
   file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
hdrdir = /var/cache/yum/x86_64/7/mysql80-community/headers
http_caching = all
includepkgs = 
ip_resolve = 
keepalive = True
keepcache = False
mddownloadpolicy = sqlite
mdpolicy = group:small
mediaid = 
metadata_expire = 21600
metadata_expire_filter = read-only:present
metalink = 
minrate = 0
mirrorlist = 
mirrorlist_expire = 86400
name = MySQL 8.0 Community Server
old_base_cache_dir = 
password = 
persistdir = /var/lib/yum/repos/x86_64/7/mysql80-community
pkgdir = /var/cache/yum/x86_64/7/mysql80-community/packages
proxy = False
proxy_dict = 
proxy_password = 
proxy_username = 
repo_gpgcheck = False
retries = 10
skip_if_unavailable = False
ssl_check_cert_permissions = True
sslcacert = 
sslclientcert = 
sslclientkey = 
sslverify = True
throttle = 0
timeout = 30.0
ui_id = mysql80-community/x86_64
ui_repoid_vars = releasever,
   basearch
username = 
[suna@localhost ~]$ sudo yum-config-manager --enable mysql57-community
読み込んだプラグイン:fastestmirror, langpacks
============================================= repo: mysql57-community ==============================================
[mysql57-community]
async = True
bandwidth = 0
base_persistdir = /var/lib/yum/repos/x86_64/7
baseurl = http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64
cache = 0
cachedir = /var/cache/yum/x86_64/7/mysql57-community
check_config_file_age = True
compare_providers_priority = 80
cost = 1000
deltarpm_metadata_percentage = 100
deltarpm_percentage = 
enabled = 1
enablegroups = True
exclude = 
failovermethod = priority
ftp_disable_epsv = False
gpgcadir = /var/lib/yum/repos/x86_64/7/mysql57-community/gpgcadir
gpgcakey = 
gpgcheck = True
gpgdir = /var/lib/yum/repos/x86_64/7/mysql57-community/gpgdir
gpgkey = file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022,
   file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
hdrdir = /var/cache/yum/x86_64/7/mysql57-community/headers
http_caching = all
includepkgs = 
ip_resolve = 
keepalive = True
keepcache = False
mddownloadpolicy = sqlite
mdpolicy = group:small
mediaid = 
metadata_expire = 21600
metadata_expire_filter = read-only:present
metalink = 
minrate = 0
mirrorlist = 
mirrorlist_expire = 86400
name = MySQL 5.7 Community Server
old_base_cache_dir = 
password = 
persistdir = /var/lib/yum/repos/x86_64/7/mysql57-community
pkgdir = /var/cache/yum/x86_64/7/mysql57-community/packages
proxy = False
proxy_dict = 
proxy_password = 
proxy_username = 
repo_gpgcheck = False
retries = 10
skip_if_unavailable = False
ssl_check_cert_permissions = True
sslcacert = 
sslclientcert = 
sslclientkey = 
sslverify = True
throttle = 0
timeout = 30.0
ui_id = mysql57-community/x86_64
ui_repoid_vars = releasever,
   basearch
username = 

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

インストールパッケージ変更

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

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

 $ sudo yum repolist enabled | grep mysql
[suna@localhost ~]$ sudo yum repolist enabled | grep mysql
mysql-connectors-community/x86_64       MySQL Connectors Community           206
mysql-tools-community/x86_64            MySQL Tools Community                 94
mysql57-community/x86_64                MySQL 5.7 Community Server           624
[suna@localhost ~]$ 

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

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

$ sudo yum module disable mysql

MySQL5.7のインストール

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

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

MySQL5.7サーバーを起動する

$ sudo systemctl start  mysqld

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

$ sudo systemctl status  mysqld

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

[suna@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 月 2022-11-14 19:38:13 JST; 1min 4s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 11534 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=0/SUCCESS)
  Process: 11462 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 11537 (mysqld)
    Tasks: 27
   CGroup: /system.slice/mysqld.service
           └─11537 /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid

11月 14 19:38:09 localhost.localdomain systemd[1]: Starting MySQL Server...
11月 14 19:38:13 localhost.localdomain systemd[1]: Started MySQL Server.
[suna@localhost ~]$ 

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

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

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

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

MySQL5.7の初期設定

方法1:mysql_secure_installation使用しない

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

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

$ sudo grep 'temporary password' /var/log/mysqld.log
[suna@localhost ~]$ sudo grep 'temporary password' /var/log/mysqld.log
2022-11-14T10:38:10.697517Z 1 [Note] A temporary password is generated for root@localhost: Dpe*yyd5pV,V
[suna@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」コマンドを使用すると、MySQL5.7セキュリティを向上させることができます。

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

MySQL5.7サーバーの自動起動設定をする

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

$ sudo systemctl enable mysqld

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

$ sudo reboot
$ sudo systemctl status mysqld

設定ファイルの変更

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

[suna@localhost ~]$ cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/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 leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# 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
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[suna@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

変更例

[suna@localhost etc]$ sudo cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/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 leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# 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
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
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]
default-character-set = utf8mb4
[mysqladmin]
default-character-set = utf8mb4
[client]
default-character-set = utf8mb4

mysqlサーバーを再起動する

$ sudo systemctl restart mysqld

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

データベース作成

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

$ mysql -uroot -p

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

[suna@localhost etc]$ mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.7.40 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> 
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> 

データベース作成

CREATE DATABASE データベース名;

実行例

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

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

mysql> 

一般ユーザーの作成

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

権限の設定

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

MySQL5.7のインストールは完了