问题现象
使用confluence的同学陆续反馈有保存失败的情况,但新建页面仍可以正常保存——此现象表示磁盘空间即将占满:数据较多的页面保存时磁盘空间不足所以失败,新建页面由于数据较少磁盘空间还可以满足因此仍可以保存成功;
为了不影响大家使用confluence,因此在问题定位时没有停掉confluence服务,但很快问题开始恶化:confluence页面无法正常显示,页面报错:org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connect——此现象表示由于磁盘空间已满,confluence服务已经无法连接mysql数据库了(磁盘表示我真的一滴也没有了)。
问题定位
通过ssh工具连接服务端后台,执行df -h命令可以看到,确实有一个分区使用率已经达到100%了。因为服务器上只有confluence使用比较频繁,因此盲猜是confluence导致磁盘空间占满了。
接下来分析是什么数据占满了接近200G的磁盘——confluence内视频文件不超过5G,其他都是文本文件,因此不可能是因为系统内数据过多导致磁盘不够用,那原因就只有一个,系统预定作业(即定时任务)生成了大量冗余文件。
但是因为此时confluence页面已经无法访问,因此无法看到系统有哪些预定作业,这时候又要靠盲猜了——是不是定时备份文件太多占满了磁盘?
不废话,赶紧去看一下confluence的备份情况——/var/atlassian/application-data/confluence/backups目录下差不多有一年的备份文件,从几百M到1G不等:磁盘早就已经是备份文件的形状了。
问题修复
既然已经确认是备份文件太多,那就开始清理吧,进入Confluence的安装目录(笔者的目录是/opt/atlassian/confluence/bin)停止confluence服务。
sh shutdown.sh
然后清理/var/atlassian/application-data/confluence/backups目录下的备份文件,笔者这里只留下了最新的备份文件backup-2022_07_20.zip,其他统统删掉。
登录mysql检查数据库是否恢复,但发现此时mysql数据库仍然无法访问,输入用户名密码后提示:Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’,看来光清理备份文件还不够,接下来分析mysql的这个问题的修复步骤:
因为连接mysql时给的错误信息描述不够清晰,因此我们得去看一眼mysql的错误日志,但是此时mysql已经无法正常登陆,我们看不到错误日志的路径,因此只能去mysql的配置文件里去找——查看/etc/my.cnf文件里的以下配置项:
datadir = /data/mysql/data
log-error=mysqld-log.err
即错误日志在/data/mysql/data目录下,错误日志名称为mysqld-log.err,但是因为笔者的mysql没有配置错误日志的文件大小,现在的这个错误日志大到无法通过vi命令打开查看,那该怎么看错误信息呢?
有两个办法,一个是通过tail命令查看实时最新打印的错误信息,另一个是重命名原来的mysqld-log.err,新的错误信息会打在新建的mysqld-log.err里(笔者这里用的是第二个办法,因为第一个办法需要新开一个ssh窗口,我懒)。
重命名后重启mysql,毫无疑问会启动失败,但这样就会生成新的错误日志了:
service mysqld restart
打开错误日志过滤出ERROR消息:
2022-07-20T20:55:01.379066+08:00 0 [ERROR] Unix socket lock file is empty /tmp/mysql.sock.lock.
2022-07-20T20:55:01.379079+08:00 0 [ERROR] Unable to setup unix socket lock file.
2022-07-20T20:55:01.379094+08:00 0 [ERROR] Aborting
由于磁盘空间不足导致mysql宕机时/tmp/mysql.sock.lock文件未能正常删除,而残留的这个临时文件会影响mysql正常启动,那么我们手动把它干掉,然后就可以愉快的启动mysql了。
确认mysql恢复正常后,进入Confluence的安装目录(/opt/atlassian/confluence/bin)启动confluence服务。
sh startup.sh
此时confluence恢复正常,页面恢复访问。
问题复盘
- 配置好confluence预定作业的时间间隔(主要是备份系统);
- 定时清理confluence的备份文件;
- 为mysql配置好mysqld-log.err的文件大小。