فرض کنید که datafile ای به نام undotbs01.dbf را که در مسیر /oradata/orcl/ قرار دارد را به اشتباه حذف کرده ایم، در این صورت می توانیم با طی کردن سناریوی زیر، datafile را برگردانیم:

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/oradata/orcl/system01.dbf
/oradata/orcl/sysaux01.dbf
/oradata/orcl/undotbs01.dbf
/oradata/orcl/users01.dbf
/oradata/orcl/example01.dbf
/oradata/orcl/APEX_1830835646138963.dbf

6 rows selected.

فرض کنید که کاربری به اشتباه دستور زیر را اجرا کرده که سبب حذف datafile شده:

[root@lx-01-oracle orcl]# rm -rf /oradata/orcl/undotbs01.dbf

حال با دستور زیر، شماره پروسس dbwriter را بدست می آوریم:

[oracle@lx-01-oracle ~]$ ps -ef|grep dbw0|grep -v grep
oracle 2393 1 0 10:34 ? 00:00:00 ora_dbw0_orcl

در این قسمت به مسیر /proc می رویم و از طریق شماره پراسس dbwriter که در بالا به دست آوردیم وارد دایرکتوری پراسس می‌شویم تا لینک datafile حذف شده را بدست آوریم:

[oracle@lx-01-oracle fd]$ cd /proc/2393/fd

[oracle@lx-01-oracle fd]$ ll
total 0
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 0 -> /dev/null
l-wx------. 1 oracle oinstall 64 Jan 30 10:52 1 -> /dev/null
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 10 -> /oracle/product/11.2.0/db_1/dbs/lkORCL
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 11 -> /oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
l-wx------. 1 oracle oinstall 64 Jan 30 10:52 2 -> /dev/null
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 256 -> /oradata/orcl/control01.ctl
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 257 -> /fra/orcl/control02.ctl
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 258 -> /oradata/orcl/system01.dbf
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 259 -> /oradata/orcl/sysaux01.dbf
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 260 -> /oradata/orcl/undotbs01.dbf (deleted)
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 261 -> /oradata/orcl/users01.dbf
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 262 -> /oradata/orcl/example01.dbf
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 263 -> /oradata/orcl/APEX_1830835646138963.dbf
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 264 -> /oradata/orcl/temp01.dbf
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 3 -> /dev/null
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 4 -> /dev/null
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 5 -> /dev/null
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 6 -> /oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 7 -> /proc/2393/fd
lr-x------. 1 oracle oinstall 64 Jan 30 10:52 8 -> /dev/zero
lrwx------. 1 oracle oinstall 64 Jan 30 10:52 9 -> /oracle/product/11.2.0/db_1/dbs/hc_orcl.dat

در لیست بالا یک فایل به رنگ قرمز چشمک میزند (فایلی که با فلگ deleted مشخص شده است)

از طریق id فیال و مسیرش فایل را کپی میکنیم

[oracle@lx-01-oracle fd]$ cp 260  /oradata/orcl/undotbs01.dbf

در نهایت datafile را recover می کنیم تا هدر اوراکل با فایل سازگار شود:

(در اینجا چون من datafile undo رو حذف کردم کارهای زیر رو انجام میدم)

SQL> alter database datafile '/oradata/orcl/undotbs01.dbf' offline;
alter database datafile '/oradata/orcl/undotbs01.dbf' offline
*
ERROR at line 1:
ORA-01145: offline immediate disallowed unless media recovery enabled
SQL> alter tablespace undotbs1 offline;
alter tablespace undotbs1 offline
*
ERROR at line 1:
ORA-30042: Cannot offline the undo tablespace

SQL> create undo tablespace UNDOTBS2 datafile '/oradata/orcl/undotbs02.dbf' size 100M;
Tablespace created.

SQL> alter system set undo_tablespace=UNDOTBS2 ;
System altered.

SQL> alter system set undo_management=MANUAL scope=spfile;
System altered.

SQL> shut immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.
Total System Global Area 697311232 bytes
Fixed Size 2256512 bytes
Variable Size 251658624 bytes
Database Buffers 440401920 bytes
Redo Buffers 2994176 bytes
Database mounted.
ORA-01113: file 3 needs media recovery
ORA-01110: data file 3: '/oradata/orcl/undotbs01.dbf'

SQL> recover datafile '/oradata/orcl/undotbs01.dbf';
Media recovery complete.

SQL> alter database datafile '/oradata/orcl/undotbs01.dbf' online;
Database altered.
SQL> shut immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.
Total System Global Area 697311232 bytes
Fixed Size 2256512 bytes
Variable Size 251658624 bytes
Database Buffers 440401920 bytes
Redo Buffers 2994176 bytes
Database mounted.
Database opened.
SQL>

اگه دیتافایل شما دیتافایل undo نبود اقدامات زیر به ضمنی کافی است:

SQL> alter database datafile '/oradata/orcl/users01.dbf' offline;
Database altered.

SQL> recover datafile '/oradata/orcl/users01.dbf';
Media recovery complete.

SQL> alter database datafile '/oradata/orcl/users01.dbf' online;
Database altered.

منبع: این مقاله رو یکبار در لینکدین شخصی نوشته بود و من در فایل ورد ذخیره‌اش کردم متاسفانه لینکی از مطلب اصلی پیدا نکردم برای اینکه حقوق مولف اصلی حفظ شود اگر منبع این نوشته را یافتید با من در تماس باشید.

با تشکر