The first decisions to make about
configuration involve the configuration of data files, log files,
page size, and memory buffers. It is recommended that you define
data file, log file, and page size configuration before creating
InnoDB instance. Modifying data file or log
file configuration after the
InnoDB instance is
created may involve a non-trivial procedure, and page size can
only be defined when the
InnoDB instance is
In addition to these topics, this section provides information
InnoDB options in a
configuration file, viewing
initialization information, and important storage considerations.
Because MySQL uses data file, log file, and page size
configuration settings to initialize the
InnoDB instance, it is recommended that you
define these settings in a configuration file that MySQL reads
at startup, prior to initializing
the first time.
InnoDB is initialized when
the MySQL server is started, and the first initialization of
InnoDB normally occurs the first time you
start the MySQL server.
You can place
InnoDB options in the
[mysqld] group of any option file that your
server reads when it starts. The locations of MySQL option files
are described in Section 4.2.6, “Using Option Files”.
For example, on Windows, if mysqld is located
C:\Program Files\MySQL\MySQL Server
5.6\bin, start the MySQL server like
C:\> "C:\Program Files\MySQL\MySQL Server 5.6\bin\mysqld" --console
On Unix-like systems, mysqld is located in
bin directory of your MySQL
sell> bin/mysqld --user=mysql &
If you do not send server output to the console, check the error
log after startup to see the initialization information
InnoDB printed during the startup process.
For information about starting MySQL using other methods, see Section 2.10.5, “Starting and Stopping MySQL Automatically”.
InnoDB does not open all user tables and
associated data files at startup. However,
InnoDB does check for the existence of
tablespace files (
*.ibd files) that are
referenced in the data dictionary. If a tablespace file is not
InnoDB logs an error and continues
the startup sequence. Tablespace files that are referenced in
the redo log may be opened during crash recovery for redo
Review the following storage-related considerations before proceeding with your startup configuration.
In some cases, database performance improves if the data is not all placed on the same physical disk. Putting log files on a different disk from data is very often beneficial for performance. For example, you can place system tablespace data files and log files on different disks. You can also use raw disk partitions (raw devices) for
InnoDBdata files, which may speed up I/O. See Section 14.7.3, “Using Raw Disk Partitions for the System Tablespace”.
InnoDBis a transaction-safe (ACID compliant) storage engine for MySQL that has commit, rollback, and crash-recovery capabilities to protect user data. However, it cannot do so if the underlying operating system or hardware does not work as advertised. Many operating systems or disk subsystems may delay or reorder write operations to improve performance. On some operating systems, the very
fsync()system call that should wait until all unwritten data for a file has been flushed might actually return before the data has been flushed to stable storage. Because of this, an operating system crash or a power outage may destroy recently committed data, or in the worst case, even corrupt the database because of write operations having been reordered. If data integrity is important to you, perform some “pull-the-plug” tests before using anything in production. On OS X 10.3 and higher,
InnoDBuses a special
fcntl()file flush method. Under Linux, it is advisable to disable the write-back cache.
On ATA/SATA disk drives, a command such
hdparm -W0 /dev/hdamay work to disable the write-back cache. Beware that some drives or disk controllers may be unable to disable the write-back cache.
With regard to
InnoDBrecovery capabilities that protect user data,
InnoDBuses a file flush technique involving a structure called the doublewrite buffer, which is enabled by default (
innodb_doublewrite=ON). The doublewrite buffer adds safety to recovery following a crash or power outage, and improves performance on most varieties of Unix by reducing the need for
fsync()operations. It is recommended that the
innodb_doublewriteoption remains enabled if you are concerned with data integrity or possible failures. For additional information about the doublewrite buffer, see Section 14.12.1, “InnoDB Disk I/O”.
Before using NFS with
InnoDB, review potential issues outlined in Using NFS with MySQL.
Running MySQL server on a 4K sector hard drive on Windows is not supported with
innodb_flush_method=async_unbuffered, which is the default setting. The workaround is to use
configuration option is used to configure the
InnoDB system tablespace data files. The
should be a list of one or more data file specifications. If you
name more than one data file, separate them by semicolon
For example, the following setting explicitly creates a minimally sized system tablespace:
This setting configures a single 12MB data file named
ibdata1 that is auto-extending. No location
for the file is given, so by default,
creates it in the MySQL data directory.
Sizes are specified using
G suffix letters to
indicate units of KB, MB, or GB.
A tablespace containing a fixed-size 50MB data file named
ibdata1 and a 50MB auto-extending file
ibdata2 in the data directory can be
configured like this:
The full syntax for a data file specification includes the file name, its size, and several optional attributes:
attributes can be used only for the last data file in the
If you specify the
autoextend option for the
last data file,
InnoDB extends the data file
if it runs out of free space in the tablespace. The increment is
64MB at a time by default. To modify the increment, change the
If the disk becomes full, you might want to add another data file on another disk. For tablespace reconfiguration instructions, see Section 14.7.1, “Resizing the InnoDB System Tablespace”.
InnoDB is not aware of the file system
maximum file size, so be cautious on file systems where the
maximum file size is a small value such as 2GB. To specify a
maximum size for an auto-extending data file, use the
max attribute following the
autoextend attribute. Use the
max attribute only in cases where
constraining disk usage is of critical importance, because
exceeding the maximum size causes a fatal error, possibly
including a crash. The following configuration permits
ibdata1 to grow up to a limit of 500MB:
InnoDB creates tablespace files in the MySQL
data directory by default
datadir). To specify a
location explicitly, use the
For example, to create two files named
a directory named
InnoDB like this:
[mysqld] innodb_data_home_dir = /path/to/myibdata/ innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
A trailing slash is required when specifying a value for
InnoDB does not create directories, so make
sure that the
myibdata directory exists
before you start the server. Use the Unix or DOS
mkdir command to create any necessary
Make sure that the MySQL server has the proper access rights to create files in the data directory. More generally, the server must have access rights in any directory where it needs to create data files.
InnoDB forms the directory path for each data
file by textually concatenating the value of
innodb_data_home_dir to the
data file name. If the
innodb_data_home_dir option is
not specified in
my.cnf at all, the default
value is the “dot” directory
./, which means the MySQL data directory.
(The MySQL server changes its current working directory to its
data directory when it begins executing.)
If you specify
innodb_data_home_dir as an
empty string, you can specify absolute paths for the data files
listed in the
The following example is equivalent to the preceding one:
[mysqld] innodb_data_home_dir = innodb_data_file_path=/path/to/myibdata/ibdata1:50M;/path/to/myibdata/ibdata2:50M:autoextend
InnoDB creates two 48MB log files
in the MySQL data directory
The following options can be used to modify the default configuration:
You might use this option to place
InnoDBlog files in a different physical storage location than
InnoDBdata files to avoid potential I/O resource conflicts. For example:
[mysqld] innodb_log_group_home_dir = /dr3/iblogsNote
InnoDBdoes not create directories, so make sure that the log directory exists before you start the server. Use the Unix or DOS
mkdircommand to create any necessary directories.
Make sure that the MySQL server has the proper access rights to create files in the log directory. More generally, the server must have access rights in any directory where it needs to create log files.
innodb_log_files_in_groupdefines the number of log files in the log group. The default and recommended value is 2.
innodb_log_file_sizedefines the size in bytes of each log file in the log group. The combined size of log files (
innodb_log_files_in_group) cannot exceed a maximum value that is slightly less than 512GB. A pair of 255 GB log files, for example, approaches the limit but does not exceed it. The default log file size is 48MB. Generally, the combined size of the log files should be large enough that the server can smooth out peaks and troughs in workload activity, which often means that there is enough redo log space to handle more than an hour of write activity. The larger the value, the less checkpoint flush activity is needed in the buffer pool, saving disk I/O. For additional information, see Section 8.5.4, “Optimizing InnoDB Redo Logging”.
InnoDB undo logs are part of the
system tablespace. However, you can choose to store
InnoDB undo logs in one or more separate undo
tablespaces, typically on a different storage device.
configuration option defines the path where
InnoDB creates separate tablespaces for the
undo logs. This option is typically used in conjunction with the
options, which determine the disk layout of the undo logs
outside the system tablespace.
For more information, see Section 14.7.7, “Configuring Undo Tablespaces”.
specifies the page size for all
tablespaces in a MySQL instance. This value is set when the
instance is created and remains constant afterward. Valid values
are 16k (the default), 8k, and 4k. Alternatively, you can
specify page size in bytes (16384, 8192, 4096).
The default page size of 16k is appropriate for a wide range of
workloads, particularly for queries involving table scans and
DML operations involving bulk updates. Smaller page sizes might
be more efficient for OLTP workloads involving many small
writes, where contention can be an issue when a single page
contains many rows. Smaller pages might also be efficient with
SSD storage devices, which typically use small block sizes.
InnoDB page size close to the
storage device block size minimizes the amount of unchanged data
that is rewritten to disk.
MySQL allocates memory to various caches and buffers to improve
performance of database operations. When allocating memory for
InnoDB, always consider memory required by
the operating system, memory allocated to other applications,
and memory allocated for other MySQL buffers and caches. For
example, if you use
MyISAM tables, consider
the amount of memory allocated for the key buffer
key_buffer_size). For an
overview of MySQL buffers and caches, see
Section 188.8.131.52, “How MySQL Uses Memory”.
Buffers specific to
InnoDB are configured
using the following parameters:
innodb_buffer_pool_sizedefines size of the buffer pool, which is the memory area that holds cached data for
InnoDBtables, indexes, and other auxiliary buffers. The size of the buffer pool is important for system performance, and it is typically recommended that
innodb_buffer_pool_sizeis configured to 50 to 75 percent of system memory. The default buffer pool size is 128MB. For additional guidance, see Section 184.108.40.206, “How MySQL Uses Memory”. For information about how to configure
InnoDBbuffer pool size, see Configuring InnoDB Buffer Pool Size. Buffer pool size can be configured at startup.
On systems with a large amount of memory, you can improve concurrency by dividing the buffer pool into multiple buffer pool instances. The number of buffer pool instances is controlled by the by
innodb_buffer_pool_instancesoption. By default,
InnoDBcreates one buffer pool instance. The number of buffer pool instances can be configured at startup. For more information, see Section 220.127.116.11, “Configuring Multiple Buffer Pool Instances”.
innodb_additional_mem_pool_sizedefines size in bytes of a memory pool
InnoDBuses to store data dictionary information and other internal data structures. The more tables you have in your application, the more memory you allocate here. If
InnoDBruns out of memory in this pool, it starts to allocate memory from the operating system and writes warning messages to the MySQL error log. The default value is 8MB.
innodb_additional_mem_pool_sizeis deprecated in MySQL 5.6.3.
innodb_log_buffer_sizedefines the size in bytes of the buffer that
InnoDBuses to write to the log files on disk. The default size is 8MB. A large log buffer enables large transactions to run without a need to write the log to disk before the transactions commit. If you have transactions that update, insert, or delete many rows, you might consider increasing the size of the log buffer to save disk I/O.
innodb_log_buffer_sizecan be configured at startup. For related information, see Section 8.5.4, “Optimizing InnoDB Redo Logging”.
On 32-bit GNU/Linux x86, be careful not to set memory usage
glibc may permit the process heap
to grow over thread stacks, which crashes your server. It is a
risk if the memory allocated to the mysqld
process for global and per-thread buffers and caches is close
to or exceeds 2GB.
A formula similar to the following that calculates global and per-thread memory allocation for MySQL can be used to estimate MySQL memory usage. You may need to modify the formula to account for buffers and caches in your MySQL version and configuration. For an overview of MySQL buffers and caches, see Section 18.104.22.168, “How MySQL Uses Memory”.
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
Each thread uses a stack (often 2MB, but only 256KB in MySQL
binaries provided by Oracle Corporation.) and in the worst
case also uses
read_buffer_size additional memory.
On Linux, if the kernel is enabled for large page support,
InnoDB can use large pages to allocate memory
for its buffer pool and additional memory pool. See
Section 22.214.171.124, “Enabling Large Page Support”.