oracle数据恢复:只有数据文件的情况下;
状况描述:当Oracle的控制文件丢失或损坏,但数据文件完好时,可以通过重建控制文件的方式对数据库实例进行恢复。恢复方法如下:
一、备份数据文件
一、安装Oracle,安装过程中不要创建数据库。
二、安装好后,用DBCA(Database Configuration Assistant)创建与丢失的实例相同名称的实例。创建实例时数据库名和实例名要和丢失前的一致。数据文件与控制文件的信息可以从 (admin\xxxx\bdump\alert_xxxx.log)文件找到,其中xxxx为数据库名,参照这个文件里的CREATE CONTROLFILE 语句段。还要注意创建实例时的归档模式及非归档模式,如果admin\zhxt\bdump\alert_xxxx.log文件中的CREATE CONTROLFILE 那一行最后是NOARCHIVELOG,则为非归档模式,如为ARCHIVELOG,则为归档模式,没有则保持没有
三、关闭Oracle(我的方法,在服务里将ORACLE的有关服务改为手动,重启机子),用备份出来的数据文件覆盖新建的数据文件,并将新生成的控制文 件及重做日志文件删除。
四、启动Oracle有监听(在服务里将ORACLE有关的服务开启)
五、用sys用户连接到oracle
Sqlplus /nolog
SQL>conn sys/sys as sysdba;
六、关闭数据库
SQL> shutdown immediate;
七、起动数据库,但不挂载数据文件
SQL> startup nomount;
八、重建控制文件,重建控制文件的脚本可以从admin\xxxx\bdump\alert_xxxx.log)文件找到,搜索 CREATE CONTROLFILE 语句,如果存在多处这样的语句,则使用最后的。
控制文件的脚本类似如下语句:
CREATE CONTROLFILE REUSE DATABASE "zhxt" NORESETLOGS NOARCHIVELOG
-- SET STANDBY TO MAXIMIZE PERFORMANCE
MAXLOGFILES 50
MAXLOGMEMBERS 5
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 'E:\ORADATA\zhxt\REDO01.LOG' SIZE 100M,
GROUP 2 'E:\ORADATA\zhxt\REDO02.LOG' SIZE 100M,
GROUP 3 'E:\ORADATA\zhxt\REDO03.LOG' SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'E:\ORADATA\zhxt\RKXT.ORA',
'E:\ORADATA\zhxt\SYSTEM01.DBF',
'E:\ORADATA\zhxt\TOOLS01.DBF',
'E:\ORADATA\zhxt\TYZHXTTBS.ORA',
'E:\ORADATA\zhxt\UNDOTBS01.DBF',
'E:\ORADATA\zhxt\USERS01.DBF',
CHARACTER SET ZHS16GBK
这一语句有几个地方需要修改:
1、 因为重做日志文件已丢失,所以要将第一句的,NORESETLOGS 改为 RESETLOGS
2、 LOGFILE段的几个重做日志文件指定为实际希望的位置
3、 DATAFILE段的数据文件改为数据文件实际的位置,注意这里不要包括临时表空间用到的文件,否则会出错。
执行修改后的脚本。如果提示控制文件创建完成,则可以进行下一步操作。
结果系统报错:
ORA-01503: CREATE CONTROLFILE ??
ORA-01160: ???? data file
ORA-01110: ???? : 'D:\oracle\oradata\cicdb\TEMP01.DBF'
则需要将重建日志文件中DATAFILE段中TEMP01这行删除,因为它是临时表空间,可以在创建后用alter database语句加上。再次执行重建控制文件的脚本。
九、创建控制文件成功后,执行以下语句打开数据库,加上RESETLOGS参数是为了重新生成重做日志文件。
SQL> alter database open RESETLOGS;
如果出现以下错误:
alter database open resetlogs
*
第 1 行出现错误:
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1:
'D:ORACLEPRODUCT10.2.0ORADATAORACLE10GSYSTEM01.DBF'
解决方法如下:
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'F:SUNSYSTEM01.DBF'
SQL> set wrap off
SQL> set lin 300
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- ---------- ----------
1 ONLINE ONLINE 476049 08-JAN-08
2 ONLINE ONLINE 476049 08-JAN-08
3 ONLINE ONLINE 476049 08-JAN-08
4 ONLINE ONLINE 476049 08-JAN-08
SQL> recover database until cancel;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 476049 generated at 01/08/2008 19:13:19 needed for thread 1
ORA-00289: suggestion : F:ORACLEFLASH_RECOVERY_AREASUNARCHIVELOG2008_01_08O1_MF_1_18_%U_.ARC
ORA-00280: change 476049 for thread 1 is in sequence #18
Specify log: {
ORA-00308: cannot open archived log 'F:ORACLEFLASH_RECOVERY_AREASUNARCHIVELOG2008_01_08O1_MF_1_18_%
U_.ARC'
ORA-27041: unable to open file
OSD-04002: ????????????
O/S-Error: (OS 2) ??????????????????????
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'F:SUNSYSTEM01.DBF'
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 476049 generated at 01/08/2008 19:13:19 needed for thread 1
ORA-00289: suggestion : F:ORACLEFLASH_RECOVERY_AREASUNARCHIVELOG2008_01_08O1_MF_1_18_%U_.ARC
ORA-00280: change 476049 for thread 1 is in sequence #18
Specify log: {
E:oracleoradatasunsunredo01.log
ORA-00310: archived log contains sequence 17; sequence 18 required
ORA-00334: archived log: 'E:ORACLEORADATASUNSUNREDO01.LOG'
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: 'F:SUNSYSTEM01.DBF'
SQL> recover database using backup controlfile until cancel;
ORA-00279: change 476049 generated at 01/08/2008 19:13:19 needed for thread 1
ORA-00289: suggestion : F:ORACLEFLASH_RECOVERY_AREASUNARCHIVELOG2008_01_08O1_MF_1_18_%U_.ARC
ORA-00280: change 476049 for thread 1 is in sequence #18
Specify log: {
E:oracleoradatasunsunredo02.log
Log applied.
Media recovery complete.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open resetlogs;
Database altered.
SQL>
十、将临时表空间加入到实例上
SQL> alter tablespace TEMP add tempfile 'E:\oradata\zhxt\TEMP01.DBF' reuse;
十一、退出sqlplus,重启oracle,测试是否成功
如何更改Oracle的默认监听端口(1521)
Oracle 的默认监听端口为1521,你可以方便的依照下列步骤修改为其他端口:
[oracle@dbserver2 admin]$ cd $ORACLE_HOME/network/admin
[oracle@dbserver2 admin]$ vi listener.ora
修改这个文档中的1521端口为你需要的端口your port
[oracle@dbserver2 admin]$ lsnrctl stop
[oracle@dbserver2 admin]$ lsnrctl start
这时虽然用sqlplus能连上,但用程序是连不上的,在CMD下,netstat -an 查看时,1521端口是未开启的
解决方法如下(实际上是第三种,用手动启动数据库监听就OK了):
程序报错:Io 异常: The Network Adapter could not establish the connection
这个异常的出现一般与数据库和你的PC的设置有关
这种异常的出现大致上有下面几种:
1。IP错误。
在设置URL时错误,例如:jdbc:oracle:thin:@192.168.0.36:1521:sharp
数据库服务器不正确:ping 服务器IP是否正确。不正确,将URL更改为正确
端口号错误:一般不会错误。
进行一下操作:在DOS上键入sqlplus,检查oracle是否开启
一却正常,执行下面第2步。
2。防火墙
如果机器上安装有放火墙,可能是服务器端口号屏蔽而造成的。关闭防火墙后,尝试重新连接。
仍然不行,执行第3步。
3。数据库监听未启动 修改PC上注册表中的ImagePath值。
以下是以现在主流的数据库ORACLE为例
重新手动启动数据库监听:
1:开始 → 运行→ 输入CMD→ 进入DOS命令提示界面
d:>lsnrctl
LSNRCTL> status
或者
LSNRCTL> start
至此,完全搞定