InnoDB: errore: tabella "mysql". "Innodb_table_stats" non trovato dopo l'aggiornamento a mysql 5.6


41

Ho aggiornato a mysql 5.6 dalla 5.5, e ora i miei log sono pieni di tali messaggi all'avvio

Ho trovato una possibile soluzione qui, ma non sembra ufficiale. 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.

Qualche soluzione ufficiale o correzioni al 100%?


ripeti con il thread in stackoverflow.com/questions/15767652/… Puoi scaricare il file .sql per creare la tabella da solo.
Ben Lin il

le cose potrebbero essere andate avanti da questa domanda. @ 2018, aggiornamento di un vecchio mysql, stesso problema. Trovato per l'esecuzione: mysql_upgrade -u root -p --force && systemctl restart mysqldaggiorna lo schema mysql e tutti i dbs, risolvendo questo problema
ProxiBlue

Risposte:


67

In precedenza ho risolto questo problema in: Impossibile aprire la tabella mysql / innodb_index_stats

Queste tabelle sono create per te quando installi MySQL 5.6. Tuttavia, l'aggiornamento da MySQL 5.5 non invoca la creazione di queste tabelle. Ecco gli script per crearli 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';

ALTERNATIVA

Un'altra soluzione alternativa sarebbe quella di creare lo script da un'istanza di MySQL 5.6.

Passo 01 : vai su un server DB che esegue MySQL 5.6 o installa MySQL 5.6 su una macchina di prova.

Step 02 : mysqldump queste 5 tabelle in un file di testo

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

Quindi, è possibile eseguire InnoDB_MySQL_Tables.sqlsu qualsiasi DB Server che esegue MySQL 5.5 prima dell'aggiornamento.


1
Risolto il mio problema con un aggiornamento di Linux dalla 5.5 - Oracle 5.6. Ho dovuto eliminare alcune tabelle fantasma, interrompere mysql, spostare i file ibd danneggiati da / var / lib / mysql / mysql, riavviare mysql, quindi eseguire le dichiarazioni di Rolando .... Rolando sei incredibile.
glifo

3
Grazie per la tua soluzione Come con l'installazione del pacchetto mysql-community-server, è incluso uno script che ha praticamente tutto il necessario per creare istruzioni:cat /usr/share/mysql/mysql_system_tables.sql | mysql -uroot -p mysql
minni

1
Ho avuto questo problema e la creazione delle tabelle da zero non avrebbe funzionato perché "esistevano già". Risulta che stavo passando da un file grande a file per tabella per InnoDB e avevo eliminato il mio ibdata1file. MySQL non ha ricreato queste tabelle all'avvio e ho dovuto spostare manualmente i file che rappresentano le tabelle dalla directory dei dati MySQL per utilizzare le CREATEistruzioni sopra ( DROP TABLEnon ha funzionato).
Christopher Schultz,

@ChristopherSchultz grazie per averlo menzionato. Ne ho parlato nell'agosto 2015 ( dba.stackexchange.com/questions/111616/… ). Almeno l'hai scoperto da solo, il che è positivo.
RolandoMySQLDBA

Grazie questo risolto il mio problema. a proposito, ho riscontrato l'errore "tabella non esiste" sopra durante il ripristino dell'ultimo dump di DB prima di eseguire l'aggiornamento manuale di mysql che viene reinstallato con una versione successiva.
ash_01,

9

La risposta di Rolando ha funzionato per me con alcune aggiunte. Ho avuto lo stesso problema, con queste 5 tabelle mostrate tramite SHOW TABLES, ma SELECT o altre operazioni sul tavolo hanno portato a non trovare la tabella.

Per risolvere il problema, usando la risposta di Rolando, dovevo:

  • DROP TABLE <tablename> - tutte e 5 le tabelle

  • Nel file system, eliminare i file .ibd rimanenti (i file .frm sono stati rimossi da DROP TABLE)

  • Mi sono quindi fermato e ho avviato l'istanza mysqld (non so se fosse necessario, mi ha reso felice)

  • Le CREATE TABLEdichiarazioni fornite da Rolando sono state quindi eseguite senza problemi.


1
solo per citare che anche al momento del lancio DROP TABLE <tablename>ho ancora ricevuto il ERROR 1051 (42S02): Unknown table '...'messaggio di errore, ma almeno il file .frm è scomparso da allora.
Superjos,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.