複数バージョンのMySQLをサーバで動かす

いまだったらDockerだろう?って話だとは思うんですよ. 思うんだけど,今回試そうとしたサーバにはDocker入れてなかったので.

やってみれば手順はすこぶる簡単だったので,メモとして置いておきます.(注:X Protocol周りはスルーしてます)

希望のバイナリをMySQLのサイトからダウンロード

https://dev.mysql.com/downloads/mysql/ ここから希望のバイナリセットをダウンロードします. 自分は仕事の関係で 5.7.24(ダウンロードファイルを選択するボックスに右上にある”Looking for previous GA versions?”をクリック)と,今回の検証用で 8.0.13をダウンロードしました. 特に注意点は無いけど自分のサーバが 32bitなのか64bitなのかは確認した方が良いかも.

とかでしょうか. 自分は念の為調べてみたら32bitでした. なので例えば8.0.13であれば

でサーバにダウンロードしました.

希望のディレクトリにまるごと展開

ダウンロードしたセット一式をどこかに展開するのですが,自分は古来のしきたりに従って(たぶん) /usr/local/ 以下に展開することにしました. ざっとコマンドの流れだけ書くとこんな感じです.

いつも gzip 使ってたもんで xz って初めて使ったかも. のちのち設定やら起動やらでこの展開したディレクトリを書くことになるので,ディレクトリ名を /usr/local/mysql8013 に変更してます.

関連ディレクトリを作成して権限ユーザを設定

展開しただけだと作られないディレクトリがあるので,自分は3つ作りました.データ本体を格納する data/ ,ログファイルを格納する logs/ ,それとソケットファイルを格納する tmp/ です.

これらは設定ファイルでどうとでもなるので,お好きにセットすれば良いかと. で,これらを含めて全体を mysqlユーザにオーナーを変更しました. mysql ユーザは元々別バージョンの mysqlが動作しているので既にサーバ上には存在していたので,単純に chown を叩いただけです.

データディレクトリを初期化

MySQLサービスの初回起動時にデータディレクトリは初期化されるはずなんだけど,自分がローカルで試した限りではうまく動作しなかった.(たぶん自分のせいで,8.0.13用に書いたmy.cnfを読み込んでくれなかったから・・・じゃないかな) なので,データディレクトリはコマンドラインから下記を叩き込んで初期化.

強いて挙げればキモはログファイルの指定のところかな.

このログファイルに初期化時に自動的に設定される root のパスワードが書き込まれるので,後でクライアントから接続する時にこのファイルを参照することになります. こんな感じ↓

これですと boovl8QkIo>n が初期設定されたrootのパスワードなんですが,このパスワードでは(おそらく)パスワード変更以外の諸々の操作が出来ない設定になっているので,初回接続時に必ず変更します.(しないとそこから先使えない)

my.cnf

現時点での my.cnf はこんな感じで,やっぱり /usr/local/mysql8013/my.cnf に置いてます.

これを先に書いて置いてたので,上述の my.cnf を読んでくれているようなくれていないような状態だったのかも. むしろいっそ –no-defaults で進めるのが良かったのかな?

port番号は既存のMySQLとぶつからないデカ目のものを書いておくんだけど4桁番号は予約されてるので,あくまでもローカル環境限定ってことで. バージョン番号にしてるんだけど 8013 じゃなくて 80130とかそういう番号にすれば良かった. というか,しよう.

で,起動

ここまで準備して,下記コマンドで無事 8.0.13 が起動出来ました.

ちなみに –defaults-file は default じゃなくて defaults. これで数十秒間 ??? ってなったので.(お恥ずかしい)

クライアントからの接続は下記コマンド.

これで接続すると無事プロンプトが表示されるんですが,例えば show tables; なんてやっても怒られてしまうので,次のような感じで root のパスワードをセットします.

WordPressとつなぐ

実は今回の検証目的はWordPressだったんで,下記設定を wp-config.php に書きました.(すみません,ここだけ5.7.24で. 先に動作させたのがこっちなんで,動いてる方を書きました)

ポートは使わないでソケットに直接接続する方法もあるようで, wordpress mysql socket とかで検索すると情報ありました.ありがたや.

別のサーバからの接続もちゃんと動作するので,動作検証目的であればこんな手順で問題無いのではないかな,どうかな.