- Versão do MySQL: 5.5.24
Devido ao seguinte problema:
mysql> desc reportingdb.v3_zone_date_cpm7k;
ERROR 1146 (42S02): Table 'reportingdb.v3_zone_date_cpm7k' doesn't exist
/var/log/mysqld.log
120927 16:57:04 [ERROR] Cannot find or open table reportingdb/v3_zone_date_cpm7k#P#pcurrent_2012926 from
the internal data dictionary of InnoDB though the .frm file for the
table exists. Maybe you have deleted and recreated InnoDB data
files but have forgotten to delete the corresponding .frm files
of InnoDB tables, or you have moved .frm files to another database?
or, the table contains indexes that this version of the engine
doesn't support.
See http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting.html
how you can resolve the problem.
(ainda não descobri o motivo)
Os arquivos da tabela ainda existem no datadir:
-rw-rw---- 1 mysql mysql 8932 Sep 26 16:50 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k.frm
-rw-rw---- 1 mysql mysql 84 Sep 26 16:50 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k.par
-rw-rw---- 1 mysql mysql 9437184 Sep 13 17:56 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#MERGER_2012828.ibd
-rw-rw---- 1 mysql mysql 1048576 Sep 27 15:42 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#MERGER_2012926.ibd
Esta é a tabela DDL de um backup de um mês (portanto, as partições foram alteradas), mas para referência:
CREATE TABLE `v3_zone_date_cpm7k` (
`campaignid` mediumint(9) NOT NULL DEFAULT '0' COMMENT 'sub_campaignid',
`zoneid` smallint(6) NOT NULL DEFAULT '0',
`bannerid` mediumint(9) NOT NULL DEFAULT '0',
`totalclick` mediumint(9) unsigned NOT NULL DEFAULT '0',
`realclick` mediumint(9) unsigned NOT NULL DEFAULT '0',
`clickcharge` mediumint(9) NOT NULL DEFAULT '0',
`totalview` mediumint(9) unsigned NOT NULL DEFAULT '0',
`viewcharge` mediumint(9) unsigned NOT NULL DEFAULT '0',
`dt` date NOT NULL DEFAULT '0000-00-00',
`partnerid` smallint(6) unsigned NOT NULL DEFAULT '0',
KEY `ix_zoneid` (`zoneid`,`dt`),
KEY `ix_dt` (`dt`),
KEY `ix_campaignid` (`bannerid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY RANGE (TO_DAYS(dt))
(PARTITION p00 VALUES LESS THAN (0) ENGINE = InnoDB,
PARTITION p04 VALUES LESS THAN (734965) ENGINE = InnoDB,
PARTITION p05 VALUES LESS THAN (735025) ENGINE = InnoDB,
PARTITION MERGER_2012822 VALUES LESS THAN (735102) ENGINE = InnoDB,
PARTITION pcurrent_2012822 VALUES LESS THAN (735103) ENGINE = InnoDB,
PARTITION pcurrent_2012823 VALUES LESS THAN (735104) ENGINE = InnoDB)*/
Vou recuperar esta tabela siga este guia. Mas em 2c. passo, recebo os erros abaixo:
mysql> alter table v3_zone_date_cpm7k_restore discard tablespace;
ERROR 1031 (HY000): Table storage engine for 'v3_zone_date_cpm7k_restore' doesn't have this option
http://bugs.mysql.com/bug.php?id=52422
O que eu posso fazer agora?
ATUALIZAR
Estou restaurando a partir do backup, qual é o procedimento correto para se livrar desse problema?
O que eu tentei (no outro servidor):
DROP TABLE --> ainda obtém o "não existe"
Parar o MySQL
Mova todos os arquivos da tabela para outro local
Copie os arquivos de backup para o banco de dados correspondente
Inicie o MySQL:
120927 19:12:07 InnoDB: Error: table 'reportingdb/v3_zone_date_cpm7k#P#MERGER_2012828'
InnoDB: in InnoDB data dictionary has tablespace id 741528,
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.
InnoDB: Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html
InnoDB: for how to resolve the issue.
InnoDB: We removed now the InnoDB internal data dictionary entry
InnoDB: of table `reportingdb`.`v3_zone_date_cpm7k` /* Partition `MERGER_2012828` */.
120927 19:12:07 InnoDB: error: space object of table 'reportingdb/v3_zone_date_cpm7k#P#MERGER_2012926',
InnoDB: space id 921829 did not exist in memory. Retrying an open.
120927 19:12:07 InnoDB: Error: table `reportingdb`.`v3_zone_date_cpm7k` /* Partition `pcurrent_2012926`
*/ does not exist in
the InnoDB internal
InnoDB: data dictionary though MySQL is trying to drop it.
InnoDB: Have you copied the .frm file of the table to the
InnoDB: MySQL database directory from another database?
InnoDB: You can look for further help from
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting.html
ATUALIZAÇÃO Sex 28 de setembro 08:21:49 ICT 2012
Siga sua sugestão, tenho:
- parou o MySQL
- movido v3_zone_date_cpm7k* para outro local
- iniciou o MySQL
importou o arquivo .sql e deu o erro:
ERRO 1050 (42S01) na linha 25: Tabela '
reportingdb
.v3_zone_date_cpm7k
/* Partiçãop00
*/' já existe
o log de erros mostra:
120928 8:26:42 InnoDB: Warning: trying to init to the tablespace memory cache
InnoDB: a tablespace 932889 of name './reportingdb/v3_zone_date_cpm7k#P#p00.ibd',
InnoDB: but a tablespace 932783 of the same name
InnoDB: already exists in the tablespace memory cache!
InnoDB: We assume that InnoDB did a crash recovery, and you had
InnoDB: an .ibd file for which the table did not exist in the
InnoDB: InnoDB internal data dictionary in the ibdata files.
InnoDB: We assume that you later removed the .ibd and .frm files,
InnoDB: and are now trying to recreate the table. We now remove the
InnoDB: conflicting tablespace object from the memory cache and try
InnoDB: the init again.
e o .idb
arquivo é criado automaticamente após a reinicialização:
# ls -l /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#p00.ibd
-rw-rw---- 1 mysql mysql 65536 Sep 28 08:35 /var/lib/mysql/reportingdb/v3_zone_date_cpm7k#P#p00.ibd
Passei um pouco de tempo tentando reproduzir o erro no esquema de partição, mas não consigo obter o erro exato com a tabela órfã
Ao mover o arquivo .ibd da partição para fora do diretório de dados (o que parece ter acontecido de alguma forma), recebo um erro esperado:
De uma discussão no bate-papo, sei que você tem um arquivo de backup desatualizado. A menos que seja possível forçar a queda da partição 'pcurrent_2012926' (alguma perda de dados), as etapas para restaurar esse backup são as seguintes (infelizmente, um mês de perda de dados):
mysqldump -uuser -p reportingdb v3_zone_date_cpm7k > v3_zone_date_cpm7k.sql
DROP TABLE reportingdb.v3_zone_date_cpm7k
mysql -uuser -p reportingdb < v3_zone_date_cpm7k.sql
que deve restaurar essa tabela (com uma tabela de um mês)DROP TABLE
não funcionar, tente mover ov3_zone_date_cpm7k.frm
arquivo e outros arquivos para um local diferente e reiniciar o servidor. Em seguida, importe o arquivo de despejoA última etapa é em relação à mensagem de erro informando que você tem uma tabela órfã:
Eu realmente espero que isso não seja necessário e você possa restaurar a partição por outros meios. Este é um método de último recurso.
Finalmente reproduzi seu erro inicial. Embora isso faça pouco para restaurar a partição, pode ser útil entender para evitar que isso aconteça no futuro (potencial problema em como o processo de backup/restauração é tratado ou como as partições são criadas):
DROP TABLE v3_zone_date_cpm7k
copie os arquivos v3_zone_date_cpm7k DE VOLTA para o datadir
desc v3_zone_date_cpm7k;
ERROR 1146 (42S02): Table 'v3_zone_date_cpm7k' doesn't exist
Existe um número especial registrado com cada tabela InnoDB. É chamado de id do tablespace. É um número que é atribuído na criação da tabela e registrado no dicionário de dados dentro de ibdata1.
Existe uma maneira de fazer esse problema desaparecer, mas você deve passar por muitos obstáculos para conseguir isso. Tenha em mente que se você copiar uma tabela InnoDB para outro disco, executar qualquer tipo de DDL e tentar copiar os dados da tabela de volta, há uma pequena possibilidade de fazer com que os ids de tablespace se tornem incompatíveis.
A única pessoa sobre a qual já li sobre essa recuperação é Chris Calender , que é o guia ao qual você fez referência. Já escrevi sobre isso antes.
Mar 25, 2012
: Por que o InnoDB armazena todos os bancos de dados em um arquivo?Apr 23, 2012
: restaurar a tabela do arquivo .frm e .ibd?Sep 28, 2011
: Como recuperar uma tabela InnoDB cujos arquivos foram movidosAcho que seu problema pode ter a ver com o próprio id do tablespace. No post de 28 de setembro que mencionei, ajudei um cliente de hospedagem de banco de dados que encontrou essa mesma referência. O problema dele era este:
O tablespace_id desta tabela era 912. Ele tentou restaurar uma cópia antiga do
.ibd
arquivo. Ele tinha um tablespace_id muito menor que 912. Aqui está o que eu o ajudei a fazer:.ibd
Alterado no arquivo de backupCliente tinha 30 tabelas que ele tinha que fazer. Eu só escrevi o procedimento armazenado para ele. Eu não fiquei para os detalhes sangrentos. No entanto, o cliente recuperou todas as tabelas do InnoDB, correspondendo a todos os tablespace_ids corretamente.
No seu caso, honestamente, não sei se o método de Chris Calender funcionaria corretamente em uma tabela particionada. Acho que a ideia seria fazer com que todos os
.ibd
arquivos na partição tivessem tablespace_ids idênticos.Problema resolvido executando o seguinte comando no
mysql>
prompt:depois comente no
.sql
arquivo:e importar normalmente.