mysql访问日志满造成linux磁盘空间不足问题系列跟踪解决

本文是生产环境实践中问题的来源及处理方法,时间紧张,不断的排查终于发现根本问题并最终整理出解决方案。

1>故障排错的思路,要注意分析现象,由表及里,发现问题的本质。

2>要注意日常故障排查的逻辑推理,一步步推进。

3>解决问题要先有思路,习惯要好,最后要总结。

4>先最小化验证问题。

做任何事都要思路领先!




故障来源: 互联网用户反馈公司的APP登陆失败,发送短信也失败。

一>排查过程

接到消息后于是我们跟踪APP程序后台并未发现明显报错日志。继而登陆系统整个的管理平台,登陆界面提示用户不存在。(由于排查过程非常紧张,当时图片并未保存,所以“用户不存在”是事后还原出的真实现象)。

mysql数据库表空间是否充足 mysql空间不足_mysql

于是根据系统架构图思考。下图为系统架构图:

mysql数据库表空间是否充足 mysql空间不足_数据库_02

综合管理平台登陆失败下意识的想法,综合管理平台的用户数据是存储在mysql中的mysql库中的表中的,怎么会登陆失败呢?于是去登陆mysql数据库查询,但是用navicat连接mysql显示连接不上服务器。于是登陆mysql所在linux服务器用lsof -i:3306检测,竟然mysql已经宕掉了。于是尝试重启mysql,报错如下:

[root@zhfwpt /]# service mysqld start
Redirecting to /bin/systemctl start  mysqld.service
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
[root@zhfwpt /]# systemctl status mysqld.service
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: activating (start-pre) since 三 2018-11-07 18:47:42 CST; 523ms ago
  Process: 245000 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=1/FAILURE)
 Main PID: 8994 (code=exited, status=2);         : 245018 (mysqld_pre_syst)
   CGroup: /system.slice/mysqld.service
           └─control
             ├─245018 /bin/bash /usr/bin/mysqld_pre_systemd
             └─245037 /usr/bin/python -Es /usr/sbin/semanage fcontext -a -e /var/lib/mysql /var/lib/mysql-keyring

11月 07 18:47:42 zhfwpt systemd[1]: Starting MySQL Server...

mysql数据库表空间是否充足 mysql空间不足_操作系统_03

并未发现什么有价值的报错(其实此时可以tail -100f /var/log/messages,但是当时并未查看)。经验使然,看了下磁盘空间大小:

mysql数据库表空间是否充足 mysql空间不足_运维_04

可以发现/var挂载点此时已经达到100%了。可是这与mysql宕掉有什么关系呢?突然想到mysql的数据目录文件不就是在/var/lib/msyql下吗?

mysql数据库表空间是否充足 mysql空间不足_mysql数据库表空间是否充足_05


于是问题基本得到验证。就是由于mysql的数据文件太大-------造成挂载点/var满盘-------造成mysql宕掉-----然后管理平台登陆不了-----然后APP登陆不了(系统架构)。


二>解决过程

首先让mysql能够起来。既然是/var下磁盘满了,那可以先删掉一些尝试性试探验证下?

mysql数据库表空间是否充足 mysql空间不足_数据库_06


mysql数据库表空间是否充足 mysql空间不足_操作系统_07

于是先把/var/lib/mysql/mysql



Mysql日志清理方案:

-----------------------关于  mysql 日志自动清理的存储-----------

----目的:解决服务器由于mysql 生成日志过大,引起磁盘空间爆满,导致突然宕机等情况

----适用:现场测试与生产环境,均可。

----要求:mysql 版本在5.1以上

----说明:存储删除日志为zhfwpt数据库中,系统自动生成的日志,格式为:t_sy_access_log年月日,例:t_sy_access_log20180101


1、查看mysql版本

mysql> select version();


2、查看定时器开关

mysql> show variables like '%sche%';
+---------------------------------------------------+---------+
| Variable_name                                     | Value   |
+---------------------------------------------------+---------+
| event_scheduler                                   | ON      |

如果value值为OFF,可以这样打开:

set GLOBAL event_scheduler=1;


想关闭,只需设置为0即可。


--第一步:在mysql 中执行以下存储

--------创建 drop_log
--drop procedure drop_log;
delimiter $$
CREATE procedure drop_log()
BEGIN
            declare t_name varchar(64);
            declare isFinished int default false;
            declare log_table_list cursor for (select table_name from information_schema.tables where table_schema = 'zhfwpt' and table_name like 't_sy_access_log%'  and table_name regexp '^t_sy_access_log[0-9]{8}');
            declare continue handler for not found set isFinished=true; 
            open log_table_list;
            repeat 
                fetch log_table_list into t_name; 
                if isFinished = false then
                    if datediff(NOW(),str_to_date(replace(t_name,'t_sy_access_log',''),'%Y%m%d'))>2 then
                        set @sqltext=concat('drop table ',t_name,';');
                        PREPARE c_tab_stat from @sqltext;
                        execute c_tab_stat; 
                    end if;
                end if;
                until isFinished 
            end repeat; 
            close log_table_list;
END $$
delimiter ;

---第二步:执行存储
call drop_log();
--select @sqltext;
--show tables like 't_sy_acc%';



---开启事件调度器
show variables like 'event_scheduler';
set global event_scheduler='on';


---创建定时器 
----设置为每天执行一次 1 day
drop event if exists drop_log_event;
create event drop_log_event
on schedule every 1 day
STARTS now()
do call drop_log();


---启用定时器
定时器的打开
mysql> alter event drop_log_event on completion preserve enable;
关闭定时器
mysql> alter event drop_log_event on completion preserve disable;





转载于:https://blog.51cto.com/11218855/2314233