作者:张甦来源:https://blog.51cto.com/sumongodb/1949426

文章插图
老张我在刚开始学习数据库的时候 , 没少走弯路 。经常会遇到各种稀奇古怪的 error 信息 , 遇到报错会很慌张 , 急需一个解决问题的办法 。跟无头苍蝇一样 , 会不加思索地把错误粘到百度上 , 希望赶紧查找一下有没有好的处理问题的方法 。我想这个应该是刚从事数据库的小白 , 都会遇到窘境 。
今天就给大家列举 MySQL 数据库中 , 最经典的十大错误案例 , 并附有处理问题的解决思路和方法 , 希望能给刚入行 , 或数据库爱好者一些帮助 , 今后再遇到任何报错 , 我们都可以很淡定地去处理 。
学习任何一门技术的同时 , 其实就是自我修炼的过程 。沉下心 , 尝试去拥抱数据的世界!
Top 1:
Too many connections(连接数过多 , 导致连接不上数据库 , 业务无法正常进行)
问题还原
mysql> show variables like '%max_connection%';| Variable_name | Value |max_connections | 151 | mysql> set global max_connections=1;Query OK, 0 rows affected (0.00 sec)[root@node4 ~]# mysql -uzs -p123456 -h 192.168.56.132ERROR 1040 (00000): 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 下面的表 , 可以考虑关闭下面的参数
innodb_stats_on_metadata=https://www.isolves.com/it/sjk/MYSQL/2019-11-21/0
set global innodb_stats_on_metadata=https://www.isolves.com/it/sjk/MYSQL/2019-11-21/0
Top 2:(主从复制报错类型)
Last_SQL_Errno: 1062 (从库与主库数据冲突)
Last_Errno: 1062 Last_Error: Could not execute Write_rows event on table test.t;Duplicate entry '4' for key 'PRIMARY',Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;the event's master log mysql-bin.000014, end_log_pos 1505针对这个报错 , 我们首先要考虑是不是在从库中误操作导致的 。结果发现 , 我们在从库中进行了一条针对有主键表的 sql 语句的插入 , 导致主库再插入相同 sql 的时候 , 主从状态出现异常 。发生主键冲突的报错 。
解决方法:
在确保主从数据一致性的前提下 , 可以在从库进行错误跳过 。一般使用 percona-toolkit 中的 pt-slave-restart 进行 。
在从库完成如下操作
[root@zs bin]# ./pt-slave-restart -uroot -proot123
2017-07-20T14:05:30 p=...,u=root node4-relay-bin.000002 1506 1062
之后最好在从库中开启 read_only 参数 , 禁止在从库进行写入操作
Last_IO_Errno: 1593(server-id冲突)
Last_IO_Error:Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;these ids must be different for replication to work(or the --replicate-same-server-id option must be used on slave but thisdoes not always make sense; please check the manual before using it)这个报错出现之后 , 就看一目了然看到两台机器的 server-id 是一样的 。
在搭建主从复制的过程中 , 我们要确保两台机器的 server-id 是唯一的 。这里再强调一下 server-id 的命名规则(服务器 ip 地址的最后一位+本 MySQL 服务的端口号)
推荐阅读
- 茶叶审评的九个标准
- mysql之my.cnf/my.ini常用配置整理
- mysql中你应该要知道的变量知识点
- 如何快速切换到其他数据库实例
- 数据库的前世今生
- 3分钟学会mysql数据库的逻辑架构原理
- MySQL事务处理与并发控制
- 详解mysql三大时间函数
- 全面讲解分布式数据库架构设计特点
- MySql索引使用笔记
