MySQL バージョン 3.23 で InnoDB
テーブルを有効にする方法については、項7.5.2. 「MySQL バージョン 3.23 での InnoDB」
を参照してください。
MySQL-4.0 では、InnoDB
テーブルを有効にするために特に何かをする必要はありません。
MySQL-4.0 および MySQL-4.1
のデフォルトの動作として、MySQL の
datadir
に自動拡張する 10 MB の
ibdata1
ファイルが 1 つと、5 MB の
ib_logfile
ログファイルが 2
つ作成されます(MySQL-4.0.0 および 4.0.1
のデータファイルは 64 MB
で、自動拡張しません)。
注意: 高いパフォーマンスを得るには、この後の例に示されている InnoDB の各種パラメータを明示的に設定する必要があります。
InnoDB
テーブルを使用しない場合は、MySQL
オプション設定ファイルに
skip-innodb
オプションを指定して
InnoDB
を動作させないようにできます。
[mysqld] skip-innodb
バージョン 3.23.50 および 4.0.2
より、innodb_data_file_path
行の最後のデータファイルを、自動拡張ファイルとして指定できるようになりました。その場合の
innodb_data_file_path
の構文は次のとおりです。
innodb_data_file_path = データファイルのパス:サイズ;データファイルのパス:サイズ;... ... ;データファイルのパス:サイズ[:autoextend[:max:サイズ]]
最後のデータファイルに autoextend
オプションを指定すると、テーブルスペースに空きがなくなった場合に、InnoDB
が最後のデータファイルを拡張します。1
回の増分は 8 MB です。次に例を示します。
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend # # 注意: innodb_data_home_dir に空文字を指定した場合、 # innodb_data_file_path に与えるパスは絶対パスになる
この例では、InnoDB
に対し、初期サイズが 100 MB
のデータファイルを 1
つだけ作成し、スペースが足りなくなった場合に
8 MB
単位で拡張するように指定しています。ディスクがいっぱいになった場合は、たとえば別のディスクに新たなデータファイルを追加することもできます。その場合は、autoextend
が指定されている ibdata1
のサイズを確認し、そのサイズが 1,024 1,024
バイト(= 1
MB)の倍数になるように丸めた値を計算し、計算で得られた値を
innodb_data_file_path
の
ibdata1
のサイズとして明示的に指定する必要があります。これで、新たなデータファイルを
ibdata1
の後ろに追加できます。
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend # # 注意: この例では最初 100M の ibdata1 が、 # 888M (1024 * 1024の倍数) だけ拡張されていたので、988M の指定になっている。
ファイルシステムの最大ファイルサイズが 2 GB
である場合は注意が必要です。InnoDB
は、OS
の最大ファイルサイズを考慮しません。このようなファイルシステムでは、データファイルの最大サイズを指定する必要があります。
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M
単純な my.cnf
の例。128 MB の RAM と 1
つのハードディスクを搭載したコンピュータを使用しているとします。次に示すのは、InnoDB
の my.cnf
または
my.ini
における設定パラメータの例です。この例では、MySQL-Max-3.23.50
以降、または MySQL-4.0.2
以降が稼働していることを想定しています。この例は、Unix
と Windows の両方で、ユーザが
InnoDB
データファイルとログファイルを複数のディスクに分散させない場合に適しています。この設定パラメータによって、自動拡張するデータファイル
ibdata1
および 2 つの
InnoDB
ログファイル
ib_logfile0
と
ib_logfile1
が、MySQL の
datadir
(一般には
/mysql/data
)に作成されます。
また、アーカイブされた小さな
InnoDB
ログファイル
ib_arch_log_0000000000
も
datadir
に作成されます。
[mysqld] # You can write your other MySQL server options here # ... # Datafile(s) must be able to # hold your data and indexes. # Make sure you have enough # free disk space. innodb_data_file_path = ibdata1:10M:autoextend # Set buffer pool size to # 50 - 80 % of your computer's # memory innodb_buffer_pool_size=70M innodb_additional_mem_pool_size=10M # Set the log file size to about # 25 % of the buffer pool size innodb_log_file_size=20M innodb_log_buffer_size=8M # Set ..flush_log_at_trx_commit # to 0 if you can afford losing # some last transactions innodb_flush_log_at_trx_commit=1
datadir
でファイルを作成する権限が
MySQL
サーバにあるかどうかを確認してください。
一部のファイルシステムでは、データファイルを 2 GB 未満にする必要があることに注意してください。 ログファイルをすべて合わせたサイズは、4 GB 未満でなければなりません。また、データファイルをすべて合わせたサイズは、10 MB 以上でなければなりません。
InnoDB
データベースを初めて作成するときには、コマンドプロンプトから
MySQL サーバを起動するのが最善です。 InnoDB
によってデータベースの作成に関する情報が画面に出力されるので、処理の経過を確認できます。
画面出力の例については、次のセクションを参照してください。
たとえば、Windows では次のようにして
mysqld-max.exe
を起動することにより、MySQL
サーバはコンソールを閉じなくなります。
your-path-to-mysqld\mysqld-max --console
Windows
では、my.cnf
または
my.ini
をどこに配置すればいいでしょうか。
Windows での規則は次のとおりです。
my.cnf
または
my.ini
の一方のみを作成する必要がある。
my.cnf
ファイルは、C:\my.cnf
にする必要がある。
my.ini
ファイルは、C:\WINDOWS
や
C:\WINNT
などの %WINDIR%
ディレクトリなどに配置する必要がある。MS-DOS
のSET
コマンドを使用すれば、%WINDIR%
の値を出力できる。
PC
で使用するブートローダのブートドライブが
C:
ドライブではない場合は、my.ini
ファイルしか使用できない。
Unix
では、どこでオプションを指定すればいいでしょうか。
Unix では、mysqld
が次のファイル(存在する場合)から次の順序でオプションを読み取ります。
/etc/my.cnf
グローバルオプション
COMPILATION_DATADIR/my.cnf
サーバ固有のオプション
defaults-extra-file
--defaults-extra-file=...
で指定されたファイル
~/.my.cnf
ユーザ固有のオプション
COMPILATION_DATADIR
は MySQL
データディレクトリで、mysqld
がコンパイルされたときに
./configure
オプションとして指定されたものです(一般にはバイナリインストール用の
/usr/local/mysql/data
、またはソースインストール用の/usr/local/var
)。
mysqld
がその
my.cnf
または
my.ini
をどこから読み取るかがわからない場合は、サーバへの最初のコマンドラインオプションとしてパスを指定できます(mysqld
--defaults-file=your_path_to_my_cnf
)。
InnoDB
は、データファイルへのディレクトリパスを決定する場合に、innodb_data_home_dir
に定義されたパスのテキストを
innodb_data_file_path
内のデータファイル名またはパスのテキストと結合し、必要に応じて間にスラッシュまたはバックスラッシュを挿入します。my.cnf
でキーワード innodb_data_home_dir
がまったく指定されていない場合は、MySQL の
datadir
を意味する 'ドット'
ディレクトリ ./
がデフォルトで使用されます。
高度な my.cnf
の例。2 GB の RAM と 3 つの 60 GB
ハードディスクを搭載した Linux
コンピュータを使用しているとします。ハードディスクのディレクトリパスは、それぞれ
/
、/dr2
、/dr3
です。次に示すのは、InnoDB の
my.cnf
における設定パラメータの例です。
注意: ディレクトリは InnoDB
によって作成されないので、各自で作成する必要があります。データおよびロググループのホームディレクトリを作成するには、Unix
または MS-DOS の mkdir
コマンドを使用します。
[mysqld] # You can write your other MySQL server options here # ... innodb_data_home_dir = # Datafiles must be able to # hold your data and indexes innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # Set buffer pool size to # 50 - 80 % of your computer's # memory, but make sure on Linux # x86 total memory usage is # < 2 GB innodb_buffer_pool_size=1G innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # .._log_arch_dir must be the same # as .._log_group_home_dir innodb_log_arch_dir = /dr3/iblogs innodb_log_files_in_group=3 # Set the log file size to about # 15 % of the buffer pool size innodb_log_file_size=150M innodb_log_buffer_size=8M # Set ..flush_log_at_trx_commit to # 0 if you can afford losing # some last transactions innodb_flush_log_at_trx_commit=1 innodb_lock_wait_timeout=50 #innodb_flush_method=fdatasync #innodb_thread_concurrency=5
2
つのデータファイルを異なるディスクに配置したことに注意してください。
InnoDB
は、データファイルによって形成されるテーブルスペースをボトムアップ式に埋めていきます。場合によっては、すべてのデータを同じ物理ディスクに配置しない方がパフォーマンスが良くなります。ログファイルをデータとは別のディスクに配置すると、ほとんどの場合パフォーマンスは良くなります。
ローデバイス
をデータファイルとして使用することもできます。一部の
Unix では、この方法で I/O
の処理速度が向上します。my.cnf
でこのようなデータファイルを指定する方法については、マニュアルで
項7.5.13.1. 「ディスク I/O」
に関するセクションを参照してください。
警告: Linux x86 では、メモリ使用率の設定を高くし過ぎないように注意してください。glibc はプロセスヒープがスレッドスタックよりも大きくなることを許可しており、その場合にサーバがクラッシュします。次の計算式を見てください。
innodb_buffer_pool_size + key_buffer_size + max_connections * (sort_buffer_size + read_buffer_size) + max_connections * 2 MB
この値が、2 GB に近いか、2 GB
を超えていると危険です。各スレッドはスタックを使用し(通常は
2 MB。ただし MySQL AB バイナリでは 256 KB
のみ)、最悪の場合、sort_buffer_size +
read_buffer_size
の大きさの追加メモリも使用します。
他の mysqld
サーバパラメータはどのように調整すればいいでしょうか。:
ほとんどのユーザに適した一般的な値は次のとおりです。
skip-locking max_connections=200 read_buffer_size=1M sort_buffer_size=1M # Set key_buffer_size to 5 - 50% # of your RAM depending on how # much you use MyISAM tables, but # keep key_buffer_size + InnoDB # buffer pool size < 80% of # your RAM key_buffer_size=...
注意: 4.0
より前のバージョンでは、一部のパラメータを
set-variable = innodb... = 123
のように指定する必要があります。
各設定パラメータの意味は次のとおりです。
オプション | 説明 |
innodb_file_per_table |
4.1.1 より利用可能。このオプションによって、InnoDB
は作成された各テーブルを独自の
.ibd
ファイルに格納するようになる。複数のテーブルスペースに関するセクションを参照。 |
innodb_data_home_dir |
ディレクトリパスの中の、すべての InnoDB
データファイルに共通な部分。my.cnf
でこのオプションを指定しなかった場合のデフォルトは、MySQL
の
datadir 。このオプションには空の文字列も指定できる。その場合、innodb_data_file_path
に絶対ファイルパスを指定できる。 |
innodb_data_file_path |
個々のデータファイルへのパスとそのサイズ。各データファイルへのフルディレクトリパスは、ここで指定したパスに
innodb_data_home_dir
を連結することで取得できる。ファイルサイズはメガバイトで指定されるため、上記のようにサイズの後に
'M' が付加されている。InnoDB は 'G'
という略称も認識する。1 G は 1,024 MB
を意味する。3.23.44
より、大きなファイルをサポートするオペレーティングシステムで
4 GB
を超えるファイルサイズも設定できるようになった。一部のオペレーティング
システムでは、ファイルを 2 GB
未満にする必要がある。4.0
より、innodb_data_file_path
を指定しない場合のデフォルトの動作として、10
MB の自動拡張データファイル
ibdata1
が作成される。ファイルの合計サイズは、10
MB 以上でなければならない。 |
innodb_mirrored_log_groups |
データベースのために保持しておくロググループのコピーの数。現時点では 1 に設定する必要がある。 |
innodb_log_group_home_dir |
InnoDB
ログファイルへのディレクトリパス。my.cnf
でこのオプションを指定しなかった場合は、デフォルトで
MySQL の datadir
が設定される。 |
innodb_log_files_in_group |
ロググループ内のログファイルの数。InnoDB はこれらのログファイルに循環的に書き込みを行う。このパラメータの推奨値とデフォルト値は共に 2。 |
innodb_log_file_size |
ロググループ内の各ログファイルのサイズ(メガバイト)。実際的な値の範囲は、1M から、下で指定するバッファプールのサイズの 1/n まで(n はグループ内のログファイルの数)。この値が大きいほど、バッファプールで必要となるチェックポイントフラッシュの回数が減るため、ディスク I/O が削減される。ただし、ログファイルが大きいと、クラッシュした場合のリカバリに時間がかかる。32 ビットコンピュータでは、ログファイルの合計サイズを 4 GB 未満にする必要がある。デフォルトは 5M。 |
innodb_log_buffer_size |
InnoDB がディスク上のログファイルにログを書き出すために使用するバッファのサイズ。実際的な値は 1M 〜 8M。ログバッファを大きくすると、トランザクションコミットまでディスクにログを書き出すことなく大きなトランザクションを実行できる。大きなトランザクションがある場合は、このようにログバッファを大きくすることでディスク I/O を削減できる。 |
innodb_flush_log_at_trx_commit |
通常、このパラメータは 1 に設定する。これによって、トランザクションコミット時にログがディスクにフラッシュされ、トランザクションによる変更が確定されてデータベースクラッシュを免れる。このような安全性を必要とせず、かつ小さなトランザクションを実行している場合は、このオプションを 0 または 2 に設定してログへのディスク I/O を削減できる。値 0 を指定すると、ログファイルへのログの書き込み、およびディスクへのログファイルのフラッシュが1 秒に約1 回しか行われなくなる。値 2 を指定すると、ログファイルへのログの書き込みはコミットのたびに行われるが、ディスクへのログファイルのフラッシュは 1 秒に約 1 回しか行われなくなる。MySQL-4.0.13 よりデフォルト値が 0 から 1 に変更された。 |
innodb_log_arch_dir |
ログのアーカイブを使用する場合に、いっぱいになったログファイルがアーカイブされるディレクトリ。現時点では、このパラメータを
innodb_log_group_home_dir
と同じ値に設定する必要がある。 |
innodb_log_archive |
現時点では、このパラメータを 0 に設定する必要がある。バックアップからのリカバリは MySQL が独自のログファイルを使って行うため、現時点では InnoDB のログファイルをアーカイブする必要はない。 |
innodb_buffer_pool_size |
InnoDB が、そのテーブルのデータやインデックスをキャッシュするために使用するメモリバッファのサイズ。この値が大きいほど、テーブル内のデータへのアクセスに必要なディスク I/O が少なくなる。データベース専用サーバでは、このパラメータをマシンの物理メモリの 80% にまで設定できる。ただし、物理メモリの競合によってオペレーティングシステムでページングが発生する可能性があるため、あまり大きな値は設定しないようにする。 |
innodb_buffer_pool_awe_mem_mb |
32 ビット版 Windows の AWE
メモリに配置されるバッファプールのサイズ(MB)。4.1.0
から利用可能で、32 ビット版 Windows
にのみ関係する。使用する 32 ビット版
Windows
オペレーティングシステムが、Address
Windowing Extensions(AWE)と呼ばれる 4 GB
を超えるメモリをサポートしている場合は、このパラメータを使用して
InnoDB バッファプールを AWE
物理メモリに割り当てることができる。指定可能な最大値は、64000。このパラメータを指定した場合、innodb_buffer_pool_size
は mysqld の 32
ビットアドレス空間におけるウィンドウとなる(このアドレス空間で
InnoDB が AWE
メモリをマップする)。その場合の
innodb_buffer_pool_size
に適したサイズは 500M。 |
innodb_additional_mem_pool_size |
InnoDB がデータディクショナリの情報とその他の内部データ構造を格納するために使用するメモリプールのサイズ。このパラメータの実際的な値は 2M であるが、アプリケーションで使用するテーブルの数が多いほど、この値を大きくする必要がある。InnoDB は、このプールのメモリを使い果たすと、オペレーティングシステムからメモリを割り当てるようになり、MySQL エラーログに警告メッセージを書き込む。 |
innodb_file_io_threads |
InnoDB におけるファイル I/O スレッドの数。通常、この値は 4 にする必要があるが、Windows ではこれより大きな数を指定するとディスク I/O の面で有利になる場合がある。 |
innodb_lock_wait_timeout |
ロック待機の状態になった InnoDB
トランザクションがロールバックされるまでのタイムアウト時間(秒)。InnoDB
は、ロックされる対象のテーブルにおいてトランザクションのデッドロックを自動的に検出し、そのトランザクションをロールバックすることができる。
しかしながら、LOCK TABLES
コマンドを使用したり、または同じトランザクションで
InnoDB
以外のトランザクションセーフのストレージエンジンを使用したりすると、InnoDB
が検出できないデッドロックが発生することがある。タイムアウトは、このような状況を解決するのに役立つ。 |
innodb_flush_method |
3.23.40 より使用可能。デフォルト値は
fdatasync 。これ以外に、O_DSYNC
を指定できる。 |
innodb_force_recovery |
警告: このオプションは、破損したデータベースからテーブルをダンプする必要がある緊急事態でのみ定義する必要がある。指定可能な値は 1 〜 6。それぞれの値の意味については、この後の「強制的なリカバリ」を参照。InnoDB では、安全対策として、このオプションが 0 より大きいときはユーザがデータを変更できないようになっている。このオプションは、バージョン 3.23.44 より使用可能。 |
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.