在MySQL8.0中如何检测实例中是否仍残留MyISAM数据表

冬墨吖_6443

冬墨吖_6443

2026-10-15

926人浏览

原创

最直接可靠的方式是查 information_schema.tables 筛出非 innodb 表,执行 select table_schema, table_name, engine from information_schema.tables where engine != 'innodb' and table_schema not in ('information_schema','performance_schema','mysql','sys');

在mysql8.0中如何检测实例中是否仍残留myisam数据表

查 information_schema.TABLES 筛出非 InnoDB 表

这是最直接、最可靠的方式,不依赖 SHOW TABLE STATUS 的性能缺陷或权限限制。MyISAM 表在 ENGINE 字段中明确显示为 MyISAM,而不会被误标为其他引擎。

执行以下语句可列出所有数据库中所有非 InnoDB 的表(重点看 MyISAM,但也可能混有 MEMORY、COLUMNSTORE 等):

SELECT TABLE_SCHEMA, TABLE_NAME, ENGINE, TABLE_ROWS 
FROM information_schema.TABLES 
WHERE ENGINE != 'InnoDB' 
  AND TABLE_SCHEMA NOT IN ('information_schema', 'performance_schema', 'mysql', 'sys');

注意点:

  • TABLE_ROWS 对 MyISAM 是近似准确值,对其他引擎(如 InnoDB)只是估算,不能用于判断数据量
  • 如果查询卡住,可能是元数据锁或大库阻塞,可加 /*+ MAX_EXECUTION_TIME(5000) */ 限流(MySQL 5.7.8+ 支持)
  • 某些从库上 TABLE_ROWS 为 NULL,不代表引擎异常,而是表未加载元数据,需结合 ENGINE 字段判断

用 mysqlcheck -A 快速扫全实例

mysqlcheck 是 MySQL 自带的命令行工具,在服务运行时就能批量检查所有表,且对 MyISAM 表会真实触发文件读取(.MYD/.MYI),比纯 SQL 查询更贴近“物理存在”验证。

执行命令:

mysqlcheck -u root -p --all-databases --check-only

它会输出每张表的 OK 或报错信息;只要看到某张表返回了 test.dbname 这类路径,并且没报错,就说明该表物理文件存在且当前引擎仍为 MyISAM(因为 mysqlcheck 对非 MyISAM 表默认跳过检查或仅做轻量校验)。

常见干扰项:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 若输出含 Warning: 1 client is using or hasn't closed table,是并发写入导致的临时状态,不是引擎类型问题
  • 遇到 Table 'xxx' doesn't exist 说明表已被删,但 .frm 文件残留——这种不算“有效 MyISAM 表”,可忽略
  • 若提示 Access denied,确认用户有 SELECT 权限(mysqlcheck --check-only 依赖此权限读取元数据)

为什么不能只靠 SHOW CREATE TABLE 或 SHOW TABLE STATUS?

这两个命令容易给出误导性结论,尤其在迁移或升级后环境里。

SHOW CREATE TABLE 显示的是建表语句中的显式引擎声明,但若建表时没写 ENGINE=,它会 fallback 到当时的 default_storage_engine 设置——而该变量在 MySQL 8.0.23+ 已被标记为 deprecated,配置可能失效或被忽略;旧表也不会因配置变更自动转换引擎。

SHOW TABLE STATUS 更危险:

  • 在库大表多时性能极差,甚至阻塞其他查询
  • 不支持 WHERE 过滤,必须靠客户端筛选,无法直接定位 MyISAM
  • 输出字段名是 Engine,但大小写不敏感匹配,曾有案例因字符集问题显示为 myisam 小写,脚本解析失败

所以,宁可用 information_schema.TABLES 的精确匹配,也不要图省事用 SHOW TABLE STATUS LIKE '%'。

检查后发现 MyISAM 表,下一步必须确认是否真在用

查到 MyISAM 表不等于要立刻改引擎。有些场景下它是有意为之:比如日志归档表、只读报表缓存、或遗留 BI 工具强依赖 MyISAM 的 COUNT(*) 性能。

判断是否“真在用”的关键信号:

  • 查 INFORMATION_SCHEMA.INNODB_TRX 和 PROCESSLIST —— MyISAM 表的操作根本不会出现在这两张表里,所以如果某张 MyISAM 表长期无任何 INSERT/UPDATE/DELETE 连接痕迹,大概率已废弃
  • 看慢日志或 general_log 中是否还有对该表的 DML;没有记录,基本可判定冷数据
  • 用 myisamchk -s /path/to/db/table.MYI 检查索引头,若提示 MyISAM file not found,说明物理文件已丢失,只剩元数据残留

真正麻烦的是那些仍在写入、但没人知道为啥还在用 MyISAM 的表——这类最容易在崩溃后暴露,也最难推动改造。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2213

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1359

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

795

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

3032

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5108

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1139

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5371

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4722

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6254

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 187人学习