0

0

例子2之解决ORA

php中文网

php中文网

发布时间:2016-06-07 15:48:24

|

1389人浏览过

|

来源于php中文网

原创

vc appliance停机是用待机方式将oracle数据库停了。再启动时,oracle不能启动。用sqlplus中的starup命令。出现下面的提示: 由于ORA-03113错误是一个通用的错误提示,能给的信息量很少。 于是一步步的来Debug,由于startup相当于3个命令的集合,就一步步地执

vc appliance停机是用待机方式将oracle数据库停了。再启动时,oracle不能启动。用sqlplus中的starup命令。出现下面的提示:

例子2之解决ORA

由于ORA-03113错误是一个通用的错误提示,能给的信息量很少。

于是一步步的来Debug,由于startup相当于3个命令的集合,就一步步地执行

先执行

SQL>startup nomount

并没有发现什么明显的失败信息,说明启动数据库实例是没有问题的,再执行第二步

SQL>alter database mount;

出现故障

例子2之解决ORA

看来故障出现在挂载数据库文件时,这一步骤主要是“允许特定的维护操作, 例如, 重命名数据文件, 添加, 删除或重命名重做日志文件, 启用和禁用重做归档选项, 执行完全数据库恢复。它不允许对数据库进行一般的访问。”

找到$ORACLE_HOME/rdbms/log目录,用ls -ltr找到最近的日志文件。在本例中是sales_ora_27010.trc

例子2之解决ORA

看来是olr.loc和ocr.loc两个文件不能打开。但是我的机器上根本没有这个文件。在网上搜索,发现这两个文件和Oracle的集群有关,我这里是单节点的,按说是不需要Oracle Local Registry的。

在网上搜索,也没有什么特别有用的提示,但是发现了另一个问题,就是我找的日志文件可能不对,找了原来安装时导出的备份虚拟机,用命令

SQL>show parameter background

找到正确的日志路径/usr/local/oracle/diag/rdbms/oracle/sales/trace

查看启动时的日志,在最后发现

Starting ORACLE instance (normal)

LICENSE_MAX_SESSION = 0

LICENSE_SESSIONS_WARNING = 0

Picked latch-free SCN scheme 3

Using LOG_ARCHIVE_DEST_1 parameter default value as USE_DB_RECOVERY_FILE_DEST

Autotune of undo retention is turned on.

Wed Aug 07 15:37:46 2013

SMON started with pid=13, OS id=30687

Wed Aug 07 15:37:46 2013

RECO started with pid=14, OS id=30689

Wed Aug 07 15:37:46 2013

MMON started with pid=15, OS id=30691

starting up 1 dispatcher(s) for network address ‘(ADDRESS=(PARTIAL=YES)(PROTOCOL=TCP))’…

Wed Aug 07 15:37:46 2013

MMNL started with pid=16, OS id=30693

starting up 1 shared server(s) …

ORACLE_BASE from environment = /usr/local/oracle

Wed Aug 07 15:37:46 2013

ALTER DATABASE   MOUNT

USER (ospid: 30698): terminating the instance

Instance terminated by USER, pid = 30698

重试了多次,结果大多类似。在日志相同目录里,找到最近的trc文件,发现如下内容:

[root@localhost trace]# vi sales_ora_20498.trc

Release:        2.6.32-279.el6.x86_64

Version:        #1 SMP Fri Jun 22 12:19:21 UTC 2012

Machine:        x86_64

Instance name: sales

Redo thread mounted by this instance: 0

Oracle process number: 19

Unix process pid: 20498, image: oracle@localhost.localdomain (TNS V1-V3)

*** 2013-08-08 09:23:49.818

*** SESSION ID:(125.37) 2013-08-08 09:23:49.818

*** CLIENT ID:() 2013-08-08 09:23:49.818

*** SERVICE NAME:() 2013-08-08 09:23:49.818

*** MODULE NAME:(sqlplus@localhost.localdomain (TNS V1-V3)) 2013-08-08 09:23:49.818

*** ACTION NAME:() 2013-08-08 09:23:49.818

Error: kccpb_sanity_check_2

Control file sequence number mismatch!

fhcsq: 38637 bhcsq: 38638 cfn 0

*** 2013-08-08 09:23:49.819

USER (ospid: 20498): terminating the instance

从上面来看,是控制文件故障。

现在重建控制文件,先到日志文件中找到一个相关参数的例子,在alert_sales.log文件中找出

Create controlfile reuse set database “oracle”

MAXINSTANCES 8

MAXLOGHISTORY 1

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

Datafile

‘/usr/local/oradata/ora11g/ORA11G/oracle/system01.dbf’,

‘/usr/local/oradata/ora11g/ORA11G/oracle/sysaux01.dbf’,

51shop 网上商城系统
51shop 网上商城系统

51shop 由 PHP 语言开发, 使用快速的 MySQL 数据库保存数据 ,为中小型网站实现网上电子商务提供一个完美的解决方案.一、用户模块1. 用户注册:用户信息包括:用户ID、用户名、用户密码、性别、邮箱、省份、城市、 联系电话等信息,用户注册后不能立即使用,需由管理员激活账号,才可使用(此功能管理员可设置)2. 登录功能3. 资料修改:用户可修改除账号以后的所有资料4. 忘记密码:要求用

下载

‘/usr/local/oradata/ora11g/ORA11G/oracle/undotbs01.dbf’,

‘/usr/local/oradata/ora11g/ORA11G/oracle/users01.dbf’

LOGFILE GROUP 1 (‘/usr/local/oradata/ora11g/ORA11G/oracle/redo01.log’) SIZE 51200K,

GROUP 2 (‘/usr/local/oradata/ora11g/ORA11G/oracle/redo02.log’) SIZE 51200K,

GROUP 3 (‘/usr/local/oradata/ora11g/ORA11G/oracle/redo03.log’) SIZE 51200K RESETLOGS

WARNING: Default Temporary Tablespace not specified in CREATE DATABASE command

Default Temporary Tablespace will be necessary for a locally managed database in future release

Successful mount of redo thread 1, with mount id 1691519286

Completed: Create controlfile reuse set database “oracle”

然后,根据网上“如何获得创建控制文件脚本并创建脚本”一文中的脚本模板

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE “PRIMARY” NORESETLOGS  ARCHIVELOG

–  SET STANDBY TO MAXIMIZE PERFORMANCE

MAXLOGFILES 5

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 1

MAXLOGHISTORY 226

LOGFILE

GROUP 1 ‘/opt/oracle/oradata/primary/redo01.log’  SIZE 10M,

GROUP 2 ‘/opt/oracle/oradata/primary/redo02.log’  SIZE 10M,

GROUP 3 ‘/opt/oracle/oradata/primary/redo03.log’  SIZE 10M

– STANDBY LOGFILE

DATAFILE

‘/opt/oracle/oradata/primary/system01.dbf’,

‘/opt/oracle/oradata/primary/undotbs01.dbf’,

‘/opt/oracle/oradata/primary/users01.dbf’

CHARACTER SET ZHS16GBK

;

RECOVER DATABASE

ALTER SYSTEM ARCHIVE LOG ALL;

ALTER DATABASE OPEN;

ALTER TABLESPACE TEMP ADD TEMPFILE ‘/opt/oracle/oradata/primary/temp01.dbf’

SIZE 41943040  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

在SQL>下先运行startup nomount,然后直接将根据上面和日志中参数,定义下面的脚本直接粘贴到SQL>下

CREATE CONTROLFILE REUSE DATABASE “oracle” NORESETLOGS  ARCHIVELOG

–  SET STANDBY TO MAXIMIZE PERFORMANCE

MAXLOGFILES 16

MAXLOGMEMBERS 3

MAXDATAFILES 100

MAXINSTANCES 8

MAXLOGHISTORY 1

LOGFILE

GROUP 1 ‘/usr/local/oradata/ora11g/ORA11G/oracle/redo01.log’  SIZE 51200K,

GROUP 2 ‘/usr/local/oradata/ora11g/ORA11G/oracle/redo02.log’  SIZE 51200K,

GROUP 3 ‘/usr/local/oradata/ora11g/ORA11G/oracle/redo03.log’  SIZE 51200K

– STANDBY LOGFILE

DATAFILE

‘/usr/local/oradata/ora11g/ORA11G/oracle/vpx01.dbf’,

–’/usr/local/oradata/ora11g/ORA11G/oracle/temp01.dbf’,

‘/usr/local/oradata/ora11g/ORA11G/oracle/system01.dbf’,

‘/usr/local/oradata/ora11g/ORA11G/oracle/sysaux01.dbf’,

‘/usr/local/oradata/ora11g/ORA11G/oracle/undotbs01.dbf’,

‘/usr/local/oradata/ora11g/ORA11G/oracle/users01.dbf’

在上面脚本中,我重试了几次,一次是日志大小,我想改成10M,但是不成功,另一次是提示temp01.dbf不是有效的数据库文件,我只有把它注释掉了,只能参照网上的脚本,一步步运行

例子2之解决ORA

其中,最后一句

ALTER TABLESPACE TEMP ADD TEMPFILE ‘/usr/local/oradata/ora11g/ORA11G/oracle/temp01.dbf’ SIZE 20480K REUSE AUTOEXTEND ON NEXT 640K MAXSIZE UNLIMITED

我也是从日志文件中找出来的。

根据上面显示的结果,应该是恢复成功了。

先重启操作系统。再手工启动Oracle,一切正常,但是对应的VCSA却不能启动,用OEM进去看到有数据块错误

例子2之解决ORA

从图中可以看到,ORA-01578错误,出现文件损坏,Block是45953。

用dbv命令检查文件

[oracle@localhost ~]$ dbv FILE=’/usr/local/oradata/ora11g/ORA11G/oracle/vpx01.dbf’ BLOCKSIZE=8192

得到下面的结果:

例子2之解决ORA

从中可以看出,被标记会Corrupt的块有452个。

再查询是哪些损坏的哪些内容:

Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=5 and 45953 between block_id and block_id+blocks-1;

结果如下:

例子2之解决ORA

说明损坏的是LOBSEGMENT

用命令找到损坏的表名和列名

select table_name, column_name from dba_lobs where segment_name=’SYS_LOB0000075100C00016$$’ and owner =’VPXADMIN’;

结果为:

例子2之解决ORA

select count(*) from VPXADMIN.VPX_RESOURCE_POOL;

发现这个表中只有8行数据。

ROWID                      ID

—————— ———-

AAASVcAAFAAACfjAAA          8

AAASVcAAFAAACfkAAB        523

AAASVcAAFAAACfkAAA        816

AAASVcAAFAAACfkAAC        826

AAASVcAAFAAACfkAAD        833

AAASVcAAFAAACfkAAE        839

AAASVcAAFAAACflAAB       1212

AAASVcAAFAAACfjAAC       1601

一行一行地试

select * from VPXADMIN.VPX_RESOURCE_POOL where id>1212;

发现ID=1212的这条记录是损坏的。

delete  from  VPXADMIN.VPX_RESOURCE_POOL where id=1212;

删除后,这个表可以正常地访问了,用DBV检查,结果没有什么不同。

shutdown immadiate数据库,提示没有Commit,看来删除并没有真正成功,于是在SQL命令行下,直接输入commit提交了修改。然后可以关闭数据库了。重启数据库DBV检查情况并无改观,说明这些还不够。

想了半天,也没有什么头绪,回到OEM页面中,在“可用 性”里面,选择了“执行恢复”,看看能不能将表空间VPX恢复到8月3日之前。

点了半天后,提示操作失败,同时VPX也脱机了,在图形界面中却怎么为无法联机。真是事情越搞越乱,好在问题并不复杂,在SQL环境下,执行

recover datafile 5

alter database datafile 5 online;

alter tablespace VPX online;

就可以联机了。

再回到原来的问题。

排查到现在,还有两个方向研究,一个是从vCenter服务器不能启动服务入手,查看日志,查看出错的地点和原因。一个还是从DBV出的错误结果入手。

先从DBV入手,在网上搜索到这篇文章,发现,可能根据DBV出的错误信息找到出错的文件和块,从而找到对应的表。

下面一部分的DBV 201错误块信息

DBV-00201: Block, DBA 21044390, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044391, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044393, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044394, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044395, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044397, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044398, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044399, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044401, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044402, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044403, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044406, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044407, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044410, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044411, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044412, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044414, marked corrupt for invalid redo application

DBV-00201: Block, DBA 21044415, marked corrupt for invalid redo application

根据最后的显示,应该有452个块,这里这是一部分,因为终端显示不完全。

拿最后一个来测试一下

select dbms_utility.data_block_address_file(21044415) from dual;

select dbms_utility.data_block_address_block(21044415) from dual;

结果是File为5,Block为72895。再用

Select tablespace_name,segment_type,owner,segment_name From dba_extents Where file_id=5 and 72895 between block_id and block_id+blocks-1;

得到Segment名为SYS_LOB0000075068C00059$$用

select table_name, column_name from dba_lobs where segment_name=’SYS_LOB0000075068C00059$$’ and owner =’VPXADMIN’

得到表名为VPX_HOST,列表为RESOURCE_INFO,测试一下:

例子2之解决ORA

这里又出现了一个块10309,用相同的方法找到是VPX_HOST表中的另一个列CAPABILITY,这种方法很明显能找到故障表,但是对于修复却帮助不大,因为数量太大,没有办法手工处理。

按上文中提到的修复方法先创一个表

create table corrupted_data (corrupted_rowid rowid);

然后,在SQL提示符下粘贴下面脚本代码,最后用/结束并运行。

set concat off

declare

error_1578 exception;

pragma exception_init(error_1578,-1578);

n number;

begin

for cursor_lob in (select rowid r, &&lob_column from &table_owner.&table_with_lob) loop

begin

n:=dbms_lob.instr(cursor_lob.&&lob_column,hextoraw(’889911′));

exception

when error_1578 then

insert into corrupted_data values (cursor_lob.r);

commit;

end;

end loop;

end;

根据提示符,输入需要的各变量值,列名为RESOURCE_INFO,所有者VPXADMIN,表名为VPX_HOST。脚本会把有问题行的ROWID写到上表创建的表中。上面的代码中hextoraw(’889911′)有点奇怪,不知道是什么意思,在上文最后到是提到了,原来这个值是随便写的,主要是让n总是返回0值。

然后再将有问题行中的对应列数据填为空值。

set concat off

update &table_owner.&table_with_lob set &lob_column=empty_blob() where rowid in (select corrupted_rowid from corrupted_data);

出现下面的错误提示

ORA-00932: inconsistent datatypes: expected NCLOB got BLOB

于是将上面的代码修改成

update &table_owner.&table_with_lob set &lob_column=empty_clob() where rowid in (select corrupted_rowid from corrupted_data);

再试一次,Update成功。(如果类型是XMLTYPE则用XMLType.createXML(”)代替empty_clob()。)

回到命令行方式,用DBV再试一次,结果却仍是有452个Page被标记为坏。

但是这次用Select * from vpxadmin.vpx_host;能返回正常的值了。说明表的确是被修复了。但量DBV结果仍标记为Corrupted,用DBV来找坏表的实用性就差了许多。像这样有452个坏块,一个一个地测试,太麻烦了。

转到vCenter的服务器中,

例子2之解决ORA

发现在启动过程中,初始化VPXD时出错。

查看/var/log/vmware/vpx目录下的日志。大致可判断为数据库中数据读出来后,反序列化出错。但是因为上面的原因我又找到不出故障的表的内容,用OEM在表空间里试了几个表,都是好的,从VCenter日志中也找不出线索,问题就变成死问题了。

看来只能重建一个表空间给vCenter用,原来保留的数据也只有放弃了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

4

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

8

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

32

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

25

2026.03.03

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

77

2026.02.28

Golang 工程化架构设计:可维护与可演进系统构建
Golang 工程化架构设计:可维护与可演进系统构建

Go语言工程化架构设计专注于构建高可维护性、可演进的企业级系统。本专题深入探讨Go项目的目录结构设计、模块划分、依赖管理等核心架构原则,涵盖微服务架构、领域驱动设计(DDD)在Go中的实践应用。通过实战案例解析接口抽象、错误处理、配置管理、日志监控等关键工程化技术,帮助开发者掌握构建稳定、可扩展Go应用的最佳实践方法。

60

2026.02.28

Golang 性能分析与运行时机制:构建高性能程序
Golang 性能分析与运行时机制:构建高性能程序

Go语言以其高效的并发模型和优异的性能表现广泛应用于高并发、高性能场景。其运行时机制包括 Goroutine 调度、内存管理、垃圾回收等方面,深入理解这些机制有助于编写更高效稳定的程序。本专题将系统讲解 Golang 的性能分析工具使用、常见性能瓶颈定位及优化策略,并结合实际案例剖析 Go 程序的运行时行为,帮助开发者掌握构建高性能应用的关键技能。

48

2026.02.28

Golang 并发编程模型与工程实践:从语言特性到系统性能
Golang 并发编程模型与工程实践:从语言特性到系统性能

本专题系统讲解 Golang 并发编程模型,从语言级特性出发,深入理解 goroutine、channel 与调度机制。结合工程实践,分析并发设计模式、性能瓶颈与资源控制策略,帮助将并发能力有效转化为稳定、可扩展的系统性能优势。

26

2026.02.27

Golang 高级特性与最佳实践:提升代码艺术
Golang 高级特性与最佳实践:提升代码艺术

本专题深入剖析 Golang 的高级特性与工程级最佳实践,涵盖并发模型、内存管理、接口设计与错误处理策略。通过真实场景与代码对比,引导从“可运行”走向“高质量”,帮助构建高性能、可扩展、易维护的优雅 Go 代码体系。

20

2026.02.27

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 19.9万人学习

HTML教程
HTML教程

共500课时 | 6.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号