Go to the first, previous, next, last section, table of contents.

# M Pieces of the manual in transit

## M.1 Installing a MySQL Binary Distribution

MySQL の バイナリ配布プログラムをインストールする際は以下のツールが必要になります：

- GNU の圧縮解凍ツール `gunzip`。ソースを解凍するのに必要です。
- ファイルアーカイバ`tar`。これもソースを解凍するのに必要です。 GNU `tar`の動作は確認されています。Sun `tar`の使用には問題があります。

zipやtarを使った方法とは別の形式、RPM(RedHat Package Manager)を使った配布も行われています。 「2.1.1 Installing MySQL on Linux」節参照.

もしもこの問題にぶつかってしまった場合は `mysqlbug` を使用してください。 質問等は mysql@lists.mysql.com に送ってください。 問題点がバグに該当しなくても `mysqlbug` は情報を集めていますので解決の 手助けになることと思います。 `mysqlbug` を使用すれば問題の解決方法を得る 確率が増します。`mysqlbug` は解凍されたプログラムの ``bin'` 以下にあります。 「1.2.22.3 バグや問題を報告する方法」節参照.

バイナリ配布プログラムのインストール及び立ち上げまでに必要となる基本操作は以下の通りです。

    shell> groupadd mysql
    shell> useradd -g mysql mysql
    shell> cd /usr/local
    shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
    shell> ln -s mysql-VERSION-OS mysql
    shell> cd mysql
    shell> scripts/mysql_install_db
    shell> chown -R root  /usr/local/mysql
    shell> chown -R mysql /usr/local/mysql/data
    shell> chgrp -R mysql /usr/local/mysql
    shell> chown -R root /usr/local/mysql/bin
    shell> bin/safe_mysqld --user=mysql &

新しいユーザを追加するには `bin/mysql_setpermission` スクリプトを 使用できます。使用の際は`DBI`と`Msql-Mysql-modules`の Perlモジュールをインストールする必要があります。

より詳細な情報をここから示します。

バイナリ配布のプログラムをインストールする際は以下に従ってください。 その後、 「2.4 インストール後の設定とテスト」節に進んでインストールの終了処理と動作試験を行ってください。

1. バイナリ配布プログラムを解凍するためのディレクトリを用意してください。 そして、そこにバイナリ配布ファイルを置いてください。 以下の例では ``/usr/local'` にファイルを解凍し、``/usr/local/mysql'` に MySQLをインストールします。（従って以下の例では操作するユーザが ``/usr/local'` に対して書き込み権限を持つことを前提としています。 もしも ``/usr/local'` への書き込みが禁じられている場合は `root`としてインストールを行う必要があります。
2. プログラムの配布は以下のサイトから行ってください。 「2.2.1 MySQL を得る方法」節. MySQLのバイナリ配布は圧縮された `tar` 形式で行われており、 ``mysql-VERSION-OS.tar.gz'` のような形式の名前が付けられています。 ここで、`VERSION` はバージョン番号（例えば `3.21.15`）を `OS` はプラットホームとなるOS（例えば `pc-linux-gnu-i586`）を示します。
3. バイナリ配布ファイルに `-max` という表示があるものがありますが、 これはこのプログラムが transaction-safe 機能やその他の機能をサポート していることを示しています。 「4.7.5 mysqld-max, An extended mysqld server」節参照。 全てのバイナリプログラムは同じソースファイルからmakeされたものです。
4. `mysqld`が動作するためのユーザとグループを作成してください。

       shell> groupadd mysql
       shell> useradd -g mysql mysql

   これらのコマンドは `mysql` グループと `mysql` ユーザを作成するものです。 `useradd` や `groupadd` というコマンドもありますが、 これらは使用プラットホームによって使い方が若干異なります。 また、`adduser` や `addgroup` と呼ばれる場合もあります。 `mysql` 以外のユーザやグループでも使用できます。
5. インストール先のディレクトリを変更する場合は以下のようにします。 まずディレクトリを移動します。

       shell> cd /usr/local

6. 以下のように移動したディレクトリ上でプログラムの解凍を行い インストールディレクトリを作成してください。

       shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf -
       shell> ln -s mysql-VERSION-OS mysql

   最初のコマンドで ``mysql-VERSION-OS'` という名前のディレクトリを作成します。 次のコマンドはそのディレクトリへのシンボリックリンクを作成し、 ユーザに単純な ``/usr/local/mysql'` という名前での利用を可能にします。
7. 以下のようにインストールディレクトリへ移動します。

       shell> cd mysql

   複数のファイルが `mysql` 以下のディレクトリに展開されているのが おわかりになると思います。 中でもインストールに重要な役目を果たすものは ``bin'` と ``scripts'` のサブディレクトリにあります。
   ``bin'`
     このディレクトリにはサーバ本体やクライアントプログラムなどシェルから 使用するために `PATH` 変数に追加する必要のあるものが置いてあります。 「H Environment Variables」節参照.
   ``scripts'`
     このディレクトリには `mysql_install_db` という `mysql` への アクセス管理を行うデータベースを初期化するためのスクリプトが置いてあります。
8. `mysqlaccess`を使う必要があり、なおかつ、標準ディレクトリとは異なる場所に インストールを行いたい場合は、`mysqlaccess` が `mysql`クライアントを 起動できるように環境設定を行う必要があります。 ``bin/mysqlaccess'`の18行目位にある以下のような行を変更してください。

       $MYSQL     = '/usr/local/bin/mysql';    # path to mysql executable

   これを実際に `mysql` がインストールされているディレクトリに変更してください。 これをしないと `mysqlaccess` を使う際に `Broken pipe` エラーが発生します。
9. 以下のようにすることによりアクセス管理データベースを作ることができます（初めてMySQLをインストールする時だけ必要）。

       shell> scripts/mysql_install_db

   使用する MySQL のバージョンが 3.22.10 より古い場合はこの操作をする時に MySQL サーバが 立ち上がっている必要がありましたが、現在のバージョンでは必要ありません。
10. データディレクトリ以下のファイルの所有者を `mysql` に、 それ以外のファイルの所有者を `root` にする手順は以下のようになります。

        shell> chown -R root  /usr/local/mysql
        shell> chown -R mysql /usr/local/mysql/data
        shell> chgrp -R mysql /usr/local/mysql

    最初のコマンドによって全てのファイルの `owner` 属性が `root` になります。 二行目のコマンドによってデータディレクトリ以下のファイル全ての `owner` 属性が `mysql` になります。 最後のコマンドによって全てのファイルの `group` 属性が `mysql` になります。
11. Perlモジュール`DBI`、`DBD`のインストールが必要なら 「M.2 Perl Installation Comments」節の項をご覧下さい。
12. MySQL を OS のブート時に自動的に起動したい場合は `support-files/mysql.server` を 貴方のシステムの的確な場所にコピーして使用できます。 より詳しい情報は `support-files/mysql.server` のスクリプト自体や 「2.4.3 MySQL の自動起動と自動停止」節 にあります。

全てのファイルの解凍とインストールが終了したら初期化と稼動試験を行います。

以下のようにしてMySQLサーバを立ち上げることができます。

    shell> bin/safe_mysqld --user=mysql &

「4.7.2 safe_mysqld, the wrapper around mysqld」節参照.

「2.4 インストール後の設定とテスト」節参照.

## M.2 Perl Installation Comments

### M.2.1 Installing Perl on Unix

MySQLのPerlでの使用に関するサポートは `DBI`/`DBD`クライアントインターフェスの提供で行なわれます。 「8.2 MySQL Perl API」節参照. `DBI`/`DBD`はPerl5.004かそれ以上のバージョンが必要になります。 古いバージョンのPerlでは動きません。

MySQL の Perl support にはここまでで既にインストールが済んでいる筈の MySQL のクライアントプログラミングサポートが必要となります。 もしも RPM ファイルからインストールをされているのならば クライアントプログラムはクライアントRPMにあるものの、 クライアントプログラミングサポートはデベロッパー RPM にあります。 まずデベロッパー RPM をインストールされたがどうかお確かめ下さい。

バージョン3.22.8からは Perl support がメインの MySQL 配布ファイルとは別になっています。 もし Perl support が必要であれば http://www.mysql.com/Downloads/Contrib/ からお取りください。

Perl関係プログラムのの配布は`tar`形式圧縮ファイルとして行われており、 ファイル名が ``MODULE-VERSION.tar.gz'` の形式になっています。 ここで、`MODULE`はモジュール名称、`VERSION`はバージョン番号を表しています。 `Data-Dumper`、`DBI`、及び、`Msql-Mysql-modules`を入手してインストールしてください。 インストール手順は以下に示す通りです。なお、ここでは`Data-Dumper`のみの手順が示されていますが、 他のモジュールについても同様な手順でインストールできます。

1. 以下のようにして作業ディレクトリで配布ファイルを解凍展開してください。

       shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -

   This command creates a directory named ``Data-Dumper-VERSION'`.
2. 解凍先のトップディレクトリーに移動します。

       shell> cd Data-Dumper-VERSION

3. コンパイル＆ビルドを行います。

       shell> perl Makefile.PL
       shell> make
       shell> make test
       shell> make install

出来上がったモジュールの動作を確認するために`make test`のコマンドは重要になってきます。 このコマンドを`Msql-Mysql-modules`をインストールしている時に使ってみてください。 MySQLサーバが動いていなければ失敗することになります。

MySQLをバージョンアップした際に `DBI` が core ダンプした場合は 必ず `Msql-Mysql-modules` を再コンパイルしてインストールしなおしてください。 そうでなくても MySQL のバージョンを変更した場合は再コンパイルしたほうが賢明です。

貴方のユーザ権限ではPerlのモジュールをインストールできない場合でも 以下の例のようにしてローカルディレクトリにモジュールをインストールできます。

    http://www.iserver.com/support/contrib/perl5/modules.html

`Installing New Modules that Require Locally Installed Modules`.という見出しの文書をご覧下さい。

### M.2.2 Installing ActiveState Perl on Windows

`DBD`モジュールとActiveState Perlをインストールするには以下の手順で行います。

- ActiveState Perlはこのサイトからダウンロードできます。 http://www.activestate.com/Products/ActivePerl/index.html
- 先ず、DOSのシェルを立ち上げてください。
- 必要であれば次のようにHTTP_proxy変数をセットしてください。

      set HTTP_proxy=my.proxy.com:3128

- 次のようにPPMプログラムを立ち上げます。

      C:\> c:\perl\bin\ppm.pl

- `DBI`がインストールされていなければインストールします。

      ppm> install DBI

- ここまで来たら次のようなコマンドを実行してください。

      install ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd

以上でActiveState Perlのバージョン5.6がとりあえず動くことになります。

もしも動作しない場合は次のように MyODBC ドライバーをインストールして ODBC経由でMySQLサーバに接続する必要があります。

    use DBI;
    $dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") ||
      die "Got error $DBI::errstr when connecting to $dsn\n";

### M.2.3 Installing the MySQL Perl Distribution on Windows

MySQL Perlの配布パッケージには`DBI`、`DBD:MySQL`、そして、`DBD:ODBC`が含まれています。

- Perlの配布パッケージをこのサイトからダウンロードしてください。 http://www.mysql.com/download.html.
- `C:`で配布パッケージを解凍してください。``C:\PERL'`に必要なファイルが現れます。
- 次にコマンドパスに``C:\PERL\BIN'`を追加してください。
- ディレクトリ、``C:\PERL\BIN\MSWIN32-x86-thread'` か ``C:\PERL\BIN\MSWIN32-x86'` もコマンドパスに追加してください。
- `perl -v`と入力して`perl`の起動をチェックしてみましょう。

### M.2.4 Problems Using the Perl `DBI`/`DBD` Interface

Perl が "``../mysql/mysql.so'`を見つけられない" というメッセージを出した場合、 それは多分 Perl のシェアードライブラリ ``libmysqlclient.so'` を見つけることが出来ないのでしょう。

これは以下のような方法で解決できます。

- `Msql-Mysql-modules`は通常、`perl Makefile.PL` とコンパイルされますが、 `perl Makefile.PL -static -config`とコンパイルしてください。
- `libmysqlclient.so`をシェアードライブラリが置いてあるディレクトリにコピーしてください (通常は``/usr/lib'`や``/lib'`といったディレクトリになるはずです)。
- Linux の場合は ``/etc/ld.so.conf'` ファイルを使って ``libmysqlclient.so'` のあるディレクトリを パスに追加することが出来ます。
- ``libmysqlclient.so'`のあるディレクトリを`LD_RUN_PATH`に追加することによって そこへのパスが追加されます。

`DBD-mysql` が次のようなエラーを発生する場合があります。 この原因の一つは `gcc`(又は`gcc`でコンパイルされた古いバイナリ配布パッケージ)をお使いのケースです。

    /usr/bin/perl: can't resolve symbol '__moddi3'
    /usr/bin/perl: can't resolve symbol '__divdi3'

``mysql.so'` ライブラリをビルドする時に `-L/usr/lib/gcc-lib/... -lgcc` を リンクコマンドに追加してください(`make`コマンド実行時の出力をチェックすれば確認できます。)。 オプション`-L`で指定されるのは`libgcc.a`のあるディレクトリになります。

もう一つの原因はPerlとMySQLのどちからが`gcc`でコンパイルされており、どちらかがそうでない場合です。 この場合はどちらも`gcc`でコンパイルし、この不一致を解消すれば解決します。

`Msql-Mysql-modules`がテストで次のようなエラーを出した時、

    t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.

これは、ファイル圧縮用ライブラリ -lz へのパスを追加すれば解決いたします。 ``lib/DBD/mysql/Install.pm'` に以下のような変更を行ってください。

    $sysliblist .= " -lm";

    to

    $sysliblist .= " -lm -lz";

このあと'make realclean'を実行し、最初からインストールをやり直す必要があります。

SCOのようなダイナミックリンクが使用できないシステムで Perl モジュールを使用する際は `DBI`や`DBD-mysql`をスタティックリンクしたバージョンのPerlを作成する必要があります。 `DBD`をスタティックにリンクするには、Perlのインストールディレクトリに `DBI`のプログラムを置き`DBD`をリンクし、インストールします。

SCOでは以下のような環境変数をセットする必要があります。

    shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib
    or
    shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
    shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib
    shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:/usr/skunk/man:

`DBI` をスタティックにリンクしたPerlを作成するためには、 先ず以下のコマンドを `DBI` がインストールされているディレクトリで実行してください。

    shell> perl Makefile.PL -static -config
    shell> make
    shell> make install
    shell> make perl

次に新しいPerlをインストールします。 通常 `make perl` でインストールに必要なファイル類を作成しますが、 SCOの場合は `make -f Makefile.aperl inst_perl MAP_TARGET=perl` のように行う必要があります。

次に、ここで作成された Perl で目的の `DBD::mysql` をスタティックにリンクされた Perl を作成するために使います。 `Msql-Mysql-modules` がインストールされたディレクトリで以下のようなコマンドを実行してください。

    shell> perl Makefile.PL -static -config
    shell> make
    shell> make install
    shell> make perl

最後に、この新しいPerlプログラムをインストールしてください。 `make perl`で必要なコマンドを再確認することができます。

## M.3 Functions for Use with `GROUP BY` Clauses

`GROUP BY`節を含まない文でグループ関数を使用すると 全てのレコードについてグループされたものとみなされます。

`COUNT(expr)`
  Returns a count of the number of non-`NULL` values in the rows retrieved by a `SELECT` statement: `SELECT`文により選択されたレコードから`NULL`ではないものの数を返します。

      mysql> select student.student_name,COUNT(*)
                 from student,course
                 where student.student_id=course.student_id
                 GROUP BY student_name;

  `COUNT(*)`は`NULL`を含むかどうかで選択されたレコードの数を返すだけです。 `COUNT(*)`は一つのテーブルから一つだけカラムが選択され、 尚且つ`WHERE`節が使用されていない場合に最適化され、高速に動作します。 例えば以下のように使います。

      mysql> select COUNT(*) from student;

`COUNT(DISTINCT expr,[expr...])`
  これは`NULL`値では無い値を持つデータの数を区別して返すことが出来ます。

      mysql> select COUNT(DISTINCT results) from student;

  複数の選択されたデータ群から`NULL`を含まないデータの総数算出が必要な場合、 MySQLでは必要な選択リストを与えることによって得ることが出来ます。 一方でANSIのSQLではその選択一つ一つについて`CODE(DISTINCT ..)`を使う必要があります。
`AVG(expr)`
  `expr`で得られる値の平均値を返します。

      mysql> select student_name, AVG(test_score)
                 from student
                 GROUP BY student_name;

`MIN(expr)`
`MAX(expr)`
  `expr`で得られる値の最大値、最小値を返します。 `MIN()`と`MAX()`の引数は文字列を取ることもできます。 この際は文字列の値の大小を比較し、最大と最小を返します。 「5.4.3 MySQL はどのようにインデックスを使用するか？」節.

      mysql> select student_name, MIN(test_score), MAX(test_score)
                 from student
                 GROUP BY student_name;

`SUM(expr)`
  `expr`で得られる値の総計を返します。 もしも得られるレコードが見つからない場合は`NULL`が返ってきます。
`STD(expr)`
`STDDEV(expr)`
  `expr`で得られる値の標準偏差を返します。 これはANSI SQLの格調になっています。 関数としての`STDDEV()`の形はOracleのものと互換性があります。
`BIT_OR(expr)`
  `expr`で得られる値のビット和(`OR`)を返します。 計算は64-bit(`BIGINT`)の精度で行われます。
`BIT_AND(expr)`
  `expr`で得られる値のビット積(`AND`)を返します。 計算は64-bit(`BIGINT`)の精度で行われます。

MySQLの`GROUP BY`は拡張された使い方が可能です。 `SELECT`で使用したフィールド名や計算式を`GROUP BY`には使用しない、 という使い方が可能です。 このことはグループにはどんな値も使用可能ということを表しています。 データの並べ替えやグループ分けに適さない要素を排除することによって より良好なパフォーマンスを得ることが出来ます。 例えば、次のようなクエリで`customer.name`についてのグループ分けをする必要はありません。

    mysql> select order.custid,customer.name,max(payments)
           from order,customer
           where order.custid = customer.custid
           GROUP BY order.custid;

ANSI SQLでは`customer.name`を`GROUP BY`のところに追加する必要があります。 MySQLではANSIモードで動かしていない限り余計な記述の必要はありません。

`GROUP BY`で省略するフィールドはグループ内でユニークでなくてはいけません。 もしそうでない場合は結果は予想もしないようなものになるでしょう。

たとえユニークでは無くても特定のフィールドの値を得るために `MIN()`や`MAX()`を使用できるケースもあります。 次の例は`sort`フィールド中の最小値を持つレコードから 特定の`column`の値を取り出します。

    substr(MIN(concat(rpad(sort,6,' '),column)),7)

「3.5.4 The Rows Holding the Group-wise Maximum of a Certain Field」節参照.

MySQLの3.22以前のバージョンをお使いであるか、ANSI SQLに沿っての使用をされる場合は `GROUP BY`と`ORDER BY`内に選択表現を記述してはいけません。 この制限を守った上で作業を進めるにはエイリアスを使用します。

    mysql> SELECT id,FLOOR(value/100) AS val FROM tbl_name
               GROUP BY id,val ORDER BY val;

MySQLのバージョン3.23では次のようにも記述できます。

    mysql> SELECT id,FLOOR(value/100) FROM tbl_name ORDER BY RAND();

Go to the first, previous, next, last section, table of contents.