با حذف یک فایل در محیط لینوکس، معمولا فضای مصرفی ان فایل هم آزاد می شود اما در مواردی، این فضای مصرفی، به سیستم عامل برنمی گردد. در این متن به دلایل احتمالی این مسئله و چگونگی رفع آن می پردازیم.
در قسمت زیر خواهیم دید که با حذف یک فایل 5 گیگابایتی، فضای مصرفی این فایل، به پارتیشن بر نخواهد گشت.
SQL> alter tablespace MYTBS add datafile ‘/18c/base/oradata/NONCDB/mytbs02.dbf’ size 5g;
Tablespace altered.
[oracle@ol6 ~]$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 181G 140G 33G 82% /
[oracle@ol6 ~]$ rm -rf /18c/base/oradata/NONCDB/mytbs02.dbf
[oracle@ol6 ~]$ df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 181G 140G 33G 82% /
انتقال این فایل به recycle bin شاید اولین چیزی باشد که به ذهن متبادر شود! پس لیست فایلهای موجود در دایرکتوری Trash را بازبینی می کنیم:
[root@ol6 ~]# ls -la /root/.local/share/Trash/files
drwx—— 2 root root 4096 Jun 17 15:13 .
drwx—— 5 root root 4096 Aug 29 2028 ..
همانطور که می بینید، اثری از این فایل در دایرکتوری Trash نیست! پس باید به دنبال راهکار دیگری باشیم.
فایل mytbs02.dbf را در زمانی حذف کرده ایم که دیتابیس اوراکل در حال اجرا بوده است و این فایل هم به عنوان یکی از دیتافایلهای دیتابیس، در حال استفاده و اصطلاحا توسط پروسسهای اوراکلی، open شده بود دلیل عدم برگشت فضای این فایل، به همین مسئله برمی گردد!
با دستور زیر لیست فایلهای بازی(open) که حذف شده اند را می بینیم:
[oracle@ol6 ~]$ lsof |grep deleted
ora_dbw0_ 14825 oracle 268uW REG 8,3 5368717312 6960459 /18c/base/oradata/NONCDB/mytbs02.dbf (deleted)
ora_ckpt_ 14829 oracle 266u REG 8,3 5368717312 6960459 /18c/base/oradata/NONCDB/mytbs02.dbf (deleted)
می بینیم که این دیتافایل توسط بک گراند پروسسهای dbw و ckpt در حال استفاده می باشد و file descriptor آن برابر با 268 و 266 می باشد:
[root@ol6 ~]# ls -l /proc/14825/fd/268
lrwx—— 1 oracle oinstall 64 Jun 17 15:23 /proc/14825/fd/268 -> /18c/base/oradata/NONCDB/mytbs02.dbf (deleted)
این دیتافایل هنوز در عمل حذف نشده و قابل بازیابی می باشد که قبلا در مقاله ای، نحوه بازیابی آن را شرح داده ایم.
پس برای آزاد کردن فضای مصرفی این فایل، کار آسانی را در پیش داریم! با از بین بردن و یا اصطلاحا kill کردن این دو پروسس، فضای اشغال شده توسط این فایل هم آزاد خواهد شد:
[oracle@ol6 ~]$ kill -9 14825 14829
با دستور زیر می بینید که این فضا ازاد شده است:
[oracle@ol6 ~]$ df –h /
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 181G 135G 38G 79% /
همچنین با restart کردن دیتابیس اوراکل هم این فضای مصرف شده به دیسک برمی گردد. البته ممکن است نخواهیم دیتابیس را restart کنیم که در این صورت، راه حل دیگری هم وجود دارد:
[root@ol6 ~]# cat /dev/null > /proc/14825/fd/268