MySQLをソースインストールする準備 / Rocky Linux9.4 on さくらのVPS

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

Rocky Linux9.4 にMySQLをソースインストールしていってみたいと思います。

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

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

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

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

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

環境

実施日2024-05-14
サーバさくらのVPS 2G
OSRocky Linux9.4
cat /etc/redhat-release
Rocky Linux release 9.4 (Blue Onyx)

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

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

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

事前確認

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

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

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

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

ざっくりと仕様

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

MySQLのディレクトリ構成

# ソース置き場
/usr/local/src/mysql-8.4.0
/usr/local/src/mysql-8.0.37
/usr/local/src/mysql-5.7.44
/usr/local/src/mysql-5.6.51
/usr/local/src/mysql-5.5.62

# インストール先
/usr/local/lib/mysql-8.4.0
/usr/local/lib/mysql-8.0.37
/usr/local/lib/mysql-5.7.44
/usr/local/lib/mysql-5.6.51
/usr/local/lib/mysql-5.5.62

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

MySQLのポート

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

バージョン | ポート
8.4.0     | 58400
8.0.37    | 58037
5.7.44    | 55744
5.6.51    | 55651
5.5.62    | 55562

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

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

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

MySQLのユーザー

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

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

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

大前提

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

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

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

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

dnf install cmake
dnf install gcc gcc-c++
dnf install gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc

# 有効化する
# これを実行すると変数定義がクリアされるので定義しなおす(MYSQL_PORT_NOなど)
scl enable gcc-toolset-12 bash
dnf install openssl-devel
dnf install ncurses-devel
dnf config-manager --set-enabled crb
dnf install libtirpc-devel
dnf install rpcgen

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

# MySQL 8.0.0 以降
# 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 以降 : 以前までのパスワード認証にする
# MySQL 8.4 以降では指定があることがダメ
# default_authentication_plugin = mysql_native_password

# 8.0.0 以降 MySQL X Plugin を停止
# 利用する場合はポート 33060 を開ける(必要があるかも)
mysqlx = 0

# チューニング用
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のソースインストール