磁盘空间满了之后MySQL会怎样

大多数用户在对于磁盘进行分区的时候都是习惯性的不给系统盘预留很大空间,其实这并不是一个好习惯。因为系统分区并不像我们想象的那样会仅仅安装一个操作系统,系统分区多数还是会承载操作系统主要应用软件安装任务。那么当磁盘空间爆满后,MySQL会发生什么事呢?又应该怎么应对?

  会发生什么事

  当磁盘空间写满了之后,MySQL是无法再写入任何数据的,包括对表数据的写入,以及binlog、binlog-index等文件。

  当然了,因为InnoDB是可以把脏数据先放在内存里,所以不会立刻表现出来无法写入,除非开启了binlog,写入请求才会被阻塞。

  当MySQL检测到磁盘空间满了,它会怎么样呢?下面我们来看一个具体例子:

  磁盘满了之后MySQL会做什么?

  我们看下官方的说法

  其实MySQL本身并不会做任何操作,如官方文档说说,只会每分钟check一次是否有空闲空间,并且10分钟写一次错误日志。

  但是再次期间由于磁盘满了,意味着binlog无法更新,redolog也无法更新,所有bufferpool中的数据无法被flush上,如果不幸的服务器重启,或者实例被kill了,那必然会造成数据丢失,这几乎是一定的。所以,处理磁盘满的问题最好是先释放出来一定空间让dirty数据刷新下来。

  磁盘满了为什么会导致操作hang住?

  1、select

  首先经过经验和实际测试,select操作不会由于磁盘满导致问题,也就是所有select操作都会正常运行。

  2、insert

  经过不通的测试发现,当磁盘满了之后,并不是第一个insert就卡住,而是会在n个之后出现卡住的情况。

  通过查看error日志,发现卡住现象和刷磁盘的操作有关系。

  为了验证推论是否正确,我们将sync_binlog设置为1,在这种情况下,insert第一条就卡住了,并且errorlog中直接报错提示写binlog失败。看来卡住确实和刷磁盘有关系。

  目前已知和刷磁盘有关系的参数有3个,分别是sync_binlog,innodb_flush_log_tr_commit,和duoblewrite。

  3、showslavestatus

  在从库经过测试,操作会被卡住,这主要是由于执行showslavestatus需要获得LOCK_active_mi锁,然后锁上mi->data_lock,但是由于磁盘满了无法将io_thread中的数据写入到relaylog中,导致io_thread持有mi->data_lock锁,这就导致了死锁。

  所以,这就导致在磁盘满的情况下,执行showslavestatus操作会卡住。

  4、showstatus

  测试可以正常操作,但是如果先执行了showslavestatus操作的情况下,showstatus也会被卡住。这是因为执行showstatus需要锁上LOCK_status,而由于status状态中包含slavestatus,所以还需要锁上LOCK_active_mi。如果限制性了showslavestatus,这时候由于mi->data_lock死锁问题,导致io_thread不会释放LOCK_active_mi锁。这时候就导致showstatus和showslavestatus争抢同一把LOCK_active_mi锁,也形成了死锁。

  所以,在磁盘满的情况下,如果先执行showslavestatus,后执行showstatus,连个操作都会卡住。

  应该怎么办

  那么,当发现磁盘空间满了之后,我们应该怎么处理呢,建议:

  每分钟:检查空间是否得到释放,以便写入新数据。当发现有剩余空间了,就会继续写入数据,一切照旧。

  每十分钟:如果还是发现没剩余空间,则会在日志中写入一条记录,报告磁盘空间满(这时候只写入几个字节还是够的)。

  提高监控系统检测频率,预防再次发生;

  及时删除不用的文件,释放空间;

  若有线程因磁盘满的问题被阻塞了,可先杀掉,等到下一分钟重新检测时它可能又可以正常工作了;

  可能因磁盘满导致某些线程被阻塞,引发其他线程也被阻塞,可把导致阻塞的线程杀掉,其他被阻塞的线程也就能继续工作了。

  例外

  有个例外的情况是:

  当执行REPAIRTABLE或者OPTIMIZETABLE操作时,或者执行完LOADDATAINFILE或ALTERTABLE之后批量更新索引时,这些操作会创建临时文件,当执行这些操作过程中mysqld发现磁盘空间满了,就会把这个涉及到的表标记为crashed,删掉临时文件(除了ALTERTABLE操作,MySQL会放弃正在执行的操作,删除临时文件,释放磁盘空间)。

  备注:当执行这些命令过程中mysqld进程被意外被杀掉的话,其所生成临时文件不会自动删除,需要手工删掉才能释放磁盘空间。

时间: 2024-10-09 23:51:14

磁盘空间满了之后MySQL会怎样的相关文章

磁盘空间不够导致mysql崩溃重启

起因: 群里有人提了句pt-ioprofile,我不知道,就查了查,想测一测,想以后可能会有帮助. 为了能看到效果,我选择了我虚拟机上最大的压测表Sbtest1,该表有100w数据,执行update sbtest1 set k=k+1; 并且通过pt-ioprofile查看到了想要的结果,然后就干别的去了,下午了,看update sbtest1 set k=k+1;这个窗口的光标还闪着,以为还没执行完,不停地回车,crtl c,各种不好用.过了一会儿,报错了,并且提示mysql已经重启了. 我去

oracle服务器硬盘磁盘空间满了

问题描述:oracle服务器硬盘磁盘空间满了,没有空间写入数据: 解决思路: a.服务器是虚拟机还是实体机? 虚拟机,->物理机上有空间直接给它扩容,再给数据库的相关表空间添加文件就可: 实体机,->确定是否还有oracle收缩磁盘硬盘插槽,能新增物理硬盘,买+接入: b.删数据以及降低高水位: 通常思路是:找占用磁盘最大的表空间TS_1,找该表空间下巨大的表tableA,删除历史数据,降低高水位(table move),缩小表空间文件,腾出空间: 1.查询 表空间各文件 --找出占用磁盘最大

二进制安装MySQL5.5.39,磁盘空间不足导致MySQL无法启动

--添加用户和组 [[email protected] local]# groupadd [[email protected] local]# useradd -g mysql -s /sbin/nologin -d /opt/msyql mysql --创建目录 [[email protected] local]# mkdir /data/mysql/mysql_3306/{data,logs,tmp} -p --做软链接到/usr/local/mysql [[email protected]

磁盘空间满了

模拟: seq 500000000 >>/var/log/messages 磁盘空间不足-满了  df -h Filesystem      Size  Used Avail Use% Mounted on /dev/sda3       8.8G  6.1G  2.3G  74% / tmpfs           931M     0  931M   0% /dev/shm /dev/sda1       190M   40M  141M  22% /boot /dev/sdc      

mysql 错误- 磁盘空间不足,

mysql 磁盘空间不足错误 磁盘空间满了, 写不进去了. 141020 09:45:24 mysqld_safe Starting mysqld daemon with databases from /alidata/server/mysql-5.6.20/data 2014-10-20 09:45:24 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults

阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例

阿里云ECS(linux)磁盘满触发的mysql的表异常修复案例 阿里云技术支持:完颜镇江 问题现象: 磁盘空间满了,第一想到的就是删除无用的服务日志或者升级数据盘. 通常是使用du –sh去分析目录找出占用最大的. 根据经验来说基本都是日志文件占用的,那么就是停止应用清理日志,或者清理日志后重启应用即可. 但是本实例的异常是网站主页正常,但是子导航的内容为空,首先怀疑的就是磁盘满了导致mysql数据库的数据异常. 问题排查: 排查的方法是打开mysql的errlog 添加以下配置重启mysql

关于Ubuntu10.04磁盘空间不足的问题

最近由于项目问题,需要自己写驱动,但是驱动知识太少,开始下了个内核自己玩玩,没想到的是内核下好了,Ubuntu待机后却登录不了了,重启了好几次也不行,而且颜色是蓝色,右上角还提示:Install problem,搞的很蒙,心想用了这么久了,安装会有问题,登不进去的话我里面的程序也就没了,情急之下百度了一下,原来是磁盘空间满了.有两种方式特此总结一下. 结合截图,操作如下: (1)登录界面如上: (2)第一步: 关闭Ubuntu打开设置,配置存储里面IDE控制器为选择Ubuntu10.04.4**

物理磁盘空间使用已满导致数据库hang起

情况描述 一天公司小张过来咨询,说是数据库查询报错了:乍一看好像是数据库有坏快了,为了排查更加详细的错误信息,决定查看一下告警日志,发现问题所在,原来是数据库的物理磁盘空间满了 Writing to the above trace file is disabled for now on... Tue Jul 29 17:30:32 2014 Non critical error ORA-48181 caught while writing to trace file "/u01/app/orac

rm -rf 删除文件后磁盘空间不释放

当一个服务器的磁盘空间满了后,执行rm -rf命令以后,磁盘空间没有被释放可以使用lsof | grep delete命令来查看删除进程,然后kill掉相关的进程以后就可以释放空间了 原文地址:http://blog.51cto.com/11742478/2091817