AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 25036
Accepted
quanta
quanta
Asked: 2012-09-28 02:07:49 +0800 CST2012-09-28 02:07:49 +0800 CST 2012-09-28 02:07:49 +0800 CST

ERRO Não é possível encontrar ou abrir a tabela?

  • 772
  • 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):

  1. DROP TABLE --> ainda obtém o "não existe"

  2. 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ção p00*/' 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 .idbarquivo é 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
mysql innodb
  • 3 3 respostas
  • 26619 Views

3 respostas

  • Voted
  1. Derek Downey
    2012-09-28T08:31:26+08:002012-09-28T08:31:26+08:00

    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ã

    120927 16:57:04 [ERRO] Não é possível localizar ou abrir a tabela reportingdb/v3_zone_date_cpm7k#P#pcurrent_2012926 do dicionário de dados interno do InnoDB embora o arquivo .frm para a tabela exista.

    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:

    [ERRO] O MySQL está tentando abrir um identificador de tabela, mas o arquivo .ibd da tabela foo/v3_zone_date_cpm7k#P#pcurrent_2012822 não existe.

    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):

    • Faça um backup do seu servidor principal (apenas por precaução!)
    • Restaurar o backup em um servidor diferente
    • Faça um mysqldump da tabela:mysqldump -uuser -p reportingdb v3_zone_date_cpm7k > v3_zone_date_cpm7k.sql
    • copie v3_zone_date_cpm7k.sql para o servidor principal
    • No servidor principal, tente fazer isso:DROP TABLE reportingdb.v3_zone_date_cpm7k
    • Se isso funcionar, importe seu dumpfile: mysql -uuser -p reportingdb < v3_zone_date_cpm7k.sqlque deve restaurar essa tabela (com uma tabela de um mês)
    • Se DROP TABLEnão funcionar, tente mover o v3_zone_date_cpm7k.frmarquivo e outros arquivos para um local diferente e reiniciar o servidor. Em seguida, importe o arquivo de despejo

    A última etapa é em relação à mensagem de erro informando que você tem uma tabela órfã:

    Isso significa que existe um arquivo .frm órfão sem uma tabela correspondente dentro do InnoDB. Você pode descartar o arquivo .frm órfão excluindo-o manualmente. [src]

    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):

    • Copiei o v3_zone_date_cpm7k para um local diferente (como backup).
    • um problemaDROP 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

    [ERRO] Não é possível encontrar ou abrir a tabela v3_zone_date_cpm7k#P#p00 do dicionário de dados interno do InnoDB embora o arquivo .frm para a tabela exista.

    • 3
  2. RolandoMySQLDBA
    2012-09-28T07:51:39+08:002012-09-28T07:51:39+08:00

    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 movidos

    Acho 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 .ibdarquivo. Ele tinha um tablespace_id muito menor que 912. Aqui está o que eu o ajudei a fazer:

    • Instância MySQL separada criada
    • Escreveu o procedimento armazenado para criar e descartar a tabela InnoDB 911 vezes.
    • Tabela InnoDB criada (agora tablespace_id era 912)
    • Espaço de tabela descartado
    • .ibdAlterado no arquivo de backup
    • Espaço de tabela importado
    • MySQL despejou a tabela
    • Importou o mysqldump para o servidor original

    Cliente 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 .ibdarquivos na partição tivessem tablespace_ids idênticos.

    • 1
  3. Best Answer
    quanta
    2012-10-03T00:59:40+08:002012-10-03T00:59:40+08:00

    Problema resolvido executando o seguinte comando no mysql>prompt:

    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;
    

    depois comente no .sqlarquivo:

    -- DROP TABLE IF EXISTS `v3_zone_date_cpm7k`;
    -- /*!40101 SET @saved_cs_client     = @@character_set_client */;
    -- /*!40101 SET character_set_client = utf8 */;
    -- 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) */;
    -- /*!40101 SET character_set_client = @saved_cs_client */;
    

    e importar normalmente.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve