MySQL 5.6 解決InnoDB: Error: Table "mysql"."innodb_table_stats" not found.問題

最近在巡檢的時候,發現mysql錯誤日誌中,報以下錯誤:  
1779986 2015-10-06 00:06:37 7f5215214700 InnoDB: Error: Table "mysql"."innodb_table_stats" not found.
1779987 2015-10-06 00:06:37 7f5215214700 InnoDB: Recalculation of persistent statistics requested for table "xxxx"."xxxxxx" but the required persistent statistics storage is not present or is corrupted. Using transient stats instead.
       通過排查,發現是mysql 的幾張系統表不見了,究竟是那幾張呢?
MySQL 5.6的ibdata1表空間包含了5個InnoDB基礎表,以下:
mysql> select table_name from information_schema.tables where table_schema='mysql' and engine='InnoDB';
+----------------------+
| table_name           |
+----------------------+
| innodb_index_stats   |
| innodb_table_stats   |
| slave_master_info    |
| slave_relay_log_info |
| slave_worker_info    |
+----------------------+
5 rows in set (0.00 sec)
        在MySQL 5.6以前,若是關閉MySQL後刪除ibdata1,再從新啓動MySQL的時候ibdata1會被從新建立, 但從MySQL 5.6開始,這5個表不會被重建,究其原因是由於這幾張表的存儲引擎是innodb,並且在MySQL5.5 中並無這幾張表。大體來看看5.6與5.5系統表的區別:
MySQL 5.5 系統表
 +---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
22 rows in set (0.00 sec)
MySQL 5.6 系統表
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               | 
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| innodb_index_stats        |
| innodb_table_stats        |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slave_master_info         |
| slave_relay_log_info      |
| slave_worker_info         |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
28 rows in set (0.00 sec)
         由上述統計能夠看到,在mysql5.6 中,除了增長了上述5張表,還添加了general_log 、slow_log 表,而且將5.5中的host表合到了5.6中的user表中。
        在錯誤日誌中追溯緣由,發現是在一次故障遷移中,刪除過ibdata1文件,在重啓以後,自動建立的ibdata1文件,但這幾張innodb系統表並沒加載到表空間中。這些錯誤雖然並不影響業務,但很影響備份,在錯誤日誌中大量出現,也是很煩的。
 
那麼對於這樣的錯誤,咱們該如何處理? 
一、若是是slave備機,中止複製,記錄pos等信息(對於不復制mysql庫來講,也沒有必要作這一步)
     mysql>stop slave ;
二、刪除上述系統表
    drop  table  mysql.innodb_index_stats;
    drop  table  mysql.innodb_table_stats;
    drop  table  mysql.slave_master_info;
    drop  table  mysql.slave_relay_log_info;
    drop  table  mysql.slave_worker_info ;

三、刪除相關的.frm與 .ibd 文件
      rm -rf  innodb_*_stats*
      rm -rf  slave_*
四、從新建立上述系統表
  • 從其餘機器上,使用mysqldump將這幾張表的表結構備份出來,放到該機器上從新執行,備份腳本以下:
    #!/bin/sh
    TABLELIST="innodb_index_stats"
    TABLELIST="${TABLELIST} innodb_table_stats"
    TABLELIST="${TABLELIST} slave_master_info"
    TABLELIST="${TABLELIST} slave_relay_log_info"
    TABLELIST="${TABLELIST} slave_worker_info"
    mysqldump -uroot -p mysql ${TABLELIST} > mysql_innodb_tables.sql
  • 將 mysql_innodb_tables.sql拷貝到出現壞表錯誤的那臺數據庫機器,並將其導入到系統庫mysql庫中.
    # mysql -uroot -p mysql < mysql_innodb_tables.sql
  • 運行FLUSH TABLES(可選)

 

五、重啓數據庫
六、啓動slave,若是報錯,從新change  master  
七、從新肯定錯誤日誌中有無相似報錯

注意:不要輕易刪除ibdata1文件,在不一樣的版本、不一樣的分支,系統表都有可能不太同樣,如mysql 5.6 與 MariaDB 10.0的系統表,mysql5.5 與mysql 5.6 的 系統表等等,在作遷移或升級時,很容易忽略掉這些細節,因此在作以前,必定要備份,不要任性而爲。

來自 「 ITPUB博客 」 ,連接:http://blog.itpub.net/30109892/viewspace-1982923/,如需轉載,請註明出處,不然將追究法律責任。php

相關文章
相關標籤/搜索