2 个命令的输出得到差异(ls 与 du)

2 个命令的输出得到差异(ls 与 du)

因此,分析工作中的一个问题,我发现,当我在 Oracle 上创建一些数据文件时,数据文件没有在文件系统中保留空间,因此我转到sapdata放置数据文件的文件系统,令我惊讶的是,ls -ltr显示了文件我创建数据文件时指定的权重,但 adu -gs说它是 0.00 所以为了比较我做了这两个命令:

A)

find ./sapdata* -name "temp*" -type f -exec du -gs {} \;

二)

find ./sapdata* -name "temp*" -type f -exec ls -ltr {} \; | awk '{printf ("%.2f\t%s\n", $5/1024/1024/1024,$9)}'

请记住,这个命令是这样的,因为这是 Unix,而不是 Linux,我不能使用-printfor -h,我必须使用-g并且我必须除以 1024 才能在ls.

最后一个结果的输出等于第一个结果的输出,但第二个结果使用来自 的信息ls -ltr

在实践中,一切都很好,我设法看到差异,我们正在研究这个问题,但我想通过两种方式向前迈出一步:

  1. 将两个结果混合在一起,告诉我哪些文件在一行中不同
  2. 混合两个结果并获得比较的“健康状态”,这对于制作监控脚本很有用。

我从此命令获得的输出示例如下

A)给我:

15.63   ./sapdata19/temp_1/temp.data1
25.31   ./sapdata20/temp_2/temp.data2

B)给我:

15.63   ./sapdata19/temp_1/temp.data1
0.00    ./sapdata20/temp_2/temp.data2

所以从解决方案1我想要类似的东西

                         DU                                            DIFF                                    LS
--------------------------------------------------------   ----------   --------------------------------------------------------
15.63   ./sapdata19/temp_1/temp.data1    OK          15.63   ./sapdata19/temp_1/temp.data1
25.31   ./sapdata20/temp_2/temp.data2    FAILED   0.00    ./sapdata20/temp_2/temp.data2

或者类似的东西,虽然我知道这是可能的,但不需要标题

对于解决方案 2 我想要类似的东西

Health=50%
Number of Failed=1
Total Number of Datafiles=2
List of Failed=
./sapdata20/temp_2/temp.data2

也许最后一个解决方案我可以使用 BASH 脚本来完成,不会出现太多问题,但第一个解决方案因为我希望它在一行中,所以我不知道该怎么做。我猜想里面有xargsanddiff或者可能是 forawk但我不确定。


  • 回答@roaima:

    不,这不是关于du和之间差异的问题ls,我知道存在差异,但通常这种差异没有意义,现在对于 Oracle 上的临时文件来说,它可能是有意义的。我不完全确定 Oracle 是如何工作的,因为我不是 DBA,但我必须执行一些简单的任务,例如从brtools.

    要点是,假设您有一个 100G 的 sapdata FS /oracle/SID/sapdata1(SAP 实例的 oracle)。如果您添加 2 个 25G 的数据文件,现在sapdata1sapdata有 50G 使用,50G 可用,现在您添加 2 个每个 20G 的临时文件。因此,您在 sapdata1 上将有 90G 已用空间,但是不会,您将有 50G 已用空间,由您通过 找到的每个文件的总和表示du,然后您改天,如果未使用临时文件,它们将保持为 1024K(空)文件大小),然后你df -Ph说“嘿,我有 50G 可用空间,我可以在我的主表空间上添加 2 个 25G 数据文件”,你去添加这一点,这里的问题是,Oracle 是否会理解实际上没有空间在 FS 上,因为临时文件的权重未在 DF 上表示?在我看来,他不会知道,并且会让您添加这两个额外的数据文件。

    此时,FS 上将有 4 个 0G 可用的数据文件,加上 2 个不占用 FS 空间的 20G 临时文件,如果将 a 的查找结果相加,则总和du将为 100G,如果将 ls 的查找结果相加,则将在 100G FS 上为 140G。

    这意味着当 Oracle 数据库尝试实际使用这些临时文件时,它将无法执行并失败,或者它会自动将临时文件的大小调整为剩余空间?我不确定,但如果没有控制,它就会失败,并且在生产环境中失败并不是很好。

    Oracle 创建这些临时文件时没有分配空间来快速创建它们,但在我看来,这可能会导致一些问题,而不仅仅是混乱。抱歉,如果我的英语不是最好的。

  • @Paul_pedant抱歉,我忘了指出这是Unix,而不是Linux,unix find 还没有-print-printf无论如何我都可以用-printon find 来缩短这个时间,但我喜欢使用awk呵呵。

相关内容