Para habilitar tabelas InnoDB
no MySQL
versão 3.23, veja Secção 7.5.2, “InnoDB no MySQL Versão 3.23”.
No MySQL-4.0 não é necessário se fazer nada específico para
habilitar tabelas InnoDB
.
O comportamento padrão no MySQL 4.0 e MySQL 4.1 é criar um
arquivo ibdata1
auto-extensível de 10 MB
no diretório de dados do MySQL e dois
ib_logfile
s de 5MB em
datadir
. (No MySQL-4.0.0 e 4.0.1 o arquivo
de dados é 64 MB e não é auto-extensível.)
Note: Para obter uma boa performance você deve definir explicitamente os parâmetros listados nos seguintes exemplos.
Se você não quiser utilizar tabelas InnoDB
,
você pode adicionar a opção skip-innodb
ao
seu arquivo de oção do MySQL.
A partir das versões 3.23.50 e 4.0.2 InnoDB
permite que o último arquivo de dados n linha
innodb_data_file_path
seja especificado como
auto-extensível. A sintaxe de
innodb_data_file_path
é a seguinte:
caminhodados:tamanhoespec;caminhodados:tamanhoespec;... ... ;caminhodados:tamanhoespec[:autoextend[:max:tamanhoespec]]
Se você especificar o último arquivo de dados coma a opção
autoextend, InnoDB
extenderá o último
arquivo de dados se ele ficar sem espaço no tablespace. O
aumento é de 8 MB a cada vez. Um exemplo:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend
instrui InnoDB
a criar apenas um único
arquivo de dados com tamanho inicial de 100 MB e que é
extendido em blocos de 8 MB quando o espaço acabar. Se o disco
ficar cheio você pode querer adicionar outro arquivo de dados a
outro disco, por exemplo. Então você tem que olhar o tamanho
de ibdata1
, arredondar o tamanho para baixo
até o múltiplo de 1024 * 1024 bytes (= 1 MB) mais próximo, e
especificar o tamanho arredondado de
ibdata1
explicitamente em
innodb_data_file_path
. Depois disto você
pode adicionar outros arquivos de dados:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend
Tenha cuidado com sistema de arquivos onde o tamanho máximo do arquivo é 2 GB. O InnoDB não está ciente disto. Neste sistemas de arquivos você pode querer especificar o tamanho máximo para o arquivo de dados:
innodb_data_home_dir = innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M
Um exemplo de my.cnf
simples. Suponha que você tenha um computador com
128 MB RAM e um disco rígido. Abaixo está o exemplo dos
parâmetros de configuração possíveis para
my.cnf
ou my.ini
para
o InnoDB. Nós consideramos que você está executando
MySQL-Max-3.23.50 ou posterior, our MySQL-4.0.2 ou posterior.
Este exemplo serve para a maioria dos usuários, tanto em Unix e
Windows, que não querem distribuir arquivos de dados InnoDB e
arquivos de log em vários discos. Isto cria um arquivo de dados
ibdata1
auto-extensível e dois arquivos de
log ib_logfile0
e
ib_logfile1
do InnoDB no
datadir
do MySQL (normalmente
/mysql/data
). O arquivo de log
ib_arch_log_0000000000
do InnoDB também
fica em datadir
.
[mysqld] # Você pode escrever outras opções do servidor MySQL aqui # ... # Arquivos de dados deve estar aptos # a guardar os seus dados e índices. # Esteja certo que você tem espaço # livre suficiente em disco. innodb_data_file_path = ibdata1:10M:autoextend # Defina o tamanho da área de buffer com # 50 - 80 % da meória do seu computador set-variable = innodb_buffer_pool_size=70M set-variable = innodb_additional_mem_pool_size=10M # Defina o tamanho do seu arquivo log # para 25 % da tamanho da área de buffer set-variable = innodb_log_file_size=20M set-variable = innodb_log_buffer_size=8M # Defina ..flush_log_at_trx_commit # com 0 se você puder perder # algumas das ultimas trnsações innodb_flush_log_at_trx_commit=1
Check that the MySQL server has the rights
to create files in datadir
.
Note que os arquivo de dados devem ser < 2 GB em alguns sistemas de arquivos! O tamanho combinado do arquivos de log devem ser < 4 GB. O tamanho combinado dos arquivos de dados devem ser >= 10 MB.
Quando você criar um banco de dados pela primeira vez, é
melhor que você inicie o servidor MySQL do prompt de comando.
Então InnoDB irá imprimir a informação sobre a criação do
banco de dados na tela e você poderá ver o que está
acontecendo. Veja abaixo na próxima seção como a saída na
tela se parece. Por exemplo, no Windows você pode iniciar
mysqld-max.exe
com:
your-path-to-mysqld\mysqld-max --console
Onde colocar o my.cnf
ou my.ini
no Windows? As regras
para o Windows são o seguinte:
Apenas o my.cnf
ou
my.ini
deve ser criado.
O arquivo my.cnf
deve ser colocado no
diretótio raiz do drive C:
.
O arquivo my.ini
deve ser colocado no
diretório WINDIR, e.g, C:\WINDOWS
ou
C:\WINNT
. Você pode usar o comando
SET
do MS-DOS para imprimir o valor de
WINDIR.
Se o seu PC utiliza um carrgador de boot onde o drive
C:
não é o drive de boot, então a
sua única opçào é usar o arquivo
my.ini
.
Onde especificar as opções no
Unix? No Unix o mysqld
lê
opções dos seguintes arquivos, se eles existirem, na seguinte
ordem:
/etc/my.cnf
Opções globais.
COMPILATION_DATADIR/my.cnf
Opções
específicas do servidor.
defaults-extra-file
O arquivo
especificado com --defaults-extra-file=...
.
~/.my.cnf
Opções específicas do
usuário
COMPILATION_DATADIR
é o dirertório de
dados do MySQL o qual foi especificado como uma opção do
./configure
quando o
mysqld
foi compilado. (normalmente
/usr/local/mysql/data
para uma instalação
binária ou /usr/local/var
para uma
instalação fonte).
Se você não estiver certo de onde mysqld
lê o seu my.cnf
ou
my.ini
, você pode dar o caminho como a
primeira opção de linha de comando para o servidor:
mysqld --defaults-file=your_path_to_my_cnf
.
O InnoDB forma o caminho do diretório a um arquivo de dados
concatenando textualmente
innodb_data_home_dir
a um nome de arquivo de
dados ou caminho em innodb_data_file_path
,
adicionando uma possível barra ou barra invertida entre eles se
for necessário. Se a palavra-chave
innodb_data_home_dir
não é mencionada em
my.cnf
, o padrão para ele é o diretório
'ponto' ./
que significa o
datadir
de MySQL.
Um exemplo de my.cnf
avançado. Suponha que você tenha um computador
Linux com 2 GB RAM e três disco rígidos de 60 GB (no caminho
de diretórios /
, /dr2
e /dr3
). Abaixo esta um exemplo de
parâmetros de configuração possíveis no arquivo
my.cnf
para o InnoDB.
Note que o InnoDB não cria diretórios:
você mesmo deve criá-los. Use o comando
mkdir
do Unix ou MS-DOS para criar o
diretório base do grupo de dados e de log.
[mysqld] # Você pode escrever outras opções do servidor MySQL aqui # ... innodb_data_home_dir = # Os arquivos de devem estar aptos a # guardar seus dados e índices innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend # Defina o tamanho da área de buffer para # 50 - 80 % da memória do seu computador, # mas esteja certo, no Linux x86, que o # total de memória usada é < 2 GB set-variable = innodb_buffer_pool_size=1G set-variable = innodb_additional_mem_pool_size=20M innodb_log_group_home_dir = /dr3/iblogs # .._log_arch_dir deve ser o mesmo # que .._log_group_home_dir innodb_log_arch_dir = /dr3/iblogs set-variable = innodb_log_files_in_group=3 # Defina o tamanho do arquivo de log # para cerca de 15% do tamanho da # área da buffer set-variable = innodb_log_file_size=150M set-variable = innodb_log_buffer_size=8M # Defina ..flush_log_at_trx_commit com # 0 se você puder permitir a perda de # algumas das ultimas transações. innodb_flush_log_at_trx_commit=1 set-variable = innodb_lock_wait_timeout=50 #innodb_flush_method=fdatasync #set-variable = innodb_thread_concurrency=5
Note que nós colocamos os dois arquivos de dados em discos
diferentes. O InnoDB preencherá o tablespace de tabela formado
pelos arquivos de dados de baixo para cima. Em alguns casos ele
aumentará o desempenho do banco de dados se todos os dados não
forem colocados no mesmo disco físico. Colocar os arquivos de
log em discos diferentes dos de dados é geralmente, benéfico
para o desempenho. Você pode usar
partições de discos raw
(dispositivos raw) como arquivos de dados. Em alguns Unixs eles
aumentam a E/S. Vejam a seção sobre gerenciamento de espaço
de arquivos no InnoDB para saber como especificá-los no
my.cnf
.
Aviso: no Linux x86 você deve ter cuidado par não definir um uso de memória muito alto. glibc permitirá que o área do processo cresça acima da pilha da thread, o que fará com que o seu servidor falhe. Isto é um risco se o valor de
innodb_buffer_pool_size + key_buffer + max_connections * (sort_buffer + read_buffer_size) + max_connections * 2 MB
é próximo de 2 GB ou exceda 2 GB. Cada thread usará uma pilha
(geralmente 2 MB, mas no binário da MySQL AB é somente 256 KB)
e no pior caso usará tmabém sort_buffer +
read_buffer_size
de memória adicional.
Como sintonizar outros parâmetros do
servidor mysqld
? Valores comuns
que servem para a maioria dos usuários são:
skip-locking set-variable = max_connections=200 set-variable = read_buffer_size=1M set-variable = sort_buffer=1M # Defina key_buffer com 5 - 50% # de sua RAM dependendo de quanto # você usa tabelas MyISAM, mas # mantenha key_buffer + tamanho da # área de buffer do InnoDB < 80% de # sua RAM set-variable = key_buffer=...
Note que alguns parâmetros são dados usando o formato do
parâmetro numérico de my.cnf
:
set-variable = innodb... = 123
, outros
(parâmetros string e booleanos) com outro formato:
innodb_... = ...
.
O significado dos parâmetros de configuração são os seguintes:
Opção | Descrição |
innodb_file_per_table |
Disponível a partir da versão 4.1.1. Esta opção faz com que o InnoDB
armazene cada tabela criada em seu próprio arquivo
.ibd . Veja a seção sobre
multiplos tablespaces. |
innodb_data_home_dir |
A parte comum do caminho do diretório para todos arquivos de dados
InnoDB. Se você não mencionar esta opção em
my.cnf , o padrão é o
datadir do MySQL. Você pde
especificá-lo também como uma string vazia, e neste
caso você poderá utilizar caminhos de arquivos
absolutos em innodb_data_file_path . |
innodb_data_file_path |
Caminho para os arquivos de dados individuais e os seus tamanhos. O
caminho do diretório completo para cada arquivo de
dados é obtido concatenando innodb_data_home_dir ao
caminho especificado aqui. O tamanho do arquivo é
especificado em megabytes, adicionando o 'M' depois da
especificação do tamanho. InnoDB também entende a
abreviação 'G', 1 G significa 1024 MB. A partir da
versão 3.23.44 você pode definir o tamanho do arquivo
maior que 4 GB em sistemas operacionais que seuportam
que suportam arquivos grandes. Em alguns sistemas
operacionais arquivos devem ser menor que 2 GB. Se você
não especificar
innodb_data_file_path , o
comportamento padrão a partir do versão 4.0 é criar
um arquivo de dados ibdata1 de 10
MB auto-extensível. A soma do tamanho dos arquivos
devem ser menores que 10 MB. |
innodb_mirrored_log_groups |
Número de cópias idênticas de grupos de log mantidos para os banco de dados. Atualmente deve ser definido com 1. |
innodb_log_group_home_dir |
Caminho do diretório de arquivos de log do InnoDB. Se você não
mencionar esta opção no my.cnf o
padrão é o datadir do MySQL. |
innodb_log_files_in_group |
Número de arquivos de log no grupo de log. O InnoDB escreve nos arquivos de modo circular. O valor recomendado aqui é 2. O valor padrão é 2. |
innodb_log_file_size |
Tamanho de cada arquivo de log em um grupo de logs em megabytes. Faixa de valores sensíveis de 1M a 1/n-th do tamanho do área de buffer especificado abaixo, onde n é o número de arquivos de log no grupo. Quanto maior é o valor, menos atividade de descarga é necessária na área de buffer, economizando E/S de disco. Mas arquivos de log maiores também significa que a recuperação será lenta no caso de falhas. O tamanho combinado do arquivo de log deve ser menor que 4GB em comutadores de 32 bits. O padrão é 5M. |
innodb_log_buffer_size |
O tamanho do buffer que o InnoDB utiliza para escrever o log em aruivos no disco. Faixa de valores sensíveis de 1M a 8M. Um buffer de log grande permite aumentar transações para executarem sem precisar de escrever o log em até se fazer um commit da transação. iAlem disso, se você tiver grande transações, fazer um buffer de log maior economiza E/S de disco. |
innodb_flush_log_at_trx_commit |
Normalmente é atribuido 1, significando que em um commit de uma transação o log é descarregado para o disco e as modificações feitas pela transação se tornam permanentes, sobrevivendo a uma falha no banco de dados. Se você estiver disposto a comprometer esta segrança e está executando transações pequenas, você pode definí-lo com 0 ou 2 para reduzir E/S de discos nos logs. O valor 0 significa que o log só é escrito no arquivo e este é descarregado pro disco aproximadamente uma vez por segundo. O valor 2 significa que o log é escrito no arquivo a cada commit, mas o arquivo de log só é descarregado em disco aproximadamente uam vez por segundo. O valor padrão é 1 a partir do MySQL-4.0.13; antes era 0. |
innodb_log_arch_dir |
O diretório onde arquivos de log totalmente escritos seriam escritos se
usarmos arquivamento de log. Atualmente o valor deste
parâmetro deve ser definido igual a
innodb_log_group_home_dir . |
innodb_log_archive |
Atualmente este valor deve ser definido com 0. Como a recuperação ai partir de um backup deve ser feito pelo MySQL usando os seus próprios arquivos de log, não há nenhuma necessidade de se arquivos os arquivos de log do InnoDB. |
innodb_buffer_pool_size |
O tamanho do buffer de memória que o InnoDB usa para armazenar dados e índices de suas tabelas. Quanto maior for este valor, menor será a necessidade de E/S de disco para acessar dados na tabela. Em um servidor de banco de dados dedicado você pode definir este parâmetro até 80% do tamanho da memória física da máquina. Não atribua um valor muito alto, pois a competição da memória física pode causar paginação no sistema operacional. |
innodb_buffer_pool_awe_mem_mb |
Tamanho da área de buffer em Mb, se estiver localizado na memória AWE do Windows 32 bits. Deiponível a partir da versão 4.1.0 e relevante apenas no Windows 32 bits. Se o seu Windows suporta mais 4GB de memória, chamado Address Windowing Extensions, você pode alolcar a área de buffer do InnoDB em uma memória física AWE usando este parâmetro. O maior valor possível para isto é 64000. Se este parâmetro for especificado, então innodb_buffer_pool_size é a janela no espaço de endereço de 32 bits do mysqld onde o InnoDB mapeia aquela memória AWE. Um bom valor para innodb_buffer_pool_size é 500M. |
innodb_additional_mem_pool_size |
Tamanho do pool da memória que o InnoDB utiliza para armazenar informações de dicionário de dados e outras estruturas de dados internas. Um bom valor aqui pode ser 2M, mas quanto mais tabelas você tiver em sua aplicação, mais você precisará alocar aqui. Se o InnoDB ficar sem memória neste pool, ele l começara a alocar memória do sistema operacional e a escrever mensagens de aviso no log de erro do MySQL. |
innodb_file_io_threads |
Número de threads de E/S de arquivos no InnoDB. Normalmente ele deve ser 4, mas no Windows E/S de disco pode se beneficiar de um número maior. |
innodb_lock_wait_timeout |
Tempo limite em segundos que uma transação InnoDB pode esperar por uma
trava antes de fazer um roll back. InnodDB detecta
automaticamente deadlocks de transações em sua
própria tabela bloqueada e faz um roll back da
transação. Se você utiliza o comando LOCK
TABLES , ou outro mecanismo de armazenamento
seguro com transações diferente do InnoDB na mesma
transação, então um deadlock pode crescer, o que não
seria notificado pelo InnoDB. Nestes casos o tempo
limite é útil para resolver a situação. |
innodb_flush_method |
(Disponível a partir da versão 3.23.40.) O valor padrão para este
parâmetro é fdatasync . Outra
opção é O_DSYNC . |
innodb_force_recovery |
Aviso: esta opção só deve ser definida em uma situação de emergência quando você quiser um dump de suas tabelas em um banco de dados corropido! Os valores possíveis são de 1 - 6. Veja abaixo na seção 'Forçando a recuperação' sobre o significado dos valores. Como uma medida segura o InnoDB previne que um usuário modifique os dados quando esta opção é > 0. Esta opção está disponível a partir da versão 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.