MySQL (frozen)

こちらでは主に MySQL について書くが、RDS へも相互リンク。

出力いろいろ

DB 固有であり、最低限必要な流儀は何か? スキーマ(スキータセット?)や「DB」などの名前空間分離、ユーザの作成・削除、権限の付与・剥奪。

名前空間

「CREATE SCHEMA は CREATE DATABASE の同義語です」か。違和感があると思ったら、MySQL では権限があれば隣の「データベース(実態はスキーマ)」の読み書きができるのね。 ∥ CREATE DATABASE http://dev.mysql.com/doc/refman/5.1/ja/create-database.html

PostgreSQL だと、「より一般的な以下の構文「database.schema.table」を使用することもできますが、現在ではこの構文は形式上標準SQLに準拠するためにのみ存在しています。 記述されるデータベース名は、接続しているデータベースと同じ名前でなければなりません」というわけで、PostgreSQL は、「データベース(ダミー)」.「スキーマ(大抵は "public" だが)」.「オブジェクト」を用いるが、MySQL では、「スキーマ(実際に指定する)」.「オブジェクト」の 2 段階しかない。PostgreSQL では DB クラスタ内の「データベース」単位で切り分けるので隣を読むことはできないのだが、MySQL では「データベース」という切り分けはないので、読み取り権限があれば、隣のスキーマ内のオブジェクトは読めてしまう。 ∥ PostgreSQL 文書 5.7 スキーマ

「データベース」は完全な分離なので、権限いかんに関わらず、お互いに読み書きはできない。「スキーマ」は名前空間の分離でしかないので、権限さえあれば、full qualified ならば読み書きができる。

権限

権限について。

実体

GRANT ON TO, SHOW GRANTS FOR, REVOKE ON FROM などで管理するが、実体は以下の 5 テーブルに格納されている。

> select host, user from user; # 特定ホスト&特定ユーザ → 不特定 DB への権限と、パスワード
> select host, db from mysql.host; # 特定ホスト&不特定ユーザ → DB へのアクセス権限
> select host, user, db from mysql.db; # 特定ホスト&特定ユーザ → DB へのアクセス権限
> select host, user, db, table_name from mysql.tables_priv; # 特定ホスト&特定ユーザ → DB 内のテーブルへのアクセス権限
> select host, db, user, table_name, column_name from mysql.columns_priv; # 特定ホスト&特定ユーザ → DB 内のテーブル内カラムへのアクセス権限

"%" が使えるのだから、1 テーブルにできそうなものだが、歴史的な経緯でこうなったか? なお、これらを操作するラッパーというかユーティリティが "GRANT", "REVOKE", "SET PASSWORD FOR" であり、これらを利用する限り、"FLUSH PRIVILEGES" は不要。

以下のようなパターンが簡単かつよくあるか:

> GRANT ALL PRIVILEGES ON foodb.* TO foouser@'%' IDENTIFIED BY 'foopass';  # あらゆるホスト指定での特定 DB へのアクセスには全権を与える。明示的な "CREATE USER" は無くても良い
> REVOKE ALL PRIVILEGES ON *.* FROM foouser@'%'; # グローバルにはアクセスさせない
> SHOW GRANTS FOR foouser@'%'; # 確認
> SET PASSWORD FOR foouser@'%' = PASSWORD('barpass'); # パスワードの変更。

> DROP USER foouser@'%'; # 全消し。ここでも FLUSH PRIVILEGES は不要

"USAGE" 権限については下記:

手順

root での接続:

$ mysql -u root -p

> create database foodb;
> grant all privileges on *.* to foouser@localhost identified by 'foodb';
> exit

データベース一覧:
> show databases;

データベース移動:
> use foodb;

ダンプ

$ mysqldump -u root -p --lock-all-tables --all-databases > foo.sql

そのまま書きもどせば、いったん drop してくれるので、元どおり。
Subpages (1): Tuning (frozen)
Comments