oracle数据恢复:利用ctl,dbf,log

       任何一种技术方案都有其使用场景,我这个主要是针对没有dmp备份,卸载了数据库,但是有实例的ctl,dbf和log文件都存在的情况。其实这种情况也蛮多的。

      网络上说的情况大多比较复杂,要么ctl丢失的,只有dbf,需要通过手段重建ctl和log文件,不过经过本人测试,重建ctl没有成功,由于时间有限,没来得及调研。

      本人恢复oracle背景是自己卸载了oracle10g,后来想起来自己有一个数据库的数据是十分需要的,所以又折腾着恢复过来。在网络上参考了一个恢复oracle11g的文章写的,在oracle10g下亲测可以用,发到这里共享给大家。

     这里顺便补充一句:我也用网上提到的aul6 进行数据恢复,它是利用字典文件system01.dbf和业务实例文件(比如笔者的etl.dbf)将业务实例里面的表恢复成建表语句和数据,不过遗憾的是,恢复的数据对中文的支持不好,有乱码,而且,有很多表的某一列数据被拆分加入多个空格,造成数据恢复时候是乱码,导致整体不可用,而我又没有找到解决乱码的方法,估计对纯英文的支持比较好,故而只好放弃该方案。幸好我卸载以后,dbf,log,ctl文件都存在,恢复也就变得简单了,因为网络上大多说的不详细,将我的操作步骤详细的给大家共享出来。

     首先安装一个一模一样的oracle10g,这个大家不要嫌麻烦,这是我目前感觉最简单有效的方式了。安装目录跟以前一不一样无所谓,因为我们经常无法安装一样的目录,比如笔者,因为已经在机器安装了oracle11g,在虚拟机重装的oracle10g,只有一个c盘。新建的数据库sid跟之前的一样是有必要的。

     安装好以后,将数据库服务关闭掉,建议在cmd下利用语句完成。完整操作如下:

    sqlplus /nolog

    conn / as sysdba

    shutdown immediate

    关闭数据库以后,将实例文件改个名字,比如笔者是orcl,改为orcl2,将以前的orcl拷贝到该目录下(如c:\oracle\product\10.2.0\oradata下面)。

    然后cmd下启动数据库,以无挂载的方式,如下:

    STARTUP NOMOUNT;

    此时,我们在cmd输入如下命令:

    SELECT NAME FROM V$DATAFILE;

    得到结果如下:

NAME
--------------------------------------------------------------------------------

E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\UNDOTBS01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSAUX01.DBF
E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\USERS01.DBF
E:\ORACLE\SWOA\SWOA\ETL.DBF
E:\ORACLE\SWOA\SWOA\AVPLAN.DBF

已选择6行。

由结果我们看出,得到了是我们之前建立的数据库dbf文件路径,发现跟我们安装的数据库目录(也就是刚才拷贝到c:\oracle\product\10.2.0\oradata)是不一样的。

同样执行:

SELECT NAME FROM v$controlfile;

SELECT * FROM v$logfile;

发现ctl,log文件路径也都是与安装目录文件不一致,利用以下命令修改:

alter database rename file '查询出来的路径' to '现在存放的路径';

比如我是如下修改(log,ctl修改都是该语句):

alter database rename file 'E:\ORACLE\SWOA\SWOA\etl.DBF' to 'C:\oracle\p
roduct\10.2.0\oradata\orcl\etl.DBF';

如果之前所有的dbf文件都存在,并且都拷贝到了新的数据库目录下,那么到此为止,只要重启数据库,就已经ok了。

利用:ALTER DATABASE OPEN; 打开数据库,或者shutdown,再重启数据库。

-----------------------华丽的分割线-------------

但是笔者由于业务数据的dbf习惯安装在其他目录下,不小心删掉了一个,如上面的avplan.dbf,造成此处无法修改路径,启动数据库也不成功,而事实上,这个业务库也不是我们要恢复的,但它妨碍了我们。

尝试删除该条数据,由于数据库未打开,删除不了,所以笔者想了个办法,将数据库cmd下,shutdown,然后将之前改为orcl2文件夹改回orcl,现有的orcl暂时改为其他名字(如orcl1),(即还原为安装时状态)然后启动数据库,建立了一个表空间avplan,dbf文件名字叫avplan.dbf。这时候在关闭数据库,将avplan.dbf拷贝到orcl1下,并且将orcl1再改回orcl,刚才的orcl你懂的,变为其他名字(如orcl2)。这时,cmd下输入:

STARTUP NOMOUNT;

这时数据库重启,在cmd下继续输入

alter database rename file 'E:\ORACLE\SWOA\SWOA\AVPLAN.DBF' to 'C:\oracle\p
roduct\10.2.0\oradata\orcl\AVPLAN.DBF';

ALTER DATABASE DATAFILE 'C:\oracle\p
roduct\10.2.0\oradata\orcl\AVPLAN.DBF' OFFLINE DROP;

这时候,这个影响我们的avplan.dbf就不起作用了。

这里顺便要提一下:如果不新建avplan.dbf,直接使用ALTER DATABASE DATAFILE 'C:\oracle\p
roduct\10.2.0\oradata\orcl\AVPLAN.DBF' OFFLINE DROP; 是不成功的。

还有一点是,新建的avplan.dbf只是权宜之计,不过不实行drop,启动会报

Total System Global Area  293601280 bytes
Fixed Size                  1248624 bytes
Variable Size             100663952 bytes
Database Buffers          188743680 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
ORA-01122: 数据库文件 6 验证失败
ORA-01110: 数据文件 6: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\AVPLAN.DBF'
ORA-01203: 此文件的原型错误 - 创建 SCN 错误

----------------------华丽分割线---------------------

通过以上的方式之后,数据库已经还原完成了。

shutdown

startup

成功!!


©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页