備忘録的プログラミングリファレンス

データベースの管理(作成、削除)

 データベースとは、実際にデータを収める複数のテーブルやビュー,トリガといったスクリプトを統括し管理するためのものです。

 ここでは MySQL データベースの管理における、データベースの作成、削除について解説します。 データベースの管理は、mysql にログインしてから SQL のクエリーで行います。

データベースを管理する上での注意点

ユーザーについて

 データベースの作成はスーパーユーザーもしくはデータベースを作成することが許可されたユーザーであることが必要です。
 Ubuntu で MySQL を標準インストールするとスーパーユーザーはrootです。ここでは話を簡単にするためにユーザーはrootとして解説します。

 もしもサーバーとして運用するためなら、まずは mysql_secure_installation によってセキュリティー設定をおこないます。さらに、スーパーユーザー、ユーザーの追加を検討した方がよいでしょう。
 データベースの操作、特にデーターの追加、更新、削除といった操作を root のような一般的によく知られたスーパーユーザーで行えるようにしておくのはセキュリティー上好ましくありません。
 外部からデータベースに接続できるのが一般的に知られたスーパーユーザーにしておくと、ログインできた場合にデータベースのすべてが改変できるためです。

 データベースの作成やデータ操作は別名のユーザーまたはローカル接続のみから行えるようにしておいた方がよいでしょう。

データベースの一覧

 MySQL における既に作成されたのデーターベースの確認方法です。

 mysql にログイン後に SHOW databases; を実行します。

$ sudo mysql
...
mysql> SHOW databases;
...
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
...

 information_schema は全てのデータベースを管理するためのメタデータを保持しているデータベースです。MySQL サーバーが管理しています。

 performance_schema はクエリやトランザクションの実行によるログが記録されるデータベースです。

データベースの作成

 新規にデータベースを作成する方法です。データベースの作成はスーパーユーザーまたはデータベースの作成権限をもつユーザーでなければなりません。
 以下はスーパーユーザーrootによるデータベースの作成例です。

 mysql にログインまたは SQL コマンドが使える環境で CREATE DATABASE クエリーを実行します。

$ sudo mysql
...
# CREATE DATABASE dbname;

 この場合、root のデータベースとして作成されます。

オーナーを指定したデータベース作成

 任意のユーザーを指定してデータベースを作成することもできます。
 方法としては、データベースを作成するときに任意のユーザーをオーナーとして設定します。普段はこのオーナーユーザーでデータベースと接続します。
 ここでオーナーにするユーザーは事前に追加しておかなければなりません。

オーナーを指定してデータベース作成
mysql> CREATE DATABASE dbname OWNER rolename;

 作成が成功しても何の応答もないので、上記の「データベースの一覧」で作成状況を確認してください。

 スーパーユーザーだけがデータベースを操作できることは危険ですので、他のユーザーでデータベースが操作できるようにした方がよいでしょう。

 rolenameはロール名です。データベースではユーザーは正確にはロールとして扱います。ロールはデータベースの操作権限をもったユーザーのことです。
 特に、API やネットワークを通したデータベースへの接続認証はロールで管理します。ユーザー認証が必要な場面ではロールとして管理されていることを憶えておいたほうがよいでしょう。
 ユーザー、ロールについて詳しくはユーザー(ロール)管理ページを参照してください。

データベースにログインユーザを登録

 データベースに任意のログインユーザーを新規登録することができます。

psqlコマンドプロンプト

psql my_database
...
foodatabase=# create role foo_usr with login;
CREATE ROLE

 この例では、ユーザfoo_usrがmy_databaseにアクセスできるようになります。 詳しくはロール(ユーザー)の追加を参照してください。

データベースに接続

 作成したデータベースにテーブルやビューを作成したりデータを編集するためには、データベースを指定し接続しなければなりません。
 データベースに接続する方法には、mysql コマンドでデータベースを指定する、mysql コマンドプロンプトで USE コマンドを実行する方法があります。

 mysql コマンドでは -p オプションでデータベースを指定します

mysql コマンドでデータベース指定
$ mysql -u username -p db_name
...
mysql>

 -u オプションは mysql にログインするユーザーの指定です。

現在使用中のデータベース

 現在接続中のデータベースを確認するには SELECT クエリーで databse() 関数を使用します。

現在使用中のデータベースの確認
mysql> SELECT databse();

 もしも以下のように database() カラムの内容が NULL の場合は使用中のデータベースがないことを示しています。

+------------+
| database() |
+------------+
| NULL       |
+------------+
...

 データベースを切り替えるには以下のような use クエリーを実行します。

データベース切り替え

 mysql にログインした状態でデータベースを切り替えるには USE コマンドを使用します。

データベースの切り替え
mysql> use other_db;
Database changed

 SELECT databse() を実行して以下のようにデータベースが表示されたらデータベースの切り替えができています。

mysql> show tables;

+------------+
| database() |
+------------+
| other_db   |
+------------+
...

詳細なデータベースの確認

 現在使用できるデータベースについて詳細なデータを確認するには、SHOW PROCESSLIST クエリーを実行します。

mysql> SHOW PROCESSLIST;

+----+-----------------+-----------+------+---------+------+------------------------+------------------+
| Id | User            | Host      | db   | Command | Time | State                  | Info             |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
|  5 | event_scheduler | localhost | NULL | Daemon  | 1357 | Waiting on empty queue | NULL             |
|  8 | root            | localhost | NULL | Query   |    0 | init                   | SHOW PROCESSLIST |
+----+-----------------+-----------+------+---------+------+------------------------+------------------+
...

 db の項目をみてみると NULL と表示されています。現在データベースがないことが分かります。

データベースの削除

 データベースを削除するには、データベースの作成権限をもつユーザまたはデータベースオーナーで、DROP クエリーを実行します。

データベース削除の構文
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name

 例えば db_name データベースを削除するには以下のようなクエリーを実行します。

データベース削除 1
mysql> DROP db_name

 指定データベースがあるかを確認するには以下のようにします。

データベース削除 2
mysql> DROP IF EXISTS db_name;

 指定したデータベースがない場合はエラーが出て終了するための配慮です。

その他

データベースのディレクトリ初期化

 データベースのディレクトリ初期化は、データベースの領域となるディレクトリを指定するものです。この例では、デフォルト(環境変数PGDATA)のディレクトリに作成します。

シェルコマンド

$ initdb

 ディレクトリ指定をするには-Dオプションを用います。