mysql3.23とmysql5.0の共存

2008年4月29日(火)

本日ブログ開設。右のプロフィールにあるとおり、このブログではPython, TurboGears,バロックオーボエの話題が中心の予定である。しかし本日は初日なのに全然違う話題である。

先日、仕事で借りている専用サーバの移転作業を行った。サーバ中には10サイト近くサイトがあるためある程度の工数は予想したが、結果としてはそれを遥かに上回る工数を要してしまった。原因は、データベースmysqlのバージョンの違いである。

旧サーバはmysql3.23、新サーバはmysql5.0。文字コードで問題の発生する可能性はMLなどで事前に知ってはいた。確かにブログの移転で若干の問題は発生したが、/etc/my.cnfの設定、データベースの文字コード指定等でクリアできた。

問題はJava(Servlet)アプリケーション。これは医学データ収集用WEBアプリケーションで、5,6年前(だいぶ前)に作ったものだ。

文字コード(文字化け)問題はこのJavaアプリケーションでも発生した。ただこれも、/etc/my.cnfの設定、データベースの文字コード指定のみならず、mysql-connector-javaのバージョンや設定を変えることで、少し時間はかかったがクリアできた。しかしどうしても解決できない問題が発生してしまった。

それは、「TIMESTAMP NULL」問題である。良く知られたことだがMySQLのデータ型のTIMESTAMPは癖があり使わない方が良い。しかしこのJavaアプリではTIMESTAMP型は多用されていた。そして、TIMESTAMP値の0またはNULLを代入する際、TIMESTAMP型の開始日時である 1970-01-01 00:00:00 を設定していた。これはmysql3.23では問題なく動作する。しかしmysql5.0では例外が発生してしまう。

ここからが試行錯誤の始まりだった。mysql5.0ではJSTとUTCの9時間のずれを考慮しているようで、1970-01-01 09:00:01 は設定できる。しかし 1970-01-01 09:00:00 は設定できない。NULLを設定してみると、mysqlのTIMASTAMP型の振るまいでカレント日時が代入されてしまう。

この「設定できない」という意味は、Javaから設定できない、という意味である。コンソールのmysqlコマンドでは設定できる。mysqlコマンドでは 1970-01-01 09:00:00 は設定でき、SELECTでそれを見ると NULL として表示される。この振るまいをJavaから行いたいのだが。いろいろ試行錯誤し、調査の結果、これは不可能であることがわかった。このJavaアプリで必要な、TIMESTAMP型に初期値を設定するという処理がmysql5.0では不可能なのだ。

サーバ移転の期限は迫ってくるし、さあ困った。そこで思いついた案が、mysql5.0が動いているサーバに別途mysql3.23を動かし、共存させる、という方法だ。設定ファイルの/etc/my.cnfが悪さをしないかちょっと心配だったが、結果としては共存できた。そして件のJavaアプリからはmysql3.23側に接続し、問題なく動作している。

ここで、mysql5.0動作環境にmysql3.23を共存インストールする手順について簡単にまとめておく。

1: mysql5.0環境のセーブ
念のため、mysql5.0関連ファイルをセーブしておく。
(1)2ファイルセーブ
/etc/my.cnf
/etc/rc/init.d/mysqld

(2)mysqlデーモンを止めてから /var/lib/mysql セーブ

2: /etc/my.cnf を5.0専用にする
/etc/my.cnf 修正
[mysqld] を  [mysqld-5.0] に変更しmysql再起動。問題の無いことを確認する。

3: ソースインストール
実行は新ユーザ mysql3 とする。またmysql3.2の最後のバージョンのソース mysql-3.23.58.tar.gz を入手し、/tmp下に存在するものとする。

$ su -
# useradd mysql3
# mkdir /usr/local/mysql3.23
# chown mysql3 /usr/local/mysql3.23

# cd /usr/local/src
# cp -p /tmp/mysql-3.23.58.tar.gz .
# mkdir mysql-3.23.58
# chown mysql3 mysql-3.23.58
# su - mysql3

rootでの実行はここまで。以降は、新ユーザ mysql3 で実行する。

$ cd /usr/local/src
$ tar xvzf mysql-3.23.58.tar.gz
$ cd mysql-3.23.58
$ ./configure –prefix=/usr/local/mysql3.23 –with-extra-chrasets=all –with-charset=ujis

ところが上記最後の ./configure でエラーが発生した。

checking “LinuxThreads”… “Not found”
configure: error: This is a linux system and Linuxthreads was not
found. On linux Linuxthreads should be used. Please install Linuxthreads
(or a new glibc) and try again. See the Installation chapter in the
Reference Manual for more information.

調査の結果、これはMySQLのバグのようで、configureにオプションを付加すれば良いことがわかった。

$ ./configure –prefix=/usr/local/mysql3.23 –with-extra-chrasets=all –with-charset=ujis –with-pthread –with-named-thread-libs=-lpthread –disable-dependency-tracking –without-bench –without-debug –enable-assembler

次にmakeを行う。

$ make >make.log 2>makeErr.log

今度は次のエラーとなった。

mysqld.o:mysqld.cc:(.text+0×306e): more undefined references to `my_fast_mutexattr’ follow
collect2: ld returned 1 exit status

調査の結果、あるサイトの次の記述を参考にした。

my_fast_mutexattrはmysys/my_thr_init.cに
以下のように定義されています。

#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
#endif

この定義を次のように変更したら、makeは成功しました。

//#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
pthread_mutexattr_t my_fast_mutexattr;
//#endif

目出度くmakeは成功した。そしてインストール。

$ make install >install.log 2>installErr.log

4: .my.cnf
/home/mysql3下に次の内容で .my.cnf (ドット’.'ファイルであることに注意)作成

[mysqld]
port=13306
basedir=/usr/local/mysql3.23
datadir=/usr/local/mysql3.23/var
socket=/tmp/mysql.sock3.23
log=/usr/local/mysql3.23/var/mysql.log

5: DB初期化
ユーザ mysql3で次を実行。

$ cd /usr/local/src/mysql-3.23.58
$ scripts/mysql_install_db

6: mysqlデーモン開始

$ /usr/local/mysql3.23/bin/safe_mysqld &

mysqlデーモンのプロセスIDは次のファイルに格納されている。
/usr/local/mysql3.23/var/xxxxx.pid (xxxxxは環境に固有)

そこで、次のコマンドでmysqlデーモンを停止できる。

$ kill `cat /usr/local/mysql3.23/var/xxxxx.pid`

7: mysql3.23 自動実行
/etc/rc.d/init.d/mysqld をコピーして mysql3 とし、上記の内容で修正。

8: mysqlコマンド接続
・mysqlデータベース接続

$ /usr/local/mysql3.23/bin/mysql –port=13306 –socket=/tmp/mysql.sock3.23 -uroot mysql

または

$ /usr/local/mysql3.23/bin/mysql -h127.0.0.1 –port=13306 -uroot mysql

なおこの初期状態ではrootにパスワードが設定されていないので至急設定する。
そして、mysql3.23側データベースアクセスは、/usr/local/mysql3.23/bin/下のコマンドを使用すればよい。

以上でmysql5.0とmysql3.23の共存に成功した。

この記事のトラックバックURL:
http://www.oboefukuneco.com/archives/4/trackback

コメント投稿

(承認制となっております。)


(必須)


(ブログには表示されません)



コメント・トラックバック一覧(0)

コメントはまだありません。

 
サブタイトル カレンダー

 

2017 年 9 月
« 3 月    
 12
3456789
10111213141516
17181920212223
24252627282930
秘書
サブタイトル profile

 

職業はソフトウェアエンジニア。趣味はバロックオーボエとモダンオーボエ演奏。このブログでは、Python・Go・Scala言語、そのWEBアプリケーションフレームワーク、そしてバロックオーボエ・クラシカルオーボエの話題を中心に書いて参ります。

サブタイトル 検索

 

サブタイトル 最近のトラックバック

 


QLOOK ANALYTICS