CentOS Stream 8 にMySQLをソースインストールする準備

CentOS Stream 8 にMySQLをソースインストールしていってみたいと思います。

今回のこだわりポイントは「複数バージョンの同居」です。

開発環境用のサーバにMySQLをインストールするのですが、単独のバージョンしか使えないのでは後々困ったことになります。

案件によっては、何年も前に開発されたシステムを扱う場合もありますし、新規開発案件なのに納入先のサーバの都合で古いバージョンしか使えないこともあります。

ということでこのページではまず複数バージョンを同居するための準備について書いていきます。

なお本番環境で利用される場合はここにある内容だけを鵜呑みにせずセキュリティ専門家に相談されることをお勧めします。

環境

実施日2021-08-12
サーバVMware ESXi 6.7 U3
OSCentOS Stream 8
cat /etc/redhat-release
CentOS Stream release 8

なぜソースインストールなのか

まずはこれですね。
一言で言うと、バージョンの同居が面倒になるから、です。
ソースインストールすることで、いろいろ細かくバージョンごとの調整がやりやすくなります。

ちなみにバージョン同居にこだわらないからDNFが良いって方は、こちらを参考にしてみてください。

事前確認

dnfで入れたMySQLもしくはMariaDBがインストールされていないか確認します。

# MySQLがインストールされていないことを確認
dnf list installed | grep mysql

# MariaDBがインストールされていないことを確認
dnf list installed | grep mariadb

インストールされている場合は、経緯を確認して良いようにしてください。
そのまま残しておいても良いですし、削除しても良いですが、その判断はご自身で決めてください。

ざっくりと仕様

こんな感じで進めますよってところを説明します。

MySQLのディレクトリ構成

# ソース置き場
/usr/local/src/mysql-8.0.20
/usr/local/src/mysql-5.7.30
/usr/local/src/mysql-5.6.48
/usr/local/src/mysql-5.5.62

# インストール先
/usr/local/lib/mysql-8.0.20
/usr/local/lib/mysql-5.7.30
/usr/local/lib/mysql-5.6.48
/usr/local/lib/mysql-5.5.62

こんな感じでバージョンごとにディレクトリを分けます。

MySQLのポート

MySQLのポートは通常 3306 です。
ですが異なるバージョンを同時に利用できるようにするため、バージョンごとにポートを分けることにします。

バージョン | ポート
8.0.20    | 58020
5.7.30    | 55730
5.6.48    | 55648
5.5.62    | 55562

ポートは重複してなければなんでも良いっちゃなんでも良いのですが、適当過ぎると覚えてられないので次のルールにします。

バージョンのドットを外した数字を使う。で、先頭に 5 を付ける。
バージョン 8.0.20 なら、 8020 で先頭に 5 を付けて、58020 を 8.0.20 のポート番号とします。

プライベートポート番号は、49152 ~ 65535 で自由に利用できるポート番号として割り当てられています。

MySQLのユーザー

MySQLのバージョンに関わらず「mysql」ユーザーで統一します。

MySQLのrootユーザーのパスワード

MySQLのバージョンに関わらず、何か複雑なパスワードにして統一します。
ってこれはわざわざ書かなくても良いことですね。
理想だけで言えば、全部のパスワードを異なるものにすべきです。

大前提

MySQLの複数バージョン同居・同時使用は本番環境でやるようなものではないことは分かっていますよね?
本記事は開発環境でのお話です。

必要なパッケージのインストール

MySQLをインストールしながら、エラーが出て必要になったときに行っても良いですし、最初にまとめてやってしまっても良いです。

すべてのバージョンで必要なもの、一部のバージョンで必要なものなどあります。

# cmakeを入れてないとき
dnf install cmake

# cmakeで▼のエラーがでたとき
# Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
dnf install ncurses-devel
# rm CMakeCache.txt
# cmake ・・・ (やり直す)

# cmake で▼のエラーがでたとき
# CMake Error at cmake/ssl.cmake:66 (MESSAGE):
dnf install openssl-devel
dnf --enablerepo=powertools install rpcgen
# rm CMakeCache.txt
# cmake ・・・ (やり直す)

#
CMake Error at rapid/plugin/group_replication/rpcgen.cmake:100 (MESSAGE):

# MySQL8.0.20 のcmake で▼のエラーが出たとき
# Could NOT find Git (missing: GIT_EXECUTABLE)
dnf install git
# rm CMakeCache.txt
# cmake ・・・ (やり直す)

# mysql_install_db を実行して「誤ったインタプリタです」のとき
dnf install perl
dnf install perl-Data-Dumper
perl -v

cmake

MySQL8.0.14以上くらいから普通に cmake をすると次のエラーが出るようになります。

Could not find devtoolset gcc
gcc -v

で確認すると、4.8.5 と古いので新しい gcc を用意します。

gcc-10.1.0をCentOS7にソースインストール

▲こちらを行います。

cmake-3.17.2をCentOS7にソースインストール

▲せっかくなのでMySQL8.0.14からはcmakeも新しいのを使うことにします。

MySQLユーザーの作成

# グループが作られてないことを確認
cat /etc/group | grep mysql

# ユーザーがつくられてないことを確認
cat /etc/passwd | grep mysql

# グループを作成
groupadd mysql

# ユーザーを作成
useradd -g mysql -d /usr/local/mysql mysql

事前に存在確認して既に作成されている場合は良いようにしてください。

my.cnfの雛形作成

my.cnfを雛形として作っておきます。
MySQLをインストールした後にこのファイルを使って設定していきます。

vi /root/template_my.cnf
[mysqld]
port      = [_PORT_NO_]
user      = mysql
basedir   = /usr/local/lib/mysql-[_MYSQL_VERSION_]
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/mysqld

# 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,NO_AUTO_CREATE_USER

# 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      = mysql
socket    = [_MYSQL_DATA_BASE_DIR_]/tmp/mysql.sock
default-character-set = [_CHARACTER_SET_]

[mysql.server]
port      = [_PORT_NO_]
user      = mysql
basedir   = /usr/local/lib/mysql-[_MYSQL_VERSION_]
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/mysqld
default-character-set = [_CHARACTER_SET_]

[mysqld_safe]
port      = [_PORT_NO_]
user      = mysql
basedir   = /usr/local/lib/mysql-[_MYSQL_VERSION_]
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/mysqld
default-character-set = [_CHARACTER_SET_]

[client]
port      = [_PORT_NO_]
user      = mysql
socket    = [_MYSQL_DATA_BASE_DIR_]/tmp/mysql.sock

MySQLのダウンロードURL

https://downloads.mysql.com/archives/community/

「Product Version」で希望のバージョンを選択。

「Operating System」は「Source Code」を選択。

ファイル名が「mysql-バージョン.tar.gz」の形式のものをダウンロードします。
バージョン 8.0.20 なら「mysql-8.0.20.tar.gz」

MySQLのソースインストール