InnoDB: ошибка: таблица «mysql». «Innodb_table_stats» не найдена после обновления до mysql 5.6

41

Я обновил MySQL до версии 5.6 с 5.5, и теперь при запуске мои журналы завалены такими сообщениями.

Я нашел здесь возможное решение, но оно не кажется официальным. 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.

Какие-нибудь официальные решения или 100% исправления?

giorgio79
источник
Повторите с потоком в stackoverflow.com/questions/15767652/… Вы можете скачать файл .sql, чтобы создать таблицу самостоятельно.
Бен Лин
после этого вопроса все могло продолжиться. @ 2018, обновление старого mysql, та же проблема. Найдено для запуска: mysql_upgrade -u root -p --force && systemctl restart mysqldобновляет схему mysql и все базы данных, решая эту проблему
ProxiBlue

Ответы:

67

Ранее я обращался к этой проблеме в: Не удается открыть таблицу mysql / innodb_index_stats

Эти таблицы создаются для вас при установке MySQL 5.6. Однако обновление с MySQL 5.5 не вызывает создание этих таблиц. Вот сценарии для их создания вручную:

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';

АЛЬТЕРНАТИВА

Другой обходной путь - создание сценария из экземпляра MySQL 5.6.

Шаг 01 : Перейдите на сервер БД под управлением MySQL 5.6 или установите MySQL 5.6 на тестовом компьютере.

Шаг 02 : mysqldump эти 5 таблиц в текстовый файл

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

Затем вы можете запустить InnoDB_MySQL_Tables.sqlна любом сервере БД под управлением MySQL 5.5 перед обновлением.

RolandoMySQLDBA
источник
1
Решил мою проблему при обновлении Linux с 5.5 до Oracle 5.6. Пришлось удалить некоторые фантомные таблицы, остановить mysql, переместить поврежденные файлы ibd из / var / lib / mysql / mysql, перезапустить mysql, затем выполнить операторы Rolando .... и Yay больше нет ошибок при запуске и, надеюсь, больше нет нестабильности. Роландо, ты потрясающий.
символ
3
Спасибо за ваше решение. Как и в случае установки пакета mysql-community-server, включен сценарий, который содержит в основном все необходимые операторы create:cat /usr/share/mysql/mysql_system_tables.sql | mysql -uroot -p mysql
minni
1
У меня была эта проблема, и создание таблиц с нуля не сработало бы, потому что они «уже существовали». Оказывается, я перешел с одного большого файла на файл на таблицу для InnoDB, и я удалил свой ibdata1файл. MySQL не создавал заново эти таблицы при запуске, и мне пришлось вручную перемещать файлы, представляющие таблицы, из каталога данных MySQL, чтобы использовать приведенные CREATEвыше операторы ( DROP TABLEне работало).
Кристофер Шульц
@ChristopherSchultz спасибо за упоминание этого. Я упоминал об этом еще в августе 2015 года ( dba.stackexchange.com/questions/111616/… ). По крайней мере, вы узнали сами, что хорошо.
RolandoMySQLDBA
Спасибо, это решило мою проблему. Кстати, я столкнулся с ошибкой «таблица не существует» выше, при восстановлении последнего дампа БД перед выполнением ручного обновления mysql, который переустанавливается с более высокой версией.
ash_01
9

Ответ Роландо работал для меня с некоторыми дополнениями. У меня была та же проблема, с этими 5 таблицами, отображаемыми через SHOW TABLES, но SELECT или другие операции с таблицей привели к тому, что таблица не найдена.

Чтобы решить проблему, используя ответ Роландо, мне нужно было:

  • DROP TABLE <tablename> - все 5 столов

  • В файловой системе удалите оставшиеся файлы .ibd (файлы .frm были удалены с помощью DROP TABLE)

  • Затем я остановился и запустил экземпляр mysqld (не знаю, был ли он нужен - сделал меня счастливым)

  • В CREATE TABLEзаявлении Роландо предоставляемом побежало без проблем.

Асока Диггс
источник
1
просто упомянуть, что даже при запуске DROP TABLE <tablename>я все еще получал ERROR 1051 (42S02): Unknown table '...'сообщение об ошибке, но по крайней мере файл .frm к тому времени исчез.
Superjos