InnoDB:エラー:テーブル「mysql」。「innodb_table_stats」はmysql 5.6へのアップグレード後に見つかりません


41

5.5からmysql 5.6にアップグレードしたところ、起動時にログにこのようなメッセージが散らばっています

ここで解決策を見つけましたが、公式ではないようです。 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%の修正はありますか?


stackoverflow.com/questions/15767652/…のスレッドで繰り返します。.sqlファイルをダウンロードして、自分でテーブルを作成できます。
ベン・林

この質問以来、物事進んでいる可能性あります。@ 2018、古いmysqlの更新、同じ問題。実行が見つかりました:mysql_upgrade -u root -p --force && systemctl restart mysqldmysqlスキーマとすべての
データベースを

回答:


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を実行しているDBサーバーに移動するか、テストマシンにMySQL 5.6をインストールします。

ステップ02:これら5つのテーブルをテキストファイルにmysqldump

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を実行している任意のDBサーバーで実行できます。


1
5.5-Oracle 5.6からのLinuxアップグレードに関する問題を解決しました。いくつかのファントムテーブルを削除し、mysqlを停止し、不正なibdファイルを/ var / lib / mysql / mysqlから移動し、mysqlを再起動してから、Rolandoのステートメントを実行する必要がありました。ローランド、あなたはすごい。
グリフ14

3
解決していただきありがとうございます。MySQLのコミュニティ-serverパッケージのインストールと同じように、スクリプトは基本的にすべての必要があったことが含まれる書類を作成:cat /usr/share/mysql/mysql_system_tables.sql | mysql -uroot -p mysql
minni

1
私はこの問題を抱えており、「既に存在している」ため、テーブルをゼロから作成することはできません。私は、ファイルあたりのテーブルはInnoDBのための1つのビッグファイルから切り替えたと私は削除していたことが判明しibdata1たファイルを。MySQLは起動時にこれらのテーブルを再作成しなかったため、CREATE上記のステートメントを使用するためにテーブルを表すファイルをMySQLデータディレクトリから手動で移動する必要がありました(機能DROP TABLEしませんでした)。
クリストファーシュルツ

@ChristopherSchultz、これについて言及してくれてありがとう。これについては2015年8月に言及しました(dba.stackexchange.com/questions/111616/…)。少なくとも自分で見つけたのは良いことです。
RolandoMySQLDBA

おかげで問題が解決しました。ところで、上のバージョンで再インストールしているmysqlの手動アップグレードを行う前に、DBの最後のダンプを復元しているときに、上記の「テーブルが存在しません」というエラーが発生しました。
ash_01

9

Rolandoの答えは、いくつかの追加で私にとってはうまくいきました。SHOW TABLESを介してこれら5つのテーブルが表示されるという同じ問題がありましたが、テーブルに対するSELECTまたはその他の操作の結果、テーブルが見つかりませんでした。

この問題を解決するには、Rolandoの答えを使用して、次のことを行う必要がありました。

  • DROP TABLE <tablename> -5つのテーブルすべて

  • ファイルシステムで、残りの.ibdファイルを削除します(.frmファイルはによって削除されましたDROP TABLE

  • その後、mysqldインスタンスを停止して開始しました(必要かどうかわからない-嬉しくなりました)

  • CREATE TABLEローランドが提供ステートメントは、問題なく走りました。


1
起動DROP TABLE <tablename>時にもERROR 1051 (42S02): Unknown table '...'エラーメッセージが表示されますが、少なくとも.frmファイルはそれまでに消えてしまいました。
-superjos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.