概要

標準でインストール可能なMySQLは、MariaDBというMySQL派生のDBである。
MySQLとほぼ同じなので、そのまま使用しても問題ないが、本番環境でMySQL8.0を使用する場合は、同じバージョンに揃えたい時がある。

ここでは、MySQL8.0をインストールする方法を記載する。


MariaDBのアンインストール

もし、既にMariaDBがインストールされている場合は、MariaDBをアンインストールする。
まず、インストールされているパッケージの確認するため、以下のコマンドを実行する。

# RHEL
sudo rpm -qa | grep maria

# SUSE
sudo zypper search -i | grep maria


RHELの場合、mariadb-libs-<バージョン名>.el<バージョン名>.<アーキテクチャ名>と表示されるので、このパッケージをアンインストールする。
SUSEの場合、mariadbと表示されるので、このパッケージをアンインストールする。

# RHEL
sudo dnf remove mariadb-libs
sudo rm -rf /var/lib/mysql/

# SUSE
sudo zypper remove mariadb mariadb-client mariadb-errormessages libmariadb3 akonadi-server akonadi-server-lang libQt5Sql5-mysql python3-mysqlclient
sudo rm -rf /var/lib/mysql/


依存性関連のパッケージが存在すれば、同時に削除される。


MySQL公式リポジトリの追加と設定

過去のMySQLのGPGキーがインポートされている場合は削除する。

  1. 削除対象の鍵を確認する。
    sudo rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
  2. 過去のMySQLのGPGキーを削除する。
    sudo rpm -e gpg-pubkey-XXXXXXXX-XXXXXXXX
  3. 過去のMySQLのGPGキーファイルを削除する。
    sudo rm "/etc/RPM-GPG-KEY-mysql*"


まず、MySQL公式Webサイトからリポジトリを登録する必要がある。


または、以下のコマンドを実行して直接インストールする。

# RHEL 9
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm

# RHEL 8
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-5.noarch.rpm

# SUSE 15
sudo zypper install https://dev.mysql.com/get/mysql80-community-release-sl15-6.noarch.rpm
sudo rpm --import /etc/RPM-GPG-KEY-mysql-2022  # MySQLリポジトリのパッケージの署名チェックに使用するMySQL製品用のGnuPGキーをシステムにインポートする
sudo zypper refresh
または
sudo rpm -ivh mysql80-community-release-sl15-6.noarch.rpm
sudo rpm --import /etc/RPM-GPG-KEY-mysql-2022  # MySQLリポジトリのパッケージの署名チェックに使用するMySQL製品用のGnuPGキーをシステムにインポートする
sudo zypper refresh


このリポジトリを追加することで、MySQL5.5~5.7、8.0のいずれかを選択して、インストールすることができるようになる。

リポジトリが追加されたかどうかは、以下のコマンドで確認できる。

# RHEL
sudo dnf repolist all | grep mysql

# SUSE
sudo zypper repos | grep mysql


上記のリストで[有効]と表示されている項目が、標準でインストールされるパッケージである。


MySQL8.0のインストール

リポジトリを追加してインストール

インストールを行う前に、パッケージのバージョンを確認する。

# RHEL
sudo dnf info mysql-community-server

# SUSE
sudo zypper search --detail mysql-community-server


表示されているパッケージのバージョンが8.0.xxであれば、インストールを開始する。
インストールの途中において、MySQLのGPG公開鍵が無いというメッセージが表示されるが、
インストール時にGPG公開鍵も同時にインストールされるので、そのまま続ける。

# RHEL
sudo dnf install mysql-community-server

# SUSE
sudo zypper install mysql-community-server


インストール完了後、MySQLのバージョンを確認する。

mysqld –-version


最後に、自動起動の設定をしてMySQLを起動する。

# RHEL
sudo systemctl enable mysqld
sudo systemctl start mysqld

# SUSE
sudo systemctl enable mysql
sudo systemctl start mysql


ソースコードからインストール

ビルドに必要なライブラリをインストールする。

# SUSE
sudo zypper install bison make cmake ninja git glibc-devel ncurses-devel perl-Data-Dump perl-Data-Dump-Streamer perl-Data-Dumper-Concise krb5-devel \
                    perl libtirpc3 libtirpc-devel rpcgen liblz4-devel libzstd-devel protobuf-devel libicu-devel \
                    libevent-devel libnuma-devel libfido2-devel libudev-devel systemd-devel doxygen \
                    libopenssl-devel libopenssl-1_1-devel  # OpenSSL 1 を使用する場合
                    valgrind-devel  # Valgrindを使用する場合 (Valgrindとは、LinuxにおけるC++のメモリリーク等の検知ツールのことである)


MySQLの公式Webサイトにアクセスして、MySQLのソースコードをダウンロードする。

[Product Version]は、インストールするMySQLのバージョンを選択、[Operating System]では"Source Code"を選択する。
表示されるリストから、最も下欄にある"mysql-boost-<バージョン>.tar.gz"をダウンロードする。

MySQL 5.7.5からBoostライブラリが必要になったため、Boostライブラリ同梱のものをダウンロードすること。
ただし、MySQL 8.3以降からBoostライブラリは不要になっている。

または、wgetコマンドを使用して直接ダウンロードする。

wget https://downloads.mysql.com/archives/get/p/23/file/mysql-boost-<バージョン>.tar.gz


ダウンロードしたファイルを解凍する。

tar xf mysql-boost-<バージョン>.tar.gz
cd mysql-boost-<バージョン>


MySQLのビルドディレクトリを作成する。

mkdir build && cd build


MySQLをビルドおよびインストールする。

# MySQL 8.2以前
cmake .. \
      -DCMAKE_C_COMPILER=<GCC 8.1以降のgcc実行ファイルのパス>   \
      -DCMAKE_CXX_COMPILER=<GCC 8.1以降のg++実行ファイルのパス> \
      -DCMAKE_BUILD_TYPE=Release                           \
      -DCMAKE_INSTALL_PREFIX=<MySQLのインストールディレクトリ>     \
      -DDEFAULT_CHARSET=utf8mb4                      \
      -DWITH_EXTRA_CHARSETS=all                      \
      -DDEFAULT_COLLATION=utf8mb4_general_ci         \
      -DWITH_INNOBASE_STORAGE_ENGINE=1               \
      -DSYSCONFDIR=<MySQLのインストールディレクトリ>         \
      -DMYSQL_DATADIR=<MySQLのインストールディレクトリ>/data \
      -DWITH_BOOST=../boost \  # MySQL 8.2以前の場合
      -DWITH_SYSTEMD=ON     \  # Systemdサービスを使用する場合
      -DWITH_VALGRIND=ON       # Valgrindを使用する場合 (Valgrindとは、LinuxにおけるC++のメモリリーク等の検知ツールのことである)

make -j $(nproc)
make install

# または

cmake .. -G Ninja \
      -DCMAKE_C_COMPILER=<GCC 8.1以降のgcc実行ファイルのパス>   \
      -DCMAKE_CXX_COMPILER=<GCC 8.1以降のg++実行ファイルのパス> \
      -DCMAKE_BUILD_TYPE=Release                           \
      -DCMAKE_INSTALL_PREFIX=<MySQLのインストールディレクトリ>     \
      -DDEFAULT_CHARSET=utf8mb4              \
      -DWITH_EXTRA_CHARSETS=all              \
      -DDEFAULT_COLLATION=utf8mb4_general_ci \
      -DWITH_INNOBASE_STORAGE_ENGINE=1       \
      -DSYSCONFDIR=<MySQLのインストールディレクトリ> \
      -DMYSQL_DATADIR=<MySQLのインストールディレクトリ>/data \
      -DWITH_BOOST=../boost \  # MySQL 8.2以前の場合
      -DWITH_SYSTEMD=ON     \  # Systemdサービスを使用する場合
      -DWITH_VALGRIND=ON       # Valgrindを使用する場合 (Valgrindとは、LinuxにおけるC++のメモリリーク等の検知ツールのことである)

ninja -C .
ninja -C . install


/<MySQLのインストールディレクトリ>/libディレクトリから/<MySQLのインストールディレクトリ>/lib64ディレクトリへ、シンボリックリンクを作成する。

ln -s /<MySQLのインストールディレクトリ>/lib /<MySQLのインストールディレクトリ>/lib64


MySQLのインストールディレクトリに、以下のディレクトリとファイルを作成する。

# ディレクトリを作成
mkdir <MySQLのインストールディレクトリ>/data
mkdir <MySQLのインストールディレクトリ>/tmp
mkdir <MySQLのインストールディレクトリ>/logs


次に、MySQLのデータディレクトリを初期化する。(MySQL 5.7.6以降、mysql_install_dbは廃止されていることに注意する)

Systemdサービスユニットファイルの作成

MySQLをソースコードからインストールした時、
SystemdサービスからMySQLを起動および停止する場合は、Systemdサービスユニットファイルを作成する。

作成するファイルを以下に示す。

  • mysqld.serviceファイル
  • mysqld@.serviceファイル


  • システム全体で使用する場合
    /etc/systemd/systemディレクトリ
  • 各ユーザで使用する場合 (ただし、各ユーザごとに使用する場合は、特権ポート0〜1023番ポートは使用できない)
    ~/.config/systemd/userディレクトリ


# mysqld.serviceファイル

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network-online.target
Wants=network-online.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
# hence, + prefix is used

# Needed to create system tables
ExecStartPre=+/<MySQLのインストールディレクトリ>/bin/mysqld_pre_systemd

# Start main service
ExecStart=/<MySQLのインストールディレクトリ>/bin/mysqld $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false

PIDFile=/<MySQLのインストールディレクトリ>/tmp/mysqld.pid


# mysqld@.serviceファイル

[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network-online.target
Wants=network-online.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Execute pre and post scripts as root
# hence, + prefix is used

# Needed to create system tables
ExecStartPre=+/<MySQLのインストールディレクトリ>/bin/mysqld_pre_systemd %I

# Start main service
ExecStart=/<MySQLのインストールディレクトリ>/bin/mysqld --defaults-group-suffix=@%I $MYSQLD_OPTS

# Use this to switch malloc implementation
EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set enviroment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false


MySQLの設定ファイルの作成

MySQLのインストールディレクトリに、MySQLの設定ファイルであるmy.cnfファイルを作成する。
my.cnfファイルの設定内容については、インストール - MySQL8#my.cnfファイルのテンプレートのセクションを参照すること。

vi /<MySQLのインストールディレクトリ>/my.cnf


作成したmy.cnfファイルを、以下に示すように編集する。

cd <MySQLのインストールディレクトリ>

# my.cnf : ポートの変更
sed -i -e "s/PORT_NO/<任意のポート番号  例. 53306>/g" my.cnf

# my.cnfc: ユーザ名の変更
sed -i -e "s/USER_NAME/<任意のユーザ名  例. mysql>/g" my.cnf

# my.cnfm: MySQLのデータディレクトリの変更
sed -i -e "s/MYSQL_DATA_BASE_DIR/<MySQLのインストールディレクトリ  例. \/home\/user\/InstallSoftware\/MySQL>/g" /my.cnf

# my.cnf : 文字コードの変更
sed -i -e "s/CHARACTER_SET/utf8mb4/g" my.cnf
sed -i -e "s/# collation-server = utf8mb4_bin/collation-server = utf8mb4_bin/g" my.cnf

# my.cnff: パスワードの有効期限を無期限に延長する場合
sed -i -e "s/# default_password_lifetime = 0/default_password_lifetime = 0/g" my.cnf

# my.cnf.: パスワード認証をレガシーに設定する場合
sed -i -e "s/# default_authentication_plugin = mysql_native_password/default_authentication_plugin = mysql_native_password/g" my.cnf


MySQLの初期化

MySQLの初期化を行う。

# MySQLの初期化
/<MySQLのインストールディレクトリ>/bin/mysqld --initialize                               \
                                      --user=<my.cnfファイルのuserキーの値(ユーザ名)>  \  # 例. mysql等
                                      --basedir=<MySQLのインストールディレクトリ>        \
                                      --datadir=/<MySQLのインストールディレクトリ>/data


この時、my.cnfファイルの[log_error]セクションに設定したファイル(例. /<MySQLインストールディレクトリ>/logs/mysql_error.logファイル)に、
MySQLのrootユーザのパスワードが保存される。

# rootユーザのパスワードを確認
grep "temporary password" <[log_error]セクションに設定したファイル>

例. grep "temporary password" /<MySQLインストールディレクトリ>/logs/mysql_error.log


MySQLの起動

MySQLを起動する。

/<MySQLのインストールディレクトリ>/support-files/mysql.server start


MySQLのユーザの設定

MySQLの初期設定を行う。

# rootユーザで接続する
/<MySQLのインストールディレクトリ>/bin/mysql -u root -p
(/var/log/mysql/mysqld.logファイルに保存されたパスワードを入力する)

# rootユーザのパスワードを変更する
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '<任意のパスワード>';

quit;


/<MySQLのインストールディレクトリ>/binディレクトリにあるmysql_secure_installationを実行する。
詳細は、インストール - MySQL8#MySQLの初期設定を参照すること。

/<MySQLのインストールディレクトリ>/bin/mysql_secure_installation


MySQLの停止

MySQLを停止するには、以下のコマンドを実行する。
この時、/var/lock/subsys/mysqlファイルを削除する必要があるため、スーパーユーザ権限で行う必要がある。

sudo /<MySQLのインストールディレクトリ>/support-files/mysql.server stop



MySQL Router

MySQL Routerは、MySQL InnoDB ClusterやInnoDB ReplicaSetで使用可能であり、ロードバランスや障害発生時のフェイルオーバーに対応したルーティングを透過的に実現するミドルウェア製品である。
詳細は、MySQL - MySQL Routerを参照すること。


my.cnfファイル

my.cnfファイルの各セクションの意味と役割を以下に示す。

  • [mysqld]セクション
    MySQLサーバデーモン (バックグラウンドで動作するサーバプロセス) の設定を定義する。
    サーバの動作に関する全ての主要な設定 (メモリ、キャッシュ、ログ、文字コード等) が含まれる。
    このセクションの設定はサーバ全体に影響を与える。
    例: innodb_buffer_pool_sizeキー、character-set-serverキー、portキー等


  • [mysql]セクション
    MySQLコマンドラインクライアント (mysqlコマンド) 特有の設定を定義する。
    コマンドラインでMySQLに接続する際に使用される設定である。
    主に、クライアントツールの動作に関する設定が含まれる。
    例: default-character-setキー、promptキー、auto-vertical-outputキー等


  • [client]セクション
    全てのMySQLクライアントプログラム共通の設定を定義する。
    mysqlコマンドのみではなく、mysqldumpコマンド、mysqlimportコマンド、mysqladminコマンド等のクライアントツール全てに適用される。
    主に、接続関連の設定が含まれる。
    portキー、socketキー、default-character-setキー等


  • mysqldコマンドは、[mysqld]セクションの設定を使用する。
  • mysqlコマンドは、[mysql]セクションおよび[client]セクションの両方の設定を使用する。
  • mysqldumpコマンド等のその他のクライアントツールは、 [client]セクションの設定を使用する。


  1. 共通の接続設定は[client]セクションにまとめる。
  2. [mysql]セクションには、CLI固有の設定のみを記述する。
  3. [mysqld]セクションにはサーバ固有の設定を記述する。



my.cnfファイルのテンプレート

my.cnfファイルのテンプレートを以下に記述する。

[mysqld]
port      = PORT_NO
user      = USER_NAME
basedir   = MYSQL_DATA_BASE_DIR
datadir   = MYSQL_DATA_BASE_DIR/data
tmpdir    = MYSQL_DATA_BASE_DIR/tmp
socket    = MYSQL_DATA_BASE_DIR/tmp/mysql.sock
pid-file  = MYSQL_DATA_BASE_DIR/logs/mysqld.pid
log-error = MYSQL_DATA_BASE_DIR/logs/mysql_error.log
general_log_file = MYSQL_DATA_BASE_DIR/logs/mysql.log
general_log      = 1
long_query_time  = 2
log-queries-not-using-indexes

# Windows / Mac環境のみ
# lower_case_table_names = 2

# 文字コード
character-set-server = CHARACTER_SET

# utf8mb4を使う場合
collation-server = utf8mb4_bin

# SQLモード
sql_mode  = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#sql_mode  = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO

# SQL文の最大長
max_allowed_packet = 1M
# max_allowed_packet = 16MB

# MySQL 5.6.6 以降はデフォルトでON: InnoDBをテーブルごとにファイルを分ける
innodb_file_per_table = 1

# MySQL 5.5 のみ : federated が無くなったので無効にする
# skip-federated

# MySQL 5.6 以降 : 暗黙のDEFAULT値を持つTIMESTAMPは非推奨
explicit_defaults_for_timestamp = 1

# MySQL 5.7.4 以降 : パスワードの有効期間を無期限に
# default_password_lifetime = 0

# MySQL 8.0 以降 : 以前までのパスワード認証にする
# default_authentication_plugin = mysql_native_password

# チューニング用
sort_buffer_size        = 512K
net_buffer_length       = 8K
read_buffer_size        = 256K
read_rnd_buffer_size    = 512K
myisam_sort_buffer_size = 8M

# innodb_buffer_pool_size = 128M
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M

# key_buffer = 16M
# table_cache = 64
# skip-locking

[mysql]
port      = PORT_NO
user      = USER_NAME
socket    = MYSQL_DATA_BASE_DIR/tmp/mysql.sock
default-character-set = CHARACTER_SET

# 例: プロンプトの設定やその他のCLI固有の設定
prompt = '\u@\h [\d]> '
auto-vertical-output = 1

[client]
port      = PORT_NO
user      = USER_NAME
socket    = MYSQL_DATA_BASE_DIR/tmp/mysql.sock
default-character-set = utf8mb4



MySQLのrootパスワードの確認

MySQLのインストール時にrootのパスワードがログに出力されているので確認する。
ここでは、V9djjjWFd_wfがrootのパスワードである。

sudo grep 'temporary password' /var/log/mysql/mysqld.log

# 結果
2019-02-17T01:49:46.433912Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: V9djjjWFd_wf



MySQLの初期設定

MySQLの初期設定は、いくつかの質問に答えるだけで完了する。以下に、質問箇所を抜粋して記載する。
パスワードは8文字以上+大文字小文字+数値+記号を含める必要がある。

sudo mysql_secure_installation

Enter current password for root (enter for none):(何も入力せずエンター)
Set root password? [Y/n] y(設定する方が良いのでy)
New password:(設定したいパスワードを入力)
Re-enter new password:(設定したいパスワードを再入力)
Remove anonymous users? [Y/n] y(匿名ユーザーは不要なのでy)
Disallow root login remotely? [Y/n] y(rootでリモートログインはNGなのでy)
Remove test database and access to it? [Y/n]y(テスト用のデータベースはいらないのでy)
Reload privilege tables now? [Y/n]y(ここまでの設定を反映させるのでy)


続いて、文字コードの設定を行うため、以下のファイルを開く。
この設定を行わない場合、日本語が文字化けする可能性がある。

sudo vi /etc/my.cnf


[mysqld_safe]の上部辺りに、以下の4行を追加する。

character_set_server=utf8mb4
explicit_defaults_for_timestamp=true
skip-character-set-client-handshake
table_definition_cache=400


MySQLを再起動するため、以下のコマンドを実行する。

# RHEL
sudo systemctl restart mysqld

# SUSE
sudo systemctl restart mysql


もし、rootユーザのパスワードを変更する場合、MySQLにログインして以下のコマンドを実行する。

ALTER USER 'root'@'localhost' IDENTIFIED BY '<パスワード>';



パスワードポリシーの変更

非推奨ではあるが、パスワードポリシー(短いパスワードを許可する)を変更する場合、MySQLにログイン後、以下のクエリを実行する。
初期状態では、validate_password.policyMEDIUMとなっている。

set global validate_password.length=6;   # パスワードの最低の長さを変更
set global validate_password.policy=LOW; # セキュリティレベルの変更


現在のパスワードポリシーを確認する場合、MySQLにログイン後、以下のクエリを実行する。

SHOW VARIABLES LIKE 'validate_password%';


WordPressを使用する場合は、認証をパスワード式にする必要がある。

ALTER USER 'ユーザ名'@'ホスト名または%' IDENTIFIED WITH mysql_native_password BY ‘<パスワード>’;



MySQLユーザの作成

一般的に、rootユーザでデータベースを操作しないため、データベースユーザを作成する。
まず、MySQLにログインする。

sudo mysql -p

Enter password:(rootユーザに設定したパスワード)


ここでは、全ての権限を持ったユーザを作成する。(通常はこのようなユーザは作成しない)

  • MySQL8をローカル環境でのみ使用する場合
mysql> CREATE USER 'ユーザ名'@'ホスト名' IDENTIFIED BY 'パスワード';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'ユーザ名'@'ホスト名';
mysql> FLUSH PRIVILEGES;


  • MySQL8を外部のネットワークから接続する場合
mysql> CREATE USER 'ユーザ名'@'%' IDENTIFIED BY 'パスワード';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'ユーザ名'@'%';
mysql> FLUSH PRIVILEGES;


以降は、このユーザで操作をするため、再ログインする。

mysql> exit;
sudo mysql -u ユーザ名 -p

Enter password:(作成したユーザに設定したパスワード)


※注意
PHP7からMySQL8以降に接続する場合、以下のエラーが出力されることがある。

Warning: PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]


これは、MySQL8以降、データベースユーザの認証プラグインがcaching_sha2_passwordに変更されたが、
PHP7では、caching_sha2_passwordが未サポートであることが原因である。
そのため、データベースユーザの認証プラグインをmysql_native_passwordに変更することが必要となる。

まず、MySQL8に接続して、認証プラグインを確認する。

mysql> SELECT User, Host, Plugin FROM mysql.user;


次に、ユーザの認証プラグインをcaching_sha2_passwordからmysql_native_passwordに変更する。

mysql> ALTER USER 'ユーザ名'@'ホスト名または%' IDENTIFIED WITH mysql_native_password BY 'パスワード';


Dockerを使用している場合、Dockerのコンテナ内でユーザの認証プラグインを変更する手順を、以下に記載する。
まず、Dockerのコンテナに入る。

# DockerのCONTAINER IDを確認
docker ps

# 上記のコマンドで確認したMySQL 8のCONTAINER IDを指定して、コンテナに接続する
docker exec -it <CONTAINER ID> bash

# コンテナ内でMySQL 8にログインする
mysql -u root -p
Enter password: <database.ymlで設定したパスワード>

# User、Host、Pluginを確認する(例えば、以下のような全ユーザの認証プラグイン)
mysql> SELECT User, Host, Plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+

# 例: rootユーザの認証プラグインを変更する
mysql> ALTER USER 'ユーザ名'@'ホスト名' IDENTIFIED WITH mysql_native_password BY 'パスワード'

# 正常に変更されているか確認する
mysql> SELECT User, Host, Plugin  FROM mysql.user;
+------------------+-----------+-----------------------+
| User             | Host      | Plugin                |
+------------------+-----------+-----------------------+
| root             | %         | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session    | localhost | caching_sha2_password |
| mysql.sys        | localhost | caching_sha2_password |
| root             | localhost | mysql_native_password |  <= 変更されているか確認
+------------------+-----------+-----------------------+


コンテナを削除して、再度、ビルドを行う。

docker-compose down
docker-compose build



パスワードの変更

MySQL8において、パスワードを変更するには、以下のクエリを実行する。

USE mysql;
ALTER USER '<ユーザ名>'@'<ホスト名または%>' identified BY '<パスワード>';



パスワードを忘れた場合の対処

もし、パスワードを忘れてログインできない場合は、まず、MySQLをセーフモードで起動して、パスワードなしでログインする。
まず、/etc/my.cnfファイルの[mysqld]セクションに以下の設定を追記する記述する。

sudo vi /etc/my.cnf

# /etc/my.cnfファイル
[mysqld]
skip-grant-tables ; skip-grant-tablesで認証をOFF
skip-networking   ; skip-networkingで外部(リモート)からの接続を禁止


MySQLを再起動をして設定を反映する。

# RHEL
sudo systemctl restart mysqld

# SUSE
sudo systemctl restart mysql


MySQLにログインする。

mysql -u root


MySQLのテーブルに格納されているrootユーザのパスワードを空にする。

USE mysql;
UPDATE mysql.user SET authentication_string=null WHERE User='root';


/etc/my.cnfファイルの[mysqld]セクションの設定を元に戻す。

sudo vi /etc/my.cnf

[mysqld]
# skip-grant-tables
# skip-networking


MySQLを再起動して設定を反映させる。

# RHEL
sudo systemctl restart mysqld

# SUSE
sudo systemctl restart mysql


上記で設定した空のパスワード(rootユーザ)でログインして、rootユーザのパスワードを再設定する。

mysql -u root -p 

USE mysql;
ALTER USER 'root'@'localhost' identified BY 'HogeHoge1';



MySQL WorkBenchのインストール

パッケージ管理システムを使用してインストール

MySQL WorkBenchと依存関係のライブラリをインストールする。

sudo zypper install mysql-workbench libOpenCL1 libantlr4-runtime4_7_2 libfreexl1 libgdal26 libgeos-3_6_2 libgeos_c1 libgeotiff5 libhdf5-103 \
                    libhdf5_cpp103 libhdf5_hl100 libkea1_4 libmariadb-devel libnetcdf15 libproj19 libscintilla3 \
                    libspatialite7 libvsqlitepp3 proj python python-enum34 python-ipaddress python-xml python2-PyNaCl python2-appdirs \
                    python2-asn1crypto python2-bcrypt python2-cffi python2-cryptography python2-idna python2-packaging python2-paramiko \
                    python2-pexpect python2-ptyprocess python2-pyasn1 python2-pycparser python2-pyparsing python2-setuptools python2-six


ソースコードからインストール

MySQLの公式Webサイトにアクセスして、MySQL WorkBenchのソースコードをダウンロードする。
または、GitHubからソースコードをクローンする。

git clone --depth 1 https://github.com/mysql/mysql-workbench.git


MySQL WorkBenchのビルドに必要なライブラリをインストールする。

sudo zypper install cmake autoconf automake pkg-config libtool libzip-devel libxml2-devel libsigc++2-devel libglade2-devel \
                    Mesa-libGL1 Mesa-libGL-devel Mesa-devel libmysqlclient-dev libmysqlcppconn-devel libuuid-devel \
                    libpixman-1-0-devel pcre-devel pango-devel cairo-devel python-devel libboost_headers1_66_0-devel \
                    mysql-client python-pysqlite sqlite3-devel swig vsqlite++-devel gdal-devel gtk3-devel gtkmm3-devel \
                    libopenssl-devel libsecret-devel proj-devel


  • ANTLR(推奨)
    MySQLパーサ用のファイルを生成するには、ANTLR 4.7以降が必要である。
    ANTLRの公式Webサイトにアクセスして、antlr-<バージョン>-complete.jarファイルをダウンロードする。
    cmakeコマンドを実行する時、このjarファイルのパスをcmakeの引数として渡す必要がある。
    -DWITH_ANTLR_JAR=<antlr-<バージョン>-complete.jarファイルのパス>

  • iodbc
    ミドルウェアにおいて、iodbcの代わりにunixODBCを使用する場合を記載する。
    まず、unixODBCをインストールする。
    cmakeコマンドを実行する時、-DUSE_UNIXODBC=Trueオプションを付加する。

  • gdal
    Ubuntuの場合、unixodbcが必須である。
    もし、iodbcを使用する場合は、MySQL WorkBenchをソースコードからビルドする必要がある。


cmakeコマンドを実行して、MySQL WorkBenchをコンパイルする。

mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=<MySQL WorkBenchのインストールディレクトリ> -DWITH_ANTLR_JAR=<antlr-<バージョン>-complete.jarファイルのパス> ..
make -j 8


MySQL WorkBenchをインストールする。

make install DESTDIR=<MySQL WorkBenchのインストールディレクトリ>



トラブルシューティング

エラー : Public Key Retrieval is not allowed

クライアントがサーバから自動的に公開鍵を要求できるように、mysql-connectorにallowPublicKeyRetrieval=trueオプションを追加する必要がある。
これは、悪意のあるプロキシが平文のパスワードを取得するためのMITM攻撃を行う可能性があるため、標準ではfalseになっており、明示的に有効にする必要がある。

また、テストや開発のために使用する場合は、useSSL=falseオプションも付加して接続してもよい。

詳細は、MySQLの公式Webサイトを参照すること。

# 接続コマンド
jdbc:mysql://<Webサーバのホスト名>:<MySQLのポート番号>/db?allowPublicKeyRetrieval=true&useSSL=false

# 例
jdbc:mysql://localhost:3306/db?allowPublicKeyRetrieval=true&useSSL=false



DBeaver

DBeaverは、Oracle、SQLServer、MySQL、MariaDB、SQLite等の計42種類のドライバに対応したSQLクライアントツールである。
DBeaverの詳細を知りたい場合は、インストール - DBeaverのページを確認すること。

※注意
データベース接続時において、以下のエラーが出力される場合がある。

SQL Error [08001]: Public Key Retrieval is not allowed


この時、DBeaverのメイン画面左の[データベースナビゲータ]から該当接続を右クリックして、[編集 接続]を選択する。
次に、[接続構成]画面右 - [ドライバのプロパティ]タブから、以下の項目を設定する。

  • allowPublicKeyRetrieval
    trueに変更する。
  • useSSL
    falseに変更する。


最後に、[接続構成]画面下の[OK]ボタンを押下する。


Adminer

PHPとMySQLやPostgreSQLと連携する時、データベースの内容をグラフィカルな環境で確認する場合、Adminerを使用すると便利である。

Adminerは、インストール不要であり、PHPファイルが1つで導入が簡単である。
1つのファイルで、MySQL、PostgreSQL、SQLite、MS SQL、Oracle DB、SimpleDB、Elasticsearch、MongoDBに対応している。

ただし、PCにデータベースドライバの導入は別途必要であることに注意する。

phpMyAdminやphpPgAdminは、導入に手間が掛かり、ブルートフォースアタックの対象になることもある。

Adminerの公式Webサイトにアクセスして、Adminer(PHPファイル)をダウンロードする。
ダウンロードしたファイルを、ドキュメントルート(/var/www/htmlディレクトリ等)に配置する。 (ファイル名は自由に変更してもよい)


phpMyAdmin

パッケージ管理システムからインストール

phpMyAdminのインストール

常にコマンドラインから操作することは面倒であるので、Webブラウザから操作できるphpMyAdminをインストールする。
PHPからMySQLを使用するために必要なパッケージが一式インストールできるので、phpMyAdminを使用する予定がなくても、
インストールしておくと便利である。

# RHEL
sudo dnf install epel-release
sudo dnf install phpmyadmin php-pecl-mcrypt

# SUSE
sudo zypper install phpMyAdmin


phpMyAdminの設定

まず、設定ファイルであるconfig.inc.phファイルを編集する。
config.inc.phpファイルに暗号化用のパスフレーズを設定する。これを行わないと、phpMyAdmin上でエラーが表示される。
(設定ファイルに暗号化(blowfish_secret)用の非公開パスフレーズの設定を必要とするようになった)

面倒な時は以下のコマンドを実行して、32桁のパスフレーズを作成する。

sudo openssl rand -base64 100 | fold -w 32 | head -1

出力例 : GgP1/5FMW7Nf3iX1rXmqeQj4k/mHAZDv


設定ファイルはサンプルがあるので、それをコピーして編集する。

sudo cp -a /usr/share/doc/phpMyAdmin-<バージョン>/config.sample.inc.php /etc/phpMyAdmin/config.inc.php
sudo nano /etc/phpMyAdmin/config.inc.php


ファイルの先頭のあたりに存在する$cfg['blowfish_secret']キーの値に、上記で作成したパスフレーズを入力する。

/**
* This is needed for cookie based authentication to encrypt password in
* cookie. Needs to be 32 chars long.
*/
$cfg['blowfish_secret'] = <パスフレーズ>; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */


次に、phpMyAdmin.confファイルの設定を行う。
まず、アクセス権に関する設定を行う。(この設定を行うことにより、phpMyAdminにアクセスできる)

sudo nano /etc/httpd/conf.d/phpMyAdmin.conf

16行目と30行目にあるRequire localの1つ下の行に以下の設定を追加する。

# Apache 2.4
Require ip 192.168.xxx.0/24


編集を完了したら、Apacheを再起動する。

sudo systemctl restart httpd


Webブラウザから、http://localost/phpmyadmin/ にアクセスし、ログイン画面が表示されることを確認する。

※上記のURLでエラーが表示される場合
もし、下記のようなエラーが出力される場合は、外部と通信しないローカル環境のみのサーバなので、
セッション情報を保存するsessionディレクトリの権限を変更する。

# エラー内容
phpMyAdmin - Error
Error during session start; please check your PHP and/or webserver log file and configure your PHP installation properly. Also ensure that cookies are enabled in your browser.
session_start(): open(SESSION_FILE, O_RDWR) failed: Permission denied (13)
session_start(): Failed to read session data: files (path: /var/lib/php/session)

sudo chmod 777 /var/lib/php/session


また、下記のようなエラーが出力される場合は、tempディレクトリの権限を変更する。

# エラー内容
$cfg['TempDir'] (/var/lib/phpMyAdmin/temp/)にアクセスできません。
phpMyAdmin はテンプレートをキャッシュすることができないため、低速になります。

sudo chmod 777 /var/lib/phpMyAdmin/temp


※phpMyAdminにログインできない場合
接続方式を変更するために、rootユーザでMySQLにログインする。

sudo mysql -u root -p


次に、以下のクエリを発行する。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';
mysql> FLUSH PRIVILEGES;

最後に、MySQLを再起動する。

# RHEL
sudo systemctl restart mysqld

# SUSE
sudo systemctl restart mysql


phpMyAdminにログインできるか確認する。

手動でインストール

phpMyAdminの公式Webサイトにアクセスして、phpMyAdminをダウンロードする。
ダウンロードしたファイルを解凍する。

unzip phpMyAdmin-<バージョン>-all-languages.zip
mv phpMyAdmin-<バージョン>-all-languages phpMyAdmin


解凍したphpMyAdminのディレクトリを、Apache2またはNginXのドキュメントルートに移動する。
phpMyAdmin用の仮想ホストを構築していることが望ましい。

mv phpMyAdmin <Apache2またはNginXのドキュメントルート>
cd /<Apache2またはNginXのドキュメントルート>/phpMyAdmin


phpMyAdminの設定を行う。

cp config.sample.inc.php config.inc.php
vi config.inc.php


 # config.inc.phpファイル
 
 # 編集前
 $cfg['Servers'][$i]['host'] = 'localhost';
 
 # 編集後
 $cfg['Servers'][$i]['host'] = '<ホスト名またはIPアドレス>:<MySQLのポート番号>';
 // 例. $cfg['Servers'][$i]['host'] = '127.0.0.1:3306';