最終更新:2008/3/1

MySQLサーバ(データベース)のインストールと設定

現在利用できるバージョンは 4.1系, 5.0系, 5.1系があります。 日本語の問題がいろいろあるのでできれば最新をおすすめしますが、 どうしても過去のアプリケーションを継承しなければいけない場合は 特定バージョンにした方がよいかもしれません。 ここでは5.1系の最新版である 5.1.23 を導入します。

導入のしかたですが、依存関係で入れようとすると、 自分の意図しないバージョンが入る事があります。 (これはMySQLに限ったことではないのですが) もしも既に違うバージョンが入ってしまっている場合は、 pkg_delete で予め削除しておきます。

クライアントとサーバの二個のパッケージに分かれているので、 同じバージョンの両方をインストールします。 いくつかオプションが用意されているのでそれを指定します。 私は以下の指定で作成してみました。 デフォルトの文字コードを無変換、利用可能な文字コードをすべて使う、SSL機能有効、 コンパイラの最適化オプションあり(作成にメモリと時間が多少かかる)

# cd /usr/ports/databases/mysql51-client
# make WITH_CHARSET=binary WITH_XCHARSET=all WITH_OPENSSL=yes BUILD_OPTIMIZED=yes
# make install
# cd /usr/ports/databases/mysql51-server
# make WITH_CHARSET=binary WITH_XCHARSET=all WITH_OPENSSL=yes BUILD_OPTIMIZED=yes
# make install

後々の為に pkgtools.conf を設定する場合はこんな感じに。

/usr/local/etc/pkgtools.conf
  MAKE_ARGS = {
     'databases/mysql51-*' => [
         'WITH_CHARSET=binary',
         'WITH_XCHARSET=all',
         'WITH_OPENSSL=yes',
         'BUILD_OPTIMIZED=yes',
     ],
    .
    .
    .
  }
新規インストール
# portinstall databases/mysql51-client
# portinstall databases/mysql51-server
再インストール
# portupgrade -f databases/mysql51-client
# portupgrade -f databases/mysql51-server
バージョンアップ
# portupgrade databases/mysql51-client
# portupgrade databases/mysql51-server

MySQL の起動と終了

起動スクリプトは /usr/local/etc/rc.d/mysql-server になります。 rc.conf にスクリプトを起動するように追加します。

/etc/rc.conf
mysql_enable="YES"

デフォルトでは /var/db/mysql にデータベースファイルが作成されます。 もし他の場所にしたい場合は rc.conf に以下のような設定を追加します。 このディレクトリが起動時になければパーミッション 700、オーナー mysqlで作成されます。

mysql_dbdir="/path/to/mysql"

mysqlの設定ファイルの雛形をコピーしておきます。 (より大規模なシステムなら large や huge に)

# cp /usr/local/share/mysql/my-medium.cnf /usr/local/etc/my.cnf
# chmod 644 /usr/local/etc/my.cnf

以下の起動スクリプトで制御できます。

# /usr/local/etc/rc.d/mysql-server start ←デーモンを起動します
# /usr/local/etc/rc.d/mysql-server restart ←デーモンを再起動します
# /usr/local/etc/rc.d/mysql-server stop ←デーモンを停止します

MySQL の設定

起動できたら、rootユーザのパスワードを設定します。 初期状態ではパスワードなしになっています。 ここでは root@localhost の設定を変更しておきます。

# mysqladmin -u root -h localhost password 'XXXXXX' ←XXXXXXに半角でパスワードを書きます。

先ほどコピーしたファイルを編集します。 グループ毎に設定するようになっているので、 普段利用すると思われる漢字コードを指定しておきます。 おそらく日本語だと ujis か utf8 が多いかと思いますが。 EUC-JPの場合は ujis を、UTF8の場合は utf8 を指定します。 コード変換を行わない binary というものもあります。

/usr/local/etc/my.cnf
[client] ←クライアントライブラリを使った標準設定(アプリ側で読み込みが必要)
default-character-set = ujis
 .
 .

[mysqld] ←サーバの設定
character-set-server = ujis
 .
 .

[mysqldump] ←mysqldumpコマンドの設定
default-character-set = ujis
 .
 .

[mysql] ←mysqlコマンドの設定
default-character-set = ujis
 .
 .

ここでの指定はあくまでデフォルト値であり、 もちろんアプリ側で明示して指定すればこれ以外も使えます。 データベース、テーブル、カラム作成時に指定すれば任意の文字コードで操作できます。

しかしながら、文字コードが混在するのは扱いにくいので、 特に理由がなければ文字コードを統一して使うことをお勧めします。 もしもサーバとクライアントの文字コードが一致しない場合で、 かつどちらかbinary指定がない場合は、文字コード変換が発生します。

準備ができたら再起動します。

# /usr/local/etc/rc.d/mysql-server restart

接続を確認してみます。確認は mysql コマンドで行います。 このコマンドは指定を省略すると現在のログインユーザ名でlocalhostに接続を試みます。 (su で rootになっている場合は root@localhost として)

# mysql -p
Enter password: ←mysqladminで指定したパスワードを入力します。
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.23-rc FreeBSD port: mysql-server-5.1.23

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

mysql>

ここで、「mysql>」というプロンプトになったらMySQLに接続できています。 ここから各種SQLコマンドを入力することでデータベースを操作できます。 インストール直後は root@localhost, root@ホスト名, root@127.0.0.1 の3個のユーザと、 localhostとホスト名の2個の匿名ユーザ、 管理領域の他にtestという空のデータベースが入っています。

@localhostUNIXドメインソケット経由の接続(サーバ稼動マシンのみの接続)
@ホスト名IPアドレスを指定したTCP接続(リモート接続も可能)
@127.0.0.1ループバックを使ったTCP接続
TCP接続の場合は /etc/hosts.allow で mysqld を指定するとIPアドレス単位のアクセス制御が可能です。
また、SSLを利用して盗聴を避けたりクライアント認証をする事もできます。

※実は最後の127.0.0.1を使った接続は利用したことがないです。
-h 127.0.0.1 を指定してTCP要求しても認証はlocalhostになってしまう。
↓コマンドの利用例
mysql> SHOW DATABASES; ←データベース一覧を表示する
mysql> USE test; ←データベース test を選択する(以後の操作対象になる)
mysql> SHOW TABLES; ←テーブル一覧を表示する
↓長いコマンドの利用例(;が現れるまで複数行に渡り入力できます。)
※これはEUC-JPのテーブルを作成する場合の例です
mysql> CREATE TABLE mytable (id INT AUTO_INCREMENT, name VARCHAR(255),
    -> message VARCHAR(255), PRIMARY KEY(id)) DEFAULT CHARSET=ujis;
Query OK, 0 rows affected (0.05 sec)
↓同じような入力は履歴と行編集機能で行えます。(カーソルキー上下、BSキー等)
mysql> INSERT INTO mytable (name, message) VALUES ('青山','これはテスト1です');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO mytable (name, message) VALUES ('青山','これはテスト2です');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO mytable (name, message) VALUES ('青山','これはテスト3です');
Query OK, 1 row affected (0.01 sec)

mysql> SELECT id, name, message FROM mytable;
+----+------+-------------------+
| id | name | message           |
+----+------+-------------------+
|  1 | 青山 | これはテスト1です |
|  2 | 青山 | これはテスト2です |
|  3 | 青山 | これはテスト3です |
+----+------+-------------------+
3 rows in set (0.00 sec)
※mysqlコマンドではUTF8の表示カラム計算がずれます^^;
(格納データが破損しているわけではない)

mysql> DELETE FROM mytable WHERE id=2;
Query OK, 1 row affected (0.00 sec)

mysql> UPDATE mytable SET message='変更です' WHERE id=3;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT id, name, message FROM mytable;
+----+------+-------------------+
| id | name | message           |
+----+------+-------------------+
|  1 | 青山 | これはテスト1です |
|  3 | 青山 | 変更です          |
+----+------+-------------------+
2 rows in set (0.01 sec)

mysql> quit ←サーバとの接続を終了する
Bye

※テーブル名やカラム名などにも日本語は使えますけど、 個人的にはあまり好きではないです。 ついでにシフトJISと呼ばれる類のコードも2バイト目のバックスラッシュを 常に考慮しないとアプリ側の文字化け&バグの元なのであまりおすすめしません。


接続ユーザの作成・削除・パスワード変更

これらは手動でやると慣れない人にはかなり大変なので、 細かくは phpMyAdmin を導入してそちらで行います。 phpMyAdmin の実行にはWebサーバとPHPが必要になります。 MySQLのSSL機能を利用した場合はリモート接続を暗号化できますので、 MySQLサーバと管理用の phpMyAdmin は同じマシンでなくとも利用可能です。

ここでは匿名ユーザなど root@localhost 以外を削除しておきます。 mysqlコマンドで接続した後に以下のコマンドを実行します。

DELETE FROM mysql.user WHERE user!='root' OR host!='localhost';
FLUSH PRIVILEGES; ←権限テーブルの再読み込み

以下の例では、ユーザ名は aoyama、パスワードは zzzzzz として作成。

権限の付与も行えるユーザ(初期状態のrootと同じ)
GRANT ALL PRIVILEGES ON *.* TO aoyama@localhost IDENTIFIED BY 'zzzzzz' WITH GRANT OPTION;
全権限のあるユーザ
GRANT ALL PRIVILEGES ON *.* TO aoyama@localhost IDENTIFIED BY 'zzzzzz';
sample データベースに全権限のあるユーザ
GRANT ALL PRIVILEGES ON sample.* TO aoyama@localhost IDENTIFIED BY 'zzzzzz';
与えた権限を削除
REVOKE ALL PRIVILEGES ON *.* FROM aoyama@localhost;
REVOKE ALL PRIVILEGES ON sample.* FROM aoyama@localhost;
ユーザを削除
DROP USER aoyama@localhost;
パスワード変更(自分自身の場合は "FOR aoyama@localhost" の部分を省略)
SET PASSWORD FOR aoyama@localhost = PASSWORD('yyyyyy'); ←yyyyyyに新しいパスワード

データベースのバックアップとリストア

基本的な操作は標準添付のコマンドで行えます。 mysqldump を使ってデータベースのバックアップ、 mysql コマンドでリストアをする事ができます。

すべてのデータベース(ユーザ情報や権限も含む)を all.sql ファイルに保存
# mysqldump -p --lock-all-tables --flush-logs --all-databases > all.sql
test データベースを test.sql ファイルに保存
# mysqldump -p --lock-all-tables test > test.sql

リストアをする場合は、 --skip-networking 付きで MySQLサーバを立ち上げて、 ネットワークから参照できないように起動して作業を行います。

test データベースを test.sql から戻す
# mysql -p test < test.sql
すべてのデータベースを all.sql から戻す
# mysql -p < all.sql

フルバックアップ以後のデータに関してはバイナリログ(更新系ログ)を利用します。 mysqldump --flush-logs を実行した時にバイナリログが切り替わります。 (その他 FLUSH LOGS を実行したりMySQLサーバを再起動した時) そこで、切り替わった後のログをフルバックアップに対して適用します。

バイナリログは my.cnf の中で log-bin として設定されています。 (標準の場所は /var/db/mysql/mysql-bin.xxxxxx) 現在の配布ファイルだと my-small.cnf 以外は設定されているようです。 もしもまだ設定がないようであれば今後の為に書き加えて再起動しておきます。

バイナリログ(環境により番号等は違う)をSQL文に展開してmysqlコマンドで適用する
# mysqlbinlog --no-defaults mysql-bin.000002 > binlog.sql
↑--no-defaults がないと my.cnf に default-character-set が存在すると起動できない
# mysql -p < binlog.sql

システム変数の調整

MySQLの動作を決めるパラメータは システム変数 として参照設定することができます。 現在の値を見るにはSQLコマンド SHOW VARIABLES を実行します。

# mysql -p
mysql> SHOW VARIABLES;

これらの値は my.cnf で指定することにより変更することができます。


その他の機能や詳細についてはマニュアルを参照してください。 MySQL 5.1 リファレンスマニュアル

perl 用モジュールを導入する

mysql コマンドによる作業だけですと面倒ですので、 作業用スクリプトを書く為に perl モジュールを利用できるようにしておくと便利です。 perl モジュールは p5-XXX のようになっています。 もしもまだ perl を導入していない場合は lang/perl5.8 を先に入れておきます。

# portinstall databases/p5-DBD-mysql51 ←必要モジュールが入ります

DBIは複数のデータベースを統一した手順で使えるようにするインターフェースです。 ここからmysqlドライバが呼び出されます。利用例はこんな感じになります。

sample.pl
#!/usr/local/bin/perl

use DBI;

$host = 'localhost'; ←接続先(ホスト名、IPアドレス等)
$db = 'test'; ←操作対象のデータベース名
$user = 'root'; ←接続ユーザ名
$passwd = 'XXXXXX'; ←接続ユーザ名に対応するパスワード
$group = 'myapp'; ←[client]以外に読み込むグループ名
$conf = '/usr/local/etc/my.cnf'; ←設定ファイル
$dsn = "DBI:mysql:database=$db;host=$host"; ←MySQL接続情報を用意
$dsn .= ";mysql_read_default_file=$conf"; ←この指定がないとmy.cnfを読まない
$dsn .= ";mysql_read_default_group=$group"; ←なくてもいい(例では[myapp]を追加で読む)

$dbh = DBI->connect($dsn, $user, $passwd); ←サーバに接続する
die "Can't connect to $dsn, $DBI::errstr" if !$dbh;

↓insert/delete/updateの場合は結果を受け取らない
$rc = $dbh->do("UPDATE mytable SET message='perlから変更' WHERE id='3'"); ←SQL文を実行
die "Can't execute statement: $DBI::errstr" if !$rc;

↓selectの場合は結果を受け取る
$sth = $dbh->prepare("SELECT id, name, message FROM mytable"); ←SQL文を用意
die "Can't prepare statement: $DBI::errstr" if !$sth;

$rc = $sth->execute; ←SQL文を実行
die "Can't execute statement: $DBI::errstr" if !$rc;

for ($i = 0; $i < $sth->rows; $i++) {
    @a = $sth->fetchrow_array; ←結果を受け取る
    print "$a[0], $a[1], $a[2]\n";
}
$sth->finish; ←もしあれば残りの結果を捨てる

$dbh->disconnect; ←サーバから切断する
実行例
# ./sample.pl
1, 青山, これはテスト1です
3, 青山, perlから変更