MySQL 4.1 のインストール
〜 MySQL,DBI,DBD を全てローカルディレクトリにインストール 〜
root は不使用です
(MySQL をシステムツリーに入れたくない理由)
2004-12-16 作成 福島

・インストールイメージ

$HOME/   ユーザのホームディレクトリ
      +- mysql-base/    MySQL ディレクトリ
      |            +- bin/...      mysqld_safe,mysql はこの中です
      |            +- include/...
      |            +- info/...
      |            +- lib/...
      |            +- libexec/...
      |            +- man/...
      |            +- mysql-test/...
      |            +- share/...
      |            +- sql-bench/...
      |            +- var/...      ファイル "ホスト名.err" が動作ログです。チェックしましょう
      |
      +- perl-modules/  DBI,DBD ディレクトリ
                   +- bin/...
                   +- lib/...      DBI,DBD はこの中です
                   +- share/...


1. MySQL をインストール $ mkdir mysql-base $ tar xzf mysql-4.1.7.tar.gz $ cd mysql-4.1.7 mysql-4.1.7$ ./configure --prefix=$HOME/mysql-base --with-charset=ujis mysql-4.1.7$ make mysql-4.1.7$ make install ここでは $HOME/mysql-base/ にインストールします mysql-4.1.7$ cd .. $ ./mysql-base/bin/mysql_install_db データベースを用意 (最初に 1 回だけ実行) $ ./mysql-base/bin/mysqld_safe --socket=$HOME/mysql-base/var/mysql.sock --port=3307 & MySQL デーモンを起動 (3307 はテキトーです) $ ./mysql-base/bin/mysqladmin --socket=$HOME/mysql-base/var/mysql.sock -u root shutdown 停止はこちら (ここでの root は Unix の root ではありません) $ exit MySQL デーモンが立ち上がっていることを確認するために一度抜けます
2. MySQL デーモンが立ち上がっているか確認 $ ./mysql-base/bin/mysqladmin status
Uptime: 10  Threads: 1  Questions: 1  Slow queries: 0  Opens: 11  Flush tables: 1  Open tables: 0  Queries persecond avg: 0.145
※どうやら立ち上がっています
$ echo "SHOW DATABASES" | ./mysql-base/bin/mysql --socket=$HOME/mysql-base/var/mysql.sock -t データベースを表示 (-t は枠付きで表示する指定)
+----------+
| Database |
+----------+
| test     |
+----------+
※データベース "test" は最初からあります

3. 毎回オプションを指定するのを避けるため、~/.my.cnf を作成 $ cp ./mysql-base/share/mysql/my-small.cnf ~/.my.cnf $ vi .my.cnf
port            = 3307
socket          = $HOME/mysql-base/var/mysql.sock
$HOMEは実際のディレクトリ (例: /home/who) に置き換えてください

4. テーブルを作成 $ echo "SHOW TABLES" | ./mysql-base/bin/mysql test
(テーブルを作ってないので何も表示されません)
$ cat | ./mysql-base/bin/mysql test
CREATE TABLE test_table ( id INTEGER, value VARCHAR(10) )
^D
$ echo "SHOW TABLES" | ./mysql-base/bin/mysql test -t
+----------------+
| Tables_in_test |
+----------------+
| test_table     |
+----------------+
$ echo "SHOW FULL COLUMNS FROM test_table" | ./mysql-base/bin/mysql test -t
+-------+-------------+------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type        | Collation        | Null | Key | Default | Extra | Privileges                      | Comment |
+-------+-------------+------------------+------+-----+---------+-------+---------------------------------+---------+
| id    | int(11)     | NULL             | YES  |     | NULL    |       | select,insert,update,references |         |
| value | varchar(10) | ujis_japanese_ci | YES  |     | NULL    |       | select,insert,update,references |         |
+-------+-------------+------------------+------+-----+---------+-------+---------------------------------+---------+

5. DBI, DBD をインストール $ tar xzf DBI-1.46.tar.gz $ cd DBI-1.46 DBI-1.46$ perl Makefile.PL PREFIX=$HOME/perl-modules DBI-1.46$ make DBI-1.46$ make test DBI-1.46$ make install DBI-1.46$ cd .. $ tar xzf DBD-mysql-2.9004.tar.gz $ cd DBD-mysql-2.9004 DBD-mysql-2.9004$ PATH="$PATH:$HOME/mysql-base/bin" perl -I$HOME/perl-modules/lib/perl5/site_perl Makefile.PL PREFIX=$HOME/perl-modules PATH="$PATH:$HOME/mysql-base/bin" は mysql_config を見つけさせるために必要です (Makefile.PL 中で参照されます) DBD-mysql-2.9004$ make DBD-mysql-2.9004$ make test DBD-mysql-2.9004$ make install DBD-mysql-2.9004$ cd .. $
6. せっかくなのでテスト $ cat > ./test.pl
#!/usr/local/bin/perl

use lib "$ENV{HOME}/perl-modules/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/" ;
use DBI ;
use strict ;

my $dsn = "dbi:mysql:test;mysql_read_default_group=client;mysql_read_default_file=$ENV{HOME}/.my.cnf" ;
# my $dsn = "dbi:mysql:test;port=3307" ;  <-- この書き方は??何故か??無効です
my $db_user = $ENV{USER} ;
my $db_pass = "" ;

my $db = DBI->connect($dsn, $db_user, $db_pass) ;
my $sth = $db->prepare("INSERT INTO test_table VALUES (10,'string')") ;
$sth->execute ;
$sth->finish ;
$db->disconnect ;

my $db = DBI->connect($dsn, $db_user, $db_pass) ;
my $sth = $db->prepare("SELECT id,value FROM test_table") ;
$sth->execute ;
while (my($t1,$t2) = $sth->fetchrow_array())
    {
    print "$t1,$t2\n" ;
    }
$sth->finish ;
$db->disconnect ;
※ CGI にするときは $ENV{HOME} を実際のディレクトリ (例: /home/who) に置き換えてください  $ENV{HOME}/.my.cnf は 3 で作成したものです。MySQL の DBD では "port=" を指定しても無視され、  "mysql_read_default_file=" が有効になります (これを考えた奴は変態か?)
$ perl ./test.pl 実行 $ echo "SELECT * FROM test_table" | ./mysql-base/bin/mysql test -t
+------+--------+
| id   | value  |
+------+--------+
|   10 | string |
+------+--------+
※テストの確認が出来ました

$ mysql -u root -h localhost mysql mysql> create database DatabaseName ; mysql> grant select,insert,update,delete,create,drop on DatabaseName.* to UserName@localhost identified by 'Password' ; mysql> quit * はテーブル名を意味します。 $ mysql -p -u UserName DatabaseName mysql> create table test_table ( id integer, value varchar(10) ) ; mysql> insert into test_table values (10, 'string') ; mysql> select * from test_table ; mysql> update test_table set id = '20', value = 'STRING' where id = '10' ; mysql> select * from test_table ; mysql> quit MySQL 4.3.10 は drop database してもデータベースが消えないのでワークを削除します。 $ mysql -u root -h localhost mysql mysql> delete from mysql.user where user = 'UserName' and host = 'localhost' ; mysql> drop database DatabaseName ; mysql> quit $ cd ~/mysql-base/var $ rm -Rf ./DatabaseName
・MySQL をシステムツリーに入れたくない理由MySQL はどのように標準互換か?」を読むと分かりますが、バージョン 4.1 になってだいぶマシになったものの、 まだまだ細かいところを気にしながら SQL を組まないといけないのが MySQL です。 「くせが多い」と言い換えることも出来るかと思います。 プログラムを組む側からすると、気にすることは少ないほうが開発効率もメンテナンス性も優れます。 初心者に教えるときも、くせを回避するよりは少々遅くとも、素直な表現を使いたいものです。 プログラマは初心者であるほどくだらない主張を張る傾向にありますが、MySQL はそれを許容する要素があまりにも大きいのです。 MySQL では高速性やマニアックな拡張を売り物にし、標準的な機能や文法を蔑ろにしていますが、 その他の DBMS も頑張っているところを見ると、製品としてのバランスが悪いと言わざるを得ません。 これらの理由により、システム管理者にとって MySQL はまだ本流とは認められません。 よって、システムツリーにはなるべく入れたくないのです。 そうは言っても、このドキュメントのように、ローカルディレクトリにインストール することによって使えてしまうという事実があります。 「結局使えるのだから、リソースの逼迫は変化しない。ならば一本化してシステムツリーに入れれば良かろう」 と言いたくなるでしょう。 しかし、システムツリーは本流であり、おいそれと追加/削除できません。 ローカルディレクトリであれば、問題が起きたところで削除できるのです。 MySQL は、今はまだ小規模な DB として特化した用途でしか使えませんが、 (MySQL 用の SQL を大規模 DBMS に移植するのはハードルが高すぎます) これがまさに小規模 CGI には向いているのだと思います。 そして、今流行りのプログラマは「プログラム=Perl(CGI)」であり、 それに関する多くの書籍が出版されていることを考えると、この使い方は無視できません。 特に、最近のホスティング CGI サーバは、最初から (あるいは無料で) MySQL を搭載することが多くなりました。 PostgreSQL ではないのは、「高速性 = マシン負荷が軽い」と言うことが最大の理由でしょう。