记Linux服务器磁盘空间不足解决之路

1. 前言

在我登录我自己开发的产品血玉钻的时候,我发现接口没有数据返回,远程登录发现服务器也并没有挂掉。因为我是通过pm2管理我的应用的,于是乎,我日常pm2 restart 项目,发现接口还是数据没有返回,也没有报错,于是我没有用pm2启动项目,直接node main.js启动项目,发现MySql Lock wait timeout exceeded 这个错误。

然后我又进行万能重启操作,重启mysql,先systemctl stop mysqld,然后再systemctl start mysqld,这问题就出来了,启动失败,报如下错误。

Starting mysqld (via systemctl):  Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
                                                           [FAILED]

然后我就看我之前写的记录mysql的文章云服务器Mysql安装配置linux安装mysql启动不起来总结这两篇文章,果然安装记录的文章,发现了mysql启动不起来的原因,如下:

Disk is full writing './binlog.000039' (OS errno 28 - No space left on device). Waiting for someone to free space... Retry in 60 secs. Message reprinted in 600 secs

2. linux命令查看磁盘使用情况

通过上面我们已经知道,mysql启动不成功的原因是因为磁盘不足。 这里我们就先来学习下,怎么查看linux服务器磁盘空间使用情况。

2.1 使用df -h命令查看磁盘空空间

使用df -h命令查看磁盘空间,若磁盘空间不足则清理(当然这是我解决之后的截图,之前的磁盘满的情况忘了截图)。


Snipaste_2020-07-26_17-39-23.png

2.2 du的用法

du命令用来查看目录或文件所占用磁盘空间的大小。常用选项组合为:du -sh

du常用的选项:
  -h:以人类可读的方式显示
  -a:显示目录占用的磁盘空间大小,还要显示其下目录和文件占用磁盘空间的大小
  -s:显示目录占用的磁盘空间大小,不要显示其下子目录和文件占用的磁盘空间大小
  -c:显示几个目录或文件占用的磁盘空间大小,还要统计它们的总和
  --apparent-size:显示目录或文件自身的大小
  -l :统计硬链接占用磁盘空间的大小
  -L:统计符号链接所指向的文件占用的磁盘空间大小
du -lh --max-depth=1: 查看当前目录下一级子文件和子目录占用的磁盘容量。
du -h -x --max-depth=1:查看哪个目录占用过高
du -sh * | sort -n 统计当前文件夹(目录)大小,并按文件大小排序
du -sk filename 查看指定文件大小

3. 查看占用空间大的文件

然后用du命令查看linux文件占用磁盘大小情况。


Snipaste_2020-07-26_17-44-31.png

然后我们查到原因了,是mysql文件夹里面就占用了25G磁盘,总共磁盘才40G,然后在进入mysql文件夹查看


Snipaste_2020-07-26_17-47-07.png

发现binglog之类的文件竟然达到了20多G。

binlog是什么呢?

Mysql Binlog是二进制格式的日志文件,但是不能把binlog文件等同于OS系统某目录下的具体文件,这是狭隘的。Binlog是用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复。

然后我们知道这写文件主要是记录对数据的修改操作,主要用于数据库的主从复制,但是我的应用并没有用到主从复制,所以是可以删除的。

4. mysql的binlog安全删除

默认情况下mysql会一直保留mysql-bin文件,这样到一定时候,磁盘可能会被撑满,这时候是否可以删除这些文件呢,是否可以安全删除,是个问题。

首先要说明一下,这些文件都是mysql的日志文件,如果不做主从复制的话,基本上是没用的,虽然没用,但是不建议使用rm命令删除,这样有可能会不安全,正确的方法是通过mysql的命令去删除。

我们登录mysql之后,使用命令

mysql> reset master;
Query OK, 0 rows affected (3 min 37.65 sec)

其实关键的命令就是reset master;这个命令会清空mysql-bin文件。

另外如果你的mysql服务器不需要做主从复制的话,建议通过修改my.cnf文件,来设置不生成这些文件,只要删除my.cnf中的下面一行就可以了。

log-bin=mysql-bin

如果你需要复制,最好控制一下这些日志文件保留的天数,可以通过下面的配置设定日志文件保留的天数:

expire_logs_days = 7

表示保留7天的日志,这样老日志会自动被清理掉。

另外的方法

4.1 手动清理binlog

① 查看主库和从库正在使用的binlog是哪个文件

show master status\G 
show slave status\G  \

② 在删除binlog日志之前,首先对binlog日志备份,以防万一
开始动手删除binlog:

purge master logs before'2016-09-01 17:20:00'; //删除指定日期以前的日志索引中binlog日志文件

purge master logs to'mysql-bin.000022'; //删除指定日志文件的日志索引中binlog日志文件

注意:
时间和文件名一定不可以写错,尤其是时间中的年和文件名中的序号,以防不小心将正在使用的binlog删除!!!

切勿删除正在使用的binlog!!!

使用该语法,会将对应的文件和mysql-bin.index中的对应路径删除。

4.2 通过设置binlog过期的时间,使系统自动删除binlog文件

这种就是类似上面的expire_logs_days = 7

mysql> show variables like 'expire_logs_days'; 
+------------------+-------+ 
| Variable_name  | Value | 
+------------------+-------+ 
| expire_logs_days |   0  | 
+------------------+-------+ 
mysql> set global expire_logs_days = 30;    #设置binlog多少天过期
————————————————

注意:
过期时间设置的要适当,对于主从复制,要看从库的延迟决定过期时间,避免主库binlog还未传到从库便因过期而删除,导致主从不一致!!!

通过上面的方法之后,我们再一次查看磁盘使用情况,发现删除binlog之后,足足多出了一半以上的磁盘空间,开心。

5. mysql扩展

5.1 innodb_file_per_table 的简要说明

在很久很久以前也就是说还没有innodb_file_per_table 的那个年代,所有的innodb表的数据都是保存在innodb系统表空间中的,

在有了innodb_file_per_table参数后innodb可以把每个表的数据单独保存。单独保存有两方面的优势一个是方便管理,二个是提长性能。

5.2 mysql 引用innodb_file_per_table是为了解决什么问题

在没有innodb_file_per_table之前所有的innodb表的数据都是统一保存到,innodb系统表空间文件中的,如果想让mysql的行为

与innodb_file_per_table还没有引入时的行为一致,那么把innodb_file_per_table设置为OFF就行。

1、由于数据都统一保存到innodb系统表空间文件中,在drop table ,truncate table后表空间文件并不会进行收缩,也就是说表空间文件所占的磁盘空间并不会因为drop table , truncate table 而释放。

2、对于mysql来说alter table 的过程大概可以概括为 1)根据alter table 的指示创建出一张新的表 . 2)把老表的数据插入表新表中3)删了老表. 4)把新表的表名字重命名成老表的名字;当然如今的mysql已经有inplace对上面的过程进行优化了,不过并不是所有的alter table 都支持inplace,更多关于inplace的问题在此不表了。还是回到alter table 的第2)步 由这里可以看出系统表空间是要增大的(理由是:创建了新的表,又在向新的表中插入数据) 所以啊alter table 会导致系统表空间的进一步加大。

3、在linux系统中不允许并行的对一个文件进行写入(innodb_flush_method=O_DIRECT的情况下是这样的),这可能成为一个性能问题

4、对于使用innodb_file_per_table=ON的情况下,默认创建出来的ibd文件的格式是Barracuda,在这个文件格式下innodb数据行的格式就可以设置为compressed 或 dynamic 格式了。compressed 提供压缩功能节约空间,dynamic能优化对blob,text这样的数据类型的存储以提升性能。

5.3 Mysql删除数据后磁盘空间未释放的解决办法

官方推荐使用 OPTIMIZE TABLE命令来优化表,该命令会重新利用未使用的空间,并整理数据文件的碎片。

语法如下:

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

注:该命令将会整理表数据和相关的索引数据的物理存储空间,用来减少占用的磁盘空间,并提高访问表时候的IO性能。但是,具体对表产生的影响是依赖于表使用的存储引擎的。该命令对视图无效。

执行语句:show table status like 'table_name'查看表信息


Snipaste_2020-07-26_18-11-39.png

查询结果中:

Index_length 代表索引的数量
Data_free 代表碎片数量

然后执行下面命令进行优化整理:

mysql > optimize table table_name

如果之前的碎片数量多,执行时间可能会久一点,执行结束后出现下面框内的数据则优化成功。

注意事项:
由于命令optimize会进行锁表操作,所以进行优化时要避开表数据操作时间,避免影响正常业务的进行。

MySQL5.7已经推荐对于InnoDB的table使用 alter table table_name engine=innodb;语句的方式来进行表碎片优化。

6. 相关文章

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342