mixiユーザー(id:646942)

2015年04月04日19:23

1238 view

【技術】MySQL5.0からMySQL5.5に移行しました

FreeBSD10.1Rにする以前、FreeBSD8.3RではMySQL5.0を動かしていましたウチの通販のページですね。

その辺りに関してはブログに何度も書いてます通り弟に完全に任せていたのであまり詳しくなく。
特に考えなしに5.0を抜いて最新の5.6を入れ直してしまったんですねぇ・・・(かすれ声)
※現在はMySQL5.0はobsoleteのためportsツリーにありません

ということでデータベースに互換性がなくなりまして。

それ以前にですね。5.6がそもそもまともに立ち上がらないという現象に陥りました。
基本的には


---
14:22:22 UTC - mysqld got signal 11 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,-
something is definitely wrong and this may fail.

key_buffer_size=8388608
read_buffer_size=131072
max_used_connections=0
max_threads=151
thread_count=0
connection_count=0
It is possible that mysqld could use up to-
key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 67555 K bytes of memory
Hope that's ok; if not, decrease some variables in the equation.
---

これのループですね。


色々と右往左往していたのですが、やはり最終的にはcoreファイルを見るという結論に。

my.cnfの[mysqld]セクションにcore-fileという記述を入れるとコアダンプするようになります。

そこでコアダンプさせてですね、

/usr/local/etc/rc.d/mysql-server start
/usr/local/etc/rc.d/mysql-server stop

stopしても何故かプロセスが残留しているので個別に強制終了します。
ps -afxww | grep mysql
kill -9 数字

gdb /usr/local/libexec/mysqld ./mysqld.core

見ると・・・kill_thr()で落ちていました。


私の経験上、 thr というフレーズで出てくるのは threshold か thread ・・・


またお前か・・・


libpthreadがFreeBSD7からlibthrに置き換えられたとかそういう情報もありますが何よりとにかくスレッドをkillしてるってことはですよマルチスレッドで動いてるってことなんですね。


そしてmysqlとマルチスレッドでググるとですね、5.6からマルチスレッドのなんちゃらかんちゃらをサポートしたとか書いてあるわけです。


[root@hogeserver /usr/ports/databases/mysql56-server]# make config
===> No options to configure
[root@hogeserver /usr/ports/databases/mysql56-server]# cd ../mysql56-client/
[root@hogeserver /usr/ports/databases/mysql56-client]# make config
===> No options to configure



救いはありませんでした・・・



マルチスレッドが関わると良い感じの確率でよくないことが起こるんです経験上。
マルチスレッドはCPUがマルチスレッド対応かどうかということが問題になるのですがまずいまの世代のCPUは確実に対応しています。
しかしこれは逆に言えばCPUに依存するものとも言えます。
以前マルチスレッド化したよ! ということで導入した所こぞってエラーを吐き出したmirandaとか、FreeBSDだとperlでしたかね・・・なんというか、「スレッドセーフになりました」は安心出来るのですが「マルチスレッドに対応しました」は私にとっては脅威でですね。
マルチスレッドに対応してリリース後、3年くらいは放置しておきたいものです。
なので5.6は来年の今頃になったら入れたいかな、と思います。



ということでMySQL5.5に移行することにしました。



MySQL5.0のソースを持ってきてインストールします
http://downloads.mysql.com/archives/get/file/mysql-5.0.96.tar.gz

./configure
make -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_INNOBASE_STORAGE_ENGINE=1

make install

/etc/rc.confを確認します

mysql_enable="YES"
mysql_dbdir="/usr/local/mysql/data"

サーバを起動します。

/usr/local/etc/rc.d/mysql-server start

ダンプします

mysqldump -u root -p --all-databases > /home/tok/alldata.sql

サーバを停止します。

/usr/local/etc/rc.d/mysql-server stop

5.0をアンインストールします

make uninstall

mysqlに使っていたディレクトリ/ファイルを削除します。

rm -rf /usr/local/mysql
rm -rf /var/db/mysql/*

5.5をクライアント、サーバの順に入れます(省略)

mysql用のディレクトリを作ります。

mkdir -p /usr/local/mysql/data

権限を変更します。

chown -R mysql:mysql /usr/local/mysql

サーバを起動します。

/usr/local/etc/rc.d/mysql-server start

innodbを初期化します。

mysql_install_db --basedir=/usr/local --datadir=/usr/local/mysql/data --user=mysql

dumpしたsqlをインポートします。

mysql -u root < /home/tok/alldata.sql

この時点でrootユーザのパスワードも復帰しています。

データベースをチェックします

mysqlcheck -c -u root -p --all-databases
mysqlcheck -A -o -u root -p
mysqlcheck -r --all-databases -u root -p
※最後の行は「なんも復元するものはないよ」というエラーが出ます

ここでようやくupgradeします。

mysql_upgrade -u root -p

一旦mysqlを止めます。

/usr/local/etc/rc.d/mysql-server stop

念のため、mysql絡みのPHPのextensionを入れ直します。

/usr/ports/databases/php56-mysql
/usr/ports/databases/php56-mysqli
/usr/ports/databases/php56-pdo_mysql

それぞれで make deinstall clean && pkgdb -u します。

extensionsを入れ直します。

cd /usr/ports/lang/php56-extensions/

make deinstall install clean && pkgdb -u

自動的にphp56-mysql等を再構築してインストールしてくれます。

サーバを再起動します。

shutdown -r now

これで完了です。



だいたい丸3日くらいかかりましたね。。(右往左往していた分)
本来道義上私がやる作業ではなかったのですが(色々とありまして)、移管したはずの相手はやはり手慣れてないようなので私がやることになってしまいました疲れました。

2 0

コメント

mixiユーザー

ログインしてコメントを確認・投稿する