Ponekad se desi da recimo obrišemo fajl koji zauzima 30GB prostom komandom „rm -f fajl“ – ali ako se posle okine „df -h“ vidi se da se prostor iz nekog razloga nije oslobodio za tih 30 giga za koliko je trebalo da se oslobodi. Ovo se dešava jer neki proces na sistemu drži taj fajl otvorenim i dalje i „ne da mu da umre tako lako“ i rešenje je restartovanje ili stopiranje tog nekog procesa….ali šta ako se radi o produkcionoj mašini i zaustavljanje ili restart procesa nije izvodljiv?

Naočare za kompjuter
Brisanjem fajla se samo briše link tog fajla ka njegovoj fizičkoj lokaciji na hard disku i na nivou fajl sistema i fajl je i dalje tu negde dok ga nešto drugo ne pregazi i samo je pitanje gde je i po tom principu razni softveri (tipa Recuva) rade pretragu fajl sistema za obrisanim fajlovima.

U ovom TESTNOM primeru ćemo obrisati jednan sistemski Oracle datafajl od oko 800MB na apsolutno nebitnoj test mašini – doduše onaj najjzajebaniji tako da ne pokušavajte ovo nigde i nikad u ovakvom primeru kakvim vidite ovde koji je samo simulacija jer mi to prvo palo na pamet, proverićemo da li je sistem oslobodio prostor i ako nije odradićemo ručno pražnjenje tog „zaključanog“ fajla a naći ćemo ga na osnovu PID-a procesa i fajl deskriptora.

# Proveravamo prostor pre bilo kakvih brisanja
[root@kompjuteras-test ~]# df -hm /u01/app/oracle/oradata/orcl/
Filesystem                          1M-blocks  Used Available Use% Mounted on
/dev/mapper/centos_centos7play-root     51175 18355     32821  36% /

# Brišemo sistemski datafajl koji Oracle i dalje koristi
[root@kompjuteras-test ~]# rm -f /u01/app/oracle/oradata/orcl/system01.dbf

# Proveravamo da li se prostor oslobodio posle ovog brisanja i vidimo da 
# nije, "USED" prostor se nije promenio
[root@kompjuteras-test ~]# df -hm /u01/app/oracle/oradata/orcl/
Filesystem                          1M-blocks  Used Available Use% Mounted on
/dev/mapper/centos_centos7play-root     51175 18355     32821  36% /

# Tražimo koji to proces ili procesi drže fajl otvorenim. Ono što je obeleženo crvenom bojom 
# su PID procesa i fajl deskriptor i na osnovu tih informacija odradićemo pražnjenje fajla
[root@kompjuteras-test ~]# lsof | grep deleted | grep dbf
ora_dbrm_ 24346               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_dbw0_ 24352               oracle  258u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_lgwr_ 24355               oracle  261u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_reco_ 24361               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_mmon_ 24367               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_w001_ 24397               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_aqpc_ 24400               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_cjq0_ 24405               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_q002_ 24561               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
ora_q003_ 24563               oracle  256u      REG              253,0 828383232  102416878 /u01/app/oracle/oradata/orcl/system01.dbf (deleted)

# Putanja do lokacije je /proc/PID/fd/fajl-desktiptor, odnosno u našem slučaju /proc/1707/fd/256
# Uzeli smo prvi proces sa liste. 
[root@kompjuteras-test ~]# ls -l /proc/24346/fd/256
lrwx------. 1 oracle oinstall 64 Nov 24 06:11 /proc/24346/fd/256 -> /u01/app/oracle/oradata/orcl/system01.dbf (deleted)
[root@kompjuteras-test ~]# file /proc/24346/fd/256
/proc/24346/fd/256: broken symbolic link to `/u01/app/oracle/oradata/orcl/system01.dbf (deleted)'

# To je dakle taj fajl, ostaje nam samo da ga ispraznimo
[root@kompjuteras-test ~]# echo > /proc/24346/fd/256

# Ako proverimo sad prostor videćemo da se oslobodio za tih ~800MB
[root@kompjuteras-test ~]# df -hm /u01/app/oracle/oradata/orcl/
Filesystem                          1M-blocks  Used Available Use% Mounted on
/dev/mapper/centos_centos7play-root     51175 17565     33611  35% /

# Proveravamo po PID-u da li je proces i dalje aktivan. 
[root@kompjuteras-test ~]# ps -fp 24346
UID        PID  PPID  C STIME TTY          TIME CMD
oracle   24346     1  0 06:10 ?        00:00:00 ora_dbrm_orcl

Dakle, u ovom slučaju, fajl koji je obrisan a koji je držao otvorenim Oracle, je ispražnjen a proces koji ga je držao je ostao aktivan. Ako se nakad bude radio restart servera izgubiće se ovaj info u /proc kao i ove ‘(deleted)’ linije iz lsof-a. Naravno, s obzirom da smo u OVOM TESTNOM slučaju, obrisali sistemski datafajl – baza neće moći da se digne.