CentOSのMySQLを5.5から5.6にアップデートする

2014年3月2日

MySQL

本ブログを動作させている CentOS の MySQL バージョンを 5.5 から 5.6 にアップデートしました。更新にあたり確認したこと、実行したコマンド、エラーの対応などをメモしておきます。

これまで稼働していた MySQL 5.5 は remi リポジトリのものを使っていましたが、新バージョンの 5.6 は MySQL の公式リポジトリからインストールしました。サンプルの my.cnf も置いておきましたので、まだ MySQL を 5.6 に上げていない方の参考になれば。

remi リポジトリから MySQL 5.5 をインストールしたときの記事はこちら。

お名前.com VPS にMySQLをインストールしWordPress用にチューニング

動作確認環境

  • CentOS 6.5

目次

  1. MySQL 5.6 公式リポジトリを追加
  2. データベースのバックアップをとっておく
  3. MySQL を 5.5 から 5.6 に Update
  4. エラーログを確認
  5. my.cnf サンプル

MySQL 5.6 公式リポジトリを追加

MySQL 公式 yum リポジトリを追加します。以下のリンクから CentOS 6.5 用のリポジトリを探し、rpm コマンドで追加します。

Download MySQL Yum Repository

# rpm -ivh http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm

以下の設定が追加されました。MySQL 5.5 リポジトリは無効、5.6 リポジトリが有効になっていますね。

/etc/yum.repos.d/mysql-community.repo

# Enable to use MySQL 5.5
[mysql55-community]
name=MySQL 5.5 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/6/$basearch/
enabled=0
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
# Enable to use MySQL 5.6
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

参考サイト

データベースのバックアップをとっておく

もしもの時のためにデータベースのバックアップをとっておくと安心です。

# mysqldump -uroot -p --databases database-name1 databasename-2 --quick --single-transaction > /tmp/backup.sql

MySQL を 5.5 から 5.6 に Update

更新前に MySQL を停止します。

# /etc/init.d/mysqld stop

yum update コマンドで MySQL を 更新します。

# yum update mysql-server

Installing:
 mysql-community-client     5.6.16-1.el6     mysql56-community
     replacing  mysql.x86_64l6.remi
 mysql-community-libs       5.6.16-1.el6     mysql56-community
     replacing  mysql-libs.x6-1.el6.remi
 mysql-community-server     5.6.16-1.el6     mysql56-community
     replacing  mysql-server.36-1.el6.remi
Installing for dependencies:
 mysql-community-common     5.6.16-1.el6     mysql56-community

途中で GPG KEY を取得するか聞かれたので、「yes」を回答。

警告: rpmts_HdrFromFdno: V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Retrieving key from file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
Importing GPG key 0x5072E1F5:
 Userid : MySQL Release Engineering <mysql-build@oss.oracle.com>
 Package: mysql-community-release-el6-5.noarch (@/mysql-community-release-el6-5.noarch)
 From   : file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

warning が出てきました。config 系ファイルに更新があるようですね。後で diff を取りましょう。

warning: /etc/my.cnf created as /etc/my.cnf.rpmnew
warning: /etc/logrotate.d/mysqld saved as /etc/logrotate.d/mysqld.rpmsave

更新が終わったら、MySQL を起動します。

# /etc/init.d/mysqld start

バージョンを確認します。MySQL 5.6 になりました。

# mysql --version

mysql  Ver 14.14 Distrib 5.6.16, for Linux (x86_64) using  EditLine wrapper

参考サイト

エラーログを確認

MySQL が無事起動したら、エラーログを確認します。私の場合は 以下のような Warning や ERROR が出ていました。順番に見て行きましょう。

explicit_defaults_for_timestamp オプションを追加

explicit_defaults_for_timestamp オプションが必要になったようです。

[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
  Please use --explicit_defaults_for_timestamp server option
  (see documentation for more details).

my.cnf に追加しました。

/etc/my.cnf

[mysqld]
explicit_defaults_for_timestamp=1

innodb_additional_mem_pool_size オプションを削除

innodb_additional_mem_pool_size オプションが DEPRECATED になったようです。

 7f4d096b9720 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED.
 This option may be removed in future releases,
 together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.

my.cnf からコメントアウトしました。

/etc/my.cnf

[mysqld]
#innodb_additional_mem_pool_size=16M

mysql_upgrade コマンドを実行

いろいろエラーが出ていました。解決するには「Please use mysql_upgrade to fix this error」とのこと。

[ERROR] Column count of mysql.events_waits_current is wrong. Expected 19, found 16.
  Created with MySQL 50536, now running 50616.
  Please use mysql_upgrade to fix this error.
...

mysql_upgrade コマンドを実行します。

# mysql_upgrade -uroot -p

...
Warning: Using a password on the command line interface can be insecure.
...
OK

途中「Using a password on the command line interface can be insecure.」という Warning がでましたが「コマンドラインでパスワード入れたほうが安全だよ」という警告文なので気にしなくていいです。

MySQL 再起動

ひと通り修正できたら MySQL を再起動します。

# /etc/init.d/mysqld restart

再起動したら再びエラーログを確認して、Warning や ERROR を確認します。なくなるまで繰り返しましょう。

my.cnf サンプル

参考までに、MySQL 5.6 用の my.cnf をさらします。WEB サーバと DB サーバ共存、CPU 3 コア、メモリ 2GB のマシン用です。平常時のメモリ使用量は 200MB くらい。仮想メモリ数は 1GB くらいです。様子を見ながら調整していきます。

[mysql]
default-character-set=utf8
show-warnings
#safe-updates
prompt='[\d] mysql> '
[mysqld]
# basic
datadir=/var/lib/mysql
port=3306
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
character-set-server=utf8
default-storage-engine=InnoDB
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
explicit_defaults_for_timestamp=1
# max connections
max_connections=256
# max_connections * tables used in one transaction + 5
table_open_cache=1024
# all tables(about 30) + max_connections + 5
table_definition_cache=400
# table_open_cache * 1.4
open_files_limit=1450
# global buffer
key_buffer_size=128M
tmp_table_size=32M
max_heap_table_size=32M
query_cache_size=128M
query_cache_limit=2M
query_cache_min_res_unit=4k
query_cache_type=1
# available memory for Mysql * 0.7
innodb_buffer_pool_size=128M
# DEPRECATED in mysql5.6
#innodb_additional_mem_pool_size=16M
# thread buffer
read_buffer_size=256K
read_rnd_buffer_size=512K
join_buffer_size=256K
sort_buffer_size=512K
# InnoDB
innodb_log_buffer_size=16M
innodb_file_per_table
innodb_autoextend_increment=64
innodb_log_files_in_group=2
innodb_log_file_size=32M
innodb_flush_log_at_trx_commit=1
#innodb_flush_method=O_DIRECT
innodb_thread_concurrency=3
innodb_commit_concurrency=3
# log
general_log=0
general_log_file=/var/log/mysql/general.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=0.5
#log_queries_not_using_indexes
[myisamchk]
key_buffer=64M
sort_buffer=64M
read_buffer=16M
write_buffer=16M
[mysqldump]
default-character-set=utf8
quick
set-charset
single-transaction
[mysqld_safe]
log-error=/var/log/mysql/error.log
pid-file=/var/run/mysqld/mysqld.pid

my.cnf のチューニングは以下のサイトが参考になります。

終わりに

いかがでしたか。本家のマニュアルを参考に作業を進めれば、大抵のことは何とかなります。データベースの更新は怖い作業ですが、ぜひチャレンジしてみてください。

-技術ブログ
-