使用Linux文件句柄恢复Oracle数据文件

2025-11-13Linux/AIX / Oracle / RAC
  1. [oracle@zhongwc ~]$ sqlplus / as sysdba
  2. 2.

  3. SQL*Plus: Release 11.2.0.3.0 Production on Tue Jan 15 11:14:48 2013
  4. 4.

  5. Copyright (c) 1982, 2011, Oracle. All rights reserved.
  6. 6. 7.

  7. Connected to:
  8. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 – 64bit Production
  9. With the Partitioning, OLAP, Data Mining and Real Application Testing options
  10. 11.

  11. SQL> col tablespace_name format a10
  12. SQL> col file_name format a50
  13. SQL> select open_mode from v$database;
  14. 15.

  15. OPEN_MODE
  16. ——————–
  17. READ WRITE
  18. 19.

  19. SQL> select file_name,tablespace_name,status from dba_data_files;
  20. 21.

  21. FILE_NAME TABLESPACE STATUS
  22. ————————————————– ———- ———
  23. /u01/app/oracle/oradata/ZWC/users01.dbf USERS AVAILABLE
  24. /u01/app/oracle/oradata/ZWC/undotbs01.dbf UNDOTBS1 AVAILABLE
  25. /u01/app/oracle/oradata/ZWC/sysaux01.dbf SYSAUX AVAILABLE
  26. /u01/app/oracle/oradata/ZWC/system01.dbf SYSTEM AVAILABLE
  27. /u01/app/oracle/oradata/ZWC/example01.dbf EXAMPLE AVAILABLE

删除普通数据表空间的数据文件[plain]view plaincopyprint?

  1. SQL> !rm -r /u01/app/oracle/oradata/ZWC/users01.dbf
  2. 2.

  3. SQL> !rm -r /u01/app/oracle/oradata/ZWC/example01.dbf

查看文件句柄,发现users01.dbf和example01.dbf状态为delete,切记不要shutdown实例[plain]view plaincopyprint?

  1. [oracle@zhongwc ~]$ ps -ef|grep dbw|grep -v grep |awk '{print $2}'
  2. 2858
  3. [oracle@zhongwc ~]$ ls -l /proc/2858/fd
  4. total 0
  5. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 0 -> /dev/null
  6. l-wx—— 1 oracle oinstall 64 Jan 15 11:20 1 -> /dev/null
  7. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 10 -> /dev/zero
  8. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 11 -> /dev/zero
  9. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 12 -> /u01/app/oracle/product/11.2.0/db_1/rdbms/mesg/orazhs.msb
  10. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 13 -> /u01/app/oracle/product/11.2.0/db_1/dbs/hc_ZWC.dat
  11. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 14 -> /proc/2858/fd/
  12. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 15 -> /dev/zero
  13. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 16 -> /u01/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
  14. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 17 -> /u01/app/oracle/product/11.2.0/db_1/dbs/hc_ZWC.dat
  15. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 18 -> /u01/app/oracle/product/11.2.0/db_1/dbs/lkZWC
  16. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 19 -> /u01/app/oracle/product/11.2.0/db_1/rdbms/mesg/orazhs.msb
  17. l-wx—— 1 oracle oinstall 64 Jan 15 11:20 2 -> /dev/null
  18. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 20 -> /u01/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb
  19. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 256 -> /u01/app/oracle/oradata/ZWC/control01.ctl
  20. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 257 -> /u01/app/oracle/fast_recovery_area/ZWC/control02.ctl
  21. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 258 -> /u01/app/oracle/oradata/ZWC/system01.dbf
  22. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 259 -> /u01/app/oracle/oradata/ZWC/sysaux01.dbf
  23. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 260 -> /u01/app/oracle/oradata/ZWC/undotbs01.dbf
  24. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 261 -> /u01/app/oracle/oradata/ZWC/users01.dbf (deleted)
  25. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 262 -> /u01/app/oracle/oradata/ZWC/example01.dbf (deleted)
  26. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 263 -> /u01/app/oracle/oradata/ZWC/temp01.dbf
  27. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 3 -> /dev/null
  28. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 4 -> /dev/null
  29. lrwx—— 1 oracle oinstall 64 Jan 15 11:20 5 -> /u01/app/oracle/product/11.2.0/db_1/dbs/hc_ZWC.dat
  30. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 6 -> /dev/null
  31. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 7 -> /dev/null
  32. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 8 -> /dev/null
  33. lr-x—— 1 oracle oinstall 64 Jan 15 11:20 9 -> /dev/null

cp到新的位置[plain]view plaincopyprint?

  1. [oracle@zhongwc ~]$ cp -p /proc/2858/fd/261 /new_oradata/users01.dbf
  2. [oracle@zhongwc ~]$ cp -p /proc/2858/fd/262 /new_oradata/example01.dbf

恢复数据文件[plain]view plaincopyprint?

  1. SQL> select file#,status,name from v$datafile;
  2. 2.

  3. FILE# STATUS NAME
  4. ———- ——- ————————————————-
  5. 1 SYSTEM /u01/app/oracle/oradata/ZWC/system01.dbf
  6. 2 ONLINE /u01/app/oracle/oradata/ZWC/sysaux01.dbf
  7. 3 ONLINE /u01/app/oracle/oradata/ZWC/undotbs01.dbf
  8. 4 ONLINE /u01/app/oracle/oradata/ZWC/users01.dbf
  9. 5 ONLINE /u01/app/oracle/oradata/ZWC/example01.dbf
  10. 10.

  11. SQL> alter database datafile 4 offline;
  12. 12.

  13. Database altered.
  14. 14.

  15. SQL> alter database datafile 5 offline;
  16. 16.

  17. Database altered.
  18. 18.

  19. SQL> select file#,status,name from v$datafile;
  20. 20.

  21. FILE# STATUS NAME
  22. ———- ——- ————————————————-
  23. 1 SYSTEM /u01/app/oracle/oradata/ZWC/system01.dbf
  24. 2 ONLINE /u01/app/oracle/oradata/ZWC/sysaux01.dbf
  25. 3 ONLINE /u01/app/oracle/oradata/ZWC/undotbs01.dbf
  26. 4 RECOVER /u01/app/oracle/oradata/ZWC/users01.dbf
  27. 5 RECOVER /u01/app/oracle/oradata/ZWC/example01.dbf
  28. 28.

  29. SQL> alter database rename file '/u01/app/oracle/oradata/ZWC/users01.dbf' to '/new_oradata/users01.dbf';
  30. 30.

  31. Database altered.
  32. 32.

  33. SQL> alter database rename file '/u01/app/oracle/oradata/ZWC/example01.dbf' to '/new_oradata/example01.dbf';
  34. 34.

  35. Database altered.
  36. 36.

  37. SQL> select file#,status,name from v$datafile;
  38. 38.

  39. FILE# STATUS NAME
  40. ———- ——- ————————————————-
  41. 1 SYSTEM /u01/app/oracle/oradata/ZWC/system01.dbf
  42. 2 ONLINE /u01/app/oracle/oradata/ZWC/sysaux01.dbf
  43. 3 ONLINE /u01/app/oracle/oradata/ZWC/undotbs01.dbf
  44. 4 RECOVER /new_oradata/users01.dbf
  45. 5 RECOVER /new_oradata/example01.dbf
  46. 46.

  47. SQL> alter datafile datafile 4 online;
  48. alter datafile datafile 4 online
  49. *
  50. ERROR at line 1:
  51. ORA-00940: invalid ALTER command
  52. 52. 53.

  53. SQL> alter database datafile 4 online;
  54. alter database datafile 4 online
  55. *
  56. ERROR at line 1:
  57. ORA-01113: file 4 needs media recovery
  58. ORA-01110: data file 4: '/new_oradata/users01.dbf'
  59. 60. 61.

  60. SQL> recover datafile 4;
  61. Media recovery complete.
  62. SQL> recover datafile 5;
  63. Media recovery complete.
  64. SQL> alter database datafile 4 online;
  65. 67.

  66. Database altered.
  67. 69.

  68. SQL> alter database datafile 5 online;
  69. 71.

  70. Database altered.
  71. 73.

  72. SQL> select file#,status,name from v$datafile;
  73. 75.

  74. FILE# STATUS NAME
  75. ———- ——- ————————————————-
  76. 1 SYSTEM /u01/app/oracle/oradata/ZWC/system01.dbf
  77. 2 ONLINE /u01/app/oracle/oradata/ZWC/sysaux01.dbf
  78. 3 ONLINE /u01/app/oracle/oradata/ZWC/undotbs01.dbf
  79. 4 ONLINE /new_oradata/users01.dbf
  80. 5 ONLINE /new_oradata/example01.dbf
  81. [plain]view plaincopyprint?

  82. SQL> create user zhongwc identified by zhongwcpwd default tablespace users;
  83. 2.

  84. User created.
  85. 4.

  86. SQL> grant dba to zhongwc;
  87. 6.

  88. Grant succeeded.
  89. 8.

  90. SQL> conn zhongwc@zwc
  91. Enter password:
  92. Connected.
  93. SQL> create table t_test tablespace users as select * from dba_objects;
  94. 13.

  95. Table created.
  96. 15.

  97. SQL> select count(*) from t_test;
  98. 17.

  99. COUNT(*)
  100. ———-
  101. 75203