InnoDB: Erro: Tabela “mysql”. “Innodb_table_stats” não encontrado após a atualização para o mysql 5.6

41

Atualizei para o mysql 5.6 a partir do 5.5 e agora meus logs estão repletos de mensagens na inicialização

Encontrei uma solução possível aqui, mas não parece oficial. http://forums.mysql.com/read.php?22,578559,579891#msg-579891

2013-12-06 21:08:00 7f87b1d26700 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
2013-12-06 21:08:00 7f87b1d26700 InnoDB: Recalculation of persistent statistics requested for table "drupal"."sessions" but the required persistent statistics storage is not present or is corrupted. Using transient stats instead.
2013-12-06 21:08:07 7f903c09c700 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.

Alguma solução oficial ou correções de 100%?

giorgio79
fonte
repita com o thread em stackoverflow.com/questions/15767652/… Você pode baixar o arquivo .sql para criar a tabela sozinho.
Ben Lin
as coisas podem ter mudado desde essa pergunta. @ 2018, atualizando um mysql antigo, mesmo problema. Encontrado para executar: mysql_upgrade -u root -p --force && systemctl restart mysqldatualizações mysql esquema e todos os dbs, resolver esta questão
ProxiBlue

Respostas:

67

Eu já resolvi esse problema em: Não é possível abrir a tabela mysql / innodb_index_stats

Essas tabelas são criadas para você quando você instala o MySQL 5.6. No entanto, a atualização do MySQL 5.5 não invoca a criação dessas tabelas. Aqui estão os scripts para criá-los manualmente:

innodb_index_stats

USE mysql;
CREATE TABLE `innodb_index_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `index_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `stat_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `stat_value` bigint(20) unsigned NOT NULL,
  `sample_size` bigint(20) unsigned DEFAULT NULL,
  `stat_description` varchar(1024) COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`database_name`,`table_name`,`index_name`,`stat_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;

innodb_table_stats

USE mysql;
CREATE TABLE `innodb_table_stats` (
  `database_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `table_name` varchar(64) COLLATE utf8_bin NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `n_rows` bigint(20) unsigned NOT NULL,
  `clustered_index_size` bigint(20) unsigned NOT NULL,
  `sum_of_other_index_sizes` bigint(20) unsigned NOT NULL,
  PRIMARY KEY (`database_name`,`table_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0;

slave_master_info

USE mysql;
CREATE TABLE `slave_master_info` (
  `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file.',
  `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log currently being read from the master.',
  `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last read event.',
  `Host` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '' COMMENT 'The host name of the master.',
  `User_name` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The user name used to connect to the master.',
  `User_password` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The password used to connect to the master.',
  `Port` int(10) unsigned NOT NULL COMMENT 'The network port used to connect to the master.',
  `Connect_retry` int(10) unsigned NOT NULL COMMENT 'The period (in seconds) that the slave will wait before trying to reconnect to the master.',
  `Enabled_ssl` tinyint(1) NOT NULL COMMENT 'Indicates whether the server supports SSL connections.',
  `Ssl_ca` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The file used for the Certificate Authority (CA) certificate.',
  `Ssl_capath` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The path to the Certificate Authority (CA) certificates.',
  `Ssl_cert` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the SSL certificate file.',
  `Ssl_cipher` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the cipher in use for the SSL connection.',
  `Ssl_key` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The name of the SSL key file.',
  `Ssl_verify_server_cert` tinyint(1) NOT NULL COMMENT 'Whether to verify the server certificate.',
  `Heartbeat` float NOT NULL,
  `Bind` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'Displays which interface is employed when connecting to the MySQL server',
  `Ignored_server_ids` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The number of server IDs to be ignored, followed by the actual server IDs',
  `Uuid` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The master server uuid.',
  `Retry_count` bigint(20) unsigned NOT NULL COMMENT 'Number of reconnect attempts, to the master, before giving up.',
  `Ssl_crl` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The file used for the Certificate Revocation List (CRL)',
  `Ssl_crlpath` text CHARACTER SET utf8 COLLATE utf8_bin COMMENT 'The path used for Certificate Revocation List (CRL) files',
  `Enabled_auto_position` tinyint(1) NOT NULL COMMENT 'Indicates whether GTIDs will be used to retrieve events from the master.',
  PRIMARY KEY (`Host`,`Port`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Master Information';

slave_relay_log_info

USE mysql;
CREATE TABLE `slave_relay_log_info` (
  `Number_of_lines` int(10) unsigned NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.',
  `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the current relay log file.',
  `Relay_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The relay log position of the last executed event.',
  `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.',
  `Master_log_pos` bigint(20) unsigned NOT NULL COMMENT 'The master log position of the last executed event.',
  `Sql_delay` int(11) NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.',
  `Number_of_workers` int(10) unsigned NOT NULL,
  `Id` int(10) unsigned NOT NULL COMMENT 'Internal Id that uniquely identifies this record.',
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Relay Log Information';

slave_worker_info

USE mysql;
CREATE TABLE `slave_worker_info` (
  `Id` int(10) unsigned NOT NULL,
  `Relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Relay_log_pos` bigint(20) unsigned NOT NULL,
  `Master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Master_log_pos` bigint(20) unsigned NOT NULL,
  `Checkpoint_relay_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Checkpoint_relay_log_pos` bigint(20) unsigned NOT NULL,
  `Checkpoint_master_log_name` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `Checkpoint_master_log_pos` bigint(20) unsigned NOT NULL,
  `Checkpoint_seqno` int(10) unsigned NOT NULL,
  `Checkpoint_group_size` int(10) unsigned NOT NULL,
  `Checkpoint_group_bitmap` blob NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='Worker Information';

ALTERNATIVO

Outra solução alternativa seria criar o script a partir de uma instância do MySQL 5.6.

Etapa 01 : Vá para um servidor de banco de dados executando o MySQL 5.6 ou instale o MySQL 5.6 em uma máquina de teste.

Etapa 02 : mysqldump essas 5 tabelas em um arquivo de texto

INNODB_TABLES="innodb_index_stats"
INNODB_TABLES="${INNODB_TABLES} innodb_table_stats"
INNODB_TABLES="${INNODB_TABLES} slave_master_info"
INNODB_TABLES="${INNODB_TABLES} slave_relay_log_info"
INNODB_TABLES="${INNODB_TABLES} slave_worker_info"
mysqldump -uroot mysql ${INNODB_TABLES} > InnoDB_MySQL_Tables.sql

Em seguida, você pode executar InnoDB_MySQL_Tables.sqlem qualquer servidor DB executando o MySQL 5.5 antes de atualizar.

RolandoMySQLDBA
fonte
1
Resolvi meu problema em uma atualização do Linux da versão 5.5 - da Oracle 5.6. Tive que largar algumas tabelas fantasmas, parar o mysql, mover os arquivos ibd ruins de / var / lib / mysql / mysql, reiniciar o mysql, depois executar as instruções de Rolando ... e Yay não mais erros de inicialização e, esperançosamente, não mais instabilidade. Rolando você é incrível.
glifo
3
Obrigado pela sua solução. Como na instalação do pacote mysql-community-server, é incluído um script que basicamente contém todas as instruções create:cat /usr/share/mysql/mysql_system_tables.sql | mysql -uroot -p mysql
minni
1
Eu tive esse problema e criar as tabelas do zero não funcionaria porque elas "já existiam". Acontece que eu estava mudando de um arquivo grande para um arquivo por tabela para o InnoDB e excluí meu ibdata1arquivo. O MySQL não recriou essas tabelas na inicialização e eu tive que mover manualmente os arquivos que representam as tabelas para fora do diretório de dados do MySQL, a fim de usar as CREATEinstruções acima ( DROP TABLEnão funcionou).
Christopher Schultz
@ChristopherSchultz obrigado por mencionar isso. Mencionei isso em agosto de 2015 ( dba.stackexchange.com/questions/111616/… ). Pelo menos você descobriu por si mesmo, o que é bom.
RolandoMySQLDBA
Graças isso resolveu meu problema. btw, eu encontrei o erro "tabela não existe" acima enquanto estou restaurando o último despejo de banco de dados antes de fazer a atualização manual do mysql, que está sendo instalada com uma versão superior.
ash_01 27/12/18
9

A resposta de Rolando funcionou para mim com algumas adições. Eu tive o mesmo problema, com essas 5 tabelas exibidas via SHOW TABLES, mas SELECT ou outras operações na tabela resultaram na tabela não encontrada.

Para resolver o problema, usando a resposta de Rolando, eu precisava:

  • DROP TABLE <tablename> - todas as 5 mesas

  • No sistema de arquivos, exclua os arquivos .ibd restantes (os arquivos .frm foram removidos por DROP TABLE)

  • Então parei e iniciei a instância do mysqld (não sei se era necessário - fiquei feliz)

  • As CREATE TABLEdeclarações fornecidas por Rolando foram executadas sem problemas.

Asoka Diggs
fonte
1
apenas para mencionar que, mesmo ao iniciar DROP TABLE <tablename>, ainda recebi a ERROR 1051 (42S02): Unknown table '...'mensagem de erro, mas pelo menos o arquivo .frm desapareceu até então.
superjos