记一次Oracle 10g数据恢复事件

事实证明,不作死就不会死,这次Oracle崩溃,花费了我两天的时间,只因为我装了些莫名的安卓模拟器之后又卸载了。

卸载之后,发现oracle数据库用不了了,心一凉,因为自己存了进两年的数据全在里面,近70个g。于是赶紧进Net Manager,进不去了,需要输入配置文件的路径!这绝对是ORAACLE_HOME没了。。。于是在环境变量中添加一个ORACLE_HOME变量,地址指向E:\oracle\product\10.2.0\db_1。再进Net Manager,没问题了,却发现报错ora-12514。。。

这是个最最常见的报错,意味着很容易解决或者很难解决。

赶紧搜搜,网上一般两种做法:1.修改监听文件listener.ora文件,在里面加一段SID_DESC...GLOBAL_NAME= orcl (自己的实例名),解释是因为静态监听需要设置主动寻找该实例,否则它找不到这个实例。于是我如是修改,接着报另一个错误:ora-01034和ora-27101。

继续上网寻找,说是由于不正常退出等一些操作而导致Oracle不知道指向哪个实例名,需要在cmd中用set ORACLE_SID=orcl设置,于是设置。接着需要重新启动Oracle。这时问题又来了,我竟然忘记自己的sys用户了!由于时间久远,自己怎么都想不起来自己的sys用户了,也就是说,当我在cmd中进入sqlplus后,无法conn了。。。这下我突然慌神了,感觉问题挺大。

上一条路走不通,我决定换个思路,就是这么活跃。网上还有一种办法就是说重建监听。那就重建呗。cmd中netca边建边观察。基本无异常。建立成功。然后在OS的服务中找到监听服务,启动之(这里也可以在cmd中lsnrctl start)。但是启动后还是报ora-12514,就是说所有努力都白费啦!!!

冷静下来分析原因,竟发现服务中有两个监听服务:一个是标准的OracleOraDb10g_home1TNSListener,另一个则是OracleTNSListener,而后者启动了,前者没有启动。上网搜下它们的区别,没有资料,心里很困惑。

于是打算再建个监听看看。netca接着建,发现又多了一个监听服务:OracleTNSListener1。我似乎明白了什么。。。上网搜索监听服务的命名规则,发现是以Oracle开头,TNS+监听名结尾,中间加上ORACLE_HOME_NAME构成。瞬间明白了,原来ORACLE_HOME_NAME这个配置都没了!这个ORACLE_HOME_NAME其实就是在你安装数据库时默认的一个选项,叫做名称。

了解之后,决定环境变量中设置ORACLE_HOME_NAME。这个信息包括上面的ORACLE_HOME其实都在oracle的一个配置文件中保存的。当配置文件丢失时,oracle还会通过环境变量来找,所以在环境变量中配置好,oracle就可以使用了。配置ORACLE_HOME_NAME,值为OraDb10g_home1。

配置完成,删除一切监听,重建。之后发现,标准的OracleOraDb10g_home1TNSListener的出现了,而且启动了!下面的OracleServiceORCL是一直都启动的,这两个服务都启动了,就意味着。。。搞好了!

呵呵,还是太天真。依旧报ora-12514错误。

我又冷静了大半天,通过连接其它机器的数据库以及查看监听状态lsnrstl
status来检查监听是否正常,发现监听是没问题的。既然监听没问题,也就是说,上面的努力全白费了,数据库连不上的根本原因其实是实例的问题。

又查阅alert_orcl.log文件(E:\oracle\product\10.2.0\admin\orcl\bdump\下),翻到最后部分,发现一些tns-12560错误。结合网上的一些说法,最后推定:Oracle数据库坏了。。。

这真是巨大的悲剧。我没有sys用户,无法nomount、mount、open,不知道具体哪部分发生了什么样的错误。也许重新启动一下就好了,但是我没有sys用户,就没有操作的权限。

只能改变思路,决心重新安装数据库了!

那么,我就要使用数据文件来进行数据恢复了!

上网搜索,很多教程,发现它们都是在讲只有数据文件的恢复,而我现在数据文件、控制文件、日志文件都在,感觉应该会更加简单。于是决定先在别的电脑上试验一下。

我翻出自己的笔记本,网上的教程说只要建立个同名的实例,端口等一致即可,然后将上述文件(主要是oradata这个文件夹)copy进去覆盖掉,再重启服务就行了。那就这么试试吧!

但这里我发现个问题,笔记本是11g的Oracle,真是坑爹。无奈只好硬着头皮将上述文件拷到对应文件夹下。

cmd进入到sys用户(本的sys用户存在),开始尝试启动:shutdown immediate、start nomount都没问题(nomount是参数文件找控制文件,只要控制文件路径准确,就不会报错),接着alter database mount(这阶段是控制文件找数据文件,找不到就会报错),报错,因为数据文件在控制文件中存储的地址是10g的E:\oracle\product\10.2.0\oradata,而不是11g的app\...于是将数据文件拷贝到控制文件指向的地址(都被逼到这份儿上了—
—!),之后启动mount,没问题!

突然整个人躁起来了!这是要成功吗?

然后alter database open了啊!屏幕上蹦蹦蹦往下弹些良好的信息了啊!要成功了吗?

呵呵,还是太天真。ora-00704和ora-39700。继续搜索,发现是数据字典表因为版本的问题而报错啊!网上说执行sql脚本更新数据字典。那就整吧!

catupgrd.sql、catalog.sql、catproc.sql、utlrp.sql四个脚本,在cmd的sqlplus中@路径来执行。这四个脚本在我这里只找到三个,第三个没有,于是依次执行。

呵呵,一大波错误滚屏袭来啊!!!全是无法创建啊!!!感觉要跳楼了啊!!!

冷静片刻,觉得10g和11g是不可逾越的鸿沟,于是决定,卸载11g,改为10g继续上面的操作。

10g安装完毕,将oradata覆盖,继续在cmd的sqlplus中执行。shutdown immediate、start nomount、alter database mount没问题,alter database open。。。又报错了。。。我去,竟然报dbf文件是11g的而不是10g的!原来dbf被11g这么一搞就被玷污了啊!真是羞涩啊!

重新拷10g的oradata文件夹,继续open。。。

终于成功了!!!

搞了我两天啊!!!成功了!!!

总结一下:

(1)ora-12514只有两方面错误,监听异常,或者实例未启动,可以在这两方面进行排查,而不去盲目地按照网上的方法改listener.ora和重建监听,也许是实例不行了呢;

(2)若要进行数据恢复,则最好有oradata这个文件夹下的所有文件,这样有恃无恐;

(3)我折腾两天,也许在最开始重启数据库就会恢复正常,但是sys用户丢了,使得这一切困难起来;

(4)要学会冷静分析,结合自己遇到的情况采取相应的措施,而不能一味按照网上的解决办法执行,那也许并不适合你;

(5)多多备份,不要偷懒!

没了。

时间: 2024-10-10 08:25:29

记一次Oracle 10g数据恢复事件的相关文章

CentOS 6.3(x86_32)下安装Oracle 10g R2

一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal /proc/meminfo # grep SwapTotal /proc/meminfo 2.硬盘 由于CentOS安装后差不多有4~5G,再加上Oracle等等的安装,所以请准备至少10G的硬盘空间. 检查磁盘情况 # df -h 二.软件 系统平台:CentOS 6.3(x32) CentOS-6.3-i

CentOS 6.3(x86_64)下安装Oracle 10g R2

目 录 一.硬件要求二.软件三.系统安装注意四.安装Oracle前的系统准备工作五.安装Oracle,并进行相关设置六.升级Oracle到patchset 10.2.0.4七.使用rlwrap调用sqlplus中历史命令 一.硬件要求 1.内存 & swap Minimum: 1 GB of RAMRecommended: 2 GB of RAM or more 检查内存情况 # grep MemTotal /proc/meminfo # grep SwapTotal /proc/meminfo

oracle 数据恢复,只有oradata文件夹里的文件,没有备份文件的数据库恢复,重装系统后,oracle 10g数据库恢复

格式化重装系统后,才想起来oracle 10g 数据库没有做备份,开始以为很麻烦,没想到数据库恢复的还挺顺利的 恢复方法: 1,把原来的数据库文件备份,(D:\oracle\product\10.2.0\oradata\gqxt),重新命名即可,我命名为gqxt_old,(否则装数据库的时候会提示sid已存在). 2,重新安装数据库到原来的路径(不安装到原来的路径也没关系,但是原来的数据库文件必须在原来的路径不能变,也就是oradata\gqxt所在的路径不能变),数据库的名字就是你要恢复的名字

oracle 10g运维手册

1.    检查数据库基本状况... 4 1.1.     检查Oracle实例状态... 4 1.2.     检查Oracle服务进程... 4 1.3.     检查Oracle监听状态... 5 2.    检查系统和oracle日志文件... 6 2.1.     检查操作系统日志文件... 6 2.2.     检查oracle日志文件... 6 2.3.     检查Oracle核心转储目录... 7 2.4.     检查Root用户和Oracle用户的email. 7 3.  

[转]oracle性能调优之--Oracle 10g AWR 配置

一.ASH和AWR的故事 1.1 关于ASH 我们都知道,用户在ORACLE数据库中执行操作时,必然要创建相应的连接和会话,其中,所有当前的会话信息都保存在动态性能视图V$SESSION中,通过该视图,DBA可以查看用户实际执行的操作,或者当前的等待事件等.通常这部分信息是调优过程中的关键信息,不过,一旦连接断开.会话信息就会被同时从V$SESSION及其它相关视图中清除,也就是说,用户执行完操作走人,而你(DBA),如果不能在当前逮到他,过了这点,就不知道它曾经做过什么了. 10g 版本中,O

RAC 常用维护工具和命令(oracle 10g)

Oracle 的管理可以通过OEM或者命令行接口. Oracle Clusterware的命令集可以分为以下4种: 节点层:osnodes 网络层:oifcfg 集群层:crsctl, ocrcheck,ocrdump,ocrconfig 应用层:srvctl,onsctl,crs_stat 下面分别来介绍这些命令. 一. 节点层 只有一个命令: osnodes, 这个命令用来显示集群点列表,可用的参数如下,这些参数可以混合使用. [[email protected] bin]# ./olsno

oracle 10g 数据库与客户端冲突导致实例创建无监听问题

同事在oracle 10g上创建一个实例,快结束时弹出一个错误,提示监听失败之类.查看服务,并无生成监听服务.于是删除重来,一连试了好几次,都是如此. 这真是令人心烦意乱.提示里面有说到端口1521,难道此端口被占用了?用netstat -aon命令看了下,并没有.而且创建实例过程中,并没有什么地方可以设置端口的. 后来试了下Net manager,手动创建了一个监听.看系统服务,发现已有listener:然后修改 tnsnames.ora 文件,创建一个连接串,连接,成功. 其实呢,我修改的那

Oracle 10g 物理Dataguard日常操作维护(二)

3.3进程日志的监控操作 3.3.1 查看备库进程状态 SQL>select process,client_process,sequence#,status from v$managed_standby PROCESS   CLIENT_P  SEQUENCE#    STATUS ---------       --------     ---------- -      ----------- ARCH      ARCH            153       CLOSING ARCH 

ORACLE 常见等待事件

一. 等待事件的相关知识 1.1 等待事件主要可以分为两类,即空闲(IDLE)等待事件和非空闲(NON-IDLE)等待事件.1). 空闲等待事件指ORACLE正等待某种工作,在诊断和优化数据库的时候,不用过多注意这部分事件.2). 非空闲等待事件专门针对ORACLE的活动,指数据库任务或应用运行过程中发生的等待,这些等待事件 是在调整数据库的时候需要关注与研究的. 在Oracle 10g中的等待事件有872个,11g中等待事件1116个. 我们可以通过v$event_name 视图来查看等待事件