MySQL基础问题排查

更新时间:

概述

本文主要介绍使用阿里云ECS实例搭建MySQL时,基础问题排查相关的思路以及方法。

详细信息

说明

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

请根据现场实际情况,参考以下对应的解决方案。

无法启动

具体问题可参考链接:Linux实例中MySQL服务常见的无法启动或启动异常处理

无法连接

客户端连接MySQL时的各种错误判断,包括如下多种,需要根据报错进一步判断。

  • ERROR 1045 (28000): Access denied for user 'testcon'@'10.24.236.231' (using password: YES).

  • ERROR 2005 (HY000): Unknown MySQL server host 'rm-XXXXXXXXXXXX.mysql.rds.aliyuncs.com' (110).

  • ERROR 1449 (HY000): The user specified as a definer ('testcon'@'10.24.236.231') does not exist.

  • ERROR 2003 (HY000): Can't connect to MySQL server on 'test.mysql.rds.aliyuncs.com' (110).

  • ERROR 1135 (HY000): Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug.

  • ERROR 1130 (HY000): Host '192.168.1.3' is not allowed to connect to this MySQL server.

  • ERROR 1045 (HY000): #28000ip not in whitelist.

  • ERROR 5 (HY000): Out of memory (Needed 260400 bytes).

  • ERROR 1129 (HY000): Host '10.24.236.231' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'.

  • ERROR 1226 (42000): User 'testcon' has exceeded the 'max_user_connections' resource (current value: 2).

  • ERROR 1040 (HY000): Too many connections.

  • ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client that supports expired passwords.

  • The MYSQL server is running with the -rds-deny-access option so it cannot execute this statement.

  • Failed For Connect Mysql Server with high priv, please try again later or check the health of db #RDS00Connect Failed For Mysql Server No Response.

  • ERROR 1045 (28000): Access denied for user 'testcon'@'10.24.236.231' (using password: NO).

  • Client does not support authentication protocol requestedby server; consider upgrading MySQL client.

空间问题

产生问题的原因

  • Binlog 日志文件占用高。

  • 数据文件占用高。

  • 临时文件占用高。

  • 系统文件占用高。

实例空间使用情况可以通过 du -h进行查看。

解决方法

ECS实例支持扩容磁盘空间,升级磁盘空间是解决空间问题的有效方式之一。下面说明不升级空间的情况下解决空间问题的方法。

清理Binlog日志文件

Binlog 文件记录实例的事务信息,一般是开启的。如果短时间内实例 DML 操作生成了大量 Binlog 数据,有可能会导致超过实例磁盘空间打满。或者长时间没有清理binlog,binlog大量堆积,也会导致空间打满。 解决方法:

  • 自动清理binlog,通过参数expire_logs_days=30来配置binlog保留时长,定时清理。

  • 手动清理,手动删除前需要先确认主从库当前在用的binlog文件。

    • 主库:show master status;

    • 从库:show slave status\G

    • PURGE MASTER LOGS TO 'binlog.xxx';

清理数据文件

对于数据文件占用空间高的情况,可以通过清理数据的方式来减少空间占用情况,比如通过 drop table truncate table 来清理不再需要的数据。

  1. information_schema.tables 查询的数据容量。

    information_schema.tables 提供的是根据采样获取的表的部分统计信息,因此通过下面的查询获取的表、库数据尺寸和实际数据文件占用尺寸间会有出入(通常要小于实际数据文件占用空间)。

    从下图中可以看到,在收集表的统计信息前后反馈出的表数据量大小存在差异。

    20230922102158.jpg

    注:即使通过 analyze table 命令,重新收集统计信息,得到的数值通常也小于实际数据文件占用空间;比如本例的 16143 MB 也小于该表的数据文件实际占用空间。 由于数据文件在频繁的 DML 后会出现数据空洞的现象,比较接近实际数据文件占用空间的计算方法请参考:

    select      sum(data_length + index_length + data_free) / 1024 / 1024 from     information_schema.tables;

    注:因为 information_schema.tables 中提供的是采样统计数据,因此该计算方式在统计数据比较接近实际的情况下,才会比较接近真实空间占用情况。

  2. delete 删除数据。

    delete 操作不能够直接回收被删除数据占用的数据文件空间,这就好比排空泳池中水但泳池的占地面积不会发生改变一样。而且 delete 操作会生成相应的 Binlog 文件,会进一步恶化空间使用情况。 在 delete 操作删除数据后,需要通过 optimize table table_name; 操作来回收空间。

  3. 删除备份。

    定时清理备份。

释放临时文件

临时文件会随查询的结束或者会话的终止而自动释放,因此如果是临时文件导致实例空间满而锁定,可以通过终止会话来释放空间。

系统文件处理

系统文件涉及到 ibdata1 系统表空间文件和 ib_logfile0、ib_logfile1 日志文件。

  • ibdata1文件:

    InnoDB 引擎表由于支持多版本并发控制(MVCC),因此会将查询所需的Undo信息保存在系统文件 ibdata1 中。如果存在对一个 InnoDB 表长时间不结束的查询,而且在查询过程中表有大量的数据变化,则会生成大量的 Undo 信息,导致 ibdata1文件尺寸增加。由于 MySQL 内部机制的限制,ibdata1 文件目前是不支持收缩的。因此出现这样的情况,在不升级磁盘空间的前提下,比较好的解决方法是起个新的实例,通过 DTS 工具将数据迁移到新实例中。

  • ib_logfile 日志文件:

    ib_logfile0 和 ib_logfile1 日志文件保存 InnoDB 引擎表的事务日志信息,其文件大小尺寸固定,不可以改变。较大的尺寸在高并发事务的场景下有利于减少事务日志文件切换的次数,提高实例性能。