MySQL常见故障汇总
一、连接数过多
1.最直接的方法是,可以增加max_connections的大小,提高数据库最大连接数,但维持会话连接是需要占用内存的,连接数太多,占用大师内存,也是治标不治本。
2.Mysql数据库在处理完一条SQL后,会自动关闭空闲的会话连接,空闲会话关闭时间,取决于参数wait_timeout的数值(单位:秒),尽量不要调得太大,造成资源浪费。根据生产环境实际情况,适当调整为100-300秒。
3.如果在业务访问量非常大,但有时因故障需要重启的情况。重启后,内存缓存会被释放掉,这样大量用户访问时,首次查询数据因没有缓存,会比正常情况慢很多,短期内会有一个性能高峰,甚至导致连接数爆满。那么如何解决这个问题?是否可以让mysql自动加载数据到内存?Mysql innodb提供了一个预热功能,提前加载数据到缓存中。my.cnf配置以下参数:
# 在关机时导出内存缓存到磁盘
innodb_buffer_pool_dump_at_shutdown = 1
# 在启动时加载磁盘缓存到内存中
innodb_buffer_pool_dump_at_startup = 1
# 手动导出缓存到磁盘
innodb_buffer_pool_dump_now = 1
# 手动加载缓存到内存
innodb_buffer_pool_load_now = 1
注意:在使用Innodb引擎时,同时也要保证innodb_buffer_pool_size大小充足,innodb_buffer_pool_size/data_size的比值越大越好,如果过小,会增加磁盘I/O的压力,降低SQL的执行效率,从而连接数过多。
二、慢SQL
可以通过show processlists;使用explain进行分析;根据情况执行kill sql_pid
三、虚拟交换内存不足
适当增加虚拟内存
四、ibdata数据文件误删除
因操作失误误删数据文件,此时千万不能关掉mysqld进程,进程杀死,内存缓存,fd文件被释放,无法进行恢复。
1.找到Mysql进程pid
2.进入目录/proc/pid/fd内
3.ls -l |grep ib_,会看到几个fd的链接文件,也就是之前删除掉的数据文件,此时还在内存中。
4.在数据库中执行flush tables with read lock进行锁库,防止数据写入,以便恢复
5.查看show master status,等待file及pos点不在变化
6.把第3步的几个文件,用cp命令复制到数据库目录即可
7.重启mysql服务,恢复完成。
五、主从复制故障处理
主从复制时,经常会出现错误,大部分人面对错误时,直接进行跳过,其实可能会造成主从数据不一致,对以后故障切换造成潜在的风险。而导出导入数据,重新做主从同步,又太耗费时间。所以,以下是针对这一方面问题的处理,作出的详细总结。
1.主从复制故障处理
从库的复制出现中断,可能原因主键冲突,网络问题,主数据库异常停止,主从数据不一致等
在master上删除数据后,slave因找不到相应记录而报错,这种情况由于主库已经将记录删除,所以从库也可以删除,直接跳过错误即可。
show slave status\G;stop slave; set global sql_slave_skip_counter=1;start slave;
解释:sql_slave_skip_counter该参数最常见场景莫过于在主从复制中由于种种原因导致的主从数据不一致,从必须跳过该事务后才能正常恢复正常状态。参数sql_slave_skip_counter跳过的是event,不是单个事务(一个事务多个event:begin; insert...;update...;insert...;commit(不是5个event))。
此外#slave-skip-errors=1062,1053,1146 #跳过指定error no类型的错误
#slave-skip-errors=all #跳过所有错误
2.slave宕机,导致relay-log损坏,同步出错
如果slave死机,重启后可能同步报错error initializing relay log position:I/O reading...,
这是因为relayl-log损坏了。mysql 5.5之后版本,配置relay-log-recover=1参数就可以自动恢复日志同步。
3.slave落后延迟过多
有时查看从库同步状态,会发现有一项指标,seconds_behind_master的数值较大,这个数值代表落后主库的秒数,通常由慢SQL,慢事务导致。因此避免使用大的耗时事务,及时优化SQL,是保证从库不被拖跨的一个措施。
4.slave自动跳过错误
同步时经常出现的错误代码1023(记录不存在),1062(主键重复),这些错误无关紧要,每次都手动处理会很繁琐,浪费不必要的时间,我们可以将其设置自动跳过。
在配置文件中增加:
# 自动跳过错误
slave_skip_errors=1023,1062
5.主从数据库版本不一致引起出错
如果主从版本不一致,可能会导致同步错误。因为低版本的mysql不兼容高版本中的某些语法或特性,则主库版本高,从库版本低时,从库会报错,而主库版本低,从库版本高时,同步正常。生产环境中,应该保持数据库版本一致,避免增加故障隐患。
参考链接:https://blog.csdn.net/u010230971/article/details/80335578