mysqlの初期設定(mysql4.1.14 gentoo)
1.mysql_install_db を実行する。
このコマンドが権限テーブルを作成する。インストール時にやればいいのに、と思ったけど誰でも何でも出来る状態はよくないよね。ユーザ自身で初期化しろと。
2.mysql 上の root ユーザのパスワードを設定する。
初期化直後はユーザ root にパスワードが設定されていないため、全てのローカルユーザが root として mysql に接続することができる。なのでパスワードを設定する。
$ mysqladmin -u root password new_password
の方が便利そうだけど、シェルのヒストリにパスワードが残りそうな気がする。
MySQL サーバへの接続
注意: コマンドラインでパスワードを指定するのは安全ではありません。 同じシステム内のどのユーザでも、ps auxww のようなコマンドを使用してパスワードを知ることができてしまいます。
だそうです。
$ mysql -u root mysql mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');
3.ユーザの追加
任意のユーザ名で mysql に接続できる。個々のデータベースに接続するには grant で権限を割り当てなければいけない。mysqlのユーザとunixユーザとの間に関連はない。たぶん、ユーザ名を省略してmysqlに接続したときに unixユーザ名が利用されるだけと思われ。
ただ単にユーザを追加するって機能はないようだ。
ここでは、データ更新のみ許可するユーザを追加する。
mysql> grant -> select,create temporary tables,delete,insert,lock tables,update -> on <データベース名>.* -> to <ユーザ名> identified by '<パスワード>';
ユーザ名は、username@hostnameで指定する。hostname無しの場合は、username@%と解釈される。localhostは%に含まれない。username@hostnameとusername@%が両方登録されていた場合、hostnameから接続した場合はusername@hostnameと解釈される。っていうか当たり前だ。詳細度順ってやつ?
なんていうか、だんだんmysqlが信用できなくなってきた。柔軟すぎないか?いらんよ。まー使わなきゃいいんだが。
4.セキュリティとか
4.2.ユーザ
任意のユーザ名でmysqlには接続できる。testおよびtest_%データベース以外のデータベースにはgrantで割り当てない限り接続できない。つまり、testおよびtest_%データベースには(登録されていない)任意のユーザ名で接続できる。実運用時には不要だと思うが…
- 初期化時点で、root@localhost,root@
,<空白>@localhost,<空白>@ の4ユーザが登録されている。 - root@localhost,root@
は全権限を持っている。よくわからないのが、なぜroot@ がわざわざ用意されるんでしょ?いらないはずなんだけど。 - <空白>@localhost,<空白>@
はtestおよびtest_%データベースに対する全権限を持っている。
というわけで、削除すべきなのは、
- root@
- <空白>@localhost
- <空白>@
- testデータベース
dbテーブルからtestデータベースのレコードが消せないよ…
mysql> select user,host,db from db; +------+------+---------+ | user | host | db | +------+------+---------+ | | % | test | | | % | test\_% | +------+------+---------+ 2 rows in set (0.00 sec)
mysql> grant all on test.* to ''@'%'; Query OK, 0 rows affected (0.01 sec) mysql> revoke all on test.* from ''@'%'; Query OK, 0 rows affected (0.00 sec)
testデータベースのほうの行は消せた。
drop userやっちゃうと、dbテーブルのエントリは消せないらしい。
mysql> revoke all on `test\_%`.* from ''@'%'; Query OK, 0 rows affected (0.00 sec)
test_%も消せた。'じゃなくて`らしい。バッククオートだったっけ?
5.日本語関係
my.cnfをいじるんでしょう。まだ見てませんが。
日本MySQLユーザ会/F.A.Q.
[mysqld] default-character-set = ujis # 5.0.13-rc 以上 #skip-character-set-client-handshake [mysqldump] default-character-set = ujis [mysql] default-character-set = ujis
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_40
上の件はもういいのかな?
6.データベース作成など
mysql>create database <データベース名>; Query OK, 1 row affected (0.00 sec) mysql>use <データベース名> mysql>describe <テーブル名>
その他
- "_"はデータベース名では使わないほうがよさそう。"_"ってワイルドカードなの?(GRANT および REVOKE の構文)
- テーブル型
- 1つのデータベースに異なる型のテーブルを収容することができる
- MyISAM,InnoDBなど。InnoDB=トランザクションセーフ。デフォルトはMyISAM
- テーブル作成時に指定する。(CREATE TABLE 構文)
- ALTER TABLE ステートメントを使用すれば、テーブルを別の型に変換できる
- ホスト単位やIPアドレスの範囲でリモートからのアクセスを制限する方法は無いのかな?grantでしかできない?
備忘録
- データベースに接続
$ mysql -u <ユーザ名> -p <データベース名> $ mysql -u <ユーザ名> -p mysql>use <データベース名>
- データベースのリスト表示
mysql>show databases;
- テーブルのリスト表示
mysql>use <データベース名> mysql>show tables;
- テーブル定義の表示
mysql>describe <テーブル名>;
- データベースをテキストでダンプ
$ mysqldump -u <ユーザ名> -p <データベース名>
- ユーザ削除
削除したいユーザについて、登録済みのユーザ名とホスト名の組み合わせを調べる。覚えてればいいけど。
mysql> select host,user,password from user; mysql> select host,db,user from db; mysql> select host,db from host;
全てのユーザ名とホスト名の組み合わせについて以下を実行。ホスト名をワイルドカード(%)で指定しても登録されているすべての<ユーザ名>@'<ホスト名>'が削除されるわけでなく、<ユーザ名>@'%' が削除される。
mysql> revoke all on *.* from <ユーザ名>@'<ホスト名>'; mysql> drop user <ユーザ名>@'<ホスト名>';
revoke allではGRANT権限を削除できないので、GRANT権限があるユーザを削除する場合は
mysql> revoke grant option on *.* from <ユーザ名>@'<ホスト名>';
も実行する。
データベースごとの権限を設定している場合は、以下も必要かも。
mysql> revoke all on <データベース名>.* from <ユーザ名>@'<ホスト名>';