执行mySQL产生临时数据占满了/tmp磁盘空间的解决办法

本文介绍了解决MySQL因临时表空间不足导致的“Incorrect key file for table”错误的方法。通过调整临时表存放目录至/var/tmp,并确保其权限正确设置为1777,可以有效避免该问题的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql查询出现:mysql 126, "Incorrect key file for table '/tmp/#sql_597e_1.MYI'; try to repat it

原因是:执行mySQL产生临时数据占满了/tmp磁盘空间的解决办法

当mysql的临时文件大小设置太小,或者由于并发量太大导致临时文件存放的目录空间大小不够时都会报这个错误。”incorrect key file for the table ‘/tmp/#sql….';try to repair it”

一般的tmp目录的权限比较特别是drwxrwxrwt 就是1777
表示任何人都可以在此目录拥有写权限但是不能删除别人拥有的文件。

具体修改临时表目录的步骤为:

1) 查看法语站当前磁盘空间使用情况,建议将临时表存放目录设置在/var下。

tmp-err2
【修改tmp目录】Incorrect <wbr>key <wbr>file <wbr>for <wbr>table <wbr>’/tmp/#sql_bd2_0.MYI’解决
[root@wholesale /]# mkdir /var/tmp
[root@wholesale /]# chmod 1777 /var/tmp/
2) my.cnf中[mysqld]下增加:

tmpdir=/var/tmp

3) 重启mysql服务
4) 查看mysql错误日志情况,看是否报错。
5) 进入mysql查看当前的tmpdir情况,确认是否修改完成

show variables like ‘tmpdir';

tmp-err3



<think>嗯,用户之前问过关于如何删除/tmp目录下可以删除的文件,现在又提到/tmp文件夹满了。这说明他们可能遇到了存储空间不足的问题,需要紧急清理。首先,我得确认用户的操作系统,因为不同的发行版处理/tmp的方式不同,比如有些系统会自动清理,而有些则不会。用户可能已经尝试过手动删除,但发现空间没有释放,或者不清楚哪些文件可以安全删除。 接下来,我需要考虑用户可能没有提到的深层需求。比如,他们可能是在生产环境中遇到这个问题,担心误删重要文件导致服务中断。或者,他们可能遇到了恶意软件在/tmp中生成大量文件的情况。另外,用户可能没有足够的权限,需要sudo命令来执行清理,但不确定如何正确使用。 用户的问题还可能涉及到如何预防/tmp目录再次被填满。比如,设置定时任务自动清理,或者将/tmp挂载为tmpfs来利用内存空间。这时候,我需要提供多种解决方案,包括立即清理的方法和长期预防的措施。 另外,需要注意安全风险。直接使用rm -rf /tmp/*可能会有风险,因为可能有正在被使用的文件,导致程序崩溃。应该推荐更安全的find命令,根据文件修改时间或类型来删除。同时,检查是否有异常的大文件或权限不正确的文件,防止恶意文件占用空间。 可能还需要指导用户如何查看磁盘使用情况,确认确实是/tmp目录占满,而不是其他目录。使用df和du命令来确认空间使用情况,避免误判。如果/tmp是单独的分区,可能需要调整分区大小,但这种情况较少,更多是临时清理。 最后,用户可能需要了解为什么/tmp会被填满。比如,某个应用程序异常写入大量临时文件,或者日志文件没有正确轮转。这时候,除了清理,还需要排查根本原因,防止问题再次发生。</think>--- ### **快速诊断步骤** 1. **确认空间占用** ```bash # 查看磁盘整体使用情况 df -h | grep -E 'Filesystem|/tmp' # 定位/tmp中的大文件(按大小排序) sudo du -ah /tmp | sort -rh | head -n 20 ``` 2. **识别文件类型** ```bash # 查找超过100MB的文件 find /tmp -type f -size +100M -exec ls -lh {} \; # 检查异常文件(如随机命名文件) ls -la /tmp | grep -E '\..{20,}$' # 匹配长后缀文件 ``` --- ### **紧急清理方案** #### **方案1:安全删除陈旧文件** ```bash # 删除7天未修改的文件(保留最近使用的文件) sudo find /tmp -type f -mtime +7 -exec rm -fv {} \; # 删除空目录(避免残留无效结构) sudo find /tmp -mindepth 1 -type d -empty -delete ``` #### **方案2:处理顽固文件** ```bash # 强制删除未被进程占用的文件(跳过正在使用的文件) sudo find /tmp -type f ! -exec lsof -t {} + -exec rm -f {} \; # 清除失效的符号链接 sudo find /tmp -xtype l -delete ``` --- ### **深度排查与修复** #### **1. 检查异常进程** ```bash # 查看正在使用/tmp文件的进程 sudo lsof +D /tmp | awk 'NR==1 || $4~/[0-9][uw]/' # 监控实时写入(按Ctrl+C停止) sudo inotifywait -m -r /tmp 2> /dev/null | grep 'CREATE\|MODIFY' ``` #### **2. 文件系统检测** ```bash # 检查inode使用情况(可能被小文件耗尽) df -i /tmp # 修复文件系统错误(卸载后操作) sudo umount /tmp # 仅适用于独立分区 sudo fsck /dev/sdXN # 替换为实际分区 ``` --- ### **长期优化配置** #### **1. 内存盘挂载(推荐)** ```bash # /etc/fstab 配置示例 tmpfs /tmp tmpfs defaults,noatime,nosuid,nodev,size=2G 0 0 # 立即生效(无需重启) sudo mount -o remount /tmp ``` #### **2. 自动清理策略** ```bash # 创建每日清理任务(系统级) sudo tee /etc/cron.daily/tmp_clean <<'EOF' #!/bin/sh find /tmp -type f -mtime +3 -delete find /tmp -type d -empty -delete EOF sudo chmod +x /etc/cron.daily/tmp_clean ``` --- ### **风险控制表** | 现象 | 潜在原因 | 解决方案 | |---------------------|---------------------------|-----------------------------| | `rm: cannot remove` | 文件被进程占用 | 用 `lsof` 查杀关联进程 | | 清理后快速复现 | 恶意程序驻留 | 使用 `chattr +i` 保护目录 | | 大量小文件 | inode耗尽 | 挂载为独立分区并调整inode数 | --- ### **特殊场景处理** **场景1:Docker容器泄漏** ```bash # 查找容器残留文件 sudo find /tmp -name 'docker-*' -exec du -sh {} \; # 清理已停止容器的临时文件 docker system prune -f ``` **场景2:MySQL临时表溢出** ```bash # 检查MySQL配置 grep tmp_table_size /etc/mysql/my.cnf # 建议值(根据内存调整) tmp_table_size=256M max_heap_table_size=256M ``` --- ### **终极解决方案** ```bash # 安全重建/tmp目录(需单用户模式) sudo systemctl rescue sudo rm -rf /tmp/* sudo mkdir /tmp sudo chmod 1777 /tmp ``` --- **总结**:优先使用 `find` 按时间清理,避免直接 `rm -rf`。关键原则是 **保留活跃文件,删除僵尸数据**。对于高频写入场景,建议通过内存挂载 (`tmpfs`) 或独立分区管理。定期使用 `ncdu /tmp` 进行空间审计。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值