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%?


ทำซ้ำกับเธรดในstackoverflow.com/questions/15767652/…คุณสามารถดาวน์โหลดไฟล์. sql เพื่อสร้างตารางได้ด้วยตัวเอง
เบ็นหลิน

สิ่งที่อาจมีการย้ายไปตั้งแต่คำถามนี้ @ 2018 อัปเดต mysql เก่าปัญหาเดียวกัน ค้นพบการทำงาน: mysql_upgrade -u root -p --force && systemctl restart mysqldอัพเกรด schema mysql และ dbs ทั้งหมด, แก้ปัญหานี้
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';

ALTERNATIVE

วิธีแก้ปัญหาอื่นคือการสร้างสคริปต์จากอินสแตนซ์ MySQL 5.6

ขั้นตอนที่ 01 : ไปที่ DB Server ที่รัน 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บน DB Server ใด ๆ ที่รัน MySQL 5.5 ก่อนที่จะอัพเกรด


1
แก้ไขปัญหาของฉันในการอัปเกรด Linux จาก 5.5 - 5.6 ของ Oracle ต้องวางตาราง phantom บางส่วนหยุด mysql ย้ายไฟล์ ibd ที่ไม่ดีจาก / var / lib / mysql / mysql รีสตาร์ท mysql จากนั้นเรียกใช้คำสั่งของ Rolando .... และ Yay จะไม่มีข้อผิดพลาดในการเริ่มต้นและหวังว่าจะไม่มีความเสถียรอีกต่อไป Rolando คุณน่าทึ่ง
glyph

3
ขอบคุณสำหรับวิธีการแก้ปัญหาของคุณ เช่นเดียวกับการติดตั้งแพกเกจ mysql-community-server สคริปต์รวมที่จำเป็นต้องใช้สร้างคำสั่งทั้งหมด:cat /usr/share/mysql/mysql_system_tables.sql | mysql -uroot -p mysql
minni

1
ฉันมีปัญหานี้และการสร้างตารางตั้งแต่เริ่มต้นจะไม่ทำงานเพราะพวกเขา "มีอยู่แล้ว" ปรากฎว่าฉันเปลี่ยนจากไฟล์ขนาดใหญ่เป็นไฟล์ต่อตารางสำหรับ InnoDB และฉันได้ลบibdata1ไฟล์ของฉันไปแล้ว MySQL ไม่ได้สร้างตารางเหล่านี้ใหม่เมื่อเริ่มต้นและฉันต้องย้ายไฟล์ที่เป็นตัวแทนของตารางออกจากไดเรกทอรีข้อมูล MySQL ด้วยตนเองเพื่อใช้CREATEคำสั่งด้านบน (ใช้DROP TABLEงานไม่ได้)
Christopher Schultz

@ChristopherSchultz ขอบคุณสำหรับการกล่าวถึงนี้ ฉันพูดถึงเรื่องนี้ในเดือนสิงหาคมปี 2015 ( dba.stackexchange.com/questions/111616// ) อย่างน้อยคุณก็พบว่าเป็นของตัวเองซึ่งเป็นสิ่งที่ดี
RolandoMySQLDBA

ขอบคุณนี้แก้ปัญหาของฉัน btw ฉันพบข้อผิดพลาด "ไม่มีตาราง" ข้างต้นในขณะที่ฉันกำลังเรียกคืนการถ่ายโอนข้อมูลล่าสุดของฐานข้อมูลก่อนที่จะทำการอัพเกรดด้วยตนเองของ mysql ซึ่งกำลังติดตั้งกับรุ่นที่สูงขึ้น
ash_01

9

คำตอบของ Rolando ทำงานให้ฉันด้วยการเพิ่มบางอย่าง ฉันมีปัญหาเดียวกันกับตาราง 5 เหล่านี้แสดงผ่านตารางแสดง แต่เลือกหรือการดำเนินการอื่น ๆ ในตารางทำให้ไม่พบตาราง

ในการแก้ไขปัญหาโดยใช้คำตอบของ Rolando ฉันจำเป็นต้อง:

  • DROP TABLE <tablename> - ทั้งหมด 5 ตาราง

  • ในระบบไฟล์ลบไฟล์. ibd ที่เหลือ (ไฟล์. frm ถูกลบโดยDROP TABLE)

  • จากนั้นฉันก็หยุดและเริ่มอินสแตนซ์ mysqld (ไม่รู้ว่าจำเป็นหรือไม่ - ทำให้ฉันมีความสุข)

  • CREATE TABLEงบ Rolando ให้ไว้แล้ววิ่งโดยไม่มีปัญหา


1
เพียงพูดถึงว่าแม้เมื่อเปิดตัวDROP TABLE <tablename>ฉันยังคงได้รับERROR 1051 (42S02): Unknown table '...'ข้อความแสดงข้อผิดพลาด แต่อย่างน้อยไฟล์. frmก็หายไป
superjos
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.