mysql - não é possível descartar a tabela não existe, não é possível criar a tabela existe

4

Após uma falha no servidor, estamos tendo alguns problemas muito estranhos com uma referência de tabela específica.

Optando por uma restauração a partir do backup, o banco de dados foi descartado e um backup do dump SQL foi carregado, apenas isso falha na tabela de criação para cache_content com o erro "a tabela já existe"

mysql> create table cache_content( id int NOT NULL DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ERROR 1005 (HY000): Can't create table '****.cache_content' (errno: -1) mysql> drop table cache_content; ERROR 1051 (42S02): Unknown table 'cache_content'

Estranhamente, a tabela removida removeu o arquivo .frm, mas não o arquivo .ibd (se existir), a tabela de criação criará o arquivo .ibd, mas não o arquivo .frm.

Eu tentei vários métodos para restauração, incluindo a importação do dump em um novo banco de dados (concluído sem problemas), shuttind down mysql e copiando os arquivos .frm e .ibd relevantes, usando idbconnect para tentar anexar esta versão "conhecida":

... Space id: 1952673645 (0x74636F6D) Next record at offset: 74 TABLE_ID of '****/'.'cache_content' can not be 0 ...

Verificando as tabelas relacionadas em information_schema, posso ver que este é o caso e o TABLESPACE foi atribuído a 0

mysql> select * from INNODB_SYS_TABLES where 'SCHEMA'="*****";
+----------+--------+--------------------------+------+--------+-------+
| TABLE_ID | SCHEMA | NAME                     | FLAG | N_COLS | SPACE |
+----------+--------+--------------------------+------+--------+-------+
...

|    19791 | *****  | cache_content            |    1 |      9 |     0 |
+----------+--------+--------------------------+------+--------+-------+
N rows in set (0.01 sec)

mysql> select * FROM INNODB_SYS_INDEXES where TABLE_ID=19791;
+----------+--------+----------+------+----------+---------+-------+
| INDEX_ID | NAME   | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE |
+----------+--------+----------+------+----------+---------+-------+
|     7919 | expire |    19791 |    0 |        1 |  311158 |     0 |
+----------+--------+----------+------+----------+---------+-------+
1 row in set (0.00 sec)

Versão do servidor: Percona-Server-server-55-5.5.27-rel28.0.291.rhel6.x86_64

Agora, estou certo de que, pela leitura que fiz na remoção do ibdata1 ib_logfile *, talvez seja a única maneira de limpar essa referência "fantasma".

Minha pergunta: Existe alguma maneira de limpar essas referências fantasmas para permitir que a tabela seja restaurada a partir do backup?

    
por Oneiroi 28.08.2012 / 17:42

1 resposta

3

No final, optei por restaurar todos os bancos de dados de backups,

  1. mysqldump --all-databases --triggers > /path/to/dumpfile.sql
  2. service mysql shutdown
  3. rm -rf /path/to/datadir && mkdir /path/to/datadir && chown mysql.mysql /path/to/datadir
  4. iptables -I INPUT -p tcp --dport 3306 -j REJECT && service mysql start
  5. mysql_install_db --datadir=/path/to/datadir
  6. mysql < /path/to/dumpfile.sql
  7. Descarte e restaure os bancos de dados que não estavam intactos durante o 1. de backups individuais
  8. service mysql restart && service iptables restart

Estou deixando esta resposta aqui e a pergunta não aceita para a próxima semana; Espero que alguém possa fornecer uma solução em que o ibdata inteiro não precise de reconstrução.

    
por 28.08.2012 / 21:07

Tags