mysqlを5.5から5.7にバージョンアップ検証したお話とダイエットのお話

はじめに

はじめてまして、インフラ足軽です。
名前の通り、CCIのテクノロジーにおけるインフラ分野を担当しております。

このブログには実はエンタメというタグがあり、私が書くからにはエンタメタグを使おう……。
そう決意していたのですが、技術ブログにエンタメネタをぶっこむ技術力が私になかったために、最近検証したMySQL5.5からMySQL5.7にバージョンアップ検証したお話をしつつ、健康に絡めたお話もするというよく分からない記事を作成することにしました。

バージョンアップの経緯について

具体的にどんなバージョンから上げることになったかというと、以下の感じとなります。
mysql-5.5.xx-linux2.6-x86_64
mysql-5.7.yy-el7-x86_64

OSのバージョンから上がっとるやんけ!

まさにその通りで、昨年末にCentOS7にてMySQL5.5が稼働することを確認し、年始はconfの内容をコトコト煮詰めてリリース! という流れを辿ろうとしたところ、うちのボスから急遽「時間に余裕あるからMySQLのバージョンも上げよう」という話が降ってきたのです。
ちなみにそんなに時間の余裕はありませんでしたが、インフラ内のイエスマンと呼ばれる私は心の中ではノーと言いつつ、バージョンアップの検証を開始することにしました。
ついでに、この時からなぜかダイエットをする決意をしました(急展開)

MySQL5.7のインストール変更点

極力、現行の5.5のインストール方法とは変更しない方針に舵を取ることにしました。
そのため、インストール方法自体はとてもシンプルです。
まずは前準備としてSELinuxのコンテキストを設定します。
そう思った去年はこの段階からCentOS6⇒7へのバージョンアップの影響で、微妙にコンテキストの指定方法が変わっているという事実を知ることになりました。
指定方法についてどう変わったの? というのはこちらでは触れずに進みます。

5.5と5.7のインストール方法で大きく変わったのは、【mysql_install_db】を使用しなくなったことです。
こちら、5.5ではscriptsディレクトリの直下にあったのですが、5.7だとbinの直下に変わっています。
そのまま使えるようですが、推奨する方法ではないようで、8.0からは【mysql_install_db】自体もなくなっているようです。

そのため、MySQLのインスタンスを作成する際には【mysqld --no-defaults --initialize】を使用し、必要な情報を入力していくような形に。
データベースディレクトリ直下で、以下(例)を実行します。

# mysqld --no-defaults --initialize --user=mysql \
--datadir=/test/mysql/data \
--innodb-data-home-dir=/test/mysql/idata \
--innodb-log-group-home-dir=/test/mysql/redo \
--innodb-undo-directory=/test/mysql/undo \
--innodb-data-file-path="ibdata1:512M;ibdata2:1G;ibdata3:2G:autoextend" \
--skip-auto-generate-certs --skip-ssl

2020-02-19T06:10:06.570149Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2020-02-19T06:10:08.723489Z 0 [Warning] InnoDB: New log files created, LSN=45790
2020-02-19T06:10:09.076970Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2020-02-19T06:10:09.262049Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 7b45f153-52de-11ea-8cfc-005056982e9b.
2020-02-19T06:10:09.298556Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2020-02-19T06:10:10.524638Z 1 [Note] A temporary password is generated for root@localhost: {パスワード}

ちなみに上のコマンドを実施すると、いくつかのwarningメッセージと共に初期パスワードが表示されます。
warningについては、TIMESTAMPのwarningは対応しないと次回起動時も残るのでconfで対応します。

この後、mysql.cnfを配置します。
conf上で指定しておかないと、data/の直下にssl関連のファイルが自動で作成され、後程ssl設定を使う場合に弊害が起こる可能性があります。
なので、初期起動の前にcnf内でssl関連の設定はoffにしておきます。
ssl=OFF
auto-generate-certs=OFF

使用する場合は後程confにて、ssl設定をoffとします。
ここから起動させます。

MySQLの起動

起動方法については、CentOS6まではmysqld_safeを使用していたのですが、
CentOS7からはmysqld.serviceを作って起動させてました。
mysqldコマンドの使用で起動をさせる形です。
OSに移行に関わる話になってくるので、ここではそこまで深く触れません。
mysqld起動後は、以下のコマンドを使用して初期化対応を実施します。

# mysql_secure_installation -S /test/mysql/mysql.sock -p

anonymousユーザの要不要など聞かれますが、ここでは初期パスワードの変更を主な目的としています。
なので、パスワード変更以外に余計な機能はつけないようにしました。
これで晴れてMySQLが起動できたのですが、ここで色々とwarningメッセージがでてきます。
今回のお話的に、極力confを流用したままで動かしたいという形だったので、具体的に対応したconfの内容について触れていきます。

追加したConfの内容

参考: https://www.slideshare.net/yoku0825/mysql-57-53449734

メッセージ:[Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
メッセージ[Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.
設定変更:sql_mode=STRICT_ALL_TABLES,NO_AUTO_CREATE_USER,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO
⇒sqlモードの仕様が変わったようなので、メッセージに対応した設定に変更しました。

メッセージ:[Warning] The syntax '--log_warnings/-W' is deprecated and will be removed in a future release. Please use '--log_error_verbosity' instead.
設定変更:log_error_verbosity=3
⇒log_warnings の設定が将来廃止されるようなのでエラーメッセージが出ます。
 なので、conでは【log_warnings=2】で設定していたので変更対応としました。

メッセージ:[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
設定追加:explicit_defaults_for_timestamp = true
⇒TIMESTAMPカラムに対応するために設定の追加をしなければいけないようなので、こちらは設定を追加します。

追加設定:innodb_undo_directory=/test/mysql/AMPCRUDB/undo
⇒undo設定を一先ずcondに追加。
 現状ではまだディレクトリ内に吐き出されたところは見ていませんが、今後8.0への移行も考えると設定が必要になってくるので。

追加設定:innodb_temp_data_file_path=ibtmp1:1G
⇒テンポラリーテーブルがinnodbに変更されたのとこと。
 サイズを指定しないと徐々に肥大化してパンクする可能性があるとのことで、一先ずは1Gと設定しました。

追加設定:log_timestamps=SYSTEM
⇒mysqld.logの出力時間をOSの時間に合わせる設定。
 こちらを設定しておかないと、log出力時にOSとは異なる時間で設定される可能性があります。

追加設定:show_compatibility_56=ON
⇒Zabbixのodbc監視を使用しており、MySQL5.7ではデフォルトでinformation_schemaへのselectができないため、ONとする設定を追加しました。

削除設定:innodb_file_format=Barracuda
⇒デフォルトになったので削除。これもwarningメッセージが出ますが割愛。

上記の内容をconfに追加して改めてMySQLを起動したところ、warningメッセージは"ほぼ"解消されました。
対象のサーバでSSLを使用しているのですが、これが自己証明書を使うとwarningが出るようで、この点については解消できておりません(というか、使用する限りは出るっぽいのでどうしようもないですね)。
なので、5.5から5.7のconfへ移行する際には、主に上記の対応で問題なく起動はできた形になります。
以上が、MySQL5.7への移行検証のお話でした。
あくまで最低限での移行という形だったので、色々とconfの中身については変わっているようで、細かく対応していきたいとは考えております。

終わりに(ダイエットの話)

ここでブログの冒頭でも触れたダイエットの件です。
なぜここで急に? と思うかもしれませんが、記事を作っていたら予想以上にネタに触れる機会がなかったために最後になりました。
私は去年くらいからMySQL5.5から5.7への移行検証を始め、ついでにダイエットをしていたわけです。
私のダイエットの方法は主に食事療法でした。
「ジムに通えば?」とよく言われるのですが、私は『ザク』の方が好きと答えています。

会社のすぐ下にあるFamilyMartでよく昼食を買うのですが、その中でもオススメは以下です。
・サラダチキンバー ブラックペッパー
・サラダチキンバー レモン

参考資料:RIZAP コラボ商品続々登場!!

まさかのRIZAPコラボの商品が売っている……ということで、私の基本の昼食とすることにしました。
ちなみに担々麺も売っていておいしそうなんですけど、まだ食べられていません。

チキンバーはどちらも味がしっかりとしていて美味しく、野菜と一緒に食べるとかなり健康的な感じがします(個人の感想)。
私はこれをメインにして、ついでにゆで卵も一緒に食べたところ、1か月で大体10kg痩せることに成功しました。
痩せたのは115kgから105kgですが、体重が多いとまずは食事療法で痩せられるということです。
ちなみに食事を元に戻したら音速で体重も戻りました。

血液検査の結果は良好になったので、健康なエンジニア生活を送りましょう。
ついでにダイエットの方法も絶賛募集中なので教えてください。