IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

其实,文件也可以truncate

I am LAZY bones ? 2010-10-24 19:32:53 累计浏览 8,533 次
本机暂存

熟悉数据库的朋友们都知道,大多数数据库都有个truncate指令:truncate table xxx可以把xxx表里的所有数据都删掉,但是保留表结构。其实,在有任何数据库之前,UNIX系统里就有了truncate这个命令了,当然后面的*nix里都保留了这个。可以想像,系统里的truncate命令的操作对象肯定是文件,而且此命令不仅能把文件的数据删成0字节,还可以缩减(甚至扩大)文件至指定的大小(通过 -s 选项指定文件大小值),这对于那种日志头部有些不想删除的关键信息,但后面的部分又很多很杂的情况下很有用。对于普通的日志文件,我们要清理的时候通常可以执行 > log 来清除文件的内容(这样,log文件会变成0字节),但是如果清理的同时想保留原始日志的前面4K的信息,不用truncate就会很麻烦了。

truncate的用法还是通过实战来解释吧,如下:

以下是引用片段:
lily@LLY ~$ echo -n 1234567 > txt
lily@LLY ~$ cat txt
1234567lily@LLY ~$ 
lily@LLY ~$ truncate -s 4 txt
lily@LLY ~$ cat txt
1234lily@LLY ~$ 
lily@LLY ~$ ls -l txt
-rw-r--r-- 1 lily lily 4 10月 24 16:54 txt
lily@LLY ~$ truncate -s 1M txt
lily@LLY ~$ ls -l txt
-rw-r--r-- 1 lily lily 1048576 10月 24 17:17 txt
lily@LLY ~$ du txt
4    txt
lily@LLY ~$ wc -c txt
1048576 txt
 
这里还可以看到一个“奇怪”的现象,本来已经缩至4字节的文件,把它扩展成1M以后,ls 和 wc 的结果显示大小确实是1M,但是 du 的结果却发现大小还是4字节。这也是要注意的地方之一,这种文件称为“空洞文件”,也就是说,文件的部分内容并没有实际存在于硬盘上(即没有分配对应的inode),只是“声称”有1M的大小而已。对于不存在于硬盘上的那部分字节,如果去读的话,也是不会报错的,会读到全0的数据。

这也从另一个方面反映出ls等命令默认显示的是文件“声称”的大小,而du (disk use)默认显示的是真正的磁盘占用。这里是我以前的另外一个例子。

同分类推荐文章

  1. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  2. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)
  3. 硬件故障后数据文件大小不对故障处理—Oracle碎片扫描恢复 (2026-06-07 18:21:47)

查看更多 数据库 文章 →

建议继续学习

  1. MySQL数据库在实际应用一些方面的介绍 (累计阅读 36,363)
  2. 如何查找消耗资源较大的SQL (累计阅读 15,167)
  3. MariaDB常见问题FAQ (累计阅读 8,311)
  4. 三种东西永远不要放到数据库里 (累计阅读 8,005)
  5. SQL vs NoSQL:数据库并发写入性能比拼 (累计阅读 7,971)
  6. Mysql的随机读取 (累计阅读 7,826)
  7. 索引与优化like查询 (累计阅读 7,298)
  8. 在百度的第一年 (累计阅读 6,882)
  9. SQL到NOSQL的思维转变 (累计阅读 6,795)
  10. SQL里是否可以使用JOIN (累计阅读 6,772)