[+/-]
InnoDB
テーブルを使用しない場合は、InnoDB
スタートアップエンジンが無効になるように、--skip-innodb
オプションを指定してサーバーを起動します。
InnoDB
はトランザクションセーフな (ACID に準拠した)
MySQL
用のストレージエンジンであり、ユーザーデータを保護するためのコミット、ロールバック、およびクラッシュ復旧機能を備えています。しかし、もし基礎となる
OS
やハードウェアが広告どおりに機能しなければ、それを行うことはできません。多くの
OS
やディスクサブシステムが、性能を向上させるために書き込み操作を遅らせたり再指示したりするでしょう。いくつかの
OS
上で、ファイルのすべての未書き込みデータがフラッシュされるまで待つ必要があるそのシステムコール、fsync()
は、実際にデータが安定したストレージにフラッシュされる前に返されます。このため、OS
のクラッシュや停電によって最近コミットされたデータが破損したり、さらに最悪の場合、書き込み操作が再指示されたためにデータベースが破損することもありますもしデータの整合性が重要であるなら、製造で何かを利用する前に
「pull-the-plug」
テストを行うべきです。Mac OS X 10.3
以降のバージョンでは、InnoDB
は特別な fcntl()
ファイルフラッシュ法を利用します。Linux
下では、ライトバックキャッシュを無効にする
事をお勧めします。
ATA/SATA
ディスクドライブ上では、hdparm
-W0 /dev/hda
のようなコマンドがライトバックキャッシュを無効にする働きをします。いくつかのドライブやディスクコントローラでは、ライトバックキャッシュを無効にできない可能性があるので注意してください。
InnoDB
ストレージエンジンによって管理されている 2
つの重要なディスクベースリソースは、そのテーブル領域データファイルとログファイルです。もし
InnoDB
設定オプションをまったく指定しなければ、MySQL
は MySQL
データディレクトリに、ibdata1
という名前の 10M
バイトの自動延長と、ib_logfile0
と ib_logfile1
という名前の 5M
バイトのログファイルを作成します。高性能を得るには、次の例にあるように
InnoDB
パラメータを明示的に提供する必要があります。当然ながら、お使いのハードウェアとその要求に合うように、設定を編集する必要があります。
NFS
ボリューム上のデータファイルやログファイルを使用するように
InnoDB
を設定しないでください。そうでないと、ファイルがほかのプロセスによってロックされ、MySQL
から利用できなくなる可能性があります。
ここに表されている例は代表的なものです。InnoDB
に関連した設定パラメータに関する追加情報は、項9.3. 「InnoDB
スタートアップオプションとシステム変数」
を参照してください。
InnoDB
テーブル領域ファイルを設定するためには、my.cnf
オプションファイルの
[mysqld]
セクション内の
innodb_data_file_path
オプションを利用してください。Windows
上では、代わりに
my.ini
を利用することができます。innodb_data_file_path
の値は、1
つまたは複数のデータファイル仕様のリストでなければいけません。複数のデータファイルに名前を付けたら、セミコロン文字
(「;
」)
でそれらを区切ってください:
innodb_data_file_path=datafile_spec1
[;datafile_spec2
]...
たとえば次のように設定すると、デフォルトと同じ特性を持つテーブル領域が明示的に作成されます。
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend
この設定は、ibdata1
と名づけられた自動延長の単一 10M
バイトデータファイルを構成します。そのファイルの場所は指定されないため、InnoDB
がデフォルトでそれを MySQL
データディレクトリ内に作成します。
K バイト、M バイト、または G
バイトの単位を指定するために、K
、M
、または
G
の接尾辞文字を利用してサイズが指定されます。
データディレクトリ内で、ibdata1
と名づけられた固定サイズ 50M
バイトのデータファイルと、ibdata2
と名づけられた 50M
バイトの自動拡大ファイルを含むテーブル領域は、次のように設定されます:
[mysqld] innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
データファイル指定の完全な構文は、次のようにファイル名、そのサイズ、およびいくつかの省略可能な属性を含んでいます。
file_name
:file_size
[:autoextend[:max:max_file_size
]]
autoextend
および
max
属性は、innodb_data_file_path
行内の最後のデータファイルにのみ利用できます。
最後のデータファイルに
autoextend
オプションを指定すると、InnoDB
はもしテーブル領域の中に空き領域がなければデータファイルを拡大します。デフォルトで、インクリメントは一回に付き
8M
バイトとなっています。インクリメントを変更するには
innodb_autoextend_increment
システム変数を変更します。
もしディスクがいっぱいになると、別のディスク上に別のデータファイルを追加したくなるでしょう。テーブル領域を再設定するための手順については、項9.5. 「InnoDB
データおよびログファイルの追加、削除、またはサイズ変更」
を参照してください。
InnoDB
にはファイルシステムの最大サイズがわからないので、それが
2G
バイトのような小さい値の場合は注意してください。自動拡張データファイルの最大サイズを指定するには、autoextend
属性のあとに max
属性を指定してください。次の設定は、ibdata1
が最大 500M
バイトまで大きくなることを許容します:
[mysqld] innodb_data_file_path=ibdata1:10M:autoextend:max:500M
InnoDB
はデフォルトで
MySQL
データディレクトリ内にテーブル領域ファイルを作成します。場所を明示的に指定するには、innodb_data_home_dir
オプションを利用してください。たとえば、ibdata1
と ibdata2
と名づけられた 2
つのファイルを、/ibdata
ディレクトリ内で作成して利用するには、InnoDB
をこのように設定してください:
[mysqld] innodb_data_home_dir = /ibdata innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
InnoDB
はディレクトリを作成しないので、サーバーを起動する前に必ず
/ibdata
ディレクトリが存在することを確認してください。これは、ご自分が設定する別のログファイルにもすべて当てはまります。必要なディレクトリを作成するには、Unix
または DOS の場合 mkdir
コマンドを利用してください。
MySQL サーバーがデータディレクトリ内にファイルを作成するための正当なアクセス権を持っていることを確認してください。さらに一般的には、サーバーはデータファイルとログファイルを作成しなければいけないディレクトリ内にアクセス権を持っている必要があります。
InnoDB
は
innodb_data_home_dir
の値をテキストとしてデータファイル名に連結させ、必要に応じてパス名区切り文字
(スラッシュまたはバックスラッシュ)
を値の間に追加して、各データファイルのディレクトリパスを形作ります。もし
innodb_data_home_dir
オプションについて
my.cnf
内でまったく触れられなければ、MySQL
データディレクトリを意味する
「ドット」 ディレクトリ
./
がデフォルト値になります。(MySQL
サーバーは、実行を始めるときにその時起動しているディレクトリを、それ自体のデータディレクトリに変更します)。
もし
innodb_data_home_dir
を空の文字列として指定すれば、innodb_data_file_path
値内にリストされたデータファイルに完全なパスを指定することができます。次の例は、前出のものと同等です:
[mysqld] innodb_data_home_dir = innodb_data_file_path=/ibdata/ibdata1:50M;/ibdata/ibdata2:50M:autoextend
単純な
my.cnf
の例:
512M バイトの RAM と 1
台のハードディスクを備えたコンピュータがあるとします。次の例は、autoextend
属性を含む、InnoDB
のための my.cnf
か、my.ini
内で可能な設定パラメータを表しています。この例は、InnoDB
データファイルとログファイルをいくつかのディスクに分散することを希望しない、Unix
と Windows
両方のほとんどのユーザーに適しています。これは、MySQL
データディレクトリ内に、自動拡大データファイル
ibdata1
と、2 つの
InnoDB
ログファイル
ib_logfile0
と
ib_logfile1
を作成します。
[mysqld] # You can write your other MySQL server options here # ... # Data files must be able to hold your data and indexes. # Make sure that 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=256M innodb_additional_mem_pool_size=20M # # Set the log file size to about 25% of the buffer pool size innodb_log_file_size=64M innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1
データファイルはいくつかのファイルシステム内で 2G バイト未満でなければいけないことに注意してください。結合したログファイルのサイズは 4G バイト以下でなければいけません。結合したデータファイルのサイズは最低 10M バイトでなければいけません。
InnoDB
テーブル領域をはじめて作成するときは、MySQL
サーバーをコマンドプロンプトから起動するのが一番良い方法です。その後
InnoDB
がデータベース作成に関する情報を画面に表示するため、何が起こっているか知ることができます。たとえば、もし
Windows 上で mysqld が
C:\Program Files\MySQL\MySQL Server
5.1\bin
内にあった場合、次のように起動することができます。
C:\> "C:\Program Files\MySQL\MySQL Server 5.1\bin\mysqld" --console
もし画面にサーバーの出力を送らない場合、InnoDB
がスタートアッププロセス中に表示する内容からサーバーのエラーログを確認してください。
InnoDB
によって表示される情報の例については、項9.2.3. 「InnoDB
テーブル領域を作成する」
を参照してください。
サーバーが起動したときに読み込むオプションファイルとして、[mysqld]
グループ内に InnoDB
オプションを配置することができます。オプションファイルの場所に関しては、Using Option Files
で紹介されています。
もし MySQL
をインストールと設定ウィザードを利用して
Windows
上にインストールしたら、そのオプションファイルはお使いの
MySQL インストールディレクトリ内の
my.ini
ファイルになります。The Location of the my.ini File
を参照してください。
もしお使いの PC
が、C:
ドライブがブートドライブではないブートローダを利用していたら、残されたオプションは
Windows ディレクトリ (通常
C:\WINDOWS
) 内の
my.ini
ファイルを利用することだけです。WINDIR
の値をプリントするには、コンソールウィンドウ内のコマンドプロンプトで
SET
コマンドを利用することができます:
C:\> SET WINDIR
windir=C:\WINDOWS
mysqld
が特定のファイルからだけオプションを読み込むようにするには、次のようにサーバーを起動するときに
--defaults-file
オプションをコマンドラインの最初のオプションとして使用します。
mysqld --defaults-file=your_path_to_my_cnf
高度な
my.cnf
の例:
ディレクトリパス
/
、/dr2
、および
/dr3
に 2G バイト RAM と
3 つの 60G バイトハードディスクを持つ Linux
コンピュータを持っていると仮定してください。次の例は、InnoDB
の my.cnf
内で可能な設定パラメータを表しています。
[mysqld] # You can write your other MySQL server options here # ... innodb_data_home_dir = # # Data files must be able to hold your data and indexes innodb_data_file_path = /db/ibdata1:2000M;/dr2/db/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 < 2GB innodb_buffer_pool_size=1G innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # # Set the log file size to about 25% of the buffer pool size innodb_log_file_size=250M innodb_log_buffer_size=8M # innodb_flush_log_at_trx_commit=1 innodb_lock_wait_timeout=50 # # Uncomment the next line if you want to use it #innodb_thread_concurrency=5
場合によっては、一部のデータが異なるディスク上に置かれていれば、データベース性能が向上します。ログファイルをデータとは別のディスク上に置くことで、性能が向上することが多いです。どのようにするかを例で説明しています。これは、2
つのデータファイルを別々のディスクに、そしてログファイルを
3
つめのディスクにおきます。InnoDB
は最初のデータファイルを先に利用してテーブル領域を埋めていきます。InnoDB
データファイルとして、raw
ディスクパーティション (raw デバイス)
を利用することができ、そのおかげで I/O
のスピードが向上します。項9.2.2. 「共有テーブル領域に raw デバイスを利用する」
を参照してください。
32 ビット GNU/Linux x86
上では、メモリー使用を高く設定しすぎないように注意してください。glibc
はプロセスヒープがスレッドスタックよりも大きくなることを許容する可能性があり、そのためサーバーがクラッシュしてしまうかもしれません。もし次の式の値が
2G
バイトに近い、またはそれを上回っていたら危険です:
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
各スレッドはスタック (通常 2M
バイトですが、米国 Sun Microsystems, Inc.
が提供する MySQL バイナリ内ではわずか 256K
バイト)
を利用し、そして最悪の場合、sort_buffer_size
+ read_buffer_size
追加メモリーも利用します。
その他の mysqld サーバーパラメータのチューニング: 次の値は典型的なものであり、ほとんどのユーザーに適しています。
[mysqld]
skip-external-locking
max_connections=200
read_buffer_size=1M
sort_buffer_size=1M
#
# Set key_buffer 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=value
Linux
の場合、カーネルで大規模ページのサポートが有効になっていれば、InnoDB
は、バッファープールや追加メモリープールのメモリーを割り当てる際に大規模ページを使用できます。項4.5.9. 「大規模ページのサポートの有効化」
を参照してください。