开发者社区> 小麦苗> 正文

Oracle 10.2.0.4上ora-01882故障解决一例

简介:   任何软件,特别是企业级系统组件的升级工作,是一个非常复杂的过程。升级路径、数据留存预案、回退步骤、原有业务功能冲击程度,都是需要反复测试论证的问题。
+关注继续查看

 

任何软件,特别是企业级系统组件的升级工作,是一个非常复杂的过程。升级路径、数据留存预案、回退步骤、原有业务功能冲击程度,都是需要反复测试论证的问题。所有的运维人员在遇到升级问题的时候,都要抱有谨慎的态度。

笔者最近接手一个升级过的系统,在测试过程中遇到了一些问题。经过查找MOS和网络资源加以解决。记录下来,留待需要的朋友。

 

1、环境介绍

 

接手的是一个升级到10.2.0.4Linux版。

 

SQL> select * from v$version;

BANNER

-----------------------------------------------

Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

PL/SQL Release 10.2.0.4.0 - Production

CORE 10.2.0.4.0 Production

TNS for Linux: Version 10.2.0.4.0 - Production

NLSRTL Version 10.2.0.4.0 - Production

 

2、故障问题展示

 

在巡检中,发现记录Oracle内部作业调度的视图dba_scheduler_jobs不能支持查询。

 

SQL> select * from dba_scheduler_jobs;

 

select * from dba_scheduler_jobs

ORA-01882: 未找到时区

 

1882错误的官方解释信息如下:

 

[oracle@allfirst ~]$ oerr ora 1882

01882, 00000, "timezone region %s not found"

// *Cause: The specified region name was not found.

// *Action: Please contact Oracle Customer Support.

 

但是,并不是所有的字段都不支持查询动作。

 

SQL> select owner, job_name from dba_scheduler_jobs;

 

OWNER                          JOB_NAME

------------------------------ ------------------------------

SYS                            SQLSCRIPT_4084880

SYS                            AUTO_SPACE_ADVISOR_JOB

SYS                            GATHER_STATS_JOB

SYS                            FGR$AUTOPURGE_JOB

SYS                            PURGE_LOG

EXFSYS                         RLM$SCHDNEGACTION

EXFSYS                         RLM$EVTCLEANUP

ORACLE_OCM                     MGMT_STATS_CONFIG_JOB

ORACLE_OCM                     MGMT_CONFIG_JOB

 

9 rows selected

 

从字段性质看,值得怀疑与时区有关的字段是Time Zone

 

SQL> select column_name, data_type from dba_tab_columns where owner='SYS' and table_name=upper('dba_scheduler_jobs') and data_type like '%TIME ZONE%';

 

COLUMN_NAME                    DATA_TYPE

------------------------------ ------------------------------

START_DATE                     TIMESTAMP(6) WITH TIME ZONE

END_DATE                       TIMESTAMP(6) WITH TIME ZONE

LAST_START_DATE                TIMESTAMP(6) WITH TIME ZONE

NEXT_RUN_DATE                  TIMESTAMP(6) WITH TIME ZONE

 

但是,也并不是所有的time zone类型字段都不能显示。而且这样的问题不止出现在这个视图中。

 

 

SQL> select start_date from dba_scheduler_jobs;

START_DATE

-----------------------------------------------------

19-3 -12 05.48.23.742796 下午 +08:00

28-1 -14 02.42.49.000000 下午 +08:00

13-5 -13 07.40.35.640706 下午 +08:00

13-5 -13 07.32.40.314879 下午 +08:00

 

9 rows selected

 

SQL> select * from SYS.scheduler$_job ;

select * from SYS.scheduler$_job

 

ORA-01882: 未找到时区

 

 

3、问题分析

 

从直观看,应该是数据库部分数据表中与timezone有关的数值出现问题造成的。

时区TimeZoneOracle中不仅仅是一个环境变量,而且是融入到数据取值保存过程中的。Oracle字段类型中,与时区有关的字段类型只有两个:timestamp with time zonetimestamp with local time zone

Oracle的时区是通过时区文件来进行控制的,不同版本的数据库,选择不同版本的时区文件。

 

SQL> select * from v$timezone_file;

FILENAME        VERSION

------------ ----------

timezlrg.dat          4

 

一个经常发生的故障,是升级数据库过程中,没有升级time zone文件。这样导致升级失败现象。Time Zone文件是归属在DST技术体系下。10.2.0.2使用的是DST版本为DSTv210.2.0.3使用DSTv310.2.0.4使用DSTv4。从我们刚才的测试来看,使用的DST版本是正确的。

时区问题的另一个特点是服务器、客户端特性差异。如果需要确定是否是服务器问题,需要直接到服务器上执行命令。

 

[oracle@allfirst /]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on 星期二 1 28 14:54:51 2014

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

 

SQL> conn / as sysdba

已连接。

SQL> select * from dba_scheduler_jobs;

ERROR:

ORA-01882: 未找到时区区域 %s

 

说明是数据库服务器端问题。如果是客户端问题,则需要及时升级客户端版本。

一种猜想是:当Oracle进行版本升级的时候,使用数据库时区文件的确是升级了,但是对应的内部数据还没有进行更新。这样就存在不兼容的问题。

MOS中,我们也检查到了对应的讨论文章:Time Zone IDs for 7 Time Zones Changed in Time Zone Files Version 3 and Higher, Possible ORA-1882 After Upgrade (文档 ID 414590.1)

其中,介绍了使用检查脚本进行修复的解决方案。

 

4、问题解决

 

MOS文章中,介绍了故障的解决方法,就是从中下载SQL脚本Fix1882.sql,到界面上进行执行。

解压之后,上传到Server段的$ORACLE_HOME/rdbms/admin目录下。注意:Oracle强烈推荐在服务端执行脚本。

 

[oracle@allfirst /]$ cd $ORACLE_HOME

[oracle@allfirst 10g]$ cd rdbms/admin/

[oracle@allfirst admin]$ ls -l | grep Fix

-rw-r--r-- 1 root   root   11278 01-28 14:58 Fix1882.sql

 

更换执行权限。

 

[root@allfirst admin]# chown oracle:dba Fix1882.sql

[root@allfirst admin]# ls -l | grep Fix

-rw-r--r-- 1 oracle dba   11278 1 28 14:58 Fix1882.sql

 

SQLPLUS中执行程序。

 

[oracle@allfirst ~]$ sqlplus /nolog

SQL*Plus: Release 10.2.0.4.0 - Production on 星期二 1 28 15:00:36 2014

Copyright (c) 1982, 2007, Oracle.  All Rights Reserved.

SQL> conn / as sysdba

已连接。

SQL> @?/rdbms/admin/Fix1882.sql

 

PL/SQL 过程已成功完成。

会话已更改。

 

drop view FIX1882V

*

1 行出现错误:

ORA-00942: 表或视图不存在

 

视图已创建。

 

drop table FIX1882_PROGRESS           *

1 行出现错误:

ORA-00942: 表或视图不存在

 

表已创建。

 

drop table ADJUST_TZ_TAB

           *

1 行出现错误:

ORA-00942: 表或视图不存在

 

表已创建。

 

PL/SQL 过程已成功完成。

 

过程已创建。

过程已创建。

 

ORA-1882 in SYS.SCHEDULER$_JOB(LAST_ENABLED_TIME), checking rows

Found ORA-1882 on SYS.SCHEDULER$_JOB(LAST_ENABLED_TIME): AAABPpAABAAACuiAAA

Row successfully modified: SYS.SCHEDULER$_JOB(LAST_ENABLED_TIME)

AAABPpAABAAACuiAAA

(篇幅原因,有省略……

视图已删除。

 

执行过程需要消耗几分钟,从输出信息看,Oracle脚本在检查每个包括Time Zone相关字段,进行修改处理。输出信息里面还包括了数据行的rowid信息。

 

执行之后,检查数据行。

 

SQL> select last_start_date from dba_scheduler_jobs;

LAST_START_DATE

----------------------------------------------

19-3 -12 05.48.44.066014 下午 +08:00

27-1 -14 10.00.02.601102 下午 +08:00

27-1 -14 10.00.02.619984 下午 +08:00

18-3 -12 03.00.00.095899 上午 PST8PDT

28-1 -14 02.42.49.099626 下午 +08:00

28-1 -14 02.40.35.095036 下午 +08:00

01-1 -14 01.01.01.097621 上午 +08:00

27-1 -14 10.00.02.633247 下午 +08:00

 

9 rows selected

 

故障解决!

 

5、结论

 

升级故障是我们日常运维经常遇到的问题。一套系统进行升级,问题、故障是不能避免的。对我们而言,详细的规划和前期研究,反复的测试实验,可以最大程度的减少我们的风险和压力。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
10012 0
ORA-01017/ORA-02063DbLink建立错误问题分析及解决
ORA-01017/ORA-02063DbLink建立错误问题分析及解决   故障介绍: 我在oracle10.2.0.4中建立连接到11.2.0.3的DBLINK验证的时候出现如下错误: ORA-01017: invalid username/password; logon denied ORA-02063: preceding line from 分析错误:       从错误信息来看,是用户名和密码的错误,但是用户名和密码我确定没有问题,能够通过密码进行访问数据库。
1394 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20694 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18998 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
25240 0
ora 19804 与ora 19809 错误及解决
  [oracle@solbbk:~]$oerr ora 1980919809, 00000, "limit exceeded for recovery files"//*Cause: The limit for recovery files spec...
1034 0
RAC 单节点报ora-1105 ora-01606的解决
最近自己搭了一套 11g rac的环境,基于redhat 6, 11g 用了11.2.0.3.0的cluster和db的安装包。 共享存储基于nfs,没有用asm. 环境打完以后,crs_stat -t看到相应的服务都起了,但是第二个节点上的实例不知道怎么回事却没起来。
838 0
+关注
小麦苗
小麦苗,专注于数据库,Oracle OCM,PostgreSQL PGCM,PostgreSQL ACE,中国PG分会官方认证讲师,PGfans签约作者,PGfans年度MVP;微信公众号: DB宝,个人网站:www.xmmup.com
889
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载