MySQL について

MySQL は RDBMS ( リレーショナルデータベースを管理、運用するためのシステム ) の実装のひとつで、最近では LAMP ( Linux + Apache + MySQL + PHP ) と言われる程有名なオープンソースソフトウェアのひとつです。この MySQL は WordPress や XOOPS を導入する際に必要になります。

インストール

まずは早速インストールしてみましょう。

% sudo portinstall databases/mysql50-server

Remember to run mysql_upgrade (with the optional --datadir=<dbdir> flag)
the first time you start the MySQL server after an upgrade from an
earlier version.

データベースの初期化

インストールが終わったらデータベースの初期化を行います。
この作業を行わないと MySQL が起動できないので注意しましょう。

% sudo /usr/local/bin/mysql_install_db

Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/local/bin/mysqladmin -u root password 'new-password'
/usr/local/bin/mysqladmin -u root -h server.example.com password 'new-password'
See the manual for more instructions.
You can start the MySQL daemon with:
cd /usr/local ; /usr/local/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/local/bin/mysqlbug script!

The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com

初期化が終わったらデータベースディレクトリを MySQL を実行するユーザにします。
通常でしたら mysql:mysql になります。

% sudo chown -R mysql:mysql /var/db/mysql

設定ファイルのコピー

データベースの初期化が終わったらデフォルトの設定ファイルをコピーします。
デフォルトの設定ファイルは /usr/local/share/mysql 以下にあります。
また、このディレクトリにはインストール時に付属しているファイル等も格納されています。

デフォルトの設定ファイルの種類

デフォルトの設定ファイルはいくつかあり、サーバのメモリに応じて変わります。

| 設定ファイル | メモリ搭載量 |
| my-small.cnf | 64M 以下 |
| my-medium.cnf | 128M |
| my-large.cnf | 512M |
| my-huge.cnf | 1G-2G |
| my-innodb-heavy-4G.cnf | 4G ( InnoDB で動かす場合 ) |

搭載メモリ容量を調べる

ともあれ、まずはサーバのメモリ搭載量を調べてみましょう。

% grep memory /var/run/dmesg.boot

real memory  = 3758030848 (3583 MB)
avail memory = 3682603008 (3512 MB)
pci0: <memory, RAM> at device 0.0 (no driver attached)

本来ならこのコマンドを実行したサーバのメモリ搭載量は 4GB なのですが、 32bit OS はメモリ認識限界が 4GB なので若干少なく表示されています。

設定ファイルのコピー

メモリ搭載量は 4GB ですが、他に動かすソフトウェアの事を考えて、 my-huge.cnf をコピーします。

% sudo cp /usr/local/share/mysql/my-huge.cnf /etc/my.cnf
% sudo chmod 644 /etc/my.cnf

レプリケーションについて

MySQL はデータベースのレプリケーションという機能があります。
これはデータベースの内容をバイナリ差分として定期的に書き出し、ダンプ・リストアを容易にできます。
この機能はデフォルトで有効になっており、 /var/db/mysql 以下に mysql-bin.* として保存されます。

これは大変便利な機能なので、大抵の方は導入されていると思いますが、このバイナリログは通常ではローテーションされないので、放置しているとストレージ容量がいっぱいになり、機能が停止してしまいます。
このバイナリログをローテーションするには expire_logs_days を設定します。

% sudo /etc/my.cnf

expire_logs_days = 7

上記の例では七日過ぎたら古いものから順に削除する、という設定になります。

バイナリログを無効にするには

レプリケーションを使う場合、バイナリログはとても重要になりますが、例えばサーバが一台しかない場合などではバイナリログは単にストレージを圧迫するだけのものになります。
バイナリログを無効にするには log-bin をコメントアウトします。

% sudo vi /etc/my.cnf

#log-bin=mysql-bin

自動起動の設定

FreeBSD 起動時に MySQL が自動的に立ち上がるように /etc/rc.conf を編集します。

% sudo vi /etc/rc.conf

mysql_enable="YES"

また、 jail 環境下では lo ( ループバックインターフェース ) が使用出来ないので、 jail に割り当てた IP アドレスを指定してあげる必要があります。

mysql_args="--bind-address=192.168.1.3"

MySQL の起動

上記までの手順で問題なければ MySQL を起動します。

% sudo /usr/local/etc/rc.d/mysql-server start

管理者パスワードの設定

データベース初期化後の管理者パスワードは設定されていないので、管理者パスワードを設定しましょう。

% sudo mysqladmin -u root password 'PASSWORD'

コマンドの履歴が残るのはちょっと・・・という方は一度 MySQL にログインしてからパスワードを変更してください。

% mysql -u root
mysql> SELECT User, Host FROM mysql.user;
+------+-----------+
| User | Host      |
+------+-----------+
| root | 127.0.0.1 |
|      | db        |
| root | db        |
|      | localhost |
| root | localhost |
+------+-----------+
mysql> SET PASSWORD FOR root@localhost = password('PASSWORD');

次回ログイン時からは -p オプションをつけることによってログインできるようになります。

% mysql -u root -p

不要なユーザの削除

上記のパスワードを設定する際に、 MySQL にログインしてパスワードを変更された方は root アカウントがいくつもあったり、 User の欄が空白のアカウントがいくつかあったりと、違和感を覚えたかと思います。
これは接続元によってそれぞれ使われるアカウントが変わるので、当然と言えば当然なのですが、セキュリティ上好ましくありません。
ここではその不要ユーザの削除の仕方を説明したいと思います。

管理者アカウントをひとつにする

まずは普通に MySQL にログインします。

% mysql -u root -p
mysql>

次にユーザアカウントの状況を確認します。

mysql> SELECT User, Host FROM mysql.user;
+------+-----------+
| User | Host      |
+------+-----------+
| root | 127.0.0.1 |
|      | db        |
| root | db        |
|      | localhost |
| root | localhost |
+------+-----------+

この場合では root アカウントが三つ、無名 ( 匿名 ) アカウントが二つとなっています。
この root アカウントの localhost 以外 を削除してみましょう。

mysql> DELETE FROM mysql.user WHERE USER LIKE 'root'
    -> AND HOST LIKE 'db';
mysql> DELETE FROM mysql.user WHERE USER LIKE 'root'
    -> AND HOST LIKE '127.0.0.1';

次にユーザ情報をテーブルと同期させます。

mysql> FLUSH PRIVILEGES;

最後にテーブル状況を確認してみましょう。

mysql> SELECT User, Host FROM mysql.user;
+------+-------------+
| User | Host        |
+------+-------------+
|      | db          |
|      | localhost   |
| root | localhost   |
+------+-------------+

無名 ( 匿名 ) ユーザの削除

デフォルトではホストごとに無名 ( 匿名 ) ユーザが登録されています。
与えられている権限も最小なので、問題ないのですが、やはりセキュリティを考えて、削除してみることにしましょう。

mysql> DELETE FROM mysql.user WHERE USER LIKE '';
mysql> FLUSH PRIVILEGES;
mysql> SELECT User, Host FROM mysql.user;
+------+-------------+
| User | Host        |
+------+-------------+
| root | localhost   |
+------+-------------+

リンク

MySQLのレプリケーションの設定
MySQLのバイナリログを自動削除する設定