2011年8月15日月曜日

LAMP of CakePHP on VMware:MySQL追加設定~日本語設定、DB・ユーザー作成など

さて、LAMPほぼ童貞の男(当時)がお送りする、VMware Player上のCakePHP自習環境構築シリーズ。
初稿は今年の4月、「MySQLのDB・ユーザー作成やらは追々書いていきます」などとぬかしてから早4ヶ月…ようやくここまで辿り着きましたよ。

mysql_secure_installationの実行

まずはMySQLをセキュアにするために「mysql_secure_installation」を実行します。
# mysql_secure_installation

以下設定を行うかどうか尋ねてくるので、適宜設定してください。
基本、全てYesにしておいた方が良いでしょう。
  • rootユーザーのパスワード設定
  • 匿名ユーザーの削除
  • リモートからのrootユーザーログイン禁止設定
  • testデータベースの削除
  • 権限テーブルのリロード ※ここまでの権限に関する設定の適用

文字コード設定

我らが日本語を使用するために、DBの文字コードをUTF-8に設定。
/etc/my.cnfを開き、以下設定を追加。
[mysqld]
# MySQLサーバー用の文字コード設定
character-set-server=utf8

[client]
# クライアント用の文字コード設定
default-character-set=utf8

設定済んだら再起動。
# /etc/init.d/mysqld restart

MySQLにコマンドラインから接続

rootユーザーで接続する場合は以下コマンド。
「-u」オプションでユーザーを指定します。
「-p」オプションはパスワードを設定している場合に必要。よってパスワード未設定の場合は不要ですが、パスワードは設定しておくべきです。特にrootなら尚更。
$ mysql -u root -p
Enter password:
Welcome…
…
mysql>

ログイン済んだら上記のように「mysql>」とのプロンプトが表示されます。
ここで先程の文字コード設定がちゃんと適用されているか確認してみましょう。
以下コマンドを実行してみてください。
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show variables like 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

上記のような実行結果が得られればOKです。

ユーザー作成

  • ユーザー名:user
  • パスワード:userpass
  • 接続元ホスト:localhost
上記のユーザーを作成するには以下のコマンドを実行。
mysql> CREATE USER 'user'@'localhost' IDENTIFIED BY 'userpass';

ここでユーザー情報を確認してみましょう。
ユーザー情報はmysqlデータベースのuserテーブルに格納されています。
mysql > use mysql;
mysql > SELECT user, password, host FROM user;
+------+-------------------------------------------+--------------+
| user | password                                  | host         |
+------+-------------------------------------------+--------------+
| root | *…| localhost    |
| root | *… | 127.0.0.1    |
| user | *… | localhost    |
+------+-------------------------------------------+--------------+
補足1:ユーザーの識別単位
MySQLのユーザーは「ユーザー名+接続元ホスト」の単位がキーです。
つまり、「'user'@'localhost'」と「'user'@'192.168.1.1'」は別人です。
試しにホスト違いの同名ユーザーを作成してからuserテーブルを覗いてみてください。
補足2:匿名ユーザーが残っている場合はホスト名を必ず指定すること
CREATE USER文はホスト名の省略が可能。
mysql> CREATE USER 'test' IDENTIFIED BY 'testpass';

この場合、ホストには「%」(全てのホストから接続可能)が設定される。
この時、もし匿名ユーザー(userテーブルのuser列が空白)が存在する場合、ユーザーの照合順序の関係で、testユーザーでアクセスしても匿名ユーザーとして扱われてしまいます。よって、認証時のパスワードはtestユーザーのものではなく、匿名ユーザーのものを使用しないといけません。
この事知らないと、「何で認証通らないんだ!?」と不毛な時間を浪費することになりますので、注意してください。ていうかそもそも匿名ユーザーなんて残しておくべきではないので、前述のmysql_secure_installationで葬ってあげましょう。

※参考
公式マニュアル:接続確認

データベース作成

文法の詳細はここでは割愛。日本語環境のDBなら以下の設定が一般的です。
mysql> CREATE DATABASE sampledb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

作ったDBは以下で確認できます。
mysql> show databases;
テーブル作成
ここも文法の詳細は割愛。日本語文字列扱う場合の一般的な書き方。
ちなみにテーブル定義はCakePHPの規約に準じたものです。
mysql> use sample;
mysql> CREATE TABLE sample_tables (
->  id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
->  note TEXT NOT NULL,
->  created DATETIME DEFAULT NULL,
->  modified DATETIME DEFAULT NULL
-> )
-> engine=innodb,
-> charset=utf8,
-> collate=utf8_general_ci
-> ;

作ったテーブルは以下で確認できます。
mysql> show tables;
mysql> show columns from sample_tables;

ユーザーに権限付与

ユーザーを作成しただけでは、データベースやテーブルに対する操作は出来ません。適切に権限を設定する必要があります。
権限付与にはGRANT文を使用。文法詳細は割愛。
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON sampledb.* TO 'user'@'localhost';
mysql> FLUSH PRIVILEGES;
権限を削除するには
REVOKE~FROM文を使用。
mysql> REVOKE SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON sampledb.* FROM 'user'@'localhost';
mysql> FLUSH PRIVILEGES;

関連エントリ

0 件のコメント: