<<<back

MySQLについて 七

ユーザの作成と権限付与
 準備が整ったところで、新しいユーザ・アカウントを作成してみましょう。
 mysqlデータベースのuserテーブルで見たように、ユーザ・アカウントを発行するときは、そのユーザの権限も設定しておかなければなりません。
 ユーザ・アカウントを作成するには以下の二つの方法があります。
  • grantコマンドの使用
  • insertコマンドの使用
 まず、grantコマンドの使用について解説します。
 grantコマンドの構文は、

grant 権限 on データベース名.テーブル名 to ユーザ名@ホスト名 identified by 'パスワード';

です。
 例えば、

grant all privileges on *.* to mysql@localhost identified by 'kyonkyon' with grant option;

としたならば、localhostからアクセスするmysqlというユーザに対して(to mysql@localhost)、全てのデータベースの全てのテーブルについて(on *.*)、全ての権限を与え(grant all privileges)、そのパスワードをkyonkyonとする(identified by 'kyonkyon')ことを意味します。
 with grant optionというのは、他のユーザの権限を書き換えることのできる管理者ユーザを作成するときに付けるオプションです。
 ちなみに、grantコマンドを使用した際は、flush privileges;を入力しなくても設定は更新されます。

mysql> grant all privileges on *.* to mysql@localhost identified by 'kyonkyon' with grant option;[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql>

 実際にどのように更新されたのかselectコマンドで確認してみましょう。
 grantコマンドでは、password関数を使わなくともパスワードが暗号化されていることが分かります。

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

 もちろん、既にあるユーザに権限を追加する際もgrantを用います。
 以下では、web_dbデータベースのbib_tbテーブルを使用できる、なんの権限ももたないローカルホスト・ユーザ(pippo@localhost)を作成し、その後、web_db.bib_tbに対するselect, insert、update、delete権限とパスワードを付与します。

mysql> grant usage to pippo@localhost;[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql> grant insert, update, delete on web_db.bib_tb to pippo@localhost identified by 'inzaghi';[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql>

 userテーブルにおけるpippoの権限はすべてnとなっています。

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

 テーブル・レベルで権限を設定した場合は、mysqlデータベースのtable_privテーブルを確認します。
 すると、Table_privフィールドに操作可能な権限が設定されていることが分かります。

mysql> select * from tables_priv;[Enter Key]
+-----------+--------+-------+------------+----------------+
| Host      | Db     | User  | Table_name | Grantor        |
+-----------+--------+-------+------------+----------------+
| localhost | web_db | pippo | bib_tb     | root@localhost |
+-----------+--------+-------+------------+----------------+

----------------+-----------------------------+-------------+
 Timestamp      | Table_priv                  | Column_priv |
----------------+-----------------------------+-------------+
 20021027195431 | Select,Insert,Update,Delete |             |
----------------+-----------------------------+-------------+
1 row in set (0.00 sec)

 このほか、フィールド・レベル、データベース・レベル、ホスト・レベルでの権限の設定も可能です。

 さて、もう一つの方法はinsertコマンドを用いる方法です。
 この場合は直接的にuserテーブルにデータを挿入します。
 insertコマンドの構文は、

insert into [データベース].[テーブル] values('[host]', '[user]', '[password]', '[select_priv]', '[insert_priv]', '[update_priv]', '[delete_priv]', '[create_priv]', '[drop_priv]', '[reload_priv]', '[shutdown_priv]', '[process_priv]', '[file_priv]', '[grant_priv]', '[references_priv]', '[index_priv]', '[alter_priv]');

 です。
 *_privというのは、*の部分に対応したコマンドに関する権限であり、yかnの値をとります。
 例えば、どのホストからでもアクセスできるmysqlというユーザに対して、全てのデータベースの全てのテーブルについて、全ての権限を与え、そのパスワードをkyonkyonとするならば、

insert into mysql.user values('%', 'mysql', password('kyonkyon'), 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y');

と入力します。
 insertコマンドを使用した場合は、password関数とflush privileges;を入力していることに注意して下さい。

mysql> insert into mysql.user values('%', 'mysql', password('kyonkyon'), 'y','y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'y');[Enter Key]
Query OK, 1 row affected (0.00 sec)

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

mysql>

 再び、userテーブルの内容を確認すると以下のようになっています。

mysql> select * from mysql.user;[Enter Key]
+-----------+-------+------------------+-------------+-------------
| Host      | User  | Password         | Select_priv | Insert_priv 
+-----------+-------+------------------+-------------+-------------
| localhost | root  | 6c8a198c0c746914 | Y           | Y           
| %         | root  | 6c8a198c0c746914 | Y           | Y           
| localhost | mysql | 1787075c5a00b797 | Y           | Y           
| %         | mysql | 1787075c5a00b797 | Y           | Y           
| localhost | pippo | 7eaaafa0234b9764 | N           | N           
+-----------+-------+------------------+-------------+-------------
5 rows in set (0.00 sec)

ユーザの削除と権限剥奪
 逆に、ユーザの権限を剥奪したり、ユーザ・アカウントを削除したりするには、
  • revokeコマンドの使用(権限剥奪のみ)
  • deleteコマンドの使用
の二つの方法があります。
 まず、revokeコマンドの構文は、

revoke 権限 on データベース名.テーブル名 from ユーザ名@ホスト名;

です。
 ここでは、先程作成したmysql@localhostの全ての権限を剥奪します。

revoke all privileges on *.* from mysql@localhost;

 但し、revokeでは、権限の剥奪はできても、ユーザ・アカウントは残っていることにご注意ください。

mysql> revoke all privileges on *.* from mysql@localhost;[Enter Key]
Query OK, 0 rows affected (0.00 sec)

mysql> select * from mysql.user;[Enter Key]

+-----------+-------+------------------+-------------+-------------
| Host      | User  | Password         | Select_priv | Insert_priv 
+-----------+-------+------------------+-------------+-------------
| localhost | root  | 6c8a198c0c746914 | Y           | Y           
| %         | root  | 6c8a198c0c746914 | Y           | Y           
| localhost | mysql | 1787075c5a00b797 | N           | N           
| %         | mysql | 1787075c5a00b797 | Y           | Y           
| localhost | pippo | 7eaaafa0234b9764 | N           | N           
+-----------+-------+------------------+-------------+-------------
5 rows in set (0.00 sec)

 ユーザ・アカウントそのものを削除したければ、deleteコマンドを使います。
 以下では、ユーザ名がmysqlであるユーザを削除します。

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

mysql> select * from user;[Enter Key]

+-----------+-------+------------------+-------------+-------------
| Host      | User  | Password         | Select_priv | Insert_priv 
+-----------+-------+------------------+-------------+-------------
| localhost | root  | 6c8a198c0c746914 | Y           | Y           
| %         | root  | 6c8a198c0c746914 | Y           | Y           
| localhost | pippo | 7eaaafa0234b9764 | N           | N           
+-----------+-------+------------------+-------------+-------------
3 rows in set (0.00 sec)

 一方で、pippoを削除したければ、userテーブルだけではなく、table_privテーブルにおいてもアカウントを削除しなければなりません。

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

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

mysql> select * from user;[Enter Key]

+-----------+-------+------------------+-------------+-------------
| Host      | User  | Password         | Select_priv | Insert_priv 
+-----------+-------+------------------+-------------+-------------
| localhost | root  | 6c8a198c0c746914 | Y           | Y           
| %         | root  | 6c8a198c0c746914 | Y           | Y           
+-----------+-------+------------------+-------------+-------------
2 rows in set (0.00 sec)

mysql> select * from tables_priv;[Enter Key]
Empty set (0.00 sec)

mysql>

テーブルのロックとアンロック
 メンテナンス等のために、テーブル(群)を排他的に占有し、他のユーザの操作をブロックすることができます。
 基本構文は、

lock table テーブル名 write;

です。
 オプションをwriteとすれば、他のユーザは当該テーブルに対してどのような操作も行えませんが、readオプションを指定すれば、他のユーザはレコードの読み込みはできるようになります。

lock table テーブル名 read;

 一方、複数のテーブルを指定するには、

lock tables テーブル名1 オプション, テーブル名2 オプション...;

とします。
 必要な作業が終われば、unlockコマンドでロックを解除すればOKです。

unlock table テーブル名;

 複数のテーブルを一括してアンロックする場合は、やはり、

unlock tables テーブル名1, テーブル名2...;

とします。

テーブルのバックアップ
 データ保守のためにテーブルのバックアップをとるには、mysqldumpコマンドを使います。
 mysqldumpコマンドはmysqlプロンプトから抜けてから使用しなければならないことにご注意ください。
 さて、特定のテーブルのバックアップをとるには、 mysqldump --オプション データベース名 テーブル名 > ダンプファイル名

 特定のデータベースのバックアップをとるには、 mysqldump --オプション --databases データベース名 > ダンプファイル名

 全てのデータベースのバックアップをとるには、 mysqldump --オプション --all-databases > ダンプファイル名

 とします。
 以下では、web_dbデータベースのbib_tbテーブルをc:\mysql\data\web_db\dump.txtにダンプします。

c:\mysql\bin>mysqldump -u root -p web_db bib_tb > c:\mysql\data\web_db\dump.txt[Enter Key]
**********

c:\mysql\bin>

 ダンプファイルの内容はこちらです。
   一方、mysqldumpしておいたファイルを復旧するには、以下のように入力します。

mysql -u ユーザ名 -p データベース名 < ダンプファイル名

 以上で、MySQLについての解説を終わります。
 より詳しい情報を得たければ、MySQL関連書籍や、日本MySQLユーザ会MySQL 日本語 DocumentMySQL Mailing list japan.過去ログ等をご覧ください。