MySQL InnoDB - innodb_file_per_table contras?

32

Por padrão, o MySQL InnoDB armazena todas as tabelas de todos os bancos de dados em um arquivo global. Você pode alterar isso definindo innodb_file_per_table na configuração, que cria um arquivo de dados para cada tabela.

Eu estou querendo saber por que innodb_file_per_tablenão está ativado por padrão. Existem desvantagens em usá-lo?

Até o riacho
fonte

Respostas:

32

Eu tenho a resposta completa para este.

Uma vez que innodb_file_per_table seja instalado, e novas tabelas do InnoDB possam ser reduzidas usando ALTER TABLE <innodb-table-name> ENGINE=InnoDB';Isso reduzirá os novos .ibdarquivos GARANTIDOS.

Se você executar ALTER TABLE <innodb-table-name> ENGINE=InnoDB';em uma tabela do InnoDB criada antes de usar o innodb_file_per_table, ele retirará os dados e índices dessa tabela do arquivo ibdata1 e os armazenará em um .ibdarquivo. Isso deixará um pombo permanente inteiro no ibdata1 que nunca poderá ser reutilizado .

O ibdata1arquivo normalmente abriga quatro tipos de informações

Aqui está a maneira garantida de reduzir o arquivo ibdata1 praticamente para sempre ...

PASSO 01) MySQLDump todos os bancos de dados em um arquivo de texto SQL (chame-o SQLData.sql)

PASSO 02) Solte todos os bancos de dados (exceto esquemas mysql, information_schema e performance_schema)

PASSO 03) Shutdown mysql

PASSO 04) Adicione as seguintes linhas ao /etc/my.cnf

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
innodb_data_file_path=ibdata1:10M:autoextend

Nota: Qualquer que seja o seu conjunto para innodb_buffer_pool_size, verifique se innodb_log_file_size é 25% de innodb_buffer_pool_size.

  • PASSO 05) Exclua ibdata1, ib_logfile0 e ib_logfile1 ( consulte a atualização abaixo antes de excluir! )

Neste ponto, deve haver apenas o esquema mysql em / var / lib / mysql

  • PASSO 06) Reinicie o mysql

Isso recriará ibdata1 em 10 MB (não configure a opção), ib_logfile0 e ib_logfile1 em 1G cada

  • PASSO 07) Recarregar SQLData.sql no mysql

ibdata1 crescerá, mas conterá apenas metadados da tabela e dados intermitentes do MVCC.

Cada tabela do InnoDB existirá fora do ibdata1

Suponha que você tenha uma tabela do InnoDB chamada mydb.mytable. Se você entrar /var/lib/mysql/mydb, verá dois arquivos representando a tabela

  • mytable.frm (Cabeçalho do mecanismo de armazenamento)
  • mytable.ibd(Página inicial dos dados e índices da tabela para mydb.mytable)

ibdata1 nunca mais conterá dados e índices do InnoDB.

Com a opção innodb_file_per_table/etc/my.cnf , você pode executar o OPTIMIZE TABLE mydb.mytableOR ALTER TABLE mydb.mytable ENGINE=InnoDB;e o arquivo /var/lib/mysql/mydb/mytable.ibddiminuirá.

Eu fiz isso várias vezes na minha carreira como um DBA do MySQL sem nem um único problema depois disso. De fato, na primeira vez em que fiz isso, reduzi um arquivo ibdata1 de 50 GB em 50 MB.

De uma chance. Se você tiver outras dúvidas, envie-me um e-mail. Confie em mim. Isso funcionará a curto prazo e a longo prazo.

UPDATE 2013-07-02 15:08 EDT

Há uma ressalva que tenho a esse respeito que atualizei em outros posts meus, mas perdi isso: estou atualizando minha resposta um pouco mais com innodb_fast_shutdown porque eu costumava reiniciar o mysql e parar o mysql para fazer isso. Agora, essa etapa é vital porque todas as transações não confirmadas podem ter outras partes móveis dentro e fora dos logs de transações do InnoDB ( consulte Infra-estrutura do InnoDB ).

Observe que definir innodb_fast_shutdown como 2 também limparia os logs, mas ainda existem mais partes móveis e são selecionadas no Crash Recovery durante a inicialização do mysqld. Configuração de 0 é melhor.

RolandoMySQLDBA
fonte
Ótima informação - obrigado! 50 GB >> 50 MB - isso é impressionante!
UpTheCreek
Oi, eu tentei fazer exatamente como você escreveu aqui, o 'único' problema é que o servidor não inicia depois. se eu fizer o serviço mysql iniciá-lo apenas trava lá. Se eu voltar meu antigo arquivo cnf, tudo está bem. Você tem alguma pista disso?
Nicola Peluchetti
Esta pergunta é para Nicola: Você fez o passo 5 ???
RolandoMySQLDBA
Outra pergunta para @Nicola: quanta RAM você tem no seu sistema ???
RolandoMySQLDBA
2
Seja cuidadoso! A opção innodb_fast_shutdown=0deve ser definida no MySQL, antes de desligá-la para excluir os arquivos de log! ( ib_logfile0e ib_logfile1) Caso contrário, você poderá perder dados!
Totor
12

Veja bug .

Existem desvantagens em usá-lo?

  • mais arquivos abertos
  • abrir / reabrir sobrecarga
  • O arquivo .ibd não diminui (consulte 1 , 2 )

Eu sempre uso innodb_file_per_table em bancos de dados grandes.

alvosu
fonte
Mesmo que você não o use, os arquivos ibdata também não serão reduzidos :(
minaev 3/11/11
1
Obrigado. Também me pergunto por que não há opção para ter um arquivo por db?
UpTheCreek
1
@UpTheCreek, tabelas são entidades. Bancos de dados são grupos lógicos de entidades, em vez de entidades por si só. É mais óbvio com o MyISAM, onde bancos de dados são diretórios e tabelas são arquivos.
John Gardeniers
Só queria salientar que, embora os arquivos .ibd não encolher automaticamente , tampouco ibdata1, a alternativa ao arquivo-per-mesa. Pelo menos, é possível reduzir um .ibd usando optimize table, o que é trivial em comparação com o ibdata1.
precisa saber é o seguinte
8

innodb_file_per_table é ativado por padrão no MariaDB.

Alex
fonte
1
Não está na minha (a versão padrão no CentOS 7). Você precisa do equivalente ao MySQL 5.6.6 ou mais recente. Caso contrário, o padrão está desativado .
Lightness Races com Monica
2

A razão pela qual optei por não usar innodb_file_per_tableé que cada tabela é colocada em seu próprio arquivo, o que significa que cada tabela recebe sua própria sobrecarga separada (assinaturas de arquivo etc.), que faz com que o tamanho total e total do MySQLdiretório seja maior do que se estivesse usando um espaço de tabela compartilhado. Além disso, há mais espaço desperdiçado devido à folga do cluster ao ter vários arquivos pequenos em vez de um único e grande.

É verdade que a sobrecarga adicional não é uma quantia enorme no grande esquema, especialmente se você estiver usando uma unidade grande ou tiver um banco de dados gigante, mas para mim (e provavelmente muitos "usuários domésticos"), tudo foi adicionado e ainda era demais para a pequena unidade com clusters grandes onde eu mantinha minha loja MySQL.

Por exemplo, meu armazenamento de banco de dados com meus bancos de dados WordPress e alguns outros bancos de dados pequenos (phpBB, dev, alguns testes de AMP etc.), convertendo para tabela, alterou de 32 MB para 50 MB, e isso nem sequer inclui o ibdata1que ainda requer um mínimo de 10 MB , para um total de pelo menos 60 MB .

Como eu disse, isso pode não ser muito problemático para algumas pessoas, especialmente para as empresas, mas se você é um usuário doméstico que hospeda apenas seu site, blog etc., pode ser um fator importante em coisas como escolher um provedor de host porque muitos hosts limitam o tamanho do seu banco de dados, além do uso total do disco.

Synetech
fonte
1
Eu estava pensando que você era maluco (que se importa com dez megabytes ???) até você entender as cotas apertadas dos provedores de hospedagem. Jamais teria pensado nisso.
Dan Pritts 04/12/12
@ DanPritts, especialmente hosts gratuitos. Além disso, você pode ter um passeio gigante, mas nem todo mundo. Expandi minha partição principal de dados de 1 GB para 2 GB no ano passado porque estava muito apertada, mas mesmo 10 MB aqui e 10 MB ali (especialmente com arquivos de log) podem consumi-la rapidamente. Além disso, não se esqueça também do desperdício de cluster. Finalmente, não é necessariamente necessariamente um disco rígido . Por exemplo, atualmente estou "portablizando" meu site para que eu possa hospedá-lo em qualquer sistema, de modo que uma unidade flash de 2 GB já seja limitada. Portanto, manter os tamanhos pequenos e evitar gravações é fundamental. E depois há sistemas embarcados!
#
Além disso, não tem 10 MB (esse é o tamanho mínimo absolutoIBDATA1 ). Passou de 30 MB para ~ 85 MB. Excluindo tudo e importando um despejo do zero, acabei com 69 MB em vez dos 30 MB anteriores (um palpite sobre qual banco de dados ocupava mais da metade dele ☺). Por alguma razão, apesar de usar por tabela, o meu ibdata1ainda tem 18 MB. ☹
Synetech
Parece algo que eu tive com uma instalação do CMS com vs. um sem o selinux ativado, a julgar pelo tamanho dos arquivos de 32 milhões vs. 50 milhões. Eu realmente não posso acreditar nos números, quantos bancos de dados você tem que os metadados de alguns arquivos podem ter tamanho MEGABYTES em sistemas idênticos?
sjas
2

Só para adicionar um pouco mais de informação

Como o mysql 5.6.6 está ativado por padrão

PerroVerd
fonte
1

com innodb_file_per_table = 1, a tabela suspensa pode ficar mais lenta, veja aqui

Alex Zheng
fonte
e 'criar tabela' também pode ficar mais lento. Veja mysql-nordic.blogspot.co.il/2015/02/…
Dror Harari