Oracle 10.2.0.4上ORA-01882故障解决一例
Jun 07, 2016 pm 04:49 PM时区TimeZone在Oracle中不仅仅是一个环境变量,而且是融入到数据取值保存过程中的。Oracle字段类型中,与时区有关的字段类型只有
任何软件,特别是企业级系统组件的升级工作,是一个非常复杂的过程。升级路径、数据留存预案、回退步骤、原有业务功能冲击程度,都是需要反复测试论证的问题。所有的运维人员在遇到升级问题的时候,都要抱有谨慎的态度。
笔者最近接手一个升级过的系统,在测试过程中遇到了一些问题。经过查找MOS和网络资源加以解决。记录下来,留待需要的朋友。
推荐阅读:
ORA-01172、ORA-01151错误处理
ORA-00600 [2662]错误解决
ORA-01078 和 LRM-00109 报错解决方法
ORA-00471 处理方法笔记
ORA-00314,redolog 损坏,或丢失处理方法
ORA-00257 归档日志过大导致无法存储的解决办法
1、环境介绍
接手的是一个升级到10.2.0.4的Linux版。
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有关的数值出现问题造成的。
时区TimeZone在Oracle中不仅仅是一个环境变量,而且是融入到数据取值保存过程中的。Oracle字段类型中,与时区有关的字段类型只有两个:timestamp with time zone和timestamp 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版本为DSTv2、10.2.0.3使用DSTv3、10.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进行版本升级的时候,使用数据库时区文件的确是升级了,但是对应的内部数据还没有进行更新。这样就存在不兼容的问题。

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Kurangkan penggunaan memori MySQL di Docker

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table?

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama

Apa itu SQLite? Gambaran Keseluruhan Komprehensif

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin)

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah

Apakah beberapa alat GUI MySQL yang popular (mis., MySQL Workbench, phpmyadmin)?

Bagaimana saya mengkonfigurasi penyulitan SSL/TLS untuk sambungan MySQL?
