CentOS6にyumでMySQL5.7を導入する

MySQL5.7の性能を試すためにCentOS6のMySQLを5.6から5.7にアップデートしてみます。

前提条件

ストレージエンジンをInnoDBに変更しています。

WordpressのDBをMyISAMからInnoDBに変更する
このサイトのMySQLストレージエンジンは「高速」という理由でMyISAMを使っています。 ですが適切なチューニングを行えばIn...

既にyumでMySQL5.6にアップデート済です。

CentOS6.8のMySQLをyumでMySQL5.6にアップデートする
WordPressの推奨環境はMySQL5.6。CentOS6標準のMySQLは5.1系なので必要要件(5.0.15以上)はクリア...
1.MySQL5.6用のレポジトリを削除

MySQL5.6レポジトリが導入済の場合、MySQL5.7レポジトリをインストールすることができないので、既存のレポジトリを削除します。なお、mysql5.6のパッケージそのものは削除する必要はありません。

# yum remove mysql-community-release
2.MySQL5.7用のレポジトリをインストール

オラクルの公式サイトにアクセスし、対象OSのレポジトリrpmのURLを調べyumでインストールします。ファイル名の数字(el6-xx.noarch.rpmのxxの部分)は変わる可能性があるので都度確認しましょう)

# yum -y install http://dev.mysql.com/get/mysql57-community-release-el6-11.noarch.rpm
3.mysqlをアップデートする

レポジトリは上書きできませんが、mysql本体のパッケージは上書きアップデート可能です。

# yum update mysql
Dependencies Resolved

================================================================================
 Package                   Arch      Version         Repository            Size
================================================================================
Updating:
 mysql-community-client    x86_64    5.7.20-1.el6    mysql57-community     23 M
Updating for dependencies:
 mysql-community-common    x86_64    5.7.20-1.el6    mysql57-community    329 k
 mysql-community-libs      x86_64    5.7.20-1.el6    mysql57-community    2.1 M
 mysql-community-server    x86_64    5.7.20-1.el6    mysql57-community    152 M

Transaction Summary
================================================================================
Upgrade       4 Package(s)

Total download size: 177 M
Is this ok [y/N]: y

・・・
省略
・・・

Updated:
  mysql-community-client.x86_64 0:5.7.20-1.el6

Dependency Updated:
  mysql-community-common.x86_64 0:5.7.20-1.el6
  mysql-community-libs.x86_64 0:5.7.20-1.el6
  mysql-community-server.x86_64 0:5.7.20-1.el6

Complete!

アップデート完了後、mysqlのバージョンを確かめてみます。

# mysql --version
mysql  Ver 14.14 Distrib 5.7.20, for Linux (x86_64) using  EditLine wrapper

mysqld自体は再起動後に切り替わります。

4.my.cnfの修正

5.6用のmy.cnfで5.7を起動させようとしたところERRORで失敗。原因はRemovedされたパラメータを使用していたこと。

# cat /var/log/mysqld.log
・・・
2017-12-23T04:33:23.876546Z 0 [ERROR] unknown variable 'innodb_use_sys_malloc=1'
2017-12-23T04:33:23.876554Z 0 [ERROR] Aborting
・・・

なのでmy.cnfからコメントアウトして対処します。

# vi /etc/my.cnf- innodb_use_sys_malloc = 1
+ #innodb_use_sys_malloc = 1
5.MySQLを再起動 & バージョン確認
# service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

# mysql -uroot -p -h 127.0.0.1
mysql> show variables like'version%';
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| version                 | 5.7.20                       |
| version_comment         | MySQL Community Server (GPL) |
| version_compile_machine | x86_64                       |
| version_compile_os      | Linux                        |
+-------------------------+------------------------------+
4 rows in set (0.00 sec)
6.DBをMySQL5.7用にマイグレーションする

MySQL5.7と5.6にDB自体の互換性はありますがそのままだとログに大量の[ERROR]が記録されるので、DBも5.7用にアップデートします。

# mysql_upgrade -u root -p
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Upgrading the sys schema.
Checking databases.
sys.sys_config                                     OK
wp_wordpress..wp_commentmeta                           OK
wp_wordpress..wp_comments                              OK
wp_wordpress..wp_links                                 OK
wp_wordpress..wp_options                               OK
wp_wordpress..wp_postmeta                              OK
wp_wordpress..wp_posts                                 OK
wp_wordpress..wp_term_relationships                    OK
wp_wordpress..wp_term_taxonomy                         OK
wp_wordpress..wp_termmeta                              OK
wp_wordpress..wp_terms                                 OK
wp_wordpress..wp_usermeta                              OK
wp_wordpress..wp_users                                 OK
Upgrade process completed successfully.
Checking if update is needed.
7.Warningログ対策

マイグレーションで[ERROR]は止まりましたがログに複数の[Warning]が記録されているのでこれらも対処します。

[Warning] InnoDB: Using innodb_file_format is deprecated and the parameter may be removed in future releases. See http://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html

innodb_file_formatは非推奨に変わったとのこと。デフォルトでBarracudaなので明示的に指定する必要はないってことですね。該当箇所をコメントアウトします。

# vi /etc/my.cnf- innodb_file_format = Barracuda
+ #innodb_file_format = Barracuda
[Warning] Failed to set up SSL because of the following SSL library error: SSL context is not usable without certificate and private key

mySQL5.7からSSL接続設定が簡単になったらしいのですが「その設定がありませんよ」というワーニングです。先人のナレッジを参考にmy.cnfに追記します。

mysql 5.7.x でSSL指定方法
https://qiita.com/syunchanp/items/676071147c8dbf75ec5b

まずはMySQL5.7.6から追加されたという自己証明書作成ツールを実行し/var/lib/mysqlにpemファイルを作成します。

# mysql_ssl_rsa_setup --datadir=/var/lib/mysql
Generating a 2048 bit RSA private key
.........+++
..........................................................+++
writing new private key to 'ca-key.pem'
-----
Generating a 2048 bit RSA private key
.........+++
..............................+++
writing new private key to 'server-key.pem'
-----
Generating a 2048 bit RSA private key
.....................................................+++
.....+++
writing new private key to 'client-key.pem'
----

生成されたpemファイルがこちら。

# ll /var/lib/mysql |grep pem
-rw-------  1 root  root      1675 Dec 23 14:49 ca-key.pem
-rw-r--r--  1 root  root      1107 Dec 23 14:49 ca.pem
-rw-r--r--  1 root  root      1107 Dec 23 14:49 client-cert.pem
-rw-------  1 root  root      1679 Dec 23 14:49 client-key.pem
-rw-------  1 root  root      1675 Dec 23 14:49 private_key.pem
-rw-r--r--  1 root  root       451 Dec 23 14:49 public_key.pem
-rw-r--r--  1 root  root      1107 Dec 23 14:49 server-cert.pem
-rw-------  1 root  root      1679 Dec 23 14:49 server-key.pem

これらのファイルをmy.cnfに追記します。

# vi /etc/my.cnf  socket=/var/lib/mysql/mysql.sock
+ ssl-ca=/var/lib/mysql/ca-key.pem
+ ssl-cert=/var/lib/mysql/server-cert.pem
+ ssl-key=/var/lib/mysql/server-key.pem

なお、この設定だけだとpemファイルにmysqlがアクセスできないため、以下のWarningが発生します。

[Warning] Failed to set up SSL because of the following SSL library error: SSL_CTX_set_default_verify_paths failed

対処方法はchmodでパーミッションを変更するか、chownで所有者をmysqlに変更すること。今回はchmodを使います。

# cd /var/lib/mysql
# chmod 644 *.pem

#  ll /var/lib/mysql |grep pem
-rw-r--r--  1 root  root      1675 Dec 23 14:49 ca-key.pem
-rw-r--r--  1 root  root      1107 Dec 23 14:49 ca.pem
-rw-r--r--  1 root  root      1107 Dec 23 14:49 client-cert.pem
-rw-r--r--  1 root  root      1679 Dec 23 14:49 client-key.pem
-rw-r--r--  1 root  root      1675 Dec 23 14:49 private_key.pem
-rw-r--r--  1 root  root       451 Dec 23 14:49 public_key.pem
-rw-r--r--  1 root  root      1107 Dec 23 14:49 server-cert.pem
-rw-r--r--  1 root  root      1679 Dec 23 14:49 server-key.pem
8.MySQL5.6と同じsql_modeを指定する

デフォルトのsql_modeがMySQL5.7.8からそれ以前と変わっているとのこと。今までこの設定を気にしたことはなかったのですが、MySQL5.6でエクスポートしたWordPressデータをMySQL5.7にインポートする際にエラーとなるとのことなので予め対策しておきます。

MySQL5.6mysql> SELECT @@global.sql_mode;
+------------------------+
| @@global.sql_mode      |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
1 row in set (0.00 sec)
MySQL5.7mysql> SELECT @@global.sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                                         |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+

対策方法はmy.cnfにsql_modeを明示的に記述すること。

# vi /etc/my.cnf+ sql_mode=NO_ENGINE_SUBSTITUTION
9.MySQL5.7はWordPressで速いのか?

以上で最低限の設定変更は完了しました。この時点でWordPressがMySQL5.6に比べて高速化しているのかabベンチで比較します。

## MySQL5.6.38
# ab -n 1000 -c 100 http://127.0.0.1/

Requests per second:    70.16 [#/sec] (mean)
Time per request:       1425.283 [ms] (mean)
Time per request:       14.253 [ms] (mean, across all concurrent requests)
Transfer rate:          610.49 [Kbytes/sec] received
## MySQL5.7.20
# ab -n 1000 -c 100 http://127.0.0.1/

Requests per second:    68.86 [#/sec] (mean)
Time per request:       1452.307 [ms] (mean)
Time per request:       14.523 [ms] (mean, across all concurrent requests)
Transfer rate:          599.13 [Kbytes/sec] received

わずかに遅くなってる・・・。個人ブログのWordPress程度ではMySQL5.7の恩恵は得られないようです。ということで、本番サーバへのMySQL5.7導入はやめました。