<<<back

MySQLについて 弐

MySQLクライアントの起動
 サーバが立ち上がったら、早速、クライアントのmysql.exeを動かして、サーバに接続します。
 コマンド・プロンプトに

mysql

と入力すると、mysqlプロンプト(mysql>)が表示されます(↓下図)。
 MySQLをインストールした段階では、anonymousユーザ(しかもroot権限を持っている)がサーバにアクセスすることを許容していますので、mysqlと入力しただけでサーバに接続できます。
C:\mysql\bin>mysql[Enter Key]
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.53-max-debug

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

 mysqlコマンドの基本構文は、

mysql -u ユーザ名 -pパスワード -h ホスト名 データベース名

です。
 パスワードは-pの直後にスペースを挿入しないで入力しなければなりません。
 ホスト名はIPアドレスを指定します。
 localhostのサーバに接続する場合は、-h(hostオプション)を省略できます。
 接続する際に、使用するデータベース名を指定することもできますが、この段階では指定しないで、後でuseコマンドでデータベースを指定することも可能です。

 仮に、MySQLサーバが立ち上がっていない場合は、以下のようなエラー・メッセージが表示されます。

C:\mysql\bin>mysql[Enter Key]
ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)

C:\mysql\bin>

 また、mysqlを終了させたい場合は、

\q

あるいは

quit

あるいは

exit

などと入力すると、元のコマンド・プロンプトに戻ります。

mysql> quit[Enter Key]
Bye

C:\mysql\bin>

生まれたてのMySQL
 さて、インストールしたばかりのMySQLの中には、デフォルトで二つのデータベースが存在しています。
 mysqlデータベースとtestデータベースです。
 testの方は空なのでどうでもいいのですが、mysqlの方にはユーザ管理等の重要な情報が入っています。
 どのようなデータベースが存在しているのかは、mysqlプロンプトから

show databases;

と入力すれば確認できます。
 ここで気を付けなくてはならないのは、mysqlのコマンドには必ず最後に;(セミコロン)をつけなくてはならないという点です。
 セミコロンがないとコマンドが終了したと解釈されず、Enterキーを入力しても延々とプロンプトが表示され続けます。

mysq> show databases;[Enter Key]
+-----------+
| Databases |
+-----------+
| mysql     |
| test      |
+-----------+
2 rows in set (0.00 sec)

 データベースの中には0〜複数のテーブルが存在していて、実際のデータはそこに格納されます。
 テーブルというのは表計算ソフトのシートのようなものであり、二次元のマトリックスです。
 mysqlデータベースが持つテーブルの情報を確認するには、

show tables from mysql;

と入力します。
 その結果、mysqlデータベースには六つのテーブルのあることが分かります。

mysql> show tables from mysql;[Enter Key]
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv    |
| db              |
| func            |
| host            |
| tables_priv     |
| user            |
+-----------------+
6 rows in set (0.00 sec)

 ここで、ユーザ情報を管理しているuserテーブルを見るには、

show fields from mysql.user;

と入力します。

show columns from mysql.user;

あるいは、 desc mysql.user;

としても同じです。
 mysql.userというのはmysqlデータベースのuserテーブルを意味します。
 ただし、show(or desc)コマンドによって表示されるのは、userテーブルのデータそのものではなく、userテーブルのデータ項目の定義だけです。
 すなわち、userテーブルには17のデータ項目(Field)があり、それぞれのデータ型(Type)、デフォルト値(Default)などが表示されています。

mysql> show fields from mysql.user;[Enter Key]
+-----------------+-----------------+------+-----+---------+-------+
| Field           | Type            | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host            | char(60) binary |      | PRI |         |       |
| User            | char(16) binary |      | PRI |         |       |
| Password        | char(16) binary |      |     |         |       |
| Select_priv     | enum('N','Y')   |      |     | N       |       |
| Insert_priv     | enum('N','Y')   |      |     | N       |       |
| Update_priv     | enum('N','Y')   |      |     | N       |       |
| Delete_priv     | enum('N','Y')   |      |     | N       |       |
| Create_priv     | enum('N','Y')   |      |     | N       |       |
| Drop_priv       | enum('N','Y')   |      |     | N       |       |
| Reload_priv     | enum('N','Y')   |      |     | N       |       |
| Shutdown_priv   | enum('N','Y')   |      |     | N       |       |
| Process_priv    | enum('N','Y')   |      |     | N       |       |
| File_priv       | enum('N','Y')   |      |     | N       |       |
| Grant_priv      | enum('N','Y')   |      |     | N       |       |
| References_priv | enum('N','Y')   |      |     | N       |       |
| Index_priv      | enum('N','Y')   |      |     | N       |       |
| Alter_priv      | enum('N','Y')   |      |     | N       |       |
+-----------------+-----------------+------+-----+---------+-------+
17 rows in set (0.00 sec)

 実際に、userテーブルのデータ内容を見るには、showコマンドではなく、selectコマンドを利用します。

 select * from mysql.user;

と入力するとデータが表示されます。
 ↓下図はInsert_priv以降のフィールドを省略してありますが、実際には17のフィールドがあります。
 既に述べたように、mysqlデータベースのuserテーブルはユーザ管理のためのテーブルです。
 Hostフィールドは、ユーザ(クライアント)がどこからアクセスしてくるのかを表しています。
 Userフィールドにはユーザ名が、Passwordフィールドにはパスワード登録されています(現在、未登録の状態です)。
 それ以降の*_privというのは全て、mysqlコマンドの操作権限を示しており、Yならば操作可能、Nならば操作不可能であることを意味します。

mysql> select * from mysql.user;[Enter Key]
+-----------+------+----------+-------------+-------------
| Host      | User | Password | Select_priv | Insert_priv 
+-----------+------+----------+-------------+-------------
| localhost | root |          | Y           | Y           
| %         | root |          | Y           | Y           
| localhost |      |          | Y           | Y           
| %         |      |          | N           | N           
+-----------+------+----------+-------------+-------------
4 rows in set (0.00 sec)

MySQLの初期設定
 ↑上図のように、インストールしたばかりのuserテーブルには四つのユーザ情報が登録されています。
 一行目はlocalhostからアクセスしてくるrootユーザ(root@localhost)であり、パスワードはなく、root権限(=全ての権限がYes)を持っています。
 二行目はどこからでもアクセスできるrootユーザであり、やはり、パスワードはなく、root権限を持っています。
 三行目はlocalhostからアクセスしてくるanonymousユーザであり、やはり、パスワードはなく、root権限を持っています。
 現在、この状態でMySQLサーバにログインしています。
 四行目はどこからでもアクセスできるanonymousユーザであり、パスワードはありませんが、権限も全くありません。

 このままではマズイので、とりあえず@rootにパスワードを設定して、Aanonymousユーザを消去しておきましょう。

set password for root@localhost=password('kintakunte');

と入力すると、loclhostのrootユーザのパスワードがkintakunteに設定されます。
 ちなみに、password( )というのは、パスワードを暗号化してくれる関数です。

mysql> set password for root@localhost=password('kintakunte');[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql>

 入力を終えたら、userテーブルにパスワードが登録されているかどうか実際に確かめてみましょう。

select host, user, password from mysql.user where user='root@localhost';

と入力します。
 このコマンドの意味は、mysqlデータベースのuserテーブルから(from mysql.use)、root@loclhostの(where user='root@localhost')、hostフィールドとuserフィールドとpasswordフィールドを検索せよ(select host, user, password)ということです。
 passwordフィールドにはkintakunteではなく、暗号化された6c8a198c0c746914が登録されています。

mysql> select host, user, password from mysql.user where user='root@localhost';[Enter Key]
+-----------+------+------------------+
| host      | user | password         |
+-----------+------+------------------+
| localhost | root | 6c8a198c0c746914 |
+-----------+------+------------------+
1 rows in set (0.00 sec)

 同様に、どこからでもアクセスできるrootユーザのパスワードも設定しておきましょう。

set password for root@'%'=password('kintakunte');

と入力します。
 この場合、ホスト名が'%'のように、シングルコーテーションで囲まれていることに注意して下さい。

mysql> set password for root@'%'=password('kintakunte');[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql>

 次に、セキュリティを脆弱にしてしまう可能性のあるanonymousユーザを消去しておきます。
 ここではdeleteコマンドを使い、

delete from mysql.user where user='';

と入力します。
 続けて、selectコマンドで確認すると、anonymousユーザは消去されていることが分かります。

mysql> delete from mysql.user where user='';[Enter Key]
Query OK, 2 rows affected (0.00 sec)

mysql> select host, user, password from mysql.user;[Enter Key]

+-----------+------+------------------+
| host      | user | password         |
+-----------+------+------------------+
| localhost | root | 6c8a198c0c746914 |
| %         | root | 6c8a198c0c746914 |
+-----------+------+------------------+
2 rows in set (0.00 sec)

mysql>

 一通り設定が終わったら、

flush privileges;

と入力して設定を更新しておきます。
 flush privilegesは権限を初期化するためのコマンドです。

mysql> flush privileges;[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql>

 そうすれば、一旦、mysqlを終了して、再びログインしようとしても、mysqlとだけ入力したのでは、ログインできなくなります。

mysql> quit[Enter Key]
Bye

C:\mysql\bin>mysql[Enter Key]
ERROR 1045: Access denied for user: 'ODBC@localhost' (Using password: NO)

C:\mysql\bin>

 mysql -u root -pと入力してEnterキーをクリックしてから、実際のパスワード(ここでは、kintakunte)を入力します。
 ↑上で述べたように、mysql -u root -p kintakunteとしても構いません。

C:\mysql\bin>mysql -u root -p[Enter Key]
Enter password: **********[Enter Key]
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 3.23.53-max-nt

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

 rootのパスワードを設定すると、mysqladminもユーザ名とパスワードを入力しなければ起動しなくなります。
 例えば、pingを飛ばす場合は、mysqladmin -u root -p pingとします。

C:\mysql\bin>mysqladmin -u root -p ping[Enter Key]
Enter password: **********[Enter Key]
mysqld is alive

C:\mysql\bin>

 このページで解説したmysqlコマンドを以下に挙げておきます。

操作内容 構文
データベースの表示 show databases;
テーブルの表示 show tables from [database];
フィールドの表示 show fields from [table]
フィールドの表示 show columns from [table]
フィールドの表示 desc [table];
パスワードの設定 set password for [user]@[host] = password('[password]');
パスワードの設定
ログオン中ユーザ
set password = password('[password]');
フィールドの検索 select [field] from [table] where [field]=[value];
レコードの削除 delete from [table] where [field]='[value]';