ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

WindowsでInstallerを使わずにMySQLをインストールする

個人的な趣味で、MySQLについてはインストーラパッケージではなく、只のzipパッケージを好んで用います。うーん、PHPMySQLについてはWindowsインストーラバージョンは使いません。なんか気持ち悪いので。Apacheがぎりぎりですね。

ともあれ。となりますと、Windowsへのサービス登録も全て手動で行わなければなりません。まぁ、この自由度が大好きなのでInstallerを使わないのですが。
ちなみにOSはWindowsXP(SP2)を使ってます。

1. MySQLダウンロードサイトから、「Without installer」というパッケージをGETします。


2. お好みのディレクトリに解凍します。
例えば自分は、MySQL4の時もInstallerを使わずに入れていたので、

C:\mysql-4.1.15

というディレクトリがすでにありました。今回は5.0.51aですので

C:\mysql-5.0.51a
    bin\
    data\
    Docs\
    ...
    my-****.ini

という感じのディレクトリ構成になります。

こんな感じにやってくと、将来的にはC:\の直下にMySQLのバージョンがずらりと並ぶことになり、なんか格好良いですね。
しかも以下に示す方法でWindowsへのサービス登録も全て自分の管理下で行えるわけですから、プロっぽくて格好良いです。

3. my.iniを作成します。

開発用の環境構築なのですから、my-small.iniをコピーします。当然、全て自分の制御下に出来るので C:\WINODWSなんて気色悪いところに置きたくないです。あそこは生粋のWindowsプログラムのための楽園なのですから。
というわけで、今回は

C:\mysql-5.0.51a\my.ini

にコピーしました。

で、いくつか設定を追加しておきます。

C:\mysql-5.0.51a\my.ini : 追加・削除差分箇所だけ。
...
[client]
# ↓ソケットはUNIXソケット使えませんので、コメントアウト。
#socket = /tmp/mysql.sock

# ↓追加。
default-character-set=utf8

...
[mysqld]
# ↓ソケットはUNIXソケット使えませんので、やっぱりコメントアウト。
#socket = /tmp/mysql.sock

# ↓以下を追加。basedirとdatadirは、ここでお好みの場所を指定できます。
basedir="C:/mysql-5.0.51a/"
datadir="C:/mysql-5.0.51a/data/"
default-character-set=utf8

# ↓これは単に好みや開発内容の問題。
default-storage-engine=MyISAM

4. 動作確認

MSDOSコマンドプロンプトを立ち上げて、以下のような感じで "--console" オプション付きで起動します。

> cd c:\mysql-5.0.51a\bin

C:\mysql-5.0.51a\bin> mysqld --defaults-file=C:\mysql-5.0.51a\my.ini --console

上手く動けば、以下のようなメッセージがコマンドプロンプトに流れて、デーモンが起動=そこで待ち受け状態でコマンドプロンプトが停止するはずです。

InnoDB: The first specified data file .\ibdata1 did not exist:
InnoDB: a new database to be created!
080221 13:35:57  InnoDB: Setting file .\ibdata1 size to 10 MB
InnoDB: Database physically writes the file full: wait...
080221 13:35:58  InnoDB: Log file .\ib_logfile0 did not exist: new to be created
InnoDB: Setting log file .\ib_logfile0 size to 5 MB
InnoDB: Database physically writes the file full: wait...
080221 13:35:59  InnoDB: Log file .\ib_logfile1 did not exist: new to be created
InnoDB: Setting log file .\ib_logfile1 size to 5 MB
InnoDB: Database physically writes the file full: wait...
InnoDB: Doublewrite buffer not found: creating new
InnoDB: Doublewrite buffer created
InnoDB: Creating foreign key constraint system tables
InnoDB: Foreign key constraint system tables created
080221 13:36:00  InnoDB: Started; log sequence number 0 0
080221 13:36:01 [Note] mysqld: ready for connections.
Version: '5.0.51a-community'  socket: ''  port: 3306  MySQL Community Edition (GPL)

で、「よっしゃ動いた!さて次は・・・」とばかりにC-cで落としてはいけません。(←一回それで落としてデータファイルが壊れて、正常に起動しなくなって焦った。)
MySQLデーモンの終了は、別にDOS窓を立ち上げ、mysqladminのshutdownで落とします。

> cd c:\mysql-5.0.51a\bin

C:\mysql-5.0.51a\bin> mysqladmin.exe -u root shutdown

すると、MySQLデーモンが立ち上がってるDOS窓も動き出します。

080221 13:36:29 [Note] mysqld: Normal shutdown

080221 13:36:30  InnoDB: Starting shutdown...
080221 13:36:30  InnoDB: Shutdown completed; log sequence number 0 43655
080221 13:36:30 [Note] mysqld: Shutdown complete

DOS> (mysqldが終了してコマンドプロンプトに復帰)

5. Windowsのサービスに登録

ここまで行けば、あとはWindowsにサービスとして登録します。やはりこの辺りを手動で完全に制御できるのが、Installerを用いないで苦労してセットアップするときの醍醐味と言えましょう。
mysqldを"--console"で立ち上げたDOS窓でそのまま続けます。

C:\mysql-5.0.51a\bin> mysqld --install MySQL5 --defaults-file=C:\mysql-5.0.51a\my.ini
Service successfully installed.

C:\mysql-5.0.51a\bin>net start MySQL5
MySQL5 サービスを開始します.
MySQL5 サービスは正常に開始されました。

ポイントは"--defaults-file"でmy.iniの場所を設定している部分です。ともあれこれで、MySQL5というサービス名で自動起動で設定されます。
ちなみに、将来バージョンアップするなどしてサービス登録を一旦解除したい場合はどうすればよいでしょうか?そういうときは、"--remove"オプションを使います。

DOS> net stop MySQL5
MySQL5 サービスを停止中です.
MySQL5 サービスは正常に停止されました。

C:\mysql-5.0.51a\bin>mysqld --remove MySQL5
Service successfully removed.

ちなみに、今回は"MySQL5"という風にサービス名をデフォルトで無い名前にしてますので、"--install", "--remove"オプションとも、後ろにサービス名をつけないと怒られます。

・・・という感じです。えーと、これを応用すれば、異なるバージョンのMySQLをそれぞれ異なるポート番号で同時に起動することもできます。なんだか格好良いですね。

あくまでも趣味ですが、自分自身はApache, MySQL, PHPの3点に関してはWindows版をよく使います。開発マシンがWindowsというのもありますが、結局これらは、自分自身でサービス登録や起動設定をほぼ完全に掌握できるので、例えばPHP4とPHP5を共存させたり、今回の応用でMySQL4と5を共存させたりといった作業を、コンパイル作業やRPMを作成することなしに気楽に行えることが最大の醍醐味だと感じているからです。その文脈で、自分はXAMPを使いません。
Linuxだとどうしても手動でコンパイルしてあれこれするか、バイナリで済ますのであればRPMでごにょごにょするしか無いですから。その点Windowsの血筋が混じると、こうしてフォルダにまとめてごそっといれて済ませられるので好きです。
というか、PHP系の開発は自分の会社自体、あまりやってないので、ごくたまに1年に一回くらい、それも数週間程度の修正や小機能開発になっちゃうんですね。そうなると次の仕事をするときにはとっくに新バージョンになってたりして。入れ直したりごにょごにょする時は、やっぱりInstallerで何度も裏側でレジストリを弄られるのは気持ち悪い。こうして自分で完全に掌握しておかないと不安なわけです。

6. 参考文献

MySQLをDLして解凍すると、Docsディレクトリに "manual.chm" がついてきてます。今回はそれの「2.4.8.5. Installing MySQL from a Noinstall Zip Archive」から「2.4.8.11. Starting MySQL as a Windows Service」あたりまでを参考にしました。