Arquivos enormes # sql-xxxx_xxxx.ibd na pasta mysql-data

3

Em um dos nossos bancos de dados mysql, o tamanho no disco é muito maior (28GB) do que os dados reais (~ 5GB), então eu dei uma olhada mais de perto nos arquivos contidos no mysql-data

Eu vejo os seguintes arquivos

12K     #sql-5254_eaa3.frm
8.9G    #sql-5254_eaa3.ibd
12K     #sql-537f_8d5b.frm
11G     #sql-537f_8d5b.ibd

Os itens acima permanecem mesmo após a reinicialização do mysql, reinicialização do servidor, etc.

Alguma ideia se estas são tabelas temporárias que sobreviveram um acidente? em um sistema de produção é seguro apenas removê-los ou eu preciso lidar com eles de uma maneira diferente?

A propósito, temos file_per_table definido como true.

obrigado antecipadamente por qualquer dica!

    
por webgr 28.02.2012 / 10:28

2 respostas

7

Os arquivos de tabela que você está vendo provavelmente são resultantes de uma operação ALTER TABLE que não pôde ser concluída. A parte relevante dos documentos do MySQL diz:

If MySQL crashes in the middle of an ALTER TABLE operation, you may end up with an orphaned temporary table inside the InnoDB tablespace. Using the Table Monitor, you can see listed a table with a name that begins with #sql-. You can perform SQL statements on tables whose name contains the character “#” if you enclose the name within backticks. Thus, you can drop such an orphaned table like any other orphaned table using the method described earlier. To copy or rename a file in the Unix shell, you need to put the file name in double quotation marks if the file name contains “#”.

então eu simplesmente emiti um DROP TABLE neles. Nota: Não simplesmente exclua os arquivos - caso contrário, você obterá as chamadas tabelas órfãs produzindo avisos de mecanismo de banco de dados como estes:

InnoDB: in InnoDB data dictionary has tablespace id N,
InnoDB: but tablespace with that id or name does not exist. Have
InnoDB: you deleted or moved .ibd files?
InnoDB: This may also be a table created with CREATE TEMPORARY TABLE
InnoDB: whose .ibd and .frm files MySQL automatically removed, but the
InnoDB: table still exists in the InnoDB internal data dictionary.
    
por 28.02.2012 / 13:55
3

i percebeu que isso pode ser um arquivo temporário. O melhor seria se você pudesse:

  • descarregue toda a sua base de dados

mysqldump -uuser -ppass database > file

  • elimine seu banco de dados e recrie-o do despejo

cat file | mysql -uuser -ppass database

aviso do final ainda se aplica.

minha resposta inicial:

esses nomes correspondem aos nomes das suas tabelas? muito provavelmente sim, em caso afirmativo - esses são apenas os arquivos de dados. O mecanismo de armazenamento innodb [extensão ibd sugere que você o use] não reduz os arquivos de dados. a única maneira de diminuí-los é:

  • despejar cada tabela e recriá-la:

mysqldump -uuser -ppass database tablename > file ; cat file | mysql -uuser -ppass database

  • execute "otimizar tabela tableName;" no mysql para cada uma das 'grandes' tabelas

aviso - ambas as operações levarão muito tempo [depende muito do número de índices nas tabelas, seu subsistema io; provavelmente estamos falando de horas, se não mais; irá bloquear as leituras. não execute isto durante as horas de produção.

    
por 28.02.2012 / 10:38

Tags