2020年12月3日 星期四

解決MySQL ERROR 1577 (HY000)

MySQL ERROR 1577 (HY000) 一直困擾我的主備份、熱備份資料庫很久了。錯誤訊息顯示有資料表毀損,我也有用過遠端的基本修復和優化指令但都沒用。查一查資料可能是資料庫被升級但表結構沒升級的結果,反正能備份、能連能開能關就好,我不想進一步到系統層級去找網管自討沒趣。

這幾天開始有使用者來抱怨一些年代久遠(10y+)不維護的冷門AP「前幾天還在用怎今天就不行了」。我當時就知道應該是某個年代久遠的資料庫垮了,去問一定會遭受更多的侮辱「你怎麼不備份、你程式有問題..等」。想說服使用者別再用但最後被還是被使用者押著去找原因,想說好幸運沒碰到應該永遠也碰不到吧我多慮了,但下午還是被使用者去逮到網管(真神奇)。於是又押著我去找原因,弄沒多久使用者自知沒救跑了。我這時從他欲蓋彌彰的談話中知道,應該是「有某人」也發現了1577(HY000),「那個人」想嘗試解決時做了不正確的升級動作搞廢掉這台年代久遠的mysql,因此使用者的程式當然壞掉。

為了主資料庫著想,不要再有閒人想去修這個1577 (HY000)問題然後搞垮資料庫。還是讓專業的來吧,(十幾年前我也搞作業系統的(當時知道沒前途就改搞軟體))系統層其實也沒什麼我搞不定的。

根據錯誤訊息來看是event表出問題,查一下網路上都說去執行mysql_upgradeo指令沒什麼用。

 


靠別人不如靠自己。仔細再想想是因為被升級後系統表結構出的問題,那去找新的表結構吧..

mysql6以上的表 event 結構ddl
CREATE TABLE `event` (
  `db` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `name` char(64) NOT NULL DEFAULT '',
  `body` longblob NOT NULL,
  `definer` char(77) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `execute_at` datetime DEFAULT NULL,
  `interval_value` int(11) DEFAULT NULL,
  `interval_field` enum('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `last_executed` datetime DEFAULT NULL,
  `starts` datetime DEFAULT NULL,
  `ends` datetime DEFAULT NULL,
  `status` enum('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL DEFAULT 'ENABLED',
  `on_completion` enum('DROP','PRESERVE') NOT NULL DEFAULT 'DROP',
  `sql_mode` set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') NOT NULL DEFAULT '',
  `comment` char(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL DEFAULT '',
  `originator` int(10) unsigned NOT NULL,
  `time_zone` char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM',
  `character_set_client` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `collation_connection` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `db_collation` char(32) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
  `body_utf8` longblob,
  PRIMARY KEY (`db`,`name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Events';
修復表
cd /var/lib/mysql/mysql
mysql_upgrade -u root -h localhost -p --verbose --force

重啟mysql後不再有錯誤訊息出現



沒有留言:

張貼留言