oracle用老的控制文件备份恢复新建的数据文件

备份控制文件并在备份后新建表空间和数据:
SQL> alter database backup controlfile to trace as '/home/oracle/ctl.sql';

Database altered.

SQL> create tablespace tbs_tbs datafile '/database/oradata/skyread/tbs_tbs.dbf' size 10M;

Tablespace created.

SQL> create table t02 tablespace tbs_tbs as select * from dict;                        

Table created
干净关闭数据库,模拟控制文件损坏:
SQL> shutdown immediate;
oracle@readerlogdb-> mv tbs_tbs.dbf tbs_tbs.dbf.bak
oracle@readerlogdb-> mv control01.ctl control01.ctl.bak
oracle@readerlogdb-> mv control02.ctl control02.ctl.bak
oracle@readerlogdb-> mv control03.ctl control03.ctl.bak

SQL> startup;
ORACLE instance started.

Total System Global Area           5049942016 bytes
Fixed Size                            2090880 bytes
Variable Size                      1375733888 bytes
Database Buffers                   3657433088 bytes
Redo Buffers                         14684160 bytes
ORA-00205: error in identifying control file, check alert log for more info

这个门用的是刚才备份的脚本新建,可见里面无 tbs_tbs这个数据文件:
SQL>CREATE CONTROLFILE REUSE DATABASE "SKYREAD" NORESETLOGS FORCE LOGGING ARCHIVELOG
    MAXLOGFILES 20
    MAXLOGMEMBERS 5
    MAXDATAFILES 1000
    MAXINSTANCES 8
    MAXLOGHISTORY 2337
LOGFILE
  GROUP 1 '/database/oradata/skyread/redo01.log'  SIZE 512M,
  GROUP 2 '/database/oradata/skyread/redo02.log'  SIZE 512M,
  GROUP 3 '/database/oradata/skyread/redo03.log'  SIZE 512M,
  GROUP 4 '/database/oradata/skyread/redo04.log'  SIZE 512M,
  GROUP 5 '/database/oradata/skyread/redo05.log'  SIZE 512M
DATAFILE
  '/database/oradata/skyread/system01.dbf',
  '/database/oradata/skyread/tbs_test.dbf',
  '/database/oradata/skyread/sysaux01.dbf',
  '/database/oradata/skyread/users01.dbf',
  '/database2/oradata/skyread/TBS_MRPMUSIC01.dbf',
  '/database/oradata/skyread/sf01.dbf',
  '/database2/oradata/skyread/undotbs02'
CHARACTER SET UTF8;
这里由于数据文件模拟破坏了,但是还是打开数据库,只不过tbs_tbs这个表空间的数据无法使用
SQL> alter database open;
Database altered.
标红的部分就是我们需要恢复的数据文件,这里由于控制文件备份的时候还没有这个表空间,不知道数据文件所以无法recover,当然由于我们刚才模拟损坏,rename的时候提示没有tbs_tbs.dbf文件
SQL> select file#,name,CHECKPOINT_CHANGE# ,status from v$datafile;

               FILE# NAME                                                 CHECKPOINT_CHANGE# STATUS
-------------------- -------------------------------------------------- -------------------- -------
                   1 /database/oradata/skyread/system01.dbf                     122694852856 SYSTEM
                   2 /database/oradata/skyread/tbs_test.dbf                     122694852856 ONLINE
                   3 /database/oradata/skyread/sysaux01.dbf                     122694852856 ONLINE
                   4 /database/oradata/skyread/users01.dbf                      122694852856 ONLINE
                    5 /app/oracle/product/10.2.0/db_1/dbs/MISSING00005                      0 RECOVER
                  18 /database2/oradata/skyread/TBS_MRPMUSIC01.dbf              122694852856 ONLINE
                  26 /database/oradata/skyread/sf01.dbf                         122694852856 ONLINE
                  31 /database2/oradata/skyread/undotbs02                       122694852856 ONLINE
SQL> recover datafile 5;
ORA-00283: recovery session canceled due to errors
ORA-01111: name for data file 5 is unknown - rename to correct file
ORA-01110: data file 5: '/app/oracle/product/10.2.0/db_1/dbs/MISSING00005'
ORA-01157: cannot identify/lock data file 5 - see DBWR trace file
ORA-01111: name for data file 5 is unknown - rename to correct file
ORA-01110: data file 5: '/app/oracle/product/10.2.0/db_1/dbs/MISSING00005'

SQL> alter database rename file '/app/oracle/product/10.2.0/db_1/dbs/MISSING00005' to '/database/oradata/skyread/tbs_tbs.dbf';
alter database rename file '/app/oracle/product/10.2.0/db_1/dbs/MISSING00005' to '/database/oradata/skyread/tbs_tbs.dbf'
*
ERROR at line 1:
ORA-01511: error in renaming log/data files
ORA-01141: error renaming data file 5 - new file '/database/oradata/skyread/tbs_tbs.dbf' not found
ORA-01111: name for data file 5 is unknown - rename to correct file
ORA-01110: data file 5: '/app/oracle/product/10.2.0/db_1/dbs/MISSING00005'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
将数据文件进行恢复并ONLINE:
oracle@readerlogdb-> mv tbs_tbs.dbf.bak tbs_tbs.dbf
SQL> alter database rename file '/app/oracle/product/10.2.0/db_1/dbs/MISSING00005' to '/database/oradata/skyread/tbs_tbs.dbf';
Database altered.
SQL> recover datafile 5; 
Media recovery complete.
SQL> select count(*) from t02;
select count(*) from t02
                     *
ERROR at line 1:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/database/oradata/skyread/tbs_tbs.dbf'

SQL>  select file#,name,CHECKPOINT_CHANGE# ,status from v$datafile;

               FILE# NAME                                                 CHECKPOINT_CHANGE# STATUS
-------------------- -------------------------------------------------- -------------------- -------
                   1 /database/oradata/skyread/system01.dbf                     122694852856 SYSTEM
                   2 /database/oradata/skyread/tbs_test.dbf                     122694852856 ONLINE
                   3 /database/oradata/skyread/sysaux01.dbf                     122694852856 ONLINE
                   4 /database/oradata/skyread/users01.dbf                      122694852856 ONLINE
                     5 /database/oradata/skyread/tbs_tbs.dbf                      122694852882 OFFLINE
                  18 /database2/oradata/skyread/TBS_MRPMUSIC01.dbf              122694852856 ONLINE
                  26 /database/oradata/skyread/sf01.dbf                         122694852856 ONLINE
                  31 /database2/oradata/skyread/undotbs02                       122694852856 ONLINE

8 rows selected.
SQL> alter database datafile '/database/oradata/skyread/tbs_tbs.dbf' online;
Database altered.
SQL> select count(*) from t02;

            COUNT(*)
--------------------
                1876

最后,如果是system表空间损坏,又无备份,那么是无法打开数据库的,如果是sysaux,无备份,数据库还是可以open,当然要在重建控制文件的时候去掉损坏的数据文件,否则是无法创建成功的,如下实例:
SQL> CREATE CONTROLFILE REUSE DATABASE "SKYREAD" NORESETLOGS FORCE LOGGING ARCHIVELOG
  2      MAXLOGFILES 20
  3      MAXLOGMEMBERS 5
  4      MAXDATAFILES 1000
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 2337
  7  LOGFILE
  8    GROUP 1 '/database/oradata/skyread/redo01.log'  SIZE 512M,
  9    GROUP 2 '/database/oradata/skyread/redo02.log'  SIZE 512M,
 10    GROUP 3 '/database/oradata/skyread/redo03.log'  SIZE 512M,
 11    GROUP 4 '/database/oradata/skyread/redo04.log'  SIZE 512M,
 12    GROUP 5 '/database/oradata/skyread/redo05.log'  SIZE 512M
 13  DATAFILE
 14    '/database/oradata/skyread/system01.dbf',
 15    '/database/oradata/skyread/tbs_test.dbf',
 16      '/database/oradata/skyread/sysaux01.dbf',
 17    '/database/oradata/skyread/users01.dbf',
 18    '/database/oradata/skyread/tbs_tbs.dbf',
 19    '/database2/oradata/skyread/TBS_MRPMUSIC01.dbf',
 20    '/database/oradata/skyread/sf01.dbf',
 21    '/database2/oradata/skyread/undotbs02'
 22  CHARACTER SET UTF8;
CREATE CONTROLFILE REUSE DATABASE "SKYREAD" NORESETLOGS FORCE LOGGING ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '/database/oradata/skyread/sysaux01.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3


SQL> CREATE CONTROLFILE REUSE DATABASE "SKYREAD" NORESETLOGS FORCE LOGGING ARCHIVELOG
  2      MAXLOGFILES 20
  3      MAXLOGMEMBERS 5
  4      MAXDATAFILES 1000
  5      MAXINSTANCES 8
  6      MAXLOGHISTORY 2337
  7  LOGFILE
  8    GROUP 1 '/database/oradata/skyread/redo01.log'  SIZE 512M,
  9    GROUP 2 '/database/oradata/skyread/redo02.log'  SIZE 512M,
 10    GROUP 3 '/database/oradata/skyread/redo03.log'  SIZE 512M,
 11    GROUP 4 '/database/oradata/skyread/redo04.log'  SIZE 512M,
 12    GROUP 5 '/database/oradata/skyread/redo05.log'  SIZE 512M
 13  DATAFILE
 14    '/database/oradata/skyread/system01.dbf',
 15    '/database/oradata/skyread/tbs_test.dbf',
 16    '/database/oradata/skyread/users01.dbf',
 17    '/database/oradata/skyread/tbs_tbs.dbf',
 18    '/database2/oradata/skyread/TBS_MRPMUSIC01.dbf',
 19    '/database/oradata/skyread/sf01.dbf',
 20    '/database2/oradata/skyread/undotbs02'
 21  CHARACTER SET UTF8;

Control file created.

SQL> alter database open;

Database altered.

你可能感兴趣的:(oracle用老的控制文件备份恢复新建的数据文件)