Tomcat启动报错 ( No space left on device)

本文解决了一个关于分库查询中只能查询到第一个分库的问题,原因是数据库临时分区tmp空间不足。通过修改my.cnf配置文件中的tmpdir路径,并创建及授权新目录,成功解决了数据库重启错误。

问题起因

分库查询中只能查询到,第一个分库,后续分库查询不到,查看日志,发现如下错误信息

错误信息

Caused by: java.sql.SQLException: Can't change size of file (OS errno 28 - No space left on device)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.15.jar:8.0.15]
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.15.jar:8.0.15]
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.15.jar:8.0.15]
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:970) ~[mysql-connector-java-8.0.15.jar:8.0.15]
	at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1020) ~[mysql-connector-java-8.0.15.jar:8.0.15]
	at com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema.executeMetadataQuery(DatabaseMetaDataUsingInfoSchema.java:70) ~[mysql-connector-java-8.0.15.jar:8.0.15]
	at com.mysql.cj.jdbc.DatabaseMetaDataUsingInfoSchema.getTables(DatabaseMetaDataUsingInfoSchema.java:847) ~[mysql-connector-java-8.0.15.jar:8.0.15]

问题原因

数据库临时分区tmp空间不足

参考https://stackoverflow.com/questions/7415710/mysql-writing-file-error-errcode-28

my.cnf中如果没有配置tmpdir的路径,默认使用/tmp;

修改my.cnf 中tmpdir = /alidata1/dbtmpdir

目录磁盘空间查看

# 查看目录已用空间 df -PhT /
#处理前

已用100%
#处理后
[root@toku01 alidata1]# df -PhT /
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/vda1      ext4   20G  3.0G   16G  16% /

 

解决步骤

# 创建目录
mkdir /alidata1/dbtmpdir

#修改my.cnf配置文件 ,增加配置:tmpdir=/alidata1/dbtmpdir

vim my.cnf

#需要给新建目录授权,不然重启会失败
chmod 777 /alidata1/dbtmpdir

#重新启动

#linux centos 7 重启命令
systemctl restart  mysqld.service

#linux  centos6 重启命令
service mariadb restart

#重启启动tomcat 解决问题

 

如果数据库重启错误,查看数据库日志文件,就可以知道问题原因,然后针对性去处理


tail -n8 mysqld.log
2020-05-18T04:52:25.504543Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.15-5)  Percona Server (GPL), Release 5, Revision f8a9e99.
mysqld: Can't create/write to file '/alidata1/dbTempDir/ibiZvIlt' (OS errno 13 - Permission denied)
2020-05-18T04:52:26.900951Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.15-5) starting as process 17025
2020-05-18T04:52:27.012324Z 1 [ERROR] [MY-012576] [InnoDB] Unable to create temporary file; errno: 13
2020-05-18T04:52:27.012354Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error.
2020-05-18T04:52:27.012395Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2020-05-18T04:52:27.012655Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2020-05-18T04:52:27.012810Z 0 [ERROR] [MY-010119] [Server] Aborting

 

### 3.1 检查磁盘空间使用情况并清理无用文件 出现 `No space left on device` 错误时,首先应检查磁盘的使用情况,确认是否确实因磁盘空间耗尽导致该问题。使用以下命令查看磁盘空间: ```bash df -h ``` 如果发现某个分区的使用率达到 100%,则需要清理该分区中的无用文件。例如,可以查找并删除临时文件、日志文件或缓存文件: ```bash find /var/log -type f -name "*.log" -size +100M -exec rm -f {} \; ``` 通过这种方式可以释放部分磁盘空间,缓解因磁盘满导致的系统错误 [^1]。 ### 3.2 检查 inode 使用情况 除了磁盘空间本身,还需要检查文件系统中 inode 的使用情况。即使磁盘空间未满,但 inode 耗尽也会导致无法创建新文件。使用以下命令查看 inode 使用情况: ```bash df -i ``` 如果发现 inode 使用率达到 100%,可以通过以下命令查找并清理大量小文件: ```bash find /path/to/check -type f | wc -l ``` 清理不必要的小文件或日志条目可有效释放 inode 资源 [^1]。 ### 3.3 配置临时文件存储路径以避免磁盘空间不足 在处理上传请求(如 multipart/form-data)时,系统会使用 `/tmp` 目录作为临时存储路径。如果该路径所在的磁盘空间不足,会导致上传失败。为避免此类问题,可以配置服务使用其他具有足够空间的临时目录。例如,在 Spring Boot 应用中,可以通过以下配置设置 Tomcat 的临时目录: ```yaml server: tomcat: basedir: /data/tmp ``` 确保该目录存在并具有适当的写入权限,可有效避免因 `/tmp` 空间不足导致的问题 [^1]。 ### 3.4 定期清理临时文件以防止磁盘空间耗尽 系统运行过程中会不断生成临时文件,尤其是在高并发上传场景下。建议设置定时任务自动清理旧的临时文件。例如,创建一个清理脚本 `clean_temp.sh`: ```bash #!/bin/bash find /tmp/tomcat* -type f -mtime +1 -exec rm -f {} \; ``` 然后配置 `cron` 任务每天凌晨执行一次: ```bash 0 0 * * * /path/to/clean_temp.sh ``` 通过定期清理临时文件,可有效防止磁盘空间被临时文件占满 [^1]。 ### 3.5 实时监控磁盘使用情况以预防空间不足 建议部署监控系统(如 Prometheus + Node Exporter + Grafana)实时监控磁盘使用情况。通过设置阈值告警,可以在磁盘使用率达到 80% 或 90% 时及时通知运维人员处理。例如,使用 `node_disk_io_time_seconds_total` 指标监控磁盘 I/O 负载,结合 `node_filesystem_avail_bytes` 指标监控文件系统可用空间,可有效预警潜在的磁盘空间问题 。 ### 3.6 扩展磁盘容量以满足长期需求 如果磁盘长期处于高负载状态,上述方法仅能缓解短期问题。此时应考虑扩展磁盘容量。可以使用 LVM(Logical Volume Manager)动态扩展逻辑卷,或在云环境中升级云磁盘容量。例如,使用 LVM 扩展逻辑卷的步骤如下: ```bash pvcreate /dev/sdb vgextend vg_data /dev/sdb lvextend -L+100G /dev/vg_data/lv_root resize2fs /dev/vg_data/lv_root ``` 通过扩展磁盘容量,可从根本上解决因磁盘空间不足导致的系统错误 。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值