我第二次遇到了一个问题,我们的 MySQL 服务器(MariaDB v10.1)突然抛出错误 - 无法删除临时表:'./database_name/#sql-4593_791',错误:120。
遵循https://mariadb.com/resources/blog/get-rid-of-orphaned-innodb-temporary-tables-the-right-way/之类的指南不起作用,我仍然收到表不是的错误已知 ( ERROR 1051 (42S02): Unknown table 'database_name.#mysql50#sql-4593_1e9'
)
这个问题与删除孤立 InnoDB 临时表的其他问题的不同之处在于,数据库服务器似乎已经从磁盘和内存中删除了 .frm 文件(运行lsof | grep sql-4593_1e9
仅显示 .ibd 文件打开)
这会是问题的根源吗?如果是这样,有没有办法重新创建一个几乎无法访问的未知结构表的 .frm 文件?
我可以在数据库本身中唯一提到它的是运行:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql%';
输出以下内容:
+----------+-----------------------------+------+--------+---------+-------------+------------+---------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | FILE_FORMAT | ROW_FORMAT | ZIP_PAGE_SIZE |
+----------+-----------------------------+------+--------+---------+-------------+------------+---------------+
| 1576128 | database_name/#sql-4593_1e9 | 1 | 118 | 1576114 | Antelope | Compact | 0 |
| 1576129 | database_name/#sql-4593_78d | 1 | 118 | 1576115 | Antelope | Compact | 0 |
| 1576130 | database_name/#sql-4593_791 | 1 | 118 | 1576116 | Antelope | Compact | 0 |
+----------+-----------------------------+------+--------+---------+-------------+------------+---------------+
我不喜欢手动从磁盘中删除数据库文件,因为我不完全确定这不会导致问题。即使表空间 id 冲突的可能性几乎为零。
您在磁盘上的内容与索引内部数据字典中的内容之间存在脱节。MySQL 8.0 改进了数据字典的处理方式,但 mariadb 到 10.4 还没有实现它。
您不能直接删除它,因为它不会在磁盘上找到,但 innodb 仍然可以看到它。对于旧版本的 MySQL 和 MariaDB,您会在网上找到一些关于如何同步数据字典和磁盘的指南。但是,这是我发现更有效和更安全的方式:
rename table
,只要新数据库在同一个分区上)我已经使用过几次,我认为这是同步部分删除表的最简单、最快和更安全的方法。
重要
#sql-4593_1e9
的是临时表的格式,除非您认为它们确实是剩余的,否则请不要删除它们 - 可能有正在进行的事务需要在内部进行查询。换句话说,除非它们出现在没有任何连接的新服务器上,否则我不会碰它。