MySQLのインストールと管理メモ

Note.

(2012.8) Oracle が Sun Microsystems を買収し, MySQL は Oracle の製品になりました。Oracle による支配を嫌い, fork されたプロジェクトがあります。

Welcome to MariaDB! - MariaDB

better MySQL として, MariaDBも検討の余地ありです。

あるいは, PostgreSQL に移行することも考えられます。PostgreSQLについては PostgreSQLの管理

(2004.11.21作成)

(2005.5.5更新、公開) バージョンを4.1.11にした。

MySQLは、最もメジャーなオープンソースRDBMSのひとつ。非常に高速であり、v4.0からは標準SQLへの準拠度も上がってきた。

MySQLのライセンス

MySQLは、商用ライセンス / GPLのデュアルライセンスになっている。オープンソースライセンスはLGPLではないことに注意が必要。したがって、MySQLとリンクするプロプライエタリ(proprietary)なソフトウェアを開発する場合は、通常は商用ライセンスが必要になる。

インストール

現時点での一般向けバージョンは、v4.0.22とv4.1.7。v4.1系列はUnicodeのサポートが追加され、文字まわりの扱いがかなり変わっている。

ここでは、バージョン4.1系列の最新版であるv4.1.7をインストールしてみる。

ソースからインストールしてもいいが、バイナリ版のほうが面倒がない。Linux downloads > Linux (x86, glibc-2.2, static, gcc) > Standard のものを使う。

MySQLのインストールディレクトリは、バイナリ版では、決め打ちで /usr/local/mysql となっている。アーカイブを展開してから、/usr/local/mysql からリンクを張る。

/opt# tar xzvf mysql-standard-4.1.7-pc-linux-i686.tar.gz 
/opt# chown -R root:root mysql-standard-4.1.7-pc-linux-i686
/opt# ln -s /opt/mysql-standard-4.1.7-pc-linux-i686 /usr/local/mysql

データベースの内容が保存されるディレクトリを /var/lib以下へ移動しておく。

mysql-standard-4.1.11-pc-linux-gnu-i686# mkdir /var/lib/mysql
mysql-standard-4.1.11-pc-linux-gnu-i686# mv data /var/lib/mysql
mysql-standard-4.1.11-pc-linux-gnu-i686# ln -s /var/lib/mysql/data .

ディレクトリ構成は、次のようになる。

/usr
    /local
        /mysql -> /opt/mysql-standard-4.1.11-pc-linux-gnu-i686
/opt
    /mysql-standard-4.1.11-pc-linux-gnu-i686
        /data -> /var/lib/mysql/data

ソースからコンパイル、インストールする場合

この節はv4.0系列での例。

$ tar xzvf mysql-4.0.9-gamma.tar.gz 
$ cd mysql-4.0.9-gamma
$ ./configure --prefix=/usr/local/mysql --localstatedir=/var/lib/mysql
              --with-extra-charsets=latin1,sjis,ujis,latin1_de --without-isam

latin1_deは、テストを正常に実行するのに必要。

$ make

テストを実行する。

$ make test

...

 TEST                         USER   SYSTEM  ELAPSED        RESULT
------------------------------------------------------------------------
alias                         0.02     0.01     0.59       [ pass ]
alter_table                   0.02     0.04     0.22       [ pass ]
analyse                       0.02     0.02     0.12       [ pass ]

...

Master shutdown finished
Slave shutdown finished
All 165 tests were successful.

インストールする。

$ su
# make install

/etc/ld.so.confに/usr/local/mysql/lib/mysqlを追加してldconfigするか,環境変数LD_LIBRARY_PATHに/usr/local/mysql/lib/mysqlを追加する。

設定ファイルの作成

設定ファイルの雛形が support-files ディレクトリにある。いずれかを選んで、$(DATADIR)/my.cnfにコピーする。DATADIRは、バイナリ版では決め打ちで /usr/local/mysql/data ディレクトリになっている。mysqld 起動時に引数として渡す--datadirオプションに左右されない。

support-files# cp my-small.cnf ../data/my.cnf
設定ファイルの雛形
ファイル名 用途
my-small.cnf 64Mバイト以下のメモリの小規模サーバー向け
my-medium.cnf 32M〜64Mバイトのメモリを持つMySQL専用サーバーか,128Mバイトのメモリを持つサーバー向け
my-large.cnf 512Mバイト程度のメモリを持ち,MySQL専用となる機械向け
my-huge.cnf 1G〜2Gバイトのメモリを持つMySQL専用サーバー向け
my-innodb-heavy-4G.cnf 4Gバイトのメモリ、InnoDBのみ、ACID、少ない接続、大量のクエリ。

データベースで面倒なく日本語を扱えるように,デフォルトの文字コードを設定しておく。サーバ起動時にコマンドラインオプションで渡すこともできるが、ここでは my.cnf ファイルを編集する。mysqldグループに default-character-set 行を追加する。

指定できる文字コードは、share/mysql/charsets/Index.xml ファイルにある。次の例は、デフォルトの文字コードをUTF-8にする。

[mysqld]
...
default-character-set = utf8

データベースの初期化

データベースサーバーをroot権限で動かすのは,セキュリティ面から見て適当ではないので,専用のユーザーmysql:mysqlを作成しておく。

# /usr/sbin/groupadd mysql
# /usr/sbin/useradd -g mysql mysql

インストールが完了したら,/usr/local/mysql に移動して、データベースを初期化する。

/usr/local/mysql$ su
/usr/local/mysql# scripts/mysql_install_db --user=mysql

データベースサーバの起動・終了

データベースサーバ(mysqldデーモン)を起動する。

UNIX rootユーザーで次のように打つ。バイナリ版では、--userオプションを付けなくても、自動的に mysqlユーザーで実行される。

# /usr/local/mysql/bin/mysqld_safe &

mysqld がすぐに終了する場合は、何らかのエラーが発生しているので,data/ホスト名.err ファイルに出力されているエラーメッセージを確認する。

mysqldを終了させる場合は、単にkillコマンドを使う。data/ホスト名.pid ファイルは、自動的に削除される。

# kill `cat /usr/local/mysql/data/ホスト名.pid`

コンピュータの起動時に、自動的にMySQLを起動させるようにする。daemontoolsだとうまくkillできない(pidが違うから)。support-files にあるmysql.server コマンドを使うのがいい。/etc/rc.d/init.d または/etc/init.d ディレクトリにリンクを張る。さらに、rc3.dなどでそのリンクへのリンクを張る。

init.d# ln -s /usr/local/mysql/support-files/mysql.server .
rc3.d# ln -s ../init.d/mysql.server S65mysql

データベースユーザの登録

MySQL リファレンスマニュアル :: 4.4 MySQL のユーザ管理

MySQLは、OSシステムのユーザー・グループとは別に(独立して)、ユーザー(データベースユーザ)を管理している。MySQLのユーザーは、ホストとユーザ名の組み合わせで識別される。

MySQLサーバを起動して最初にすることは、MySQLスーパーユーザのパスワードを設定すること。パスワードを設定しないと,だれでもMySQLスーパーユーザに成りすますことができるので,重要。

パスワードは、ホスト名付きでも設定しておく。MySQLスーパーユーザ名は root という。UNIX OSシステムのスーパーユーザ名と同じなので、紛らわしい。

# bin/mysqladmin -u root password 'パスワード'
# bin/mysqladmin -u root -h ホスト名 password 'パスワード'

Note.

JIS X 3005によれば,認可識別子(データベースユーザ)とOS利用者との対応は,処理系依存。(4.26 権限)

ユーザを追加するには、mysqlコマンドでmysqlターミナルに入ってから、GRANT文を実行する。次の例は、すべてのデータベースにアクセスできるユーザを追加する。

mysql$ bin/mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 7 to server version: 4.1.11-standard

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> GRANT ALL PRIVILEGES ON *.* TO ユーザ名@ホスト名
    -> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;

ユーザ一覧を表示するには、データベースmysqlを選択して、userテーブルの内容を表示すればいい。

> use mysql
> select host,user from user;

また、現在どのデータベースユーザとして接続しているか確認するには、select user()すればいい。

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

MySQL Administrator

MySQLデータベースの管理は、MySQL Administrator を使うとかなり簡単になる。

Windowsだとバイナリ版をダウンロードしてきてインストールするだけでいい。Linux用のバイナリ版は、libstdc++のバージョンが違うので、そのままでは実行できない。ソースからコンパイルするには、gtkmm-2.0などが必要になる。

データベースの管理

新しいデータベース

新しいデータベースを作成し,一般ユーザーで操作できるように権限を付与する。

まず,MySQLスーパーユーザでmysql端末に入る。

$ ./mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12 to server version: 4.0.4-beta

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

新しいデータベースは、CREATE DATABASE文で作成する。

mysql> CREATE DATABASE db1;
Query OK, 1 row affected (0.01 sec)

このままではrootユーザーしかこのデータベースを使えないので,一般ユーザに権限を付与する。権限の付与(とデータベースユーザの作成)は,GRANT文で行う。

mysql> GRANT ALL PRIVILEGES ON db1.* TO ユーザ名@localhost
    -> IDENTIFIED BY 'パスワード' WITH GRANT OPTION;
Query OK, 0 rows affected (0.01 sec)

いったんmysql端末から抜け,一般ユーザーで入り直す。SHOW DATABASES文で,先ほど権限が与えられたデータベースが見える。

$ ./mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16 to server version: 4.0.4-beta

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> select user();
+----------------+
| user()         |
+----------------+
| hori@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> show databases;
+----------+
| Database |
+----------+
| db1      |
| test     |
+----------+
2 rows in set (0.00 sec)

SQL文を発行してデータベースを操作するには、まずデータベースを選択する。USE文でデータベースを選択する。

mysql> use db1;
Database changed

適当に,表を作成してみる。

mysql> CREATE TABLE t_test (
    -> val VARCHAR(100) NOT NULL);
Query OK, 0 rows affected (0.11 sec)

データベースの一覧

データベースの一覧は、show databasesで確認できる。

mysql> show databases;
+----------+
| Database |
+----------+
| test     |
+----------+
1 row in set (0.03 sec)

データベースの削除

データベースを削除するのは、drop database文。

mysql> drop database db1;
Query OK, 0 rows affected (0.00 sec)