💨

RDS MySQLの5.7から8へ事前チェックエラー対応

2024/04/25に公開

概要

RDS MySQLの5.7から8系へUpgradeする機会があった。
Upgrade時に事前チェックというものがあるが失敗したため記録を残す。
普通は既に終わっているはずなので需要はほぼないはず

問題内容

以下のエラーが発生した

17) Schema inconsistencies resulting from file removal or corruption
    Following tables show signs that either table datadir directory or frm file was removed/corrupted. Please check server logs, examine datadir to detect the issue and fix it before upgrade
    XXXX(Database) - present in INFORMATION_SCHEMA's INNODB_SYS_TABLES table but missing from TABLES table

XXXXはアプリケーションで使用しているDatabase名。

結論

中間データのテーブルが残っていたため、Infomation_SCHEMAのMetaデータ内で齟齬が発生していた。
齟齬というのはINNODB_SYS_TABLESには管理データがあるがTABLESには無い という点である。
これはデータが中途半端に存在している点が悪い。
対応策としては中途半端に残っている管理データを削除した。

対応までの道のり

■ INFOMATION_SCHEMAを見る

INNODB_SYS_TABLESをチェック

エクセルか何かに以下の結果を貼るとよい(後で比較する)

select * from information_schema.innodb_sys_tables;

TABLESをチェック

エクセルか何かに以下の結果を貼るとよい(後で比較する)

select * from information_schema.tables;

■ 取得したINNODB_SYS_TABLESとTABLESを比較

エラーとなっているデータベース名を起点に管理データに差分がないかを確認する。
今回は以下のような管理情報がINNODB_SYS_TABLESのみに存在していた。

差分

XXXX/#sql-ib11863-1543529396
XXXX/#sql-ib11954-1543529376
XXXX/#sql-ib11914-1587626658

中間テーブルのファイル名は#sql-ib接頭辞で始まるらしい

■ データベースから削除する

以下の様にアプリケーションのデータベースから中間テーブルをDropする。

use XXXX;
start transaction;
drop table `#mysql50##sql-ib11863-1543529396`;
drop table `#mysql50##sql-ib11954-1543529376`;
drop table `#mysql50##sql-ib11914-1587626658`; 

以下の様にInfomation_Schemaからレコードが削除されていることを確認する
OKならcommitする。

use INFORMATION_SCHEMA;
SELECT * FROM INNODB_SYS_TABLES;
commit;

Discussion