社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL数据库“十宗罪”(十大经典错误案例)

IT牧场 • 7 年前 • 914 次点击  

点击上方 IT牧场 ,选择 置顶或者星标技术干货每日送达!

今天给大家列举 MySQL 数据库中,最经典的十大错误案例,并附有处理问题的解决思路和方法,希望能给刚入行,或数据库爱好者一些帮助,今后再遇到任何报错,我们都可以很淡定地去处理。学习任何一门技术的同时,其实就是自我修炼的过程。沉下心,尝试去拥抱数据的世界!

Top 1:Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行)

问题还原:

解决问题的思路:
  • 1、首先先要考虑在我们 MySQL 数据库参数文件里面,对应的max_connections 这个参数值是不是设置的太小了,导致客户端连接数超过了数据库所承受的最大值。
    ● 该值默认大小是151,我们可以根据实际情况进行调整。
    ● 对应解决办法:set global max_connections=500
    但这样调整会有隐患,因为我们无法确认数据库是否可以承担这么大的连接压力,就好比原来一个人只能吃一个馒头,但现在却非要让他吃 10 个,他肯定接受不了。反应到服务器上面,就有可能会出现宕机的可能。
    所以这又反应出了,我们在新上线一个业务系统的时候,要做好压力测试。保证后期对数据库进行优化调整。

  • 2、其次可以限制Innodb 的并发处理数量,如果 innodb_thread_concurrency = 0(这种代表不受限制) 可以先改成 16或是64 看服务器压力。如果非常大,可以先改的小一点让服务器的压力下来之后,然后再慢慢增大,根据自己的业务而定。个人建议可以先调整为 16 即可。
    MySQL 随着连接数的增加性能是会下降的,可以让开发配合设置 thread pool,连接复用。在MySQL商业版中加入了thread pool这项功能,另外对于有的监控程序会读取 information_schema 下面的表,可以考虑关闭下面的参数

Top 2:(主从复制报错类型)

Last_SQL_Errno: 1062  (从库与主库数据冲突)

针对这个报错,我们首先要考虑是不是在从库中误操作导致的。结果发现,我们在从库中进行了一条针对有主键表的 sql 语句的插入,导致主库再插入相同 sql 的时候,主从状态出现异常。发生主键冲突的报错。

解决方法:

在确保主从数据一致性的前提下,可以在从库进行错误跳过。一般使用 percona-toolkit 中的 pt-slave-restart 进行。
在从库完成如下操作

  • 之后最好在从库中开启 read_only 参数,禁止在从库进行写入操作

Last_IO_Errno: 1593(server-id冲突)

在搭建主从复制的过程中,我们要确保两台机器的 server-id 是唯一的。这里再强调一下 server-id 的命名规则(服务器 ip 地址的最后一位+本 MySQL 服务的端口号)

解决方法:

在主从两台机器上设置不同的 server-id。

Last_SQL_Errno: 1032(从库少数据,主库更新的时候,从库报错)

解决问题的办法:

根据报错信息,我们可以获取到报错日志和position号,然后就能找到主库执行的哪条sql,导致的主从报错。
在主库执行:

获取到 sql 语句之后,就可以在从库反向执行 sql 语句。把从库缺少的 sql 语句补全,解决报错信息。
在从库依次执行:

Top 3:MySQL安装过程中的报错

解决思路:

遇到这样的报错信息,我们要学会时时去关注错误日志 error log 里面的内容。看见了关键的报错点Permission denied。证明当前 MySQL 数据库的数据目录没有权限。

解决方法:

如何避免这类问题,个人建议在安装MySQL初始化的时候,一定加上--user=mysql,这样就可以避免权限问题。

Top 4:数据库密码忘记的问题

解决思路:

目前是进入不了数据库的情况,所以我们要考虑是不是可以跳过权限。因为在数据库中,mysql数据库中user表记录着我们用户的信息。

解决方法:

启动 MySQL 数据库的过程中,可以这样执行:

Top 5:truncate 删除数据,导致自动清空自增ID,前端返回报错 not found。

这个问题的出现,就要考虑下truncate 和 delete 的区别了。

看下实验演练:

结果发现truncate把自增初始值重置了,自增属性从1开始记录了。当前端用主键id进行查询时,就会报没有这条数据的错误。
个人建议不要使用truncate对表进行删除操作,虽然可以回收表空间,但是会涉及自增属性问题。这些坑,我们不要轻易钻进去。

Top 6:阿里云 MySQL 的配置文件中,需要注意一个参数设置就是:

Top 7:数据库总会出现中文乱码的情况

解决思路:

对于中文乱码的情况,记住老师告诉你的三个统一就可以。还要知道在目前的mysql数据库中字符集编码都是默认的UTF8

处理办法:

1、数据终端,也就是我们连接数据库的工具设置为 utf8
2、操作系统层面;可以通过 cat /etc/sysconfig/i18n 查看;也要设置为 utf8
3、数据库层面;在参数文件中的 mysqld 下,加入 character-set-server=utf8。

Emoji 表情符号录入 mysql 数据库中报错。

解决思路:针对表情插入的问题,一定还是字符集的问题。
处理方法:我们可以直接在参数文件中,加入

Top 8:使用 binlog_format=statement 这种格式,跨库操作,导致从库丢失数据,用户访问导致出现错误数据信息。

Top 9:MySQL 数据库连接超时的报错 

这个问题是由两个参数影响的,wait_timeout 和 interactive_timeout。数据默认的配置时间是28800(8小时)意味着,超过这个时间之后,MySQL 数据库为了节省资源,就会在数据库端断开这个连接,Mysql服务器端将其断开了,但是我们的程序再次使用这个连接时没有做任何判断,所以就挂了。

解决思路:

先要了解这两个参数的特性;这两个参数必须同时设置,而且必须要保证值一致才可以。
我们可以适当加大这个值,8小时太长了,不适用于生产环境。因为一个连接长时间不工作,还占用我们的连接数,会消耗我们的系统资源。

解决方法:

可以适当在程序中做判断;强烈建议在操作结束时更改应用程序逻辑以正确关闭连接;然后设置一个比较合理的timeout的值(根据业务情况来判断)

Top 10 :can't open file (errno:24)

有的时候,数据库跑得好好的,突然报不能打开数据库文件的错误了。

解决思路:

首先我们要先查看数据库的error log。然后判断是表损坏,还是权限问题。还有可能磁盘空间不足导致的不能正常访问表;操作系统的限制也要关注下;用 perror 工具查看具体错误!

超出最大打开文件数限制!ulimit -n查看系统的最大打开文件数是65535,不可能超出!那必然是数据库的最大打开文件数超出限制!
在MySQL里查看最大打开文件数限制命令:

show variables like 'open_files_limit';

处理方法:


干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》

近期热文

•我最喜欢的Mybatis 3.5新特性!超实用!•干货|Spring Cloud Stream 体系及原理介绍•Spring Cloud Alibaba系列教程-03-搭建生产可用的Nacos集群•Spring Boot 2动态修改日志级别•这才是实现分布式锁的正确姿势!•持续集成工具Jenkins看这篇就够啦!

关注我

点"在看"是一种美德^_^

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/31452