MySQLシステムの管理

3-10. MySQLシステムの管理
2004年6月10日
大北高広
01T6010F
◆MySQLサーバー(mysqld)の起動ユーザー
/etc/rc.d/rc.localファイルに、マシン起動時にmysqldが立ち上がるよう
に設定した場合は、rootユーザーが起動したことになります。他のユー
ザーで起動したい場合には、インストール時./configureで、prefixに読み
書きのできるディレクトリを指定します。手動でmysqldを起動した場合は、
そのときのログインユーザーが起動したことになります。
◆rootのパスワード変更
最初に、MySQL起動時のパスワード設定をしましたが、このrootのパス
ワードを変更する場合は、mysqladminという管理ユーティリティを使いま
す。
シェルから次のコマンドを発行し、フルパスでmysqladmin1を指定したあ
と、 -u root に続けて-pのオプションでパスワードを追加します。
$ / path_to_mysql / bin / mysqladmin -u root -p password “新
パスワード”
Enter password : (現在のrootのパスワードを入力)
MySQL起動後にSQLコマンドを使って、MySQLのrootのパスワードを
変更することも可能です。ユーザーのパスワード管理は、MySQLの中の
mysqlというDBが行っています。その中の「user」というテーブルを変更
することで、パスワードを変更します。
mysql > use mysql;
mysql > update user set password = password(“新パスワード”)
- > where user = “root”;
このあと、いったんexitしてMySQLを起動してみてください。もし新しい
パスワードが機能せずにMySQLを起動できなければ、以下のシェルを
発行し、パスワードのテーブルを更新してください。
$ / path_to_mysql / bin / mysqladmin -u root -p reload
◆MySQLを起動できるユーザーの登録
MySQLを起動できるユーザーを新規登録します。mysqlというDBの中
のuserテーブルに対して、新しいユーザーを追加します。
mysql > use mysql;
mysql > insert into user set user = “tanaka”,
-> password = password(“12345”),host = “localhost”;
Query OK, 1 row affected(0.00 sec)
設定後の新ユーザーはMySQLを起動することが可能です。デフォルト
では、中にあるDBのうち「test」のみを使用することが可能です。
設定直後にこのユーザーでMySQLを起動できない場合は、パスワード
テーブルの更新を行ってください。
$ /path_to_mysql/bin/mysqladmin -u root -p reload
◆ユーザーのパスワード変更
現在MySQLを起動しているユーザーのパスワードを変更する場合は、
ユーザー名を指定しないでSQL文を記述します。
mysql > set password = password(‘123’);
現在MySQLを起動していない別のユーザーのパスワードを変更する場
合、set passwordのあとに「for ユーザー名」を追加します。この場合は、
userテーブルに変更を加える権限が必要です。
mysql > set password for tanaka = password(‘123’);
Query OK, 0 rows affected(0.00 sec)
もしくは、mysqlの中のuserに対して、次のupdateのコマンドを発行します。
mysql > update mysql.user set password = password(“789”)
-> where user = “tanaka”;
別のホストから接続するユーザーを設定する場合は、and host = “ホス
ト名”を追加します。
いずれの場合も確認メッセージなしに処理が終了します。設定したパス
ワードは必ず覚えておいてください。
「パスワードなし」に指定する場合は、次のように空文字を指定します。
mysql > set password = password(‘’);
◆ユーザーの権限を管理
・権限を与える:grant
新しいユーザーを追加したら、そのユーザーに対してテーブルやコマン
ドごとの使用権限を与えたり、権限を無効にしたりできます。そのために
SQLコマンドの「grant」を使います。デフォルトではrootのみ使用できます。
mysql> grant select on ADDRESS_DB.JOBLIST_T to
-> tanaka@localhost identified by “tanaka_pass”;
Query OK, 0 rows affected(0.01 sec)
次のコマンドで、設定した権限を有効にします。
mysql> flush privileges;
Query OK, 0 rows affected(0.00 sec)
そして、ユーザーtanakaがADDRESS_DBにアクセスしてもテーブルは
JOBLIST_Tしか見ることができません。
mysql > use ADDRESS_DB;
Database changed
mysql > show tables;
+-------------------------------------+
| Tables_in_ADDRESS_DB |
+-------------------------------------+
| JOBLIST_T
|
+-------------------------------------+
2 rows in set(0.00 sec)
他のテーブルを使おうとすると、エラーが返ってきます。
mysql> select * from FRIENDS_T;
ERROR 1142 : select command denied to user:
‘tanaka@localhost’ for table ‘FRIENDS_T’
複数の権限を与える場合や複数のユーザーに対して同じ権限を与える
場合は、ユーザー名をカンマで区切って記述します。
mysql >
->
->
->
grant select,insert on ADDRESS_DB.JOBLIST_T to
tanaka@localhost identified by
“tanaka_pass”,tanaka2@localhost identified by
“tanaka2_pass”;
権限を与える際、「すべてのホストに対して」SQLコマンドを発行できる
という指定は、” ”内にワイルドカード%を、ADDRESS_DBの「全部の
テーブルに対して」という場合は、次のように * を使います。
mysql> grant select on ADDRESS_DB. * to “tanaka”;
onのあとに*.*と指定すると、「すべてのDBのすべてのテーブルに対
して」の意味になる。
カラムごとの権限設定ですが、発行権限を与えるコマンドのあとに、( )
でカラム名を記述します。もしテーブルに対して発行権限のあるコマンドが
あれば、そちらが優先されます。
mysql > grant select(JOB_C) on ADDRESS_DB.JOBLIST_T to
-> tanaka3@localhost identified by “tanaka3_pass”;
Query OK, 0 rows affected(0.00 sec)
コマンド設定を反映させます。
mysql> flush privileges;
Query OK, 0 rows affected(0.00 sec)
ユーザtanaka3がADDRESS_DBのJOBLIST_Tに対して全カラムの全
レコードを表示させようとすると、カラムJOBID_Cへのselect権限がない
場合は、エラーが出ます。
mysql > select * from JOBLIST_T;
ERROR 1143: select commnad denied to user:
‘tanaka3@localhost’ for column ‘JOBID_C’ in table ‘JOBLIST_T’
そして*を使わず、JOB_Cのみを指定してselectすると、JOB_Cの全
レコードを表示させることができます。
mysql > select JOB_C from JOBLIST_T;
+-------------------------------------+
| JOB_C
|
+-------------------------------------+
| 営業販売
|
| プログラマー
|
| デザイナー
|
| インストラクター
|
| ミュージシャン
|
+-------------------------------------+
5 rows in set(0.00 sec)
指定できる権限の種類のほとんどがSQLコマンドと呼応しています。
■特別な権限
all ・・・ 「コマンドレベルの権限」「管理レベルの権限」のすべてのコマンドが
利用できる権限を与える。rootと同じ権限になる。
■コマンドレベルの権限
alter ・・・DBの持つテーブルの構造やデータ型を更新できる権限
create ・・・DBやテーブルを作成できる権限
delete ・・・テーブルの中のレコードを削除できる権限
drop ・・・DBやテーブルを削除できる権限
index ・・・テーブルのインデックスを作成・削除できる権限
insert ・・・テーブルに新しくレコードを追加できる権限
select ・・・テーブルからレコードを取り出せる権限
update ・・・テーブルのデータを更新できる権限
usage ・・・権限なしユーザーを作成する権限
■管理レベルの権限
file ・・・MySQLサーバーがどのファイルへ読み書きするかを指定する権限。
この権限を与えるとかなりセキュリティレベルが下がるので注意。
grant ・・・ユーザーに対して権限を与えられる権限
process ・・・show processlistを使って全スレッドに関する情報を見たり、プ
ロセスを切ったりすることだできる権限
reload ・・・reload,refresh,flushなどを使って、ログや管理テーブルなどを更
新したり0に戻したりする権限
shutdown ・・・MySQLサーバをシャットダウンする権限
・ユーザーの権限を無効にする:revoke
grant文で発行した権限を無効にするSQLコマンドです。grantの場合、
ユーザー名の前に指定するものはtoでしたが、revokeの場合はfromに
なります。
mysql> revoke select, insert on ADDRESS_DB.JOBLIST_T from
-> tanaka@localhost;
Query OK, 0 rows affected(0.00 sec)
次のコマンドで、設定した権限を反映させます。
mysql> flush privileges;
Query OK, 0 rows affected(0.00 sec)
◆ユーザー管理DBについて
ユーザー名や権限は、mysqlというDBが管理しています。このDB
の中にはいくつかのテーブルがあり、権限などの内容によって各テーブ
ルが使用されます。
mysql> use mysql;
Database changed
mysql> show tables;
mysql中のテーブルである、
columns_priv , db , func , host , tables_priv , user
の名前が表示されます。
・ユーザーを設定すると、userテーブルに追加されます。パスワードもこのテー
ブルで管理されています。
・hostテーブルでは、ホストごと
・dbテーブルではDBごと
・tables_privではテーブルごと
・columns_privではカラムごとに権限が管理されています。
mysql > select * from db;
+--------+----------------------+------------+-----------------+
| Host | Db
| User | Select_priv |
+--------+----------------------+------------+-----------------+
| %
| test
|
| Y
|
| %
| test\_%
|
| Y
|
| %
| ADDRESS_DB | tanaka | Y
|
+--------+----------------------+------------+-----------------+
------------------+------------------+-----------------+------------------+---------------+
Insert_priv | updata_priv | Delete_priv | Create_priv | Drop_priv |
------------------+------------------+-----------------+------------------+---------------+
Y
| Y
| Y
| Y
| Y
|
Y
| Y
| Y
| Y
| Y
|
N
| N
| N
| N
| N
|
----------------+------------------+------------------+------------------+---------------+
-----------------+------------------------+----------------+---------------+
Grant_priv | References_priv | Index_priv | Alter_priv |
-----------------+------------------------+----------------+---------------+
N
| Y
| Y
| Y
|
N
| Y
| Y
| Y
|
N
| N
| N
| N
|
-----------------+------------------------+----------------+---------------+
3 rows in set(0.00 sec)
tebles_privを見てみます。これは、「テーブルごとの権限」に関するテー
ブルです。
mysql > select * from tables_priv;
+--------------+----------------------+-------------+-------------------+
| Host
| DB
| User
| Table_name |
+--------------+----------------------+-------------+-------------------+
| localhost | ADDRESS_DB | tanaka2 | JOBLIST_T |
| localhost | ADDRESS_DB | tanaka3 | JOBLIST_T |
+--------------+-----------------------+------------+-------------------+
-----------------------+-------------------------+-------------------+-------------------+
Grantor
| Timestamp
| Table_priv | Column_priv |
-----------------------+--------------------------+------------------+-------------------+
root@localhost | 20000811104214 | Select,Insert |
|
root@localhost | 20000811100132 |
| Select
|
-----------------------+--------------------------+-------------------+-------------------+
2 rows in set(0.00 sec)
各カラムに対して設定できる権限は、select, insert, update,
referencesの4つです。
columns_privを見てみます。
mysql > select * from columns_priv;
+--------------+----------------------+-------------+-------------------+-----------------------+
| Host
| DB
| User
| Table_name | Columns_name |
+--------------+----------------------+-------------+-------------------+-----------------------+
| localhost | ADDRESS_DB | tanaka3 | JOBLIST_T | JOB_C
|
+--------------+-----------------------+------------+-------------------+-----------------------+
--------------------------+-------------------+
Timestamp
| Column_priv |
--------------------------+-------------------+
20000811100132 | Select
|
--------------------------+-------------------+
1 row in set(0.00 sec)
権限に関する詳細は、次のURLを参照してください。
http://www.softagency.co.jp/mysql/TIPS/permission.html
◆情報を見る: show
showコマンドを使って、
show index from TABLE01; ・・・TABLE01上で作成されたインデックスが表示さ
れる
show processlist; ・・・サーバーのスレッド情報を表示
show status; ・・・現在の接続状況
show variables; ・・・サーバーに関する変数とその値を表示