InnoDB : 오류 : mysql 5.6으로 업그레이드 한 후 테이블“mysql”.“innodb_table_stats”를 찾을 수 없습니다


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 파일을 다운로드하여 직접 테이블을 작성할 수 있습니다.
Ben Lin

이 질문 이후로 상황 이 진행 되었을 있습니다. @ 2018, 오래된 mysql을 업데이트하면 같은 문제가 발생합니다. 실행 결과 : mysql_upgrade -u root -p --force && systemctl restart mysqldmysql 스키마 및 모든 DB를 업그레이드하여이 문제를 해결
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을 실행하는 DB 서버로 이동하거나 테스트 머신에 MySQL 5.6을 설치합니다.

2 단계 :이 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을 중지하고 / var / lib / mysql / mysql에서 잘못된 ibd 파일을 이동 한 다음 mysql을 다시 시작한 다음 Rolando의 문을 실행해야했습니다. 롤란도 당신은 훌륭합니다.
글리프

3
솔루션 주셔서 감사합니다. mysql-community-server 패키지 설치와 마찬가지로 기본적으로 필요한 모든 create 문이 포함 된 스크립트가 포함되어 있습니다.cat /usr/share/mysql/mysql_system_tables.sql | mysql -uroot -p mysql
minni

1
나는이 문제가 있었고 테이블이 처음부터 "이미 존재하기 때문에"작동하지 않을 것입니다. InnoDB의 하나의 큰 파일에서 테이블 당 파일로 전환하고 파일을 삭제 한 것으로 나타났습니다 ibdata1. MySQL은 시작할 때 이러한 테이블을 다시 만들지 않았으며 CREATE위 의 문 을 사용하기 위해 테이블을 나타내는 파일을 MySQL 데이터 디렉토리 밖으로 수동으로 이동해야했습니다 ( DROP TABLE작동하지 않음).
Christopher Schultz

@ChristopherSchultz는 이것을 언급 해 주셔서 감사합니다. 나는 이것을 2015 년 8 월에 다시 언급했다 ( dba.stackexchange.com/questions/111616/… ). 적어도 당신은 스스로 알아 냈어요.
RolandoMySQLDBA

감사합니다.이 문제가 해결되었습니다. btw, 더 높은 버전으로 다시 설치하는 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.