MySQL数据库最常见的6种故障的排除方法

news2025/1/10 2:13:37

MySQL数据库最常见的6中故障的排除方法

1.MySQL无法启动

2.MySQL连接不上

3.MySQL打开文件失败

4.MySQL挂起(hung)

5.MySQL崩溃(crash)

6.忘记用户密码

1.MySQL无法启动

1.无法访问系统资源

2.参数设置错误

无法访问系统资源

检查访问文件和目录的权限 测试:

# sudo -u mysql touch /home/mysql/data/filename

有访问文件和目录的权限,但是仍然会被拒绝访问

mysql> system sudo -u mysql touch /home/mysql/data/a 
mysql> create table t1 (id int primary key,n varchar(10)) data directory='/home/mysql/data'; 
ERROR 1030(HY000):Got error 168 from storage engine 
原因:mysqld进程的访问被Linux的selinux或apparmor给阻止

系统资源被其它进程占用

# mysqld --no-defaults --console --user mysql
2020-11-03T03:36:07.519419Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19)starting as process 21171
2020-11-03T03:36:07.740347Z 1 (ERROR] [MY-012574] nnoDB] Unable to lock ./ibdata1 error: 11
原因:另外一个 mysqld 进程已经启动并占用了对应的文件

查询 MySQL启动时调用参数文件的顺序

$ mysqld --verbose --help| grep "Default options "-A 1 
Default options are read from the following files in the given order: 
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf

显示mysqld 程序将要调用的参数

$ mysqld --print-defaults 
usr/sbin/mysqld would have been started with the following arguments: 
.... 
这个命令和 my_print_defaults mysqld 完全是等价的,只不过后者的显示方式是一行一个参数

对可疑的参数进行调试

在mysqld 后加上第一个参数--no-defaults,这个参数的作用是通知 mysld 在启动的时候不要读任何参数文件;

第二个参数是--console,这个参数会把错误信息输出到屏幕上,这个参数带来的一个弊端是所有的信息都输出到屏幕上,让屏幕显得比较乱,但对于我们调试却是很方便的;

第三个参数是--log-error-verbosity=3,这个参数会显示详细的日志;

然后再在后面加上有把握的参数,可以一次只加一个参数,然后启动 mysqld,采用排除法逐步找出错误的参数

参数调试的例子

# mysqld --no-defaults --console --log-error-verbosity=3 --user mysql --gtid_mode=on
......
2020-11-03T07:14:21.632851Z 0 [ERROR][MY-010912] [Server] GTID_MODE = ON requiresENFORCE GTID CONSISTENCY = ON.
.......
需要我们同时设置参数GTID MODE和 ENFORCE GTID CONSISTENCY 同时为 on

2.MySQL连接不上

客户端连接 MySQL失败的三个原因

MySQL服务器上的进程 mysqld 没有正常运行

客户端不能和进程mysqld 通信

账户密码的问题

MySQL服务器上的进程mysqld 没有正常运行

遇到这种情况首先到服务器上看看 mysgld 进程是否活着,采用的命令是

mysqladmin ping 或 ps -ef l grep mysqld

客户端不能和进程mysqld 通信

进行网络连通的测试:

telnet localhost 3306

如果本地能通,再到客户端的机器上把 localhost 换成 MySQL 服务器的 ip 地址进行测试

如果不能通,通常有两种原因:

一种原因是 OS或网络的问题,或者是防火墙:

另一种原因是mysqld 自身根本没有侦听客户端的连接请求

mysqld启动后对于客户端的侦听的三种情况

使用参数 --skip-networking 跳过侦听客户端的网络连接

使用参数 --bind-address 后面增加对客户端访问IP 地址的限制

对客户端访问IP 地址的不进行限制

使用参数--skip-networking 跳过侦听客户端的网络连接

# mysqld --no-defaults --console --user mysql --skip-networking &
# netstat -plunt|grep 3306
#

使用参数--bind-address 后面增加对客户端访问IP 地址的限制

# mysqld --no-defaults --user mysql --bind-address=127.0.0.1 &
# netstat -plunt|grep 3306
tcp    0    0 127.0.0.1:3306    0.0.0.0:*    LISTEN    22767/mysqld
tcp6    0     0:::33060    :::*     LISTEN    22767/mysqld
# mysqld --no-defaults --user mysql --bind-address='192.168.17.40' &
# netstat -plunt|grep 3306
tcp    0    0 192.168.17.40:3306    0.0.0.0:*    LISTEN    23053/mysqld
tcp6    0    0:::33060    :::*    LISTEN    23053/mysqld

error log 记载信息的详细程度上由参数--log-error-verbosity进行控制的

默认为 2,设置为3可以记录更多的信息,这个参数可以联机设置

Permitted Message Priorities

log_error_verbosity Value

ERROR

1

ERROR,WARNING

2

ERROR,WARNING,INFORMATION

3

密码错误

root@scutech:~# mysql -uroot -perrorpassword
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
在MySQL的 errorlog 里有这样的记录:
2020-11-03T07:59:40.720835Z 7 [Note] [MY-010926] [Server] Access denied for user 'root'@'localhost' (using password: YES)
如果把参数 --log-error-verbosity 设置成的默认值 2 时是没有这个提示的,也就说没有 note类型的信息。

账户错误

ERROR 1130 (HY000): Host '192.168.17.149' is not allowed to connect to this MySQL server
注意账户错误时,提示是“is not allowed to connect to this MySQL server”,而密码错误时是“Access denied for user ”

账户错误问题解决

MySQL中的一个账户是由 user 和 host 两个部分组成,在 MySQL 中有个 mysql 数据库,里面有个user表,表中 Host和 User 为两个主键列 (primary key),唯一表示一个用户。像这种情况通常是 host 字段部分是 localhost,把它改成通配符"%"即可。

mysql> update mysql.user set host='%' where user='root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.02 sec)

3.MySQL打开文件失败

MySQL打开文件失败相关的错误

shell> perror 23
OS error code 23: File table overflow
shell> perror 24
OS error code 24: Too many open files
shell> perror 11
OS error code 11: Resource temporarily unavailable

查看MySQL已经打开的文件数

OS 中统计已经打开的文件
 ls -l /proc/`pidof mysqld`/fd|wc
MySQL数据库里统计已经打开的文件数查看状态参数
 Open_table_definitions 和 Open_tables

解决打开文件数多的方法

一种是减少 MySQL同时打开的文件数量,例如减少参数 table_open_cache 或/和 max_connections。

另一种方法是增加 MySQL 可以打开的文件数量,即增加 MySQL 的参数open_files_limit。

参数open_files_limit

MySQL 启动时这个参数起作用,在运行的时候系统会自动调整,会根据下面两个公式选择其中一个大的数:

10 + max_connections +(table_open_cache* 2)

max_connections*5

MySQL8.0.19 版本之后就直接用操作系统的限制

Linux操作系统对打开文件数的限制

配置文件 /etc/security/limits.conf
检查进程的限制:
cat /proc/`pidof mysqld`/limits|grep "Max open files'

4.MySQL挂起(hung)

系统资源的瓶颈造成的MySQL数据库挂起

使用OS层的 top sar free iostat vmstat 等查看系统资源的瓶颈

检查MySQL数据库运行状态

$ mysqladmin -i 5 processlist status

检查Innodb引擎的状态

mysql> show engine innodb status \G

关注一下几个部分:
LATEST DETECTED DEADLOCK
TRANSACTIONS
FILE I/O

在主键上的update是行级锁,在其它键的update是表级锁

索引上的查询也是行级别的锁

解决死锁(deadlock)

临时解决,kill 造成死锁的连接:
for id in `mysqladmin processlist | grep -i locked | awk '{print $1}'` 
do
    mysqladmin kill ${id}
done
根本解决,修改应用
delete update 避免使用非索引字段为条件
避免批量 delete update

5.MySQL崩溃(crash)

检查MySQL数据库的启动时间

检查 MySQL 服务状态 $ service mysql status
检查 MySQL中的uptime 状态 mysql> show global status like 'uptime';
使用 ps 检查进程启动时间 $ ps -eo pid,user,args,etime|grep mysqld
检查 MySQL日志 找关键字“ready for connections”

kill 和 kill -9 杀死 mysqld 进程的区别

使用 kill -9 杀死 mysqld 进程系统会自动重新启动,而只使用 kill 命令则不会重新启动,因为执行 kill 命令,系统会发送一个SIGTERM 信号给 mysqld,MySQL数据库会正常关闭,日志中会出现类似下面的记录:
2020-10-26T09:06:48.435181Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.19) MySQL Community Server - GPL.
1

MySQL数据库 crash 的常见原因

MySQL数据库 crash 的最常见原因有两个

1.MySQL的 bug

2.MySQL申请系统资源失败或内存泄漏。

MySQL的 bug

MySQL数据库 crash 的最常见的一个原因当然是 MySQL 的bug。95%的 bug 都是和具体的sql 相关,通常是 MySQL crash 前执行的最后一个sql 有问题,因此定位 bug 时应打开 general query log,根据最后一个 sql 来查找线索。

MySQL的 bug 库(MySQL Bugs)

 

查找 MSQL申请系统资源失败或内存泄漏的根本原因

1.仔细阅读 MySQL的错误日志,这个日志里面的一些程序调试信息看起来很让人困惑,但静下心来仔细看,很多时候会找到线索:

2.打开 general query log,找到最后一个 sql 访问的表或索引,检查这个表或索引,如果有问题就重建,通常可以解决问题。

3.使用 strace、pstack、pmap、gdb 分析mysqld 的代码,可能需要打开 core dump;

4.使用CMake 的选项-DWITH_DEBUG=1 重新编译 mysqld,然后运行重新编译后的 mysqld查看trace 文件、error log 进行排错

mysqld 内存占用的计算

全局内存
innodb_buffer_pool_size innodb_log_buffer_size thread_cache_size table_open_cache table_definition_cache key_buffer_size
线程内存
binlog_cache_size thread_stack
单次操作内存
join_buffer_size read_buffer_size read_rnd_buffer_size tmp_table_size sort_buffer_size

内存占用参考值计算公式

SELECT (@@innodb_buffer_pool_size + @@innodb_log_buffer_size + @@key_buffer_size+ @@max_connections*(@@binlog_cache_size + @@thread_stack + @@read_buffer_size+ @@read_rnd_buffer_size + @@sort_buffer_size + @@join_buffer_size + @@tmp_table_size)/ 1024 /1024 AS MAX MEM MB;

临时释放缓存

echo 1> /proc/sys/vm/drop_caches

0:0是系统默认值,默认情况下表示不释放内存,由操作系统自动管理

1:释放页缓存

2:释放dentries和inodes

3:释放所有缓存

从长远看还是要修改对应的参数进行解决。

MySQL客户端的内存泄漏的现象

mysql: Out of memory at line 42, 'malloc.c'
mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k)
ERROR 2008: MySQL client ran out of memory

客户端收到的返回结果集太大的解决办法

1.检查正在运行的 SQL,看看您真的需要这么大的返回结果集吗?

2.允许 mysql 时加上 --quick 选项,这会减少客户端单次收到的返回集,但会增加 mysqld 的负载。

6.忘记用户密码

MySQL忘记root密码的两种解决方法

skip-grant-tables

init-file

启动mysqld的时候加上参数skip-grant-tables

在默认的参数文件中加上skip-grant-tables
root@infokist:/etc/mysql# service mysql restart
root@infokist:/etc/mysql# mysql
mysql> update mysql.user set authentication_string=password('dingjia') where user='root';
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched:1 Changed:1 Warnings: 1
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

MySQL8 中的变化

加了 skip-grant-tables 参数后会自动加上skip-networking 不允许远程连接
移除了 PASSWORD() 函数
修改密码的方法是用 alter user 的命令修改密码,但注意要载入权限表后才能alter user
mysql> alter user root identified by 'dingjia';
ERROR 1290 (HY000): The MySQL server is running with the --skip-grant-tables option so itcannot execute this statement
mysql> flush privileges;
Query OK, 0 rows affected (0.07 sec)
mysql> alter user root@localhost identified by 'dingjia';
Query OK, 0 rows affected (0.02 sec)、

init-file方案

使用 -init-file 参数启动实例,类似: mysqld_safe --init-file=/tmp/chpw.sql&
在chpw.sql文件里面写上密码修改语句:
alter user 'root'@'localhost' dentified by 'dingjia';
实例启动成功后,密码即修改完毕
这种方法只会重启一次 MySQL实例,而且基本上不存在安全隐患

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【国产虚拟仪器】基于Zynq的雷达10Gbps高速PCIE数据采集卡方案(三)软件设计

4.1 引言 本章基于第二章的分析结论,进行系统软件设计。软件设计包括逻辑设计、嵌入 式软件设计和上位机软件设计。在逻辑设计中,对 ADC 模块、 Aurora 模块、 DDR3 SDRAM 模块和 PCIE 模块进行分析和设计,在 Vivado 软件提供的 …

静态时序分析-配置STA环境

1.什么是STA环境 DUA(待分析设计)会与其它同步设计交互,例如DUA从触发器接收数据,并将数据输出到DUA外部的另一个触发器。为了对这种设计执行STA,需要指定触发器的时钟、以及进入设计和退出设计的所有路径的时序约束。 2.时钟配置 定义时钟 定义时钟需要: 时钟源周期占…

SSRS rdlc报表 三 去除打印空白页

开发环境:vs2022 当我们新建一个报表,选择使用A4纸进行打印,有的时候打印列数过多,列会跑到下一页,调整好列显示后,所有的列都显示到一张纸上了,但是打印的时候发现,第二页是一张空…

宣传单页二维码怎么做?分享在线二维码制作小技巧

宣传单页现在也不是像之前的那种单一海报、纸质形式了。很多商家会将宣传单页做成二维码的形式,不仅传播方便,还方便用户填写信息便于统计。但是这种宣传单页二维码图片是怎么制作的呢? 一、什么工具能够制作二维码? 机智熊二维码…

为什么我在领英上搜到的客户都是显示领英会员(Linkedin Member)?

LinkedIn领英上找客户,开发客户已经越来越成为主流,但是很多刚注册使用LinkedIn领英的人会摸不着头脑,束手无策。 因为他会发现自己搜索出来的结果,找出来的客户都是显示领英会员(Linkedin Member)&#x…

数据结构与算法(六)

#数据结构 基础知识 数据结构:相互之间存在的一种多种的特定关系的数据元素的集合 逻辑结构: 线性表:最基本最简单的一种数据结构,一对一逻辑关系。 集合结构、线性结构、树形结构、图形结构 物理结构:顺序存储、链式存储 逻…

MYSQL 自定义变量用法收录

用户自定义变量使用&#xff1a; 优化排名语句 通过变量复制&#xff0c;快速实现类似行号功能 SET rownum :0 ; SELECT school_id , school_name , rownum :rownum1 AS rownum FROM base_school WHERE school_id<0 LIMIT 10 ; -- sql 排名 SET currcnt :0 ,pre…

如何在商场内进行导航?商场路线指引图怎么做?

如何在商场内进行导航&#xff1f;购物中心是多种零售店铺、服务设施集中在一个建筑物内或一个区域内&#xff0c;向消费者提供综合性服务的商业集合体。现在的购物中心面积都比较大&#xff0c;很多朋友的方向感明明不差&#xff0c;却每次都在商场遭遇“滑铁卢”&#xff0c;…

MaxCompute 发布智能物化视图,CU 算力节省 14%

作者&#xff1a;夏俊伟&#xff08;阿里云高级产品专家&#xff09;、郑君正&#xff08;阿里云高级技术专家&#xff09; 什么是物化视图 MaxCompute 物化视图是一种预先计算和存储结果数据的数据对象&#xff0c;也可以称之为“实体化视图”。物化视图可以作为一张虚拟表存…

输电线路测温工作要求

输电线路导线温度监测系统 一、产品描述&#xff1a; 在我国当前发展趋势下&#xff0c;电力的使用越来越庞大&#xff0c;对于供电系统的稳定性可靠性的考验越发严峻&#xff0c;智能化管理的推进必不可少&#xff0c;输电线路导线温度监测系统作为我司在线监测数据类产品&…

开源赋能 普惠未来|XuperCore诚邀您参与2023开放原子全球开源峰会

XuperCore&#xff08;待更名&#xff09;是百度自主研发&#xff0c;拥有完整知识产权的区块链底层技术XuperChain的内核&#xff0c;拥有620多篇区块链核心技术专利&#xff0c;以“高性能”、“开源”为主要设计目标&#xff0c;致力于创建“更快、更通用、更好用”的区块链…

JavaEE(系列13) -- 多线程(CAS)

目录 1. 什么是 CAS 2. CAS伪代码 3. CAS 的应用 3.1 实现原子类 3.2 实现自旋锁 4. CAS的ABA问题(面试常问) 4.1 ABA 问题 4.2 ABA问题解决方案 1. 什么是 CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“. 一个 CAS 涉及到以下操作&#xff1a; 我们假…

速卖通、阿里国际、shopee618盛典!提升订单销量的秘密武器—测评补单技术!

随着电子商务的迅速发展&#xff0c;网络购物已成为现代人生活中不可或缺的一部分。而在众多购物平台中&#xff0c;速卖通凭借其丰富多样的商品选择和优惠的价格政策&#xff0c;成为了全球消费者的首选之一。尤其是每年的618盛典&#xff0c;更是吸引了大量消费者的目光。然而…

【CH32】| 01——新建工程 | 下载 | 运行 |调试

系列文章目录 【CH32】| 00——开发环境搭建 【CH32】| 01——新建工程 | 下载 | 运行 |调试 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 1. 新建工程1.1 基于官方IDE [MounRiver Studio]1.1.1 使用官方内置的工程模板新建1.1.2 使用自定义工程模板新建1.1.2.1 新建自…

会声会影2023最新版本剪辑视频的方法和步骤

想要学剪辑&#xff0c;剪辑软件是基础。如果大家是零基础的话&#xff0c;建议大家选择一款入门级的剪辑软件&#xff0c;比如说会声会影。这款软件功能强大、操作简单&#xff0c;而且会声会影中文网站首页有很多剪辑教程供大家学习参考。会声会影在用户的陪伴下走过23余载&a…

计算机图形学 | 实验十二:混合(透明物体处理)

计算机图形学 | 实验十二&#xff1a;混合&#xff08;透明物体处理&#xff09; 计算机图形学 | 实验十二&#xff1a;混合&#xff08;透明物体处理&#xff09;混合&#xff08;Blending&#xff09;开启混合和设置混合模式绘制顺序排序透明物体绘制实验结果 华中科技大学《…

IPO观察丨德尔玛上市,“极致单品”模式的一场胜利

近日&#xff0c;创新电器品牌德尔玛&#xff08;广东德尔玛科技股份有限公司&#xff0c;代码“301332”&#xff09;&#xff0c;正式登陆深圳证券交易所创业板&#xff0c;发行价格为14.81元/股。上市前&#xff0c;德尔玛已完成了5亿元A轮融资及3.3亿元A轮融资&#xff0c;…

Linux Ubuntu配置CPU与GPU版本tensorflow库的方法

本文介绍在Linux操作系统的发行版本Ubuntu中&#xff0c;配置可以用CPU或GPU运行的Python新版本深度学习库tensorflow的方法。 在文章Anaconda配置Python新版本tensorflow库&#xff08;CPU、GPU通用&#xff09;的方法&#xff08;https://blog.csdn.net/zhebushibiaoshifu/ar…

Elasticsearch 7.x 基本操作 (CRUD)

1.概述 Elasticsearch 是一个流行的开源搜索引擎&#xff0c;用于存储、搜索和分析数据。下面是 Elasticsearch 7.x 版本的基本操作&#xff08;CRUD&#xff09;&#xff1a; 1、创建索引&#xff1a; PUT /index_name {"settings": {"number_of_shards"…

最近公司招了一个华为拿30K出来的,真是砂纸擦屁股,给我露了一手....

今年的金三银四已经结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山…