モーグルとカバとパウダーの日記

モーグルやカバ(EXカービング)山スキー(BC)などがメインの日記でした。今は仕事のコンピュータ系のネタが主になっています。以前はスパム対策関連が多かったのですが最近はディープラーニング関連が多めです。

CentOS6でMySQL5.1→5.6へのアップデートの方法

CentOS6のMySQLで、全文検索を行うためにMroongaを入れて試してみたかったのですが、CentOS6では標準ではMySQL5.1が入っており、バージョンを5.5以上にする必要がありました。
これが結構厄介だったのでアップデート手順をまとめました。


状況によってはmysql起動時にエラーが出たりlogfileの削除などをしなければならなくなったりするため、まずmysqldumpで全データベースのバックアップを取ってから行うようにします。


必須なのは

  • パッケージのアップデート
  • my.cnfの設定変更
  • データベースのアップグレード

パッケージのアップデート

CentOS5やCentOS6で標準のMySQLを5.5や5.6にするというエントリーは結構あるのですが、自分の場合は最終的にこちらのエントリーが最も参考になりました。


mysqlを5.1->5.6に再インストールする
http://blog.10rane.com/2014/07/28/reinstall-mysql56/


mysql55のパッケージを利用するものだと、一旦依存パッケージをアンインストールする必要がありました。
サービス中のサーバに適用する必要ができた場合を考え、MySQLのみをアップデートする方法を探しました。
こちらの手順では、現在インストールされているMySQL5.1に依存したパッケージを一旦削除すること無く、MySQL5.6にすることが可能でした。
5.1のアンインストールの前にMySQL-shared-compatというパッケージを入れることで、既存の依存パッケージをアンインストールすること無く、5.6をインストールすることが出来るようになります。


以下のMySQL公式ダウンロードサイトのミラーから、MySQL-5.6のMySQL-shared-compatの該当するrpmを取得します。
古いバージョンのものは無くなるため、

http://ftp.jaist.ac.jp/pub/mysql/Downloads/MySQL-5.6/

を確認して存在している自分のOSバージョンにあったもの(「el6 | el7」と「x86_64 | i386」)を選びます。
例えばCentOS6の64bit版なら「MySQL-shared-compat-5.6.21-1.el6.x86_64.rpmなどです。


MySQL-shared-compatをインストールし、5.1のMySQLをアンインストールした後、MySQLの公式サイトで提供されているCentOS6用の設定を入れ、5.6を入れ直すという手順にになります。

wget ftp://ftp.jaist.ac.jp/pub/mysql//Downloads/MySQL-5.6/MySQL-shared-compat-5.6.21-1.el6.x86_64.rpm
sudo rpm -Uvh MySQL-shared-compat-5.6.21-1.el6.x86_64.rpm
sudo yum remove mysql mysql-server
sudo yum install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
sudo yum install mysql mysql-devel mysql-server

Vagrant等で割り当てメモリ不足の対応

自分はvagrant上の仮想サーバで試していたのですが、5.6に上げると下記のようなエラーが出て起動できないという状況になりました。

InnoDB: mmap(137363456 bytes) failed; errno 12
[ERROR] InnoDB: Cannot allocate memory for the buffer pool

これはメモリが足りないために起こるため、vagrantの割り当てメモリを増やして対応します。


Vagrant+VirtualBox+CentOS環境でMySQL5.6が起動しない場合の対処法 - 憂鬱な世界にネコパンチ!
http://nekopunch.hatenablog.com/entry/2014/03/22/020507


Vagrantfile

config.vm.provider :virtualbox do |v|
  v.customize ["modifyvm", :id, "--memory", 1024]
end

InnoDBの設定変更によりlogfileのファイルサイズ変更によるエラー対応

メモリを増やして良くなったものの、また別のエラーが発生するようになりました。

[ERROR] InnoDB: auto-extending data file ./ibdata1 is of a different size 640 pages (rounded down to MB) than specified in the .cnf file: initial 768 pages, max 0 (relevant if non-zero) pages!
2014-10-29 08:29:38 2528 [ERROR] InnoDB: Could not open or create the system tablespace. If you tried to add new data files to the system tablespace, and it failed here, you should now edit innodb_data_file_path in my.cnf back to what it was, and remove the new ibdata files InnoDB created in this failed attempt. InnoDB only wrote those files full of zeros, but did not yet use them in any way. But be careful: do not remove old data files which contain your precious data!

これは設定変更後 ibdata1 当のファイルサイズが違ってしまったために起きるそうで、ファイルを削除して対応するしかないようです。
が、これの理由じゃない時にlogfileを削除してしまうと色々と問題が起きることがあったので、一旦バックアップとっといてからやったほうがいいと思います。


my.cnfでinnodb関連の設定後、MySQLが起動しなくなった | システム開発ブログ(システム開発のアイロベックス
http://www.ilovex.co.jp/blog/system/projectandsystemdevelopment/mycnfinnodbmysql.html

cd /var/lib/mysql
sudo mkdir logfile_backup
sudo mv ib_logfile0 ib_logfile1 ibdata1 logfile_backup/

my.cnfの設定変更

5.5以降からデフォルト文字コードの指定(character-set-serverに変更された)とslow-queryなどのlog出力の指定方法が変わっているため、設定を変更する必要があります。
下記ページ等を参考に、下記のように設定を行いました。


my.cnfの変更点のせいでMySQL5.6がなかなか起動しない件 - 文系プログラマによるTIPSブログ
http://treeapps.hatenablog.com/entry/2013/02/10/my.conf%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9%E3%81%AE%E3%81%9B%E3%81%84%E3%81%A7%E3%81%AA%E3%81%8B%E3%81%AA%E3%81%8BMySQL5.6%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84%E4%BB%B6


MySQLで文字化けしたときの対処法 - Qiita
http://qiita.com/WizowozY/items/5d7224be92aa8364a42a


Programster: MySQL 5.6 - Enable Slow Query Logging
http://programster.blogspot.jp/2014/02/mysql-enable-slow-query-logging.html


/etc/my.cnf

[mysqld]
character-set-server=utf8
skip-character-set-client-handshake

slow_query_log=1
slow_query_log_file=/var/log/mysqld/slow-query.log
long_query_time=0.1


また、MySQL5.6にすると /etc/my.cnf の sql_mode に下記設定が加えられてしまい、これまでのSQLがcreate table時にエラーが起きる場合があるようです。
なので以下のsql_modeの行はコメントアウトします。


/etc/my.cnf

# Recommended in standard MySQL setup
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

データベースのアップグレード

これで起動はするようになってくるのですが、一部操作が出来ない状況が発生しました。
これはログを見ると起動時に下記のようなエラーが出ているのでわかります。


/var/log/mysqld.log

[ERROR] Native table 'performance_schema'.'users' has the wrong structure


mysql_upgrade というコマンドが用意されているため、これを実行することでデータベースのアップグレードが行われて解決できます。
mysqldが動いている状況で利用します。


MySQLを5.1から5.6.10に上げたらなんか壊れた話 | いちよんこーど
http://14code.com/blog/20130625_504


homeberwでMySQL5.6にupgradeしたらユーザーが作成できなくて困ったときのメモ - Qiita
http://qiita.com/shikataka/items/4783a53ac2e4b2a3141f

mysql_upgrade -u root -p

でアップグレードが行われます。
mysqlを再起動してログにエラーが出ていないか確認して下さい。