最近在巡檢的時候,發現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系統表的區別:
在錯誤日誌中追溯緣由,發現是在一次故障遷移中,刪除過ibdata1文件,在重啓以後,自動建立的ibdata1文件,但這幾張innodb系統表並沒加載到表空間中。這些錯誤雖然並不影響業務,但很影響備份,在錯誤日誌中大量出現,也是很煩的。
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 ;
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