MySQL4.1のインストール
Mysql3 も Mysql4.0 も更新版が入手できなくなったのでそろそろ本腰入れて Mysql4.1 に乗り換えようと思います。といってもずいぶん前から Mysql4.1 をインストールしてはいましたが「キャラクターセット」まわりの挙動が理解できなくて使うには至らず、Mysql3 や Mysql4.0 を使い続けてきました。Mysql3 と Mysql4.0 はそう違いませんが、Mysql4.0 と Mysql4.1 は全く違うデータベースと思って良いくらいに違います。そこらあたりもふくめてまとめてみました。
Mysql 4.1 の入手
Mysql 本家のダウンロードページから入手できます。いくつか似たようなファイルがありますが mysql-4.1.xx-win32.zip をダウンロードします。xx の数字が大きなほどバージョンが新しいものになりますので特に理由が無い限りは新しいものを選びましょう。
MySQL :: MySQL 4.1 DownloadsWindows ZIP/Setup.EXE (x86)のDownloadもしくはミラーサイトからmysql-4.1.xx-win32.zipをダウンロードしますMySQL :: MySQL Product Archives- アーカイブにも同じファイルが置いてあります。
Microsoft Windows 32. (ZIP format) (7 Nov 2006, 41.3M)のリンクがそれです。
Mysqlのインストール
今回ダウンロードしたのが mysql-4.1.22-win32.zip。これを解凍すると Setup.exe が作られます。このアイコンをダブルクリックし表示されるウィザードに従って進んでいきます。
- 1. Welcome to the Setup Wizard for MySQL Server 4.1
- 先ずはご挨拶。よろしくとご挨拶して [Next] をクリック。
- 2. Setup Type
- セットアップのタイプを選びます。今回はインストールするフォルダを
C:\usr\local\mysql4に変更するのでCostomを選んで [Next] をクリック。 - 3. Costom Setup
- [Change...] をクリックしてインストールするフォルダを選択し [OK] をクリック。
Install to:が希望のフォルダ名に変わってることを確認して[Next] をクリック。 - 4. Ready to Install the Program
- 準備は良いかって、ここまでくれば進むしかありません。 [Install] をクリックするとインストールが始まります。 ものの数十秒で完了します。
- 5. MySQL.com Sign-Up
- Mysqlのアカウントを作成するか尋ねられます。必要なければ
◎Skip Sign-Upを選んで [Next] をクリック。 - 6. Wizard Completed
- ここで [Finish] をクリックすればインストールは終わりです。
□ Configure the MySQL Server nowは後記の環境設定ウィザードを起動するものです。ここで環境設定を行わなくてもインストールフォルダのbin\MySQLInstanceConfig.exeを実行し設定できます。一度はやっておかなければなりませんので特に理由が無ければココをチェックした上で [Finish] をクリックし、環境設定ウィザードに進みます。
環境設定ウィザードで初期設定
環境設定ウィザード(MySQLInstanceConfig.exe)を使うと rootパスワードの設定からmy.iniの作成まで、最低限必要な初期設定を行うことが出来ます。MySQL3のインストールでコマンドラインからやってたもろもろが嘘みたいにスッキリ済んでしまいます。これは楽です。
- 1. Welcome to the MySQL Server Instance Configuration Wizard 1.0.8
- 環境設定を行います。[Next] をクリック。
- 2. Please select a configration type.
- 設定のタイプを聞かれてます。特にこだわりが無ければ
◎ Standard Configurationを選んで [Next] をクリック。 - 3. Please set the Windows options.
- ここでWindowsに対するオプションを設定します。まずは Mysql を Windows のサービスにインストールするかどうかを
◎ Install As Windows Serviceで指定します。今回はMySQLの始動と終了をコマンドラインから制御できるようサービスにインストールするのでチェックを入れます。あわせてService Name:でサービス名を指定します。どれを選んでもOKですがインストールしたバージョンと合わせておくと管理し易い思います。MyPCには現在サービス名MySQLでMysql3をインストールしてあるのでここは「MySQL4」を選択しました。□ Launch the MySQL Server automaticallyは Windows の起動時にMySQLサービスを自動でスタートさせるかを設定します。始動と終了はコマンドラインから制御する予定なのでこのチェックは外します。□ Include Bin Directory in Windows PATHは、Windowsの環境変数PATHに Mysql の各実行ファイルのあるディレクトリ\binを追加するかを設定します。追加しなくても\binディレクトリに移動すれば実行できますが、追加しておけばどのディレクトリからでも実行できるようになります。以上設定を終えたら [Next] をクリック。 - 4. Please set the security options.
- 次はセキュリティの設定です。
□ Modify Security Settingsにチェックを入れてroot(管理者)のパスワードを設定します。New root password:に任意のパスワードを入力し、Confirm:にも確認の為同じパスワードを入力します。□ Enable root access from remorte machinesは、リモートコンピュータから遠隔制御するかどうかです。勉強用の開発環境には不要かと思いますのでチェックをはずしておきます。□ Create An Anonymous Accountはアノニマスユーザ(ユーザー名の無いゲストユーザ)のためのアカウントを作成するかどうかを設定します。普通は必要ないと思いますのでこのチェックもはずしておきます。以上設定を終えたら [Next] をクリック。 - 5. Ready to execute...
- [Execute] をクリックして設定を実行します。十数秒ほどで完了します。
- 6. Processing configration...
- 以上でウィザードは終了です。[Finish] をクリックしてウィザードを閉じます。
動作確認
環境設定ウィザードを終えたところで、Mysqlサーバはすでにサービスを開始していてクライアントからのリクエストを待っている状態です。コマンドラインクライアント(mysql.exe)を使って、初期設定が済んでる事を確認してみましょう。
まずは Mysqlサーバに接続(ログオン)します。コマンドプロンプトに次のコマンドを入力します。-p の後 Enter を押すとパスワードを尋ねられるので設定ウィザードで指定したパスワードを入力し Enter を押します
C:\> mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 4.1.22-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
成功すればこのようなメッセージが表示され、DOSプロンプトに代わってMysqlのプロンプトが表示されます。ここで失敗した場合はエラーメッセージから状況を判断してください。
ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
・・・Mysqlサーバが起動していない。
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
・・・パスワードが一致してない。
接続できたら次はこれから操作の対象とするデータベースを選択します。インストールしたばかりで何も無いので、Mysql自身を管理するデータベース「mysql」を選択してみます。
mysql> use mysql Database changed mysql>
Database changed(データベース変えました)が表示されたら、user テーブルの中身を確認してみます。次のSQL文は「user テーブルから Host と User と Password のフィールドを返してね」ってことです。
mysql> select Host, User, Password from User; +-----------+------+-------------------------------------------+ | Host | User | Password | +-----------+------+-------------------------------------------+ | localhost | root | *37C2F6A11B38C95BD166DCB76B653D10B0B4BCA2 | +-----------+------+-------------------------------------------+ 1 row in set (0.02 sec) mysql>
localhostのみ、rootユーザのみ、パスワード設定済み、このような感じで返事があればOK、予定通りです。
最後にMysqlサーバとの接続を切ります。(ログアウトします) \q と入力して Enter を押せば、MysqlのプロンプトがDOSのプロンプトに代わりサーバとの接続が切れます。
mysql> \q Bye C:\>
以上でMysqlサーバの動作確認はOKです。
Mysqlサーバの起動と終了
Windows のサービスに登録したので、コマンドプロンプトから簡単に開始と停止を制御できます。他のアプリケーションやスクリプトから制御する時などに便利ですので覚えておいて損はありません。
ディレクトリはどこでもかまいませんので、Windows のコマンド プロンプトを開いて次のように打ち込んでみましょう。MySQL4 の部分には設定ウィザードで指定したサービス名を指定します。
Mysqlサービスの開始
C:\> net start MySQL4
MySQL4 サービスを開始します. MySQL4 サービスは正常に開始されました。 C:\>
Mysqlサービスの停止
C:\> net stop MySQL4
MySQL4 サービスを停止中です. MySQL4 サービスは正常に停止されました。 C:\>
net はネットワーク管理のユーティリティコマンドで、start はサービスを開始、stop はサービスを停止するオプション、MySQL4 が制御対象のサービス名となります。これだけですので 「net start サービス名」、「net stop サービス名」 と覚えてしまいましょう。
netコマンドに再起動をおこなうオプションは無いので、net stop MySQL4 と net start MySQL4 を連続して下さい。
Mysql のファイル構成
触れることが多いと思われるファイルをピックアップしました。後々のためどのファイルがどこにあるのか実際にフォルダを覗いて確かめておきましょう。
C:\usr\local\mysql4bin- サーバ&クライアントコマンドファイル群mysql.exe- コマンドラインクライアントmysqladmin.exe- 管理ユーティリティmysqld-nt.exe- Mysql Server(デフォルト)mysqld-***.exe- mysqld.exe と mysqld-***で始まるものは用途別のMysql Servermysqldump.exe- DumpコマンドMySQLInstanceConfig.exe- 環境設定ウィザードdata- データフォルダ(デフォルト)Docs- .chmドキュメントフォルダshare- メッセージの言語パックフォルダmy.ini- 設定ファイル(デフォルト)
ひとまずインストールは終わりですが、今回 Mysql4.1に乗り換えるにあたって悩み考えたことをまとめてみました。
設定ファイル my.ini の置き場所(考)
ウィザードを使ってインストールするとインストールフォルダ直下に my.ini が作られています。Mysqlサーバは起動オプション(--defaults-file="C:\usr\local\mysql4\my.ini")を指定してあるのでこのファイルを見つけられますが、デフォルトでは Windowsフォルダ(C:\WINDOWS や C:\WINNT)や C:\ から my.ini を探すので、コマンドラインクライアント(mysql.exe や mysqldump.exeなど)はこの my.ini を見つけられません。[mysql] セクションに default-character-set=sjis を設定しても反映さなかったのでこれで半日悩みました。
Mysqlサーバの起動オプションを外して Windowsフォルダにこのファイルをコピーすれば、サーバとクライアントが同じ my.ini を共有するようにできます。
または、Mysqlサーバの起動オプションはつけたまま Windowsフォルダにこのファイルをコピーをつくれば、インストールフォルダ直下の my.ini はサーバ用、Windowsフォルダの my.ini はクライアント用といった具合に使い分けられます。
使い方なのでどちらが良い悪いはありませんが、後者の方法ならサーバ毎にオプションを設定出来るので、バージョンが違うMysqlサーバを複数稼動させるような場合に都合が良いと思います。
Mysql4.1 の認証パスワード(考)
Mysql4.0からMysql4.1に乗り換えて先ず戸惑うのが「認証」の違いです。Mysql4.1からパスワードのハッシュ生成方法が変更されました。(参考:MySQL 4.1 のパスワードハッシュ)ハッシュ値の長さが16バイトから41バイトに増えたことでより強固な認証システムになったと言えます。
PHP5付属のMysqlクライアントは新しい認証システムに対応してるので気にすることはありませんが、PHP4などMysql4.0以前のクライアントから接続しようとすると認証に失敗します。
互換の為 旧タイプの認証もサポートしています。各アカウントに設定されているパスワードのバイト長で新旧認証方法を使い分けるので、Mysql4.0以前のクライアントから接続したい場合は、従来の短いパスワード生成方法で設定したアカウントを新たにつくっておくと良い思います。
では、旧タイプのクライアント用に全ての管理権限を持つアカウントを作ってみます。
まずは動作確認と同様、全ての権限を持つrootアカウントでMysqlに接続します。
C:\> mysql -u root -p
Enter password: ****
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 4.1.22-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
GRANT文 を使って、パスワード MyPassword を設定した oldadmin という名前のアカウントを作成してみます。
mysql> grant all privileges on *.* to oldadmin@localhost -> identified by 'MyPassword' with grant option; Query OK, 0 rows affected (0.33 sec) mysql>
この状態でパスワードは 41バイトのハッシュ値が生成されています。現状を確かめておきましょう。
mysql> use mysql Database changed mysql> select Host, User, Password from User; +-----------+----------+-------------------------------------------+ | Host | User | Password | +-----------+----------+-------------------------------------------+ | localhost | root | *37C2F6A11B38C95BD166DCB76B653D10B0B4BCA2 | | localhost | oldadmin | *37C2F6A11B38C95BD166DCB76B653D10B0B4BCA2 | +-----------+----------+-------------------------------------------+ 2 rows in set (0.03 sec) mysql>
OLD_PASSWORD() 関数でパスワードを旧タイプのハッシュ値に設定し直します。設定後は flush privileges; しないと更新が反映されないので続けて実行します。
mysql> update User
-> set Password = OLD_PASSWORD('MyPassword')
-> where User = 'oldadmin';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql>
これでもう一度確かめてみましょう。16バイトのハッシュ値が生成されているはずです。
mysql> select Host, User, Password from User; +-----------+----------+-------------------------------------------+ | Host | User | Password | +-----------+----------+-------------------------------------------+ | localhost | root | *37C2F6A11B38C95BD166DCB76B653D10B0B4BCA2 | | localhost | oldadmin | 46ed9710390b6f6c | +-----------+----------+-------------------------------------------+ 1 row in set (0.02 sec) mysql>
これで、旧タイプのクライアントからは、アカウント oldadmin、パスワード MyPassword で接続できるようになりました。ちなみに Mysql4.1対応のクライアントでも oldadmin アカウントを使って接続できます。
Mysqlサーバのみを4.1に移行する場合など、root アカウントを旧認証システムで運用したい場面があるかもしれません。その際は上記と同じ方法で root アカウントのパスワードを設定し直せば可能です。
また、Mysqlサーバの起動オプションもしくは my.ini で old-passwords を指定すると、GRANT文 や PASSWORD()関数 が生成するハッシュ値をMysql4.0以前と同じにすることが出来ます。この場合ハッシュの生成が古い方法で行われるだけで、認証は16バイトか41バイトかで新旧が判断されるので、41バイトハッシュが設定されたアカウントで Mysql4.0以前のクライアントが接続できるようになるわけではありません。
my.ini で old-passwords を指定する場合
67| [mysqld]
68|
69| old-passwords
70|
71| # The TCP/IP Port the MySQL Server will listen on
72| port=3306
ただし、この方法では Mysql4.1で強化された認証システムが活かされていません。また、旧認証システムのクライアントは徐々に減りいずれ消えるもと考えると、old-passwords は用いずに、新旧それぞれのアカウントを作って使い分けるのがベターな選択だと思います。
Mysql4.1 のキャラクターセット(考)
Mysql4.0 と Mysql4.1 でもうひとつ大きく違うのがキャラクターセットの取り扱いです。より細かくキャラクターセットと照合順序が指定できるうえ、クライアントとサーバ間のやり取りではサーバ側でクライアントが指定するキャラクターセットに自動変換してくれるようになりました。
これだけ読むとなんとも素晴らしい仕様です。でも Mysql4.0以前なら「サーバのキャラクターセットを何にするか」だけ良くよく考えて決めれば済んでたところ、これまで以上にキャラクターセットに対する深い理解が必要になりました。この仕様のためになかなか Mysql4.1に移行する気になれかったというのが正直なところです。でも移行を決めたからには前向きに取り組んでみたいと思います。
自動変換と言っても Mysqlサーバが文字エンコーディングを自動判別し指定のキャラクターセットに変換するわけではなく、クライアントで指定するキャラクターセットとフィールドで指定するキャラクターセットを相互変換するものです。データの文字エンコーディングが指定のキャラクターセットであることを保証しているわけではないので、データのキャラクターセットが整合性を保てるよう気をつけなければならないのはMysql4.0以前とかわりありません。
キャラクターセットを指定できる所は、サーバー < データベース < テーブル < カラム(フィールド)の4箇所で、それぞれを指定することで異なるキャラクターセットを混在させて運用できるようになっています。カラムのキャラクターセットが指定されなければテーブルのキャラクターセットが用いられ、テーブルのキャラクターセットが指定されなければデータベースのキャラクターセットが用いられるといった具合に、上位のキャラクターセットがデフォルトして用いられるので、先ずはサーバーのキャラクターセットを決めることから始めます。
ここのところ utf-8 を扱う機会が圧倒的に多いので、サーバーのキャラクターセットは utf-8 にしてみました。サーバのキャラクターセットは、my.ini の [mysqld] セクションで指定します。
81| # The default character set that will be used when a new schema or table is
82| # created and no character set is defined
83| #default-character-set=latin1
84| default-character-set=utf8
85|
my.ini の編集後は、Mysqlサーバを再起動して変更を反映させます。
サーバー以外のキャラクターセットは 作成時に SQLステートメントで指定します。
キャラクターセットに utf8 を指定して、データベース mydb を作成
create database mydb default character set utf8;
キャラクターセットに utf8 を指定して、テーブル email を作成
create table email (
id int(11) unsigned not null auto_increment,
username varchar(50) NOT NULL,
address varchar(100) NOT NULL,
primary key (id)
)
type=MyISAM,
character set utf8;
カラム(フィールド)毎にキャラクターセット utf8 を指定
create table email ( id int(11) unsigned not null auto_increment, username varchar(50) character set utf8 NOT NULL, address varchar(100) character set utf8 NOT NULL, primary key (id) ) type=MyISAM;
コマンドラインクライアント(mysql.exe)のキャラクターセットも自動変換に影響するので、my.ini の [mysql] セクションでデフォルトのキャラクターセットを指定します。Windows版のコマンドラインクライアントは、Shift_JIS 以外は文字化けを起こすので、sjis 又は cp932 を指定しておくと良いと思います。どちらを選ぶかはこちらを参照。(9.11.4.1. cp932キャラクターセット なぜcp932 キャラクターセットが必要か)
55| [mysql]
56|
57| #default-character-set=latin1
58| default-character-set=cp932
59|
ここのでのキャラクターセット指定は、コマンドラインクライアントが送信するキャラクターセットをサーバに通知する為のものです。my.ini で指定しなくてもコマンドラインから set names sjis; をサーバーに送れば、これ以降は指定したキャラクターセットで動作させることが出来ます。
最後に「照合順序(collation)」について補足しておきます。
照合順序(collation)は、問合せの際の英字の大文字と小文字の区別や、並べ替えの評価順序を設定するもので、キャラクターセットに合った照合順序をデータベースやテーブル作成の際指定します。
ただ、キャラクターセットの自動変換には影響しませんし、キャラクターセット毎にデフォルトの照合順序(Default collation)を持ってるので、照合順序を明示的に指定しなくても大きな問題になることはそうないと思っています。
以上で Mysql4.1のインストールは終わり。インストール作業は簡単になりましたがまた長文になってしまいました。次は何を書こうかな。
