MySQL5.7の性能を試すためにCentOS6のMySQLを5.6から5.7にアップデートしてみます。
前提条件
ストレージエンジンをInnoDBに変更しています。
既にyumでMySQL5.6にアップデート済です。
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導入はやめました。